/**
 * Lighthouse v13.1.0-25-ga160d341f (May 01 2026)
 *
 * Automated auditing, performance metrics, and best practices for the web.
 *
 * @homepage https://github.com/GoogleChrome/lighthouse#readme
 * @author   Copyright 2026 Google LLC
 * @license  Apache-2.0
 *
 * 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.
 */
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __esm = (fn, res) => function __init() {
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __commonJS = (cb, mod2) => function __require() {
  return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports;
};
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps(
  // If the importer is in node compatibility mode or this is not an ESM
  // file that has been converted to a CommonJS file using a Babel-
  // compatible transform (i.e. "__esModule" has not been set), then set
  // "default" to the CommonJS "module.exports" for node compatibility.
  isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target,
  mod2
));
var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2);

// build/process-global.js
import process2 from "process";
var init_process_global = __esm({
  "build/process-global.js"() {
    "use strict";
    globalThis.process = process2;
  }
});

// types/lh.js
var init_lh = __esm({
  "types/lh.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
  }
});

// core/gather/base-gatherer.js
var BaseGatherer, base_gatherer_default;
var init_base_gatherer = __esm({
  "core/gather/base-gatherer.js"() {
    "use strict";
    init_process_global();
    init_lh();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    BaseGatherer = class {
      static {
        __name(this, "BaseGatherer");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = { supportedModes: [] };
      /**
       * Method to start observing a page for an arbitrary period of time.
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<void>|void}
       */
      startInstrumentation(passContext) {
      }
      /**
       * Method to start observing a page when the measurements are very sensitive and
       * should observe as little Lighthouse-induced work as possible.
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<void>|void}
       */
      startSensitiveInstrumentation(passContext) {
      }
      /**
       * Method to stop observing a page when the measurements are very sensitive and
       * should observe as little Lighthouse-induced work as possible.
       *
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<void>|void}
       */
      stopSensitiveInstrumentation(passContext) {
      }
      /**
       * Method to end observing a page after an arbitrary period of time.
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<void>|void}
       */
      stopInstrumentation(passContext) {
      }
      /**
       * Method to gather results about a page.
       * @param {LH.Gatherer.Context} passContext
       * @return {LH.Gatherer.PhaseResult}
       */
      getArtifact(passContext) {
      }
    };
    base_gatherer_default = BaseGatherer;
  }
});

// node_modules/debug/node_modules/ms/index.js
var require_ms = __commonJS({
  "node_modules/debug/node_modules/ms/index.js"(exports2, module2) {
    init_process_global();
    var s = 1e3;
    var m = s * 60;
    var h = m * 60;
    var d = h * 24;
    var w = d * 7;
    var y = d * 365.25;
    module2.exports = function(val, options) {
      options = options || {};
      var type = typeof val;
      if (type === "string" && val.length > 0) {
        return parse(val);
      } else if (type === "number" && isFinite(val)) {
        return options.long ? fmtLong(val) : fmtShort(val);
      }
      throw new Error(
        "val is not a non-empty string or a valid number. val=" + JSON.stringify(val)
      );
    };
    function parse(str) {
      str = String(str);
      if (str.length > 100) {
        return;
      }
      var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
        str
      );
      if (!match) {
        return;
      }
      var n = parseFloat(match[1]);
      var type = (match[2] || "ms").toLowerCase();
      switch (type) {
        case "years":
        case "year":
        case "yrs":
        case "yr":
        case "y":
          return n * y;
        case "weeks":
        case "week":
        case "w":
          return n * w;
        case "days":
        case "day":
        case "d":
          return n * d;
        case "hours":
        case "hour":
        case "hrs":
        case "hr":
        case "h":
          return n * h;
        case "minutes":
        case "minute":
        case "mins":
        case "min":
        case "m":
          return n * m;
        case "seconds":
        case "second":
        case "secs":
        case "sec":
        case "s":
          return n * s;
        case "milliseconds":
        case "millisecond":
        case "msecs":
        case "msec":
        case "ms":
          return n;
        default:
          return void 0;
      }
    }
    __name(parse, "parse");
    function fmtShort(ms) {
      var msAbs = Math.abs(ms);
      if (msAbs >= d) {
        return Math.round(ms / d) + "d";
      }
      if (msAbs >= h) {
        return Math.round(ms / h) + "h";
      }
      if (msAbs >= m) {
        return Math.round(ms / m) + "m";
      }
      if (msAbs >= s) {
        return Math.round(ms / s) + "s";
      }
      return ms + "ms";
    }
    __name(fmtShort, "fmtShort");
    function fmtLong(ms) {
      var msAbs = Math.abs(ms);
      if (msAbs >= d) {
        return plural(ms, msAbs, d, "day");
      }
      if (msAbs >= h) {
        return plural(ms, msAbs, h, "hour");
      }
      if (msAbs >= m) {
        return plural(ms, msAbs, m, "minute");
      }
      if (msAbs >= s) {
        return plural(ms, msAbs, s, "second");
      }
      return ms + " ms";
    }
    __name(fmtLong, "fmtLong");
    function plural(ms, msAbs, n, name) {
      var isPlural = msAbs >= n * 1.5;
      return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
    }
    __name(plural, "plural");
  }
});

// node_modules/debug/src/common.js
var require_common = __commonJS({
  "node_modules/debug/src/common.js"(exports2, module2) {
    init_process_global();
    function setup(env) {
      createDebug.debug = createDebug;
      createDebug.default = createDebug;
      createDebug.coerce = coerce;
      createDebug.disable = disable;
      createDebug.enable = enable;
      createDebug.enabled = enabled;
      createDebug.humanize = require_ms();
      createDebug.destroy = destroy;
      Object.keys(env).forEach((key) => {
        createDebug[key] = env[key];
      });
      createDebug.names = [];
      createDebug.skips = [];
      createDebug.formatters = {};
      function selectColor(namespace) {
        let hash = 0;
        for (let i = 0; i < namespace.length; i++) {
          hash = (hash << 5) - hash + namespace.charCodeAt(i);
          hash |= 0;
        }
        return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
      }
      __name(selectColor, "selectColor");
      createDebug.selectColor = selectColor;
      function createDebug(namespace) {
        let prevTime;
        let enableOverride = null;
        let namespacesCache;
        let enabledCache;
        function debug2(...args) {
          if (!debug2.enabled) {
            return;
          }
          const self2 = debug2;
          const curr = Number(/* @__PURE__ */ new Date());
          const ms = curr - (prevTime || curr);
          self2.diff = ms;
          self2.prev = prevTime;
          self2.curr = curr;
          prevTime = curr;
          args[0] = createDebug.coerce(args[0]);
          if (typeof args[0] !== "string") {
            args.unshift("%O");
          }
          let index = 0;
          args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
            if (match === "%%") {
              return "%";
            }
            index++;
            const formatter = createDebug.formatters[format];
            if (typeof formatter === "function") {
              const val = args[index];
              match = formatter.call(self2, val);
              args.splice(index, 1);
              index--;
            }
            return match;
          });
          createDebug.formatArgs.call(self2, args);
          const logFn = self2.log || createDebug.log;
          logFn.apply(self2, args);
        }
        __name(debug2, "debug");
        debug2.namespace = namespace;
        debug2.useColors = createDebug.useColors();
        debug2.color = createDebug.selectColor(namespace);
        debug2.extend = extend;
        debug2.destroy = createDebug.destroy;
        Object.defineProperty(debug2, "enabled", {
          enumerable: true,
          configurable: false,
          get: /* @__PURE__ */ __name(() => {
            if (enableOverride !== null) {
              return enableOverride;
            }
            if (namespacesCache !== createDebug.namespaces) {
              namespacesCache = createDebug.namespaces;
              enabledCache = createDebug.enabled(namespace);
            }
            return enabledCache;
          }, "get"),
          set: /* @__PURE__ */ __name((v) => {
            enableOverride = v;
          }, "set")
        });
        if (typeof createDebug.init === "function") {
          createDebug.init(debug2);
        }
        return debug2;
      }
      __name(createDebug, "createDebug");
      function extend(namespace, delimiter) {
        const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
        newDebug.log = this.log;
        return newDebug;
      }
      __name(extend, "extend");
      function enable(namespaces) {
        createDebug.save(namespaces);
        createDebug.namespaces = namespaces;
        createDebug.names = [];
        createDebug.skips = [];
        let i;
        const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/);
        const len = split.length;
        for (i = 0; i < len; i++) {
          if (!split[i]) {
            continue;
          }
          namespaces = split[i].replace(/\*/g, ".*?");
          if (namespaces[0] === "-") {
            createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$"));
          } else {
            createDebug.names.push(new RegExp("^" + namespaces + "$"));
          }
        }
      }
      __name(enable, "enable");
      function disable() {
        const namespaces = [
          ...createDebug.names.map(toNamespace),
          ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace)
        ].join(",");
        createDebug.enable("");
        return namespaces;
      }
      __name(disable, "disable");
      function enabled(name) {
        if (name[name.length - 1] === "*") {
          return true;
        }
        let i;
        let len;
        for (i = 0, len = createDebug.skips.length; i < len; i++) {
          if (createDebug.skips[i].test(name)) {
            return false;
          }
        }
        for (i = 0, len = createDebug.names.length; i < len; i++) {
          if (createDebug.names[i].test(name)) {
            return true;
          }
        }
        return false;
      }
      __name(enabled, "enabled");
      function toNamespace(regexp) {
        return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*");
      }
      __name(toNamespace, "toNamespace");
      function coerce(val) {
        if (val instanceof Error) {
          return val.stack || val.message;
        }
        return val;
      }
      __name(coerce, "coerce");
      function destroy() {
        console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
      }
      __name(destroy, "destroy");
      createDebug.enable(createDebug.load());
      return createDebug;
    }
    __name(setup, "setup");
    module2.exports = setup;
  }
});

// node_modules/debug/src/browser.js
var require_browser = __commonJS({
  "node_modules/debug/src/browser.js"(exports2, module2) {
    init_process_global();
    exports2.formatArgs = formatArgs;
    exports2.save = save;
    exports2.load = load;
    exports2.useColors = useColors;
    exports2.storage = localstorage();
    exports2.destroy = /* @__PURE__ */ (() => {
      let warned = false;
      return () => {
        if (!warned) {
          warned = true;
          console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
        }
      };
    })();
    exports2.colors = [
      "#0000CC",
      "#0000FF",
      "#0033CC",
      "#0033FF",
      "#0066CC",
      "#0066FF",
      "#0099CC",
      "#0099FF",
      "#00CC00",
      "#00CC33",
      "#00CC66",
      "#00CC99",
      "#00CCCC",
      "#00CCFF",
      "#3300CC",
      "#3300FF",
      "#3333CC",
      "#3333FF",
      "#3366CC",
      "#3366FF",
      "#3399CC",
      "#3399FF",
      "#33CC00",
      "#33CC33",
      "#33CC66",
      "#33CC99",
      "#33CCCC",
      "#33CCFF",
      "#6600CC",
      "#6600FF",
      "#6633CC",
      "#6633FF",
      "#66CC00",
      "#66CC33",
      "#9900CC",
      "#9900FF",
      "#9933CC",
      "#9933FF",
      "#99CC00",
      "#99CC33",
      "#CC0000",
      "#CC0033",
      "#CC0066",
      "#CC0099",
      "#CC00CC",
      "#CC00FF",
      "#CC3300",
      "#CC3333",
      "#CC3366",
      "#CC3399",
      "#CC33CC",
      "#CC33FF",
      "#CC6600",
      "#CC6633",
      "#CC9900",
      "#CC9933",
      "#CCCC00",
      "#CCCC33",
      "#FF0000",
      "#FF0033",
      "#FF0066",
      "#FF0099",
      "#FF00CC",
      "#FF00FF",
      "#FF3300",
      "#FF3333",
      "#FF3366",
      "#FF3399",
      "#FF33CC",
      "#FF33FF",
      "#FF6600",
      "#FF6633",
      "#FF9900",
      "#FF9933",
      "#FFCC00",
      "#FFCC33"
    ];
    function useColors() {
      if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) {
        return true;
      }
      if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
        return false;
      }
      return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
      typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
      // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
      typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
      typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
    }
    __name(useColors, "useColors");
    function formatArgs(args) {
      args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff);
      if (!this.useColors) {
        return;
      }
      const c = "color: " + this.color;
      args.splice(1, 0, c, "color: inherit");
      let index = 0;
      let lastC = 0;
      args[0].replace(/%[a-zA-Z%]/g, (match) => {
        if (match === "%%") {
          return;
        }
        index++;
        if (match === "%c") {
          lastC = index;
        }
      });
      args.splice(lastC, 0, c);
    }
    __name(formatArgs, "formatArgs");
    exports2.log = console.debug || console.log || (() => {
    });
    function save(namespaces) {
      try {
        if (namespaces) {
          exports2.storage.setItem("debug", namespaces);
        } else {
          exports2.storage.removeItem("debug");
        }
      } catch (error) {
      }
    }
    __name(save, "save");
    function load() {
      let r;
      try {
        r = exports2.storage.getItem("debug");
      } catch (error) {
      }
      if (!r && typeof process !== "undefined" && "env" in process) {
        r = process.env.DEBUG;
      }
      return r;
    }
    __name(load, "load");
    function localstorage() {
      try {
        return localStorage;
      } catch (error) {
      }
    }
    __name(localstorage, "localstorage");
    module2.exports = require_common()(exports2);
    var { formatters } = module2.exports;
    formatters.j = function(v) {
      try {
        return JSON.stringify(v);
      } catch (error) {
        return "[UnexpectedJSONParseError]: " + error.message;
      }
    };
  }
});

// node_modules/marky/lib/marky.cjs.js
var require_marky_cjs = __commonJS({
  "node_modules/marky/lib/marky.cjs.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    var perf = typeof performance !== "undefined" && performance;
    var nowForNode;
    {
      hrtime = process.hrtime;
      getNanoSeconds = /* @__PURE__ */ __name(function() {
        var hr = hrtime();
        return hr[0] * 1e9 + hr[1];
      }, "getNanoSeconds");
      loadTime = getNanoSeconds();
      nowForNode = /* @__PURE__ */ __name(function() {
        return (getNanoSeconds() - loadTime) / 1e6;
      }, "nowForNode");
    }
    var hrtime;
    var getNanoSeconds;
    var loadTime;
    var now = nowForNode;
    function throwIfEmpty(name) {
      if (!name) {
        throw new Error("name must be non-empty");
      }
    }
    __name(throwIfEmpty, "throwIfEmpty");
    function insertSorted(arr, item) {
      var low = 0;
      var high = arr.length;
      var mid;
      while (low < high) {
        mid = low + high >>> 1;
        if (arr[mid].startTime < item.startTime) {
          low = mid + 1;
        } else {
          high = mid;
        }
      }
      arr.splice(low, 0, item);
    }
    __name(insertSorted, "insertSorted");
    exports2.mark = void 0;
    exports2.stop = void 0;
    exports2.getEntries = void 0;
    exports2.clear = void 0;
    if (perf && perf.mark && perf.getEntriesByName && perf.getEntriesByType && perf.clearMeasures) {
      exports2.mark = function(name) {
        throwIfEmpty(name);
        perf.mark("start " + name);
      };
      exports2.stop = function(name) {
        throwIfEmpty(name);
        perf.mark("end " + name);
        perf.measure(name, "start " + name, "end " + name);
        var entries2 = perf.getEntriesByName(name);
        return entries2[entries2.length - 1];
      };
      exports2.getEntries = function() {
        return perf.getEntriesByType("measure");
      };
      exports2.clear = function() {
        perf.clearMarks();
        perf.clearMeasures();
      };
    } else {
      marks = {};
      entries = [];
      exports2.mark = function(name) {
        throwIfEmpty(name);
        var startTime = now();
        marks["$" + name] = startTime;
      };
      exports2.stop = function(name) {
        throwIfEmpty(name);
        var endTime = now();
        var startTime = marks["$" + name];
        if (!startTime) {
          throw new Error("no known mark: " + name);
        }
        var entry = {
          startTime,
          name,
          duration: endTime - startTime,
          entryType: "measure"
        };
        insertSorted(entries, entry);
        return entry;
      };
      exports2.getEntries = function() {
        return entries;
      };
      exports2.clear = function() {
        marks = {};
        entries = [];
      };
    }
    var marks;
    var entries;
  }
});

// lighthouse-logger/index.js
import process3 from "process";
import { EventEmitter } from "events";
var import_debug, marky, isWindows, isBrowser, colors, Emitter, loggersByTitle, loggingBufferColumns, level_, Log, lighthouse_logger_default;
var init_lighthouse_logger = __esm({
  "lighthouse-logger/index.js"() {
    "use strict";
    init_process_global();
    import_debug = __toESM(require_browser(), 1);
    marky = __toESM(require_marky_cjs(), 1);
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    isWindows = process3.platform === "win32";
    isBrowser = process3.browser;
    colors = {
      red: isBrowser ? "crimson" : 1,
      yellow: isBrowser ? "gold" : 3,
      cyan: isBrowser ? "darkturquoise" : 6,
      green: isBrowser ? "forestgreen" : 2,
      blue: isBrowser ? "steelblue" : 4,
      magenta: isBrowser ? "palevioletred" : 5
    };
    import_debug.default.colors = [colors.cyan, colors.green, colors.blue, colors.magenta];
    Emitter = class extends EventEmitter {
      static {
        __name(this, "Emitter");
      }
      // yarn build-types fails without this!
      // https://github.com/microsoft/TypeScript/issues/41672#issuecomment-2303803072
      constructor(options) {
        super(options);
      }
      /**
       * Fires off all status updates. Listen with
       * `require('lib/log').events.addListener('status', callback)`
       * @param {string} title
       * @param {!Array<*>} argsArray
       */
      issueStatus(title, argsArray) {
        if (title === "status" || title === "statusEnd") {
          this.emit(title, [title, ...argsArray]);
        }
      }
      /**
       * Fires off all warnings. Listen with
       * `require('lib/log').events.addListener('warning', callback)`
       * @param {string} title
       * @param {!Array<*>} argsArray
       */
      issueWarning(title, argsArray) {
        this.emit("warning", [title, ...argsArray]);
      }
    };
    loggersByTitle = {};
    loggingBufferColumns = 25;
    Log = class _Log {
      static {
        __name(this, "Log");
      }
      static _logToStdErr(title, argsArray) {
        const log = _Log.loggerfn(title);
        log(...argsArray);
      }
      /**
       * @param {string} title
       */
      static loggerfn(title) {
        title = `LH:${title}`;
        let log = loggersByTitle[title];
        if (!log) {
          log = (0, import_debug.default)(title);
          loggersByTitle[title] = log;
          if (title.endsWith("error")) {
            log.color = colors.red;
          } else if (title.endsWith("warn")) {
            log.color = colors.yellow;
          }
        }
        return log;
      }
      /**
       * @param {string} level
       */
      static setLevel(level) {
        level_ = level;
        switch (level) {
          case "silent":
            import_debug.default.enable("-LH:*");
            break;
          case "verbose":
            import_debug.default.enable("LH:*");
            break;
          case "warn":
            import_debug.default.enable("-LH:*, LH:*:warn, LH:*:error");
            break;
          case "error":
            import_debug.default.enable("-LH:*, LH:*:error");
            break;
          default:
            import_debug.default.enable("LH:*, -LH:*:verbose");
        }
      }
      /**
       * A simple formatting utility for event logging.
       * @param {string} prefix
       * @param {!Object} data A JSON-serializable object of event data to log.
       * @param {string=} level Optional logging level. Defaults to 'log'.
       */
      static formatProtocol(prefix, data31, level) {
        const columns = !process3 || process3.browser ? Infinity : process3.stdout.columns;
        const method = data31.method || "?????";
        const maxLength = columns - method.length - prefix.length - loggingBufferColumns;
        const snippet = data31.params && method !== "IO.read" ? JSON.stringify(data31.params).substr(0, maxLength) : "";
        _Log._logToStdErr(`${prefix}:${level || ""}`, [method, snippet]);
      }
      /**
       * @return {boolean}
       */
      static isVerbose() {
        return level_ === "verbose";
      }
      /**
       * @param {{msg: string, id: string, args?: any[]}} status
       * @param {string} level
       */
      static time({ msg, id, args = [] }, level = "log") {
        marky.mark(id);
        _Log[level]("status", msg, ...args);
      }
      /**
       * @param {{msg: string, id: string, args?: any[]}} status
       * @param {string} level
       */
      static timeEnd({ msg, id, args = [] }, level = "verbose") {
        _Log[level]("statusEnd", msg, ...args);
        marky.stop(id);
      }
      /**
       * @param {string} title
       * @param {...any} args
       */
      static log(title, ...args) {
        _Log.events.issueStatus(title, args);
        return _Log._logToStdErr(title, args);
      }
      /**
       * @param {string} title
       * @param {...any} args
       */
      static warn(title, ...args) {
        _Log.events.issueWarning(title, args);
        return _Log._logToStdErr(`${title}:warn`, args);
      }
      /**
       * @param {string} title
       * @param {...any} args
       */
      static error(title, ...args) {
        return _Log._logToStdErr(`${title}:error`, args);
      }
      /**
       * @param {string} title
       * @param {...any} args
       */
      static verbose(title, ...args) {
        _Log.events.issueStatus(title, args);
        return _Log._logToStdErr(`${title}:verbose`, args);
      }
      /**
       * Add surrounding escape sequences to turn a string green when logged.
       * @param {string} str
       * @return {string}
       */
      static greenify(str) {
        return `${_Log.green}${str}${_Log.reset}`;
      }
      /**
       * Add surrounding escape sequences to turn a string red when logged.
       * @param {string} str
       * @return {string}
       */
      static redify(str) {
        return `${_Log.red}${str}${_Log.reset}`;
      }
      static get green() {
        return "\x1B[32m";
      }
      static get red() {
        return "\x1B[31m";
      }
      static get yellow() {
        return "\x1B[33m";
      }
      static get purple() {
        return "\x1B[95m";
      }
      static get reset() {
        return "\x1B[0m";
      }
      static get bold() {
        return "\x1B[1m";
      }
      static get dim() {
        return "\x1B[2m";
      }
      static get tick() {
        return isWindows ? "√" : "✓";
      }
      static get cross() {
        return isWindows ? "×" : "✘";
      }
      static get whiteSmallSquare() {
        return isWindows ? "·" : "▫";
      }
      static get heavyHorizontal() {
        return isWindows ? "─" : "━";
      }
      static get heavyVertical() {
        return isWindows ? "│ " : "┃ ";
      }
      static get heavyUpAndRight() {
        return isWindows ? "└" : "┗";
      }
      static get heavyVerticalAndRight() {
        return isWindows ? "├" : "┣";
      }
      static get heavyDownAndHorizontal() {
        return isWindows ? "┬" : "┳";
      }
      static get doubleLightHorizontal() {
        return "──";
      }
    };
    Log.events = new Emitter();
    Log.takeTimeEntries = () => {
      const entries = marky.getEntries();
      marky.clear();
      return entries;
    };
    Log.getTimeEntries = () => marky.getEntries();
    lighthouse_logger_default = Log;
  }
});

// core/lib/tracehouse/trace-processor.js
var ACCEPTABLE_NAVIGATION_URL_REGEX, BASE_RESPONSE_LATENCY, SCHEDULABLE_TASK_TITLE_LH, SCHEDULABLE_TASK_TITLE_ALT1, SCHEDULABLE_TASK_TITLE_ALT2, SCHEDULABLE_TASK_TITLE_ALT3, TraceProcessor;
var init_trace_processor = __esm({
  "core/lib/tracehouse/trace-processor.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ACCEPTABLE_NAVIGATION_URL_REGEX = /^(chrome|https?):/;
    BASE_RESPONSE_LATENCY = 16;
    SCHEDULABLE_TASK_TITLE_LH = "RunTask";
    SCHEDULABLE_TASK_TITLE_ALT1 = "ThreadControllerImpl::RunTask";
    SCHEDULABLE_TASK_TITLE_ALT2 = "ThreadControllerImpl::DoWork";
    SCHEDULABLE_TASK_TITLE_ALT3 = "TaskQueueManager::ProcessTaskFromWorkQueue";
    TraceProcessor = class _TraceProcessor {
      static {
        __name(this, "TraceProcessor");
      }
      static get TIMESPAN_MARKER_ID() {
        return "__lighthouseTimespanStart__";
      }
      /**
       * @return {Error}
       */
      static createNoNavstartError() {
        return new Error("No navigationStart event found");
      }
      /**
       * @return {Error}
       */
      static createNoResourceSendRequestError() {
        return new Error("No ResourceSendRequest event found");
      }
      /**
       * @return {Error}
       */
      static createNoTracingStartedError() {
        return new Error("No tracingStartedInBrowser event found");
      }
      /**
       * @return {Error}
       */
      static createNoFirstContentfulPaintError() {
        return new Error("No FirstContentfulPaint event found");
      }
      /**
       * @return {Error}
       */
      static createNoLighthouseMarkerError() {
        return new Error("No Lighthouse timespan marker event found");
      }
      /**
       * Returns true if the event is a navigation start event of a document whose URL seems valid.
       *
       * @param {LH.TraceEvent} event
       * @return {boolean}
       */
      static _isNavigationStartOfInterest(event) {
        if (event.name !== "navigationStart") return false;
        if (event.args.data?.documentLoaderURL === void 0) return true;
        if (!event.args.data?.documentLoaderURL) return false;
        return ACCEPTABLE_NAVIGATION_URL_REGEX.test(event.args.data.documentLoaderURL);
      }
      /**
       * This method sorts a group of trace events that have the same timestamp. We want to...
       *
       * 1. Put E events first, we finish off our existing events before we start new ones.
       * 2. Order B/X events by their duration, we want parents to start before child events.
       * 3. If we don't have any of this to go on, just use the position in the original array (stable sort).
       *
       * Note that the typical group size with the same timestamp will be quite small (<10 or so events),
       * and the number of groups typically ~1% of total trace, so the same ultra-performance-sensitive consideration
       * given to functions that run on entire traces does not necessarily apply here.
       *
       * @param {number[]} tsGroupIndices
       * @param {number[]} timestampSortedIndices
       * @param {number} indexOfTsGroupIndicesStart
       * @param {LH.TraceEvent[]} traceEvents
       * @return {number[]}
       */
      static _sortTimestampEventGroup(tsGroupIndices, timestampSortedIndices, indexOfTsGroupIndicesStart, traceEvents) {
        const lookupArrayIndexByTsIndex = /* @__PURE__ */ __name((i) => timestampSortedIndices[i], "lookupArrayIndexByTsIndex");
        const lookupEventByTsIndex = /* @__PURE__ */ __name((i) => traceEvents[lookupArrayIndexByTsIndex(i)], "lookupEventByTsIndex");
        const eEventIndices = [];
        const bxEventIndices = [];
        const otherEventIndices = [];
        for (const tsIndex of tsGroupIndices) {
          const arrayIndex = lookupArrayIndexByTsIndex(tsIndex);
          const event = lookupEventByTsIndex(tsIndex);
          if (event.ph === "E") eEventIndices.push(arrayIndex);
          else if (event.ph === "X" || event.ph === "B") bxEventIndices.push(arrayIndex);
          else otherEventIndices.push(arrayIndex);
        }
        const effectiveDuration = /* @__PURE__ */ new Map();
        for (const index of bxEventIndices) {
          const event = traceEvents[index];
          if (event.ph === "X") {
            effectiveDuration.set(index, event.dur);
          } else {
            let duration = Number.MAX_SAFE_INTEGER;
            let additionalNestedEventsWithSameName = 0;
            const startIndex = indexOfTsGroupIndicesStart + tsGroupIndices.length;
            for (let j = startIndex; j < timestampSortedIndices.length; j++) {
              const potentialMatchingEvent = lookupEventByTsIndex(j);
              const eventMatches = potentialMatchingEvent.name === event.name && potentialMatchingEvent.pid === event.pid && potentialMatchingEvent.tid === event.tid;
              if (!eventMatches) continue;
              if (potentialMatchingEvent.ph === "E" && additionalNestedEventsWithSameName === 0) {
                duration = potentialMatchingEvent.ts - event.ts;
                break;
              } else if (potentialMatchingEvent.ph === "E") {
                additionalNestedEventsWithSameName--;
              } else if (potentialMatchingEvent.ph === "B") {
                additionalNestedEventsWithSameName++;
              }
            }
            effectiveDuration.set(index, duration);
          }
        }
        bxEventIndices.sort((indexA, indexB) => (effectiveDuration.get(indexB) || 0) - (effectiveDuration.get(indexA) || 0) || indexA - indexB);
        otherEventIndices.sort((indexA, indexB) => indexA - indexB);
        return [...eEventIndices, ...bxEventIndices, ...otherEventIndices];
      }
      /**
       * Sorts and filters trace events by timestamp and respecting the nesting structure inherent to
       * parent/child event relationships.
       *
       * @param {LH.TraceEvent[]} traceEvents
       * @param {(e: LH.TraceEvent) => boolean} filter
       */
      static filteredTraceSort(traceEvents, filter) {
        const indices = [];
        for (let srcIndex = 0; srcIndex < traceEvents.length; srcIndex++) {
          if (filter(traceEvents[srcIndex])) {
            indices.push(srcIndex);
          }
        }
        indices.sort((indexA, indexB) => traceEvents[indexA].ts - traceEvents[indexB].ts);
        for (let i = 0; i < indices.length - 1; i++) {
          const ts = traceEvents[indices[i]].ts;
          const tsGroupIndices = [i];
          for (let j = i + 1; j < indices.length; j++) {
            if (traceEvents[indices[j]].ts !== ts) break;
            tsGroupIndices.push(j);
          }
          if (tsGroupIndices.length === 1) continue;
          const finalIndexOrder = _TraceProcessor._sortTimestampEventGroup(
            tsGroupIndices,
            indices,
            i,
            traceEvents
          );
          indices.splice(i, finalIndexOrder.length, ...finalIndexOrder);
          i += tsGroupIndices.length - 1;
        }
        const sorted2 = [];
        for (let i = 0; i < indices.length; i++) {
          sorted2.push(traceEvents[indices[i]]);
        }
        return sorted2;
      }
      /**
       * There should *always* be at least one top level event, having 0 typically means something is
       * drastically wrong with the trace and we should just give up early and loudly.
       *
       * @param {LH.TraceEvent[]} events
       */
      static assertHasToplevelEvents(events) {
        const hasToplevelTask = events.some(this.isScheduleableTask);
        if (!hasToplevelTask) {
          throw new Error("Could not find any top level events");
        }
      }
      /**
       * Calculate duration at specified percentiles for given population of
       * durations.
       * If one of the durations overlaps the end of the window, the full
       * duration should be in the duration array, but the length not included
       * within the window should be given as `clippedLength`. For instance, if a
       * 50ms duration occurs 10ms before the end of the window, `50` should be in
       * the `durations` array, and `clippedLength` should be set to 40.
       * @see https://docs.google.com/document/d/1b9slyaB9yho91YTOkAQfpCdULFkZM9LqsipcX3t7He8/preview
       * @param {!Array<number>} durations Array of durations, sorted in ascending order.
       * @param {number} totalTime Total time (in ms) of interval containing durations.
       * @param {!Array<number>} percentiles Array of percentiles of interest, in ascending order.
       * @param {number=} clippedLength Optional length clipped from a duration overlapping end of window. Default of 0.
       * @return {!Array<{percentile: number, time: number}>}
       * @private
       */
      static _riskPercentiles(durations, totalTime, percentiles, clippedLength = 0) {
        let busyTime = 0;
        for (let i = 0; i < durations.length; i++) {
          busyTime += durations[i];
        }
        busyTime -= clippedLength;
        let completedTime = totalTime - busyTime;
        let duration = 0;
        let cdfTime = completedTime;
        const results = [];
        let durationIndex = -1;
        let remainingCount = durations.length + 1;
        if (clippedLength > 0) {
          remainingCount--;
        }
        for (const percentile of percentiles) {
          const percentileTime = percentile * totalTime;
          while (cdfTime < percentileTime && durationIndex < durations.length - 1) {
            completedTime += duration;
            remainingCount -= duration < 0 ? -1 : 1;
            if (clippedLength > 0 && clippedLength < durations[durationIndex + 1]) {
              duration = -clippedLength;
              clippedLength = 0;
            } else {
              durationIndex++;
              duration = durations[durationIndex];
            }
            cdfTime = completedTime + Math.abs(duration) * remainingCount;
          }
          results.push({
            percentile,
            time: Math.max(0, (percentileTime - completedTime) / remainingCount) + BASE_RESPONSE_LATENCY
          });
        }
        return results;
      }
      /**
       * Calculates the maximum queueing time (in ms) of high priority tasks for
       * selected percentiles within a window of the main thread.
       * @see https://docs.google.com/document/d/1b9slyaB9yho91YTOkAQfpCdULFkZM9LqsipcX3t7He8/preview
       * @param {Array<ToplevelEvent>} events
       * @param {number} startTime Start time (in ms relative to timeOrigin) of range of interest.
       * @param {number} endTime End time (in ms relative to timeOrigin) of range of interest.
       * @param {!Array<number>=} percentiles Optional array of percentiles to compute. Defaults to [0.5, 0.75, 0.9, 0.99, 1].
       * @return {!Array<{percentile: number, time: number}>}
       */
      static getRiskToResponsiveness(events, startTime, endTime, percentiles = [0.5, 0.75, 0.9, 0.99, 1]) {
        const totalTime = endTime - startTime;
        percentiles.sort((a, b) => a - b);
        const ret = this.getMainThreadTopLevelEventDurations(events, startTime, endTime);
        return this._riskPercentiles(
          ret.durations,
          totalTime,
          percentiles,
          ret.clippedLength
        );
      }
      /**
       * Provides durations in ms of all main thread top-level events
       * @param {Array<ToplevelEvent>} topLevelEvents
       * @param {number} startTime Optional start time (in ms relative to timeOrigin) of range of interest. Defaults to 0.
       * @param {number} endTime Optional end time (in ms relative to timeOrigin) of range of interest. Defaults to trace end.
       * @return {{durations: Array<number>, clippedLength: number}}
       */
      static getMainThreadTopLevelEventDurations(topLevelEvents, startTime = 0, endTime = Infinity) {
        const durations = [];
        let clippedLength = 0;
        for (const event of topLevelEvents) {
          if (event.end < startTime || event.start > endTime) {
            continue;
          }
          let duration = event.duration;
          let eventStart = event.start;
          if (eventStart < startTime) {
            eventStart = startTime;
            duration = event.end - startTime;
          }
          if (event.end > endTime) {
            clippedLength = duration - (endTime - eventStart);
          }
          durations.push(duration);
        }
        durations.sort((a, b) => a - b);
        return {
          durations,
          clippedLength
        };
      }
      /**
       * Provides the top level events on the main thread with timestamps in ms relative to timeOrigin.
       * start.
       * @param {LH.Artifacts.ProcessedTrace} trace
       * @param {number=} startTime Optional start time (in ms relative to timeOrigin) of range of interest. Defaults to 0.
       * @param {number=} endTime Optional end time (in ms relative to timeOrigin) of range of interest. Defaults to trace end.
       * @return {Array<ToplevelEvent>}
       */
      static getMainThreadTopLevelEvents(trace, startTime = 0, endTime = Infinity) {
        const topLevelEvents = [];
        let prevToplevel = void 0;
        for (const event of trace.mainThreadEvents) {
          if (!this.isScheduleableTask(event) || !event.dur) continue;
          const start = (event.ts - trace.timeOriginEvt.ts) / 1e3;
          const end = (event.ts + event.dur - trace.timeOriginEvt.ts) / 1e3;
          if (start > endTime || end < startTime) continue;
          if (prevToplevel && start < prevToplevel.end) {
            prevToplevel.end = start - 1e-3;
          }
          prevToplevel = {
            start,
            end,
            duration: event.dur / 1e3
          };
          topLevelEvents.push(prevToplevel);
        }
        return topLevelEvents;
      }
      /**
       * @param {LH.TraceEvent[]} events
       * @return {{startingPid: number, frameId: string}}
       */
      static findMainFrameIds(events) {
        const startedInBrowserEvt = events.find((e) => e.name === "TracingStartedInBrowser");
        if (startedInBrowserEvt?.args.data?.frames) {
          const mainFrame = startedInBrowserEvt.args.data.frames.find((frame) => !frame.parent);
          const frameId = mainFrame?.frame;
          const pid = mainFrame?.processId;
          if (pid && frameId) {
            return {
              startingPid: pid,
              frameId
            };
          }
        }
        const startedInPageEvt = events.find((e) => e.name === "TracingStartedInPage");
        if (startedInPageEvt?.args?.data) {
          const frameId = startedInPageEvt.args.data.page;
          if (frameId) {
            return {
              startingPid: startedInPageEvt.pid,
              frameId
            };
          }
        }
        const navStartEvt = events.find(
          (e) => this._isNavigationStartOfInterest(e) && e.args.data?.isLoadingMainFrame
        );
        const firstResourceSendEvt = events.find((e) => e.name === "ResourceSendRequest");
        if (navStartEvt?.args?.data && firstResourceSendEvt && firstResourceSendEvt.pid === navStartEvt.pid && firstResourceSendEvt.tid === navStartEvt.tid) {
          const frameId = navStartEvt.args.frame;
          if (frameId) {
            return {
              startingPid: navStartEvt.pid,
              frameId
            };
          }
        }
        throw this.createNoTracingStartedError();
      }
      /**
       * If there were any cross-origin navigations, there'll be more than one pid returned
       * @param {{startingPid: number, frameId: string}} mainFrameInfo
       * @param {LH.TraceEvent[]} keyEvents
       * @return {Map<number, number>} Map where keys are process IDs and their values are thread IDs
       */
      static findMainFramePidTids(mainFrameInfo, keyEvents) {
        const frameProcessEvts = keyEvents.filter(
          (evt) => (
            // ProcessReadyInBrowser is used when a processID isn't available when the FrameCommittedInBrowser trace event is emitted.
            // In that case. FrameCommittedInBrowser has no processId, but a processPseudoId. and the ProcessReadyInBrowser event declares the proper processId.
            (evt.name === "FrameCommittedInBrowser" || evt.name === "ProcessReadyInBrowser") && evt.args?.data?.frame === mainFrameInfo.frameId && evt?.args?.data?.processId
          )
        );
        const mainFramePids = frameProcessEvts.length ? frameProcessEvts.map((e) => e?.args?.data?.processId) : [mainFrameInfo.startingPid];
        const pidToTid = /* @__PURE__ */ new Map();
        for (const pid of new Set(mainFramePids)) {
          const threadEvents = keyEvents.filter(
            (e) => e.cat === "__metadata" && e.pid === pid && e.ph === "M" && e.name === "thread_name"
          );
          let threadNameEvt = threadEvents.find((e) => e.args.name === "CrRendererMain");
          if (!threadNameEvt) {
            threadNameEvt = threadEvents.find((e) => e.args.name === "CrBrowserMain");
          }
          const tid = threadNameEvt?.tid;
          if (!tid) {
            throw new Error("Unable to determine tid for renderer process");
          }
          pidToTid.set(pid, tid);
        }
        return pidToTid;
      }
      /**
       * @param {LH.TraceEvent} evt
       * @return {boolean}
       */
      static isScheduleableTask(evt) {
        return evt.name === SCHEDULABLE_TASK_TITLE_LH || evt.name === SCHEDULABLE_TASK_TITLE_ALT1 || evt.name === SCHEDULABLE_TASK_TITLE_ALT2 || evt.name === SCHEDULABLE_TASK_TITLE_ALT3;
      }
      /**
       * @param {LH.TraceEvent} evt
       * @return {evt is LCPEvent}
       */
      static isLCPEvent(evt) {
        if (evt.name !== "largestContentfulPaint::Invalidate" && evt.name !== "largestContentfulPaint::Candidate") return false;
        return Boolean(evt.args?.frame);
      }
      /**
       * @param {LH.TraceEvent} evt
       * @return {evt is LCPCandidateEvent}
       */
      static isLCPCandidateEvent(evt) {
        return Boolean(
          evt.name === "largestContentfulPaint::Candidate" && evt.args?.frame && evt.args.data && evt.args.data.size !== void 0
        );
      }
      /**
       * The associated frame ID is set in different locations for different trace events.
       * This function checks all known locations for the frame ID and returns `undefined` if it's not found.
       *
       * @param {LH.TraceEvent} evt
       * @return {string|undefined}
       */
      static getFrameId(evt) {
        return evt.args?.data?.frame || evt.args.data?.frameID || evt.args.frame;
      }
      /**
       * Returns the maximum LCP event across all frames in `events`.
       * Sets `invalidated` flag if LCP of every frame is invalidated.
       *
       * LCP's trace event was first introduced in m78. We can't surface an LCP for older Chrome versions.
       * LCP comes from a frame's latest `largestContentfulPaint::Candidate`, but it can be invalidated by a `largestContentfulPaint::Invalidate` event.
       *
       * @param {LH.TraceEvent[]} events
       * @param {LH.TraceEvent} timeOriginEvent
       * @param {string|undefined} mainFrameId
       * @return {{lcp: LCPEvent | undefined, invalidated: boolean}}
       */
      static computeValidLCPAllFrames(events, timeOriginEvent, mainFrameId2) {
        const lcpEvents = events.filter(this.isLCPEvent).reverse();
        const finalLcpEventsByFrame = /* @__PURE__ */ new Map();
        for (const e of lcpEvents) {
          if (e.ts <= timeOriginEvent.ts) break;
          const frame = e.args.frame;
          if (finalLcpEventsByFrame.has(frame)) continue;
          finalLcpEventsByFrame.set(frame, e);
        }
        let maxLcpAcrossFrames;
        for (const lcp of finalLcpEventsByFrame.values()) {
          if (!this.isLCPCandidateEvent(lcp)) continue;
          if (!maxLcpAcrossFrames || lcp.args.data.size > maxLcpAcrossFrames.args.data.size) {
            maxLcpAcrossFrames = lcp;
          }
        }
        if (!maxLcpAcrossFrames) {
          const ukmEvents = events.filter(
            (e) => e.name.includes("LargestContentfulPaint") && e.name.includes("UKM")
          );
          const targetEventName = "NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM";
          const ukmInvalidates = ukmEvents.filter((e) => e.name === targetEventName);
          if (ukmInvalidates.length > 0) {
            ukmInvalidates.sort((a, b) => a.ts - b.ts);
            const lastInvalidate = ukmInvalidates[ukmInvalidates.length - 1];
            lighthouse_logger_default.warn(
              "TraceProcessor",
              "LCP candidate missing, falling back to UKM Invalidate event."
            );
            maxLcpAcrossFrames = /** @type {LCPCandidateEvent} */
            /** @type {unknown} */
            {
              name: "largestContentfulPaint::Candidate",
              cat: "loading",
              ph: lastInvalidate.ph,
              ts: lastInvalidate.ts,
              pid: lastInvalidate.pid,
              tid: lastInvalidate.tid,
              args: {
                frame: mainFrameId2 || "main_frame",
                // Mocked frame ID
                data: {
                  size: 1,
                  // Don't know the actuall size so we assign it 1
                  isMainFrame: true,
                  isOutermostMainFrame: true
                }
              }
            };
          }
        }
        return {
          lcp: maxLcpAcrossFrames,
          // LCP events were found, but final LCP event of every frame was an invalidate event.
          invalidated: Boolean(!maxLcpAcrossFrames && finalLcpEventsByFrame.size)
        };
      }
      /**
       * @param {Array<{id: string, url: string, parent?: string}>} frames
       * @return {Map<string, string>}
       */
      static resolveRootFrames(frames2) {
        const parentFrames = /* @__PURE__ */ new Map();
        for (const frame of frames2) {
          if (!frame.parent) continue;
          parentFrames.set(frame.id, frame.parent);
        }
        const frameIdToRootFrameId = /* @__PURE__ */ new Map();
        for (const frame of frames2) {
          let cur = frame.id;
          while (parentFrames.has(cur)) {
            cur = /** @type {string} */
            parentFrames.get(cur);
          }
          if (cur === void 0) {
            throw new Error("Unexpected undefined frameId");
          }
          frameIdToRootFrameId.set(frame.id, cur);
        }
        return frameIdToRootFrameId;
      }
      /**
       * Finds key trace events, identifies main process/thread, and returns timings of trace events
       * in milliseconds since the time origin in addition to the standard microsecond monotonic timestamps.
       * @param {LH.Trace} trace
       * @param {{timeOriginDeterminationMethod?: TimeOriginDeterminationMethod}} [options]
       * @return {LH.Artifacts.ProcessedTrace}
       */
      static processTrace(trace, options) {
        const { timeOriginDeterminationMethod = "auto" } = options || {};
        const keyEvents = this.filteredTraceSort(trace.traceEvents, (e) => {
          return e.cat.includes("blink.user_timing") || e.cat.includes("loading") || e.cat.includes("devtools.timeline") || e.cat === "__metadata";
        });
        const mainFrameInfo = this.findMainFrameIds(keyEvents);
        const rendererPidToTid = this.findMainFramePidTids(mainFrameInfo, keyEvents);
        const processEvents = _TraceProcessor.filteredTraceSort(trace.traceEvents, (e) => rendererPidToTid.has(e.pid));
        const framesById = /* @__PURE__ */ new Map();
        const tracingStartedFrames = keyEvents.find((e) => e.name === "TracingStartedInBrowser")?.args?.data?.frames;
        if (tracingStartedFrames) {
          for (const frame of tracingStartedFrames) {
            framesById.set(frame.frame, {
              id: frame.frame,
              url: frame.url,
              parent: frame.parent
            });
          }
        }
        keyEvents.filter(
          /** @return {evt is FrameCommittedEvent} */
          (evt) => {
            return Boolean(
              evt.name === "FrameCommittedInBrowser" && evt.args.data?.frame && evt.args.data.url !== void 0
            );
          }
        ).forEach((evt) => {
          framesById.set(evt.args.data.frame, {
            id: evt.args.data.frame,
            url: evt.args.data.url,
            parent: evt.args.data.parent
          });
        });
        const frames2 = [...framesById.values()];
        const frameIdToRootFrameId = this.resolveRootFrames(frames2);
        const inspectedTreeFrameIds = [...frameIdToRootFrameId.entries()].filter(([, rootFrameId]) => rootFrameId === mainFrameInfo.frameId).map(([child]) => child);
        function associatedToMainFrame(e) {
          if (e.name === "NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM") {
            return true;
          }
          const frameId = _TraceProcessor.getFrameId(e);
          return frameId === mainFrameInfo.frameId;
        }
        __name(associatedToMainFrame, "associatedToMainFrame");
        function associatedToAllFrames(e) {
          if (e.name.includes("LargestContentfulPaint") && e.name.includes("UKM")) {
            return true;
          }
          const frameId = _TraceProcessor.getFrameId(e);
          return frameId ? inspectedTreeFrameIds.includes(frameId) : false;
        }
        __name(associatedToAllFrames, "associatedToAllFrames");
        const frameEvents = keyEvents.filter((e) => associatedToMainFrame(e));
        let frameTreeEvents = [];
        if (frameIdToRootFrameId.has(mainFrameInfo.frameId)) {
          frameTreeEvents = keyEvents.filter((e) => associatedToAllFrames(e));
        } else {
          lighthouse_logger_default.warn(
            "TraceProcessor",
            "frameTreeEvents may be incomplete, make sure the trace has frame events"
          );
          frameIdToRootFrameId.set(mainFrameInfo.frameId, mainFrameInfo.frameId);
          frameTreeEvents = frameEvents;
        }
        const timeOriginEvt = this.computeTimeOrigin(
          { keyEvents, frameEvents, mainFrameInfo },
          timeOriginDeterminationMethod
        );
        const mainThreadEvents = processEvents.filter((e) => e.tid === rendererPidToTid.get(e.pid));
        const traceEnd = this.computeTraceEnd(trace.traceEvents, timeOriginEvt);
        return {
          frames: frames2,
          mainThreadEvents,
          frameEvents,
          frameTreeEvents,
          processEvents,
          mainFrameInfo,
          timeOriginEvt,
          timings: {
            timeOrigin: 0,
            traceEnd: traceEnd.timing
          },
          timestamps: {
            timeOrigin: timeOriginEvt.ts,
            traceEnd: traceEnd.timestamp
          },
          _keyEvents: keyEvents,
          _rendererPidToTid: rendererPidToTid
        };
      }
      /**
       * Finds key navigation trace events and computes timings of events in milliseconds since the time
       * origin in addition to the standard microsecond monotonic timestamps.
       * @param {LH.Artifacts.ProcessedTrace} processedTrace
       * @return {LH.Artifacts.ProcessedNavigation}
       */
      static processNavigation(processedTrace) {
        const {
          frameEvents,
          frameTreeEvents,
          timeOriginEvt,
          timings,
          timestamps,
          mainFrameInfo
        } = processedTrace;
        const frameTimings = this.computeNavigationTimingsForFrame(frameEvents, { timeOriginEvt });
        const fcpAllFramesEvt = frameTreeEvents.find(
          (e) => e.name === "firstContentfulPaint" && e.ts > timeOriginEvt.ts
        );
        if (!fcpAllFramesEvt) {
          throw this.createNoFirstContentfulPaintError();
        }
        const lcpAllFramesEvt = this.computeValidLCPAllFrames(
          frameTreeEvents,
          timeOriginEvt,
          mainFrameInfo.frameId
        ).lcp;
        const getTiming = /* @__PURE__ */ __name((ts) => (ts - timeOriginEvt.ts) / 1e3, "getTiming");
        const maybeGetTiming = /* @__PURE__ */ __name((ts) => ts === void 0 ? void 0 : getTiming(ts), "maybeGetTiming");
        return {
          timings: {
            timeOrigin: timings.timeOrigin,
            firstPaint: frameTimings.timings.firstPaint,
            firstContentfulPaint: frameTimings.timings.firstContentfulPaint,
            firstContentfulPaintAllFrames: getTiming(fcpAllFramesEvt.ts),
            largestContentfulPaint: frameTimings.timings.largestContentfulPaint,
            largestContentfulPaintAllFrames: maybeGetTiming(lcpAllFramesEvt?.ts),
            load: frameTimings.timings.load,
            domContentLoaded: frameTimings.timings.domContentLoaded,
            traceEnd: timings.traceEnd
          },
          timestamps: {
            timeOrigin: timestamps.timeOrigin,
            firstPaint: frameTimings.timestamps.firstPaint,
            firstContentfulPaint: frameTimings.timestamps.firstContentfulPaint,
            firstContentfulPaintAllFrames: fcpAllFramesEvt.ts,
            largestContentfulPaint: frameTimings.timestamps.largestContentfulPaint,
            largestContentfulPaintAllFrames: lcpAllFramesEvt?.ts,
            load: frameTimings.timestamps.load,
            domContentLoaded: frameTimings.timestamps.domContentLoaded,
            traceEnd: timestamps.traceEnd
          },
          firstPaintEvt: frameTimings.firstPaintEvt,
          firstContentfulPaintEvt: frameTimings.firstContentfulPaintEvt,
          firstContentfulPaintAllFramesEvt: fcpAllFramesEvt,
          largestContentfulPaintEvt: frameTimings.largestContentfulPaintEvt,
          largestContentfulPaintAllFramesEvt: lcpAllFramesEvt,
          loadEvt: frameTimings.loadEvt,
          domContentLoadedEvt: frameTimings.domContentLoadedEvt,
          lcpInvalidated: frameTimings.lcpInvalidated
        };
      }
      /**
       * Computes the last observable timestamp in a set of trace events.
       *
       * @param {Array<LH.TraceEvent>} events
       * @param {LH.TraceEvent} timeOriginEvt
       * @return {{timing: number, timestamp: number}}
       */
      static computeTraceEnd(events, timeOriginEvt) {
        let maxTs = -Infinity;
        for (const event of events) {
          maxTs = Math.max(event.ts + (event.dur || 0), maxTs);
        }
        return { timestamp: maxTs, timing: (maxTs - timeOriginEvt.ts) / 1e3 };
      }
      /**
       * Computes the time origin using the specified method.
       *
       *    - firstResourceSendRequest
       *      Uses the time that the very first network request is sent in the main frame.
       *      Eventually should be used in place of lastNavigationStart as the default for navigations.
       *      This method includes the cost of all redirects when evaluating a navigation (which matches lantern behavior).
       *      The only difference between firstResourceSendRequest and the first `navigationStart` is
       *      the unload time of `about:blank` (which is a Lighthouse implementation detail and shouldn't be included).
       *
       *    - lastNavigationStart
       *      Uses the time of the last `navigationStart` event in the main frame.
       *      The historical time origin of Lighthouse from 2016-Present.
       *      This method excludes the cost of client-side redirects when evaluating a navigation.
       *      Can also be skewed by several hundred milliseconds or even seconds when the browser takes a long
       *      time to unload `about:blank`.
       *
       * @param {{keyEvents: Array<LH.TraceEvent>, frameEvents: Array<LH.TraceEvent>, mainFrameInfo: {frameId: string}}} traceEventSubsets
       * @param {TimeOriginDeterminationMethod} method
       * @return {LH.TraceEvent}
       */
      static computeTimeOrigin(traceEventSubsets, method) {
        const lastNavigationStart = /* @__PURE__ */ __name(() => {
          const frameEvents = traceEventSubsets.frameEvents;
          return frameEvents.filter(this._isNavigationStartOfInterest).pop();
        }, "lastNavigationStart");
        const lighthouseMarker = /* @__PURE__ */ __name(() => {
          const frameEvents = traceEventSubsets.keyEvents;
          return frameEvents.find(
            (evt) => evt.name === "clock_sync" && evt.args.sync_id === _TraceProcessor.TIMESPAN_MARKER_ID
          );
        }, "lighthouseMarker");
        switch (method) {
          case "firstResourceSendRequest": {
            const fetchStart = traceEventSubsets.keyEvents.find((event) => {
              if (event.name !== "ResourceSendRequest") return false;
              const data31 = event.args.data || {};
              return data31.frame === traceEventSubsets.mainFrameInfo.frameId;
            });
            if (!fetchStart) throw this.createNoResourceSendRequestError();
            return fetchStart;
          }
          case "lastNavigationStart": {
            const navigationStart = lastNavigationStart();
            if (!navigationStart) throw this.createNoNavstartError();
            return navigationStart;
          }
          case "lighthouseMarker": {
            const marker = lighthouseMarker();
            if (!marker) throw this.createNoLighthouseMarkerError();
            return marker;
          }
          case "auto": {
            const marker = lighthouseMarker() || lastNavigationStart();
            if (!marker) throw this.createNoNavstartError();
            return marker;
          }
        }
      }
      /**
       * Computes timings of trace events of key trace events in milliseconds since the time origin
       * in addition to the standard microsecond monotonic timestamps.
       * @param {Array<LH.TraceEvent>} frameEvents
       * @param {{timeOriginEvt: LH.TraceEvent}} options
       */
      static computeNavigationTimingsForFrame(frameEvents, options) {
        const { timeOriginEvt } = options;
        const firstPaint = frameEvents.find((e) => e.name === "firstPaint" && e.ts > timeOriginEvt.ts);
        const firstContentfulPaint = frameEvents.find(
          (e) => e.name === "firstContentfulPaint" && e.ts > timeOriginEvt.ts
        );
        if (!firstContentfulPaint) {
          throw this.createNoFirstContentfulPaintError();
        }
        const frameId = frameEvents.map((e) => _TraceProcessor.getFrameId(e)).find(Boolean);
        const lcpResult = this.computeValidLCPAllFrames(frameEvents, timeOriginEvt, frameId);
        const load = frameEvents.find((e) => e.name === "loadEventEnd" && e.ts > timeOriginEvt.ts);
        const domContentLoaded = frameEvents.find(
          (e) => e.name === "domContentLoadedEventEnd" && e.ts > timeOriginEvt.ts
        );
        const getTimestamp = /* @__PURE__ */ __name((event) => event?.ts, "getTimestamp");
        const timestamps = {
          timeOrigin: timeOriginEvt.ts,
          firstPaint: getTimestamp(firstPaint),
          firstContentfulPaint: firstContentfulPaint.ts,
          largestContentfulPaint: getTimestamp(lcpResult.lcp),
          load: getTimestamp(load),
          domContentLoaded: getTimestamp(domContentLoaded)
        };
        const getTiming = /* @__PURE__ */ __name((ts) => (ts - timeOriginEvt.ts) / 1e3, "getTiming");
        const maybeGetTiming = /* @__PURE__ */ __name((ts) => ts === void 0 ? void 0 : getTiming(ts), "maybeGetTiming");
        const timings = {
          timeOrigin: 0,
          firstPaint: maybeGetTiming(timestamps.firstPaint),
          firstContentfulPaint: getTiming(timestamps.firstContentfulPaint),
          largestContentfulPaint: maybeGetTiming(timestamps.largestContentfulPaint),
          load: maybeGetTiming(timestamps.load),
          domContentLoaded: maybeGetTiming(timestamps.domContentLoaded)
        };
        return {
          timings,
          timestamps,
          timeOriginEvt,
          firstPaintEvt: firstPaint,
          firstContentfulPaintEvt: firstContentfulPaint,
          largestContentfulPaintEvt: lcpResult.lcp,
          loadEvt: load,
          domContentLoadedEvt: domContentLoaded,
          lcpInvalidated: lcpResult.invalidated
        };
      }
    };
  }
});

// core/gather/gatherers/trace.js
var trace_exports = {};
__export(trace_exports, {
  default: () => trace_default
});
var Trace, trace_default;
var init_trace = __esm({
  "core/gather/gatherers/trace.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_trace_processor();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    Trace = class _Trace extends base_gatherer_default {
      static {
        __name(this, "Trace");
      }
      /** @type {LH.Trace} */
      _trace = { traceEvents: [] };
      static getDefaultTraceCategories() {
        return [
          // Exclude default categories. We'll be selective to minimize trace size
          "-*",
          // Used instead of 'toplevel' in Chrome 71+
          "disabled-by-default-lighthouse",
          // Used for Cumulative Layout Shift metric
          "loading",
          // All compile/execute events are captured by parent events in devtools.timeline..
          // But the v8 category provides some nice context for only <0.5% of the trace size
          "v8",
          // Same situation here. This category is there for RunMicrotasks only, but with other teams
          // accidentally excluding microtasks, we don't want to assume a parent event will always exist
          "v8.execute",
          // For extracting UserTiming marks/measures
          "blink.user_timing",
          // Not mandatory but not used much
          "blink.console",
          // Most of the events we need are from these two categories
          "devtools.timeline",
          "disabled-by-default-devtools.timeline",
          // Up to 450 (https://goo.gl/rBfhn4) JPGs added to the trace
          "disabled-by-default-devtools.screenshot",
          // This doesn't add its own events, but adds a `stackTrace` property to devtools.timeline events
          "disabled-by-default-devtools.timeline.stack",
          // Additional categories used by devtools. Not used by Lighthouse, but included to facilitate
          // loading traces from Lighthouse into the Performance panel.
          "disabled-by-default-devtools.timeline.frame",
          "latencyInfo",
          // Enhanced traces.
          "disabled-by-default-devtools.target-rundown",
          "disabled-by-default-devtools.v8-source-rundown-sources",
          "disabled-by-default-devtools.v8-source-rundown",
          // Required for Baseline Audit to detect feature usage.
          "blink.webdx_feature_usage"
          // Not used by Lighthouse (yet) but included for users that want JS samples when looking at
          // a trace collected by Lighthouse (e.g. "View Trace" workflow in DevTools)
          // TODO: Re-enable after investigating b/325659693
          // 'disabled-by-default-v8.cpu_profiler',
        ];
      }
      /**
       * @param {LH.Gatherer.ProtocolSession} session
       * @return {Promise<LH.Trace>}
       */
      static async endTraceAndCollectEvents(session) {
        const traceEvents = [];
        const dataListener = /* @__PURE__ */ __name(function(data31) {
          traceEvents.push(...data31.value);
        }, "dataListener");
        session.on("Tracing.dataCollected", dataListener);
        return new Promise((resolve, reject) => {
          session.once("Tracing.tracingComplete", (_) => {
            session.off("Tracing.dataCollected", dataListener);
            resolve({ traceEvents });
          });
          session.sendCommand("Tracing.end").catch(reject);
        });
      }
      static symbol = Symbol("Trace");
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        symbol: _Trace.symbol,
        supportedModes: ["timespan", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async startSensitiveInstrumentation({ driver, gatherMode, settings }) {
        const traceCategories2 = _Trace.getDefaultTraceCategories().concat(settings.additionalTraceCategories || []);
        await driver.defaultSession.sendCommand("Page.enable");
        await driver.defaultSession.sendCommand("Tracing.start", {
          categories: traceCategories2.join(","),
          options: "sampling-frequency=10000"
          // 1000 is default and too slow.
        });
        if (gatherMode === "timespan") {
          await driver.defaultSession.sendCommand(
            "Tracing.recordClockSyncMarker",
            { syncId: TraceProcessor.TIMESPAN_MARKER_ID }
          );
        }
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async stopSensitiveInstrumentation({ driver }) {
        this._trace = await _Trace.endTraceAndCollectEvents(driver.defaultSession);
      }
      getDebugData() {
        return this._trace;
      }
      getArtifact() {
        return this._trace;
      }
    };
    trace_default = Trace;
  }
});

// node_modules/lodash-es/_freeGlobal.js
var freeGlobal, freeGlobal_default;
var init_freeGlobal = __esm({
  "node_modules/lodash-es/_freeGlobal.js"() {
    init_process_global();
    freeGlobal = typeof global == "object" && global && global.Object === Object && global;
    freeGlobal_default = freeGlobal;
  }
});

// node_modules/lodash-es/_root.js
var freeSelf, root, root_default;
var init_root = __esm({
  "node_modules/lodash-es/_root.js"() {
    init_process_global();
    init_freeGlobal();
    freeSelf = typeof self == "object" && self && self.Object === Object && self;
    root = freeGlobal_default || freeSelf || Function("return this")();
    root_default = root;
  }
});

// node_modules/lodash-es/_Symbol.js
var Symbol2, Symbol_default;
var init_Symbol = __esm({
  "node_modules/lodash-es/_Symbol.js"() {
    init_process_global();
    init_root();
    Symbol2 = root_default.Symbol;
    Symbol_default = Symbol2;
  }
});

// node_modules/lodash-es/_getRawTag.js
function getRawTag(value) {
  var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
  try {
    value[symToStringTag] = void 0;
    var unmasked = true;
  } catch (e) {
  }
  var result = nativeObjectToString.call(value);
  if (unmasked) {
    if (isOwn) {
      value[symToStringTag] = tag;
    } else {
      delete value[symToStringTag];
    }
  }
  return result;
}
var objectProto, hasOwnProperty, nativeObjectToString, symToStringTag, getRawTag_default;
var init_getRawTag = __esm({
  "node_modules/lodash-es/_getRawTag.js"() {
    init_process_global();
    init_Symbol();
    objectProto = Object.prototype;
    hasOwnProperty = objectProto.hasOwnProperty;
    nativeObjectToString = objectProto.toString;
    symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0;
    __name(getRawTag, "getRawTag");
    getRawTag_default = getRawTag;
  }
});

// node_modules/lodash-es/_objectToString.js
function objectToString(value) {
  return nativeObjectToString2.call(value);
}
var objectProto2, nativeObjectToString2, objectToString_default;
var init_objectToString = __esm({
  "node_modules/lodash-es/_objectToString.js"() {
    init_process_global();
    objectProto2 = Object.prototype;
    nativeObjectToString2 = objectProto2.toString;
    __name(objectToString, "objectToString");
    objectToString_default = objectToString;
  }
});

// node_modules/lodash-es/_baseGetTag.js
function baseGetTag(value) {
  if (value == null) {
    return value === void 0 ? undefinedTag : nullTag;
  }
  return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value);
}
var nullTag, undefinedTag, symToStringTag2, baseGetTag_default;
var init_baseGetTag = __esm({
  "node_modules/lodash-es/_baseGetTag.js"() {
    init_process_global();
    init_Symbol();
    init_getRawTag();
    init_objectToString();
    nullTag = "[object Null]";
    undefinedTag = "[object Undefined]";
    symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0;
    __name(baseGetTag, "baseGetTag");
    baseGetTag_default = baseGetTag;
  }
});

// node_modules/lodash-es/isObjectLike.js
function isObjectLike(value) {
  return value != null && typeof value == "object";
}
var isObjectLike_default;
var init_isObjectLike = __esm({
  "node_modules/lodash-es/isObjectLike.js"() {
    init_process_global();
    __name(isObjectLike, "isObjectLike");
    isObjectLike_default = isObjectLike;
  }
});

// node_modules/lodash-es/isArray.js
var isArray, isArray_default;
var init_isArray = __esm({
  "node_modules/lodash-es/isArray.js"() {
    init_process_global();
    isArray = Array.isArray;
    isArray_default = isArray;
  }
});

// node_modules/lodash-es/isObject.js
function isObject(value) {
  var type = typeof value;
  return value != null && (type == "object" || type == "function");
}
var isObject_default;
var init_isObject = __esm({
  "node_modules/lodash-es/isObject.js"() {
    init_process_global();
    __name(isObject, "isObject");
    isObject_default = isObject;
  }
});

// node_modules/lodash-es/isFunction.js
function isFunction(value) {
  if (!isObject_default(value)) {
    return false;
  }
  var tag = baseGetTag_default(value);
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
var asyncTag, funcTag, genTag, proxyTag, isFunction_default;
var init_isFunction = __esm({
  "node_modules/lodash-es/isFunction.js"() {
    init_process_global();
    init_baseGetTag();
    init_isObject();
    asyncTag = "[object AsyncFunction]";
    funcTag = "[object Function]";
    genTag = "[object GeneratorFunction]";
    proxyTag = "[object Proxy]";
    __name(isFunction, "isFunction");
    isFunction_default = isFunction;
  }
});

// node_modules/lodash-es/_coreJsData.js
var coreJsData, coreJsData_default;
var init_coreJsData = __esm({
  "node_modules/lodash-es/_coreJsData.js"() {
    init_process_global();
    init_root();
    coreJsData = root_default["__core-js_shared__"];
    coreJsData_default = coreJsData;
  }
});

// node_modules/lodash-es/_isMasked.js
function isMasked(func) {
  return !!maskSrcKey && maskSrcKey in func;
}
var maskSrcKey, isMasked_default;
var init_isMasked = __esm({
  "node_modules/lodash-es/_isMasked.js"() {
    init_process_global();
    init_coreJsData();
    maskSrcKey = (function() {
      var uid = /[^.]+$/.exec(coreJsData_default && coreJsData_default.keys && coreJsData_default.keys.IE_PROTO || "");
      return uid ? "Symbol(src)_1." + uid : "";
    })();
    __name(isMasked, "isMasked");
    isMasked_default = isMasked;
  }
});

// node_modules/lodash-es/_toSource.js
function toSource(func) {
  if (func != null) {
    try {
      return funcToString.call(func);
    } catch (e) {
    }
    try {
      return func + "";
    } catch (e) {
    }
  }
  return "";
}
var funcProto, funcToString, toSource_default;
var init_toSource = __esm({
  "node_modules/lodash-es/_toSource.js"() {
    init_process_global();
    funcProto = Function.prototype;
    funcToString = funcProto.toString;
    __name(toSource, "toSource");
    toSource_default = toSource;
  }
});

// node_modules/lodash-es/_baseIsNative.js
function baseIsNative(value) {
  if (!isObject_default(value) || isMasked_default(value)) {
    return false;
  }
  var pattern = isFunction_default(value) ? reIsNative : reIsHostCtor;
  return pattern.test(toSource_default(value));
}
var reRegExpChar, reIsHostCtor, funcProto2, objectProto3, funcToString2, hasOwnProperty2, reIsNative, baseIsNative_default;
var init_baseIsNative = __esm({
  "node_modules/lodash-es/_baseIsNative.js"() {
    init_process_global();
    init_isFunction();
    init_isMasked();
    init_isObject();
    init_toSource();
    reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
    reIsHostCtor = /^\[object .+?Constructor\]$/;
    funcProto2 = Function.prototype;
    objectProto3 = Object.prototype;
    funcToString2 = funcProto2.toString;
    hasOwnProperty2 = objectProto3.hasOwnProperty;
    reIsNative = RegExp(
      "^" + funcToString2.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
    );
    __name(baseIsNative, "baseIsNative");
    baseIsNative_default = baseIsNative;
  }
});

// node_modules/lodash-es/_getValue.js
function getValue(object, key) {
  return object == null ? void 0 : object[key];
}
var getValue_default;
var init_getValue = __esm({
  "node_modules/lodash-es/_getValue.js"() {
    init_process_global();
    __name(getValue, "getValue");
    getValue_default = getValue;
  }
});

// node_modules/lodash-es/_getNative.js
function getNative(object, key) {
  var value = getValue_default(object, key);
  return baseIsNative_default(value) ? value : void 0;
}
var getNative_default;
var init_getNative = __esm({
  "node_modules/lodash-es/_getNative.js"() {
    init_process_global();
    init_baseIsNative();
    init_getValue();
    __name(getNative, "getNative");
    getNative_default = getNative;
  }
});

// node_modules/lodash-es/_WeakMap.js
var WeakMap2, WeakMap_default;
var init_WeakMap = __esm({
  "node_modules/lodash-es/_WeakMap.js"() {
    init_process_global();
    init_getNative();
    init_root();
    WeakMap2 = getNative_default(root_default, "WeakMap");
    WeakMap_default = WeakMap2;
  }
});

// node_modules/lodash-es/_isIndex.js
function isIndex(value, length) {
  var type = typeof value;
  length = length == null ? MAX_SAFE_INTEGER : length;
  return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
var MAX_SAFE_INTEGER, reIsUint, isIndex_default;
var init_isIndex = __esm({
  "node_modules/lodash-es/_isIndex.js"() {
    init_process_global();
    MAX_SAFE_INTEGER = 9007199254740991;
    reIsUint = /^(?:0|[1-9]\d*)$/;
    __name(isIndex, "isIndex");
    isIndex_default = isIndex;
  }
});

// node_modules/lodash-es/eq.js
function eq(value, other) {
  return value === other || value !== value && other !== other;
}
var eq_default;
var init_eq = __esm({
  "node_modules/lodash-es/eq.js"() {
    init_process_global();
    __name(eq, "eq");
    eq_default = eq;
  }
});

// node_modules/lodash-es/isLength.js
function isLength(value) {
  return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER2;
}
var MAX_SAFE_INTEGER2, isLength_default;
var init_isLength = __esm({
  "node_modules/lodash-es/isLength.js"() {
    init_process_global();
    MAX_SAFE_INTEGER2 = 9007199254740991;
    __name(isLength, "isLength");
    isLength_default = isLength;
  }
});

// node_modules/lodash-es/isArrayLike.js
function isArrayLike(value) {
  return value != null && isLength_default(value.length) && !isFunction_default(value);
}
var isArrayLike_default;
var init_isArrayLike = __esm({
  "node_modules/lodash-es/isArrayLike.js"() {
    init_process_global();
    init_isFunction();
    init_isLength();
    __name(isArrayLike, "isArrayLike");
    isArrayLike_default = isArrayLike;
  }
});

// node_modules/lodash-es/_isPrototype.js
function isPrototype(value) {
  var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto4;
  return value === proto;
}
var objectProto4, isPrototype_default;
var init_isPrototype = __esm({
  "node_modules/lodash-es/_isPrototype.js"() {
    init_process_global();
    objectProto4 = Object.prototype;
    __name(isPrototype, "isPrototype");
    isPrototype_default = isPrototype;
  }
});

// node_modules/lodash-es/_baseTimes.js
function baseTimes(n, iteratee) {
  var index = -1, result = Array(n);
  while (++index < n) {
    result[index] = iteratee(index);
  }
  return result;
}
var baseTimes_default;
var init_baseTimes = __esm({
  "node_modules/lodash-es/_baseTimes.js"() {
    init_process_global();
    __name(baseTimes, "baseTimes");
    baseTimes_default = baseTimes;
  }
});

// node_modules/lodash-es/_baseIsArguments.js
function baseIsArguments(value) {
  return isObjectLike_default(value) && baseGetTag_default(value) == argsTag;
}
var argsTag, baseIsArguments_default;
var init_baseIsArguments = __esm({
  "node_modules/lodash-es/_baseIsArguments.js"() {
    init_process_global();
    init_baseGetTag();
    init_isObjectLike();
    argsTag = "[object Arguments]";
    __name(baseIsArguments, "baseIsArguments");
    baseIsArguments_default = baseIsArguments;
  }
});

// node_modules/lodash-es/isArguments.js
var objectProto5, hasOwnProperty3, propertyIsEnumerable, isArguments, isArguments_default;
var init_isArguments = __esm({
  "node_modules/lodash-es/isArguments.js"() {
    init_process_global();
    init_baseIsArguments();
    init_isObjectLike();
    objectProto5 = Object.prototype;
    hasOwnProperty3 = objectProto5.hasOwnProperty;
    propertyIsEnumerable = objectProto5.propertyIsEnumerable;
    isArguments = baseIsArguments_default(/* @__PURE__ */ (function() {
      return arguments;
    })()) ? baseIsArguments_default : function(value) {
      return isObjectLike_default(value) && hasOwnProperty3.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
    };
    isArguments_default = isArguments;
  }
});

// node_modules/lodash-es/stubFalse.js
function stubFalse() {
  return false;
}
var stubFalse_default;
var init_stubFalse = __esm({
  "node_modules/lodash-es/stubFalse.js"() {
    init_process_global();
    __name(stubFalse, "stubFalse");
    stubFalse_default = stubFalse;
  }
});

// node_modules/lodash-es/isBuffer.js
var freeExports, freeModule, moduleExports, Buffer2, nativeIsBuffer, isBuffer, isBuffer_default;
var init_isBuffer = __esm({
  "node_modules/lodash-es/isBuffer.js"() {
    init_process_global();
    init_root();
    init_stubFalse();
    freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
    freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module;
    moduleExports = freeModule && freeModule.exports === freeExports;
    Buffer2 = moduleExports ? root_default.Buffer : void 0;
    nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : void 0;
    isBuffer = nativeIsBuffer || stubFalse_default;
    isBuffer_default = isBuffer;
  }
});

// node_modules/lodash-es/_baseIsTypedArray.js
function baseIsTypedArray(value) {
  return isObjectLike_default(value) && isLength_default(value.length) && !!typedArrayTags[baseGetTag_default(value)];
}
var argsTag2, arrayTag, boolTag, dateTag, errorTag, funcTag2, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, weakMapTag, arrayBufferTag, dataViewTag, float32Tag, float64Tag, int8Tag, int16Tag, int32Tag, uint8Tag, uint8ClampedTag, uint16Tag, uint32Tag, typedArrayTags, baseIsTypedArray_default;
var init_baseIsTypedArray = __esm({
  "node_modules/lodash-es/_baseIsTypedArray.js"() {
    init_process_global();
    init_baseGetTag();
    init_isLength();
    init_isObjectLike();
    argsTag2 = "[object Arguments]";
    arrayTag = "[object Array]";
    boolTag = "[object Boolean]";
    dateTag = "[object Date]";
    errorTag = "[object Error]";
    funcTag2 = "[object Function]";
    mapTag = "[object Map]";
    numberTag = "[object Number]";
    objectTag = "[object Object]";
    regexpTag = "[object RegExp]";
    setTag = "[object Set]";
    stringTag = "[object String]";
    weakMapTag = "[object WeakMap]";
    arrayBufferTag = "[object ArrayBuffer]";
    dataViewTag = "[object DataView]";
    float32Tag = "[object Float32Array]";
    float64Tag = "[object Float64Array]";
    int8Tag = "[object Int8Array]";
    int16Tag = "[object Int16Array]";
    int32Tag = "[object Int32Array]";
    uint8Tag = "[object Uint8Array]";
    uint8ClampedTag = "[object Uint8ClampedArray]";
    uint16Tag = "[object Uint16Array]";
    uint32Tag = "[object Uint32Array]";
    typedArrayTags = {};
    typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
    typedArrayTags[argsTag2] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag2] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
    __name(baseIsTypedArray, "baseIsTypedArray");
    baseIsTypedArray_default = baseIsTypedArray;
  }
});

// node_modules/lodash-es/_baseUnary.js
function baseUnary(func) {
  return function(value) {
    return func(value);
  };
}
var baseUnary_default;
var init_baseUnary = __esm({
  "node_modules/lodash-es/_baseUnary.js"() {
    init_process_global();
    __name(baseUnary, "baseUnary");
    baseUnary_default = baseUnary;
  }
});

// node_modules/lodash-es/_nodeUtil.js
var freeExports2, freeModule2, moduleExports2, freeProcess, nodeUtil, nodeUtil_default;
var init_nodeUtil = __esm({
  "node_modules/lodash-es/_nodeUtil.js"() {
    init_process_global();
    init_freeGlobal();
    freeExports2 = typeof exports == "object" && exports && !exports.nodeType && exports;
    freeModule2 = freeExports2 && typeof module == "object" && module && !module.nodeType && module;
    moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
    freeProcess = moduleExports2 && freeGlobal_default.process;
    nodeUtil = (function() {
      try {
        var types = freeModule2 && freeModule2.require && freeModule2.require("util").types;
        if (types) {
          return types;
        }
        return freeProcess && freeProcess.binding && freeProcess.binding("util");
      } catch (e) {
      }
    })();
    nodeUtil_default = nodeUtil;
  }
});

// node_modules/lodash-es/isTypedArray.js
var nodeIsTypedArray, isTypedArray, isTypedArray_default;
var init_isTypedArray = __esm({
  "node_modules/lodash-es/isTypedArray.js"() {
    init_process_global();
    init_baseIsTypedArray();
    init_baseUnary();
    init_nodeUtil();
    nodeIsTypedArray = nodeUtil_default && nodeUtil_default.isTypedArray;
    isTypedArray = nodeIsTypedArray ? baseUnary_default(nodeIsTypedArray) : baseIsTypedArray_default;
    isTypedArray_default = isTypedArray;
  }
});

// node_modules/lodash-es/_arrayLikeKeys.js
function arrayLikeKeys(value, inherited) {
  var isArr = isArray_default(value), isArg = !isArr && isArguments_default(value), isBuff = !isArr && !isArg && isBuffer_default(value), isType = !isArr && !isArg && !isBuff && isTypedArray_default(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes_default(value.length, String) : [], length = result.length;
  for (var key in value) {
    if ((inherited || hasOwnProperty4.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode.
    (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers.
    isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays.
    isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties.
    isIndex_default(key, length)))) {
      result.push(key);
    }
  }
  return result;
}
var objectProto6, hasOwnProperty4, arrayLikeKeys_default;
var init_arrayLikeKeys = __esm({
  "node_modules/lodash-es/_arrayLikeKeys.js"() {
    init_process_global();
    init_baseTimes();
    init_isArguments();
    init_isArray();
    init_isBuffer();
    init_isIndex();
    init_isTypedArray();
    objectProto6 = Object.prototype;
    hasOwnProperty4 = objectProto6.hasOwnProperty;
    __name(arrayLikeKeys, "arrayLikeKeys");
    arrayLikeKeys_default = arrayLikeKeys;
  }
});

// node_modules/lodash-es/_overArg.js
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}
var overArg_default;
var init_overArg = __esm({
  "node_modules/lodash-es/_overArg.js"() {
    init_process_global();
    __name(overArg, "overArg");
    overArg_default = overArg;
  }
});

// node_modules/lodash-es/_nativeKeys.js
var nativeKeys, nativeKeys_default;
var init_nativeKeys = __esm({
  "node_modules/lodash-es/_nativeKeys.js"() {
    init_process_global();
    init_overArg();
    nativeKeys = overArg_default(Object.keys, Object);
    nativeKeys_default = nativeKeys;
  }
});

// node_modules/lodash-es/_baseKeys.js
function baseKeys(object) {
  if (!isPrototype_default(object)) {
    return nativeKeys_default(object);
  }
  var result = [];
  for (var key in Object(object)) {
    if (hasOwnProperty5.call(object, key) && key != "constructor") {
      result.push(key);
    }
  }
  return result;
}
var objectProto7, hasOwnProperty5, baseKeys_default;
var init_baseKeys = __esm({
  "node_modules/lodash-es/_baseKeys.js"() {
    init_process_global();
    init_isPrototype();
    init_nativeKeys();
    objectProto7 = Object.prototype;
    hasOwnProperty5 = objectProto7.hasOwnProperty;
    __name(baseKeys, "baseKeys");
    baseKeys_default = baseKeys;
  }
});

// node_modules/lodash-es/keys.js
function keys(object) {
  return isArrayLike_default(object) ? arrayLikeKeys_default(object) : baseKeys_default(object);
}
var keys_default;
var init_keys = __esm({
  "node_modules/lodash-es/keys.js"() {
    init_process_global();
    init_arrayLikeKeys();
    init_baseKeys();
    init_isArrayLike();
    __name(keys, "keys");
    keys_default = keys;
  }
});

// node_modules/lodash-es/_nativeCreate.js
var nativeCreate, nativeCreate_default;
var init_nativeCreate = __esm({
  "node_modules/lodash-es/_nativeCreate.js"() {
    init_process_global();
    init_getNative();
    nativeCreate = getNative_default(Object, "create");
    nativeCreate_default = nativeCreate;
  }
});

// node_modules/lodash-es/_hashClear.js
function hashClear() {
  this.__data__ = nativeCreate_default ? nativeCreate_default(null) : {};
  this.size = 0;
}
var hashClear_default;
var init_hashClear = __esm({
  "node_modules/lodash-es/_hashClear.js"() {
    init_process_global();
    init_nativeCreate();
    __name(hashClear, "hashClear");
    hashClear_default = hashClear;
  }
});

// node_modules/lodash-es/_hashDelete.js
function hashDelete(key) {
  var result = this.has(key) && delete this.__data__[key];
  this.size -= result ? 1 : 0;
  return result;
}
var hashDelete_default;
var init_hashDelete = __esm({
  "node_modules/lodash-es/_hashDelete.js"() {
    init_process_global();
    __name(hashDelete, "hashDelete");
    hashDelete_default = hashDelete;
  }
});

// node_modules/lodash-es/_hashGet.js
function hashGet(key) {
  var data31 = this.__data__;
  if (nativeCreate_default) {
    var result = data31[key];
    return result === HASH_UNDEFINED ? void 0 : result;
  }
  return hasOwnProperty6.call(data31, key) ? data31[key] : void 0;
}
var HASH_UNDEFINED, objectProto8, hasOwnProperty6, hashGet_default;
var init_hashGet = __esm({
  "node_modules/lodash-es/_hashGet.js"() {
    init_process_global();
    init_nativeCreate();
    HASH_UNDEFINED = "__lodash_hash_undefined__";
    objectProto8 = Object.prototype;
    hasOwnProperty6 = objectProto8.hasOwnProperty;
    __name(hashGet, "hashGet");
    hashGet_default = hashGet;
  }
});

// node_modules/lodash-es/_hashHas.js
function hashHas(key) {
  var data31 = this.__data__;
  return nativeCreate_default ? data31[key] !== void 0 : hasOwnProperty7.call(data31, key);
}
var objectProto9, hasOwnProperty7, hashHas_default;
var init_hashHas = __esm({
  "node_modules/lodash-es/_hashHas.js"() {
    init_process_global();
    init_nativeCreate();
    objectProto9 = Object.prototype;
    hasOwnProperty7 = objectProto9.hasOwnProperty;
    __name(hashHas, "hashHas");
    hashHas_default = hashHas;
  }
});

// node_modules/lodash-es/_hashSet.js
function hashSet(key, value) {
  var data31 = this.__data__;
  this.size += this.has(key) ? 0 : 1;
  data31[key] = nativeCreate_default && value === void 0 ? HASH_UNDEFINED2 : value;
  return this;
}
var HASH_UNDEFINED2, hashSet_default;
var init_hashSet = __esm({
  "node_modules/lodash-es/_hashSet.js"() {
    init_process_global();
    init_nativeCreate();
    HASH_UNDEFINED2 = "__lodash_hash_undefined__";
    __name(hashSet, "hashSet");
    hashSet_default = hashSet;
  }
});

// node_modules/lodash-es/_Hash.js
function Hash(entries) {
  var index = -1, length = entries == null ? 0 : entries.length;
  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}
var Hash_default;
var init_Hash = __esm({
  "node_modules/lodash-es/_Hash.js"() {
    init_process_global();
    init_hashClear();
    init_hashDelete();
    init_hashGet();
    init_hashHas();
    init_hashSet();
    __name(Hash, "Hash");
    Hash.prototype.clear = hashClear_default;
    Hash.prototype["delete"] = hashDelete_default;
    Hash.prototype.get = hashGet_default;
    Hash.prototype.has = hashHas_default;
    Hash.prototype.set = hashSet_default;
    Hash_default = Hash;
  }
});

// node_modules/lodash-es/_listCacheClear.js
function listCacheClear() {
  this.__data__ = [];
  this.size = 0;
}
var listCacheClear_default;
var init_listCacheClear = __esm({
  "node_modules/lodash-es/_listCacheClear.js"() {
    init_process_global();
    __name(listCacheClear, "listCacheClear");
    listCacheClear_default = listCacheClear;
  }
});

// node_modules/lodash-es/_assocIndexOf.js
function assocIndexOf(array, key) {
  var length = array.length;
  while (length--) {
    if (eq_default(array[length][0], key)) {
      return length;
    }
  }
  return -1;
}
var assocIndexOf_default;
var init_assocIndexOf = __esm({
  "node_modules/lodash-es/_assocIndexOf.js"() {
    init_process_global();
    init_eq();
    __name(assocIndexOf, "assocIndexOf");
    assocIndexOf_default = assocIndexOf;
  }
});

// node_modules/lodash-es/_listCacheDelete.js
function listCacheDelete(key) {
  var data31 = this.__data__, index = assocIndexOf_default(data31, key);
  if (index < 0) {
    return false;
  }
  var lastIndex = data31.length - 1;
  if (index == lastIndex) {
    data31.pop();
  } else {
    splice.call(data31, index, 1);
  }
  --this.size;
  return true;
}
var arrayProto, splice, listCacheDelete_default;
var init_listCacheDelete = __esm({
  "node_modules/lodash-es/_listCacheDelete.js"() {
    init_process_global();
    init_assocIndexOf();
    arrayProto = Array.prototype;
    splice = arrayProto.splice;
    __name(listCacheDelete, "listCacheDelete");
    listCacheDelete_default = listCacheDelete;
  }
});

// node_modules/lodash-es/_listCacheGet.js
function listCacheGet(key) {
  var data31 = this.__data__, index = assocIndexOf_default(data31, key);
  return index < 0 ? void 0 : data31[index][1];
}
var listCacheGet_default;
var init_listCacheGet = __esm({
  "node_modules/lodash-es/_listCacheGet.js"() {
    init_process_global();
    init_assocIndexOf();
    __name(listCacheGet, "listCacheGet");
    listCacheGet_default = listCacheGet;
  }
});

// node_modules/lodash-es/_listCacheHas.js
function listCacheHas(key) {
  return assocIndexOf_default(this.__data__, key) > -1;
}
var listCacheHas_default;
var init_listCacheHas = __esm({
  "node_modules/lodash-es/_listCacheHas.js"() {
    init_process_global();
    init_assocIndexOf();
    __name(listCacheHas, "listCacheHas");
    listCacheHas_default = listCacheHas;
  }
});

// node_modules/lodash-es/_listCacheSet.js
function listCacheSet(key, value) {
  var data31 = this.__data__, index = assocIndexOf_default(data31, key);
  if (index < 0) {
    ++this.size;
    data31.push([key, value]);
  } else {
    data31[index][1] = value;
  }
  return this;
}
var listCacheSet_default;
var init_listCacheSet = __esm({
  "node_modules/lodash-es/_listCacheSet.js"() {
    init_process_global();
    init_assocIndexOf();
    __name(listCacheSet, "listCacheSet");
    listCacheSet_default = listCacheSet;
  }
});

// node_modules/lodash-es/_ListCache.js
function ListCache(entries) {
  var index = -1, length = entries == null ? 0 : entries.length;
  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}
var ListCache_default;
var init_ListCache = __esm({
  "node_modules/lodash-es/_ListCache.js"() {
    init_process_global();
    init_listCacheClear();
    init_listCacheDelete();
    init_listCacheGet();
    init_listCacheHas();
    init_listCacheSet();
    __name(ListCache, "ListCache");
    ListCache.prototype.clear = listCacheClear_default;
    ListCache.prototype["delete"] = listCacheDelete_default;
    ListCache.prototype.get = listCacheGet_default;
    ListCache.prototype.has = listCacheHas_default;
    ListCache.prototype.set = listCacheSet_default;
    ListCache_default = ListCache;
  }
});

// node_modules/lodash-es/_Map.js
var Map2, Map_default;
var init_Map = __esm({
  "node_modules/lodash-es/_Map.js"() {
    init_process_global();
    init_getNative();
    init_root();
    Map2 = getNative_default(root_default, "Map");
    Map_default = Map2;
  }
});

// node_modules/lodash-es/_mapCacheClear.js
function mapCacheClear() {
  this.size = 0;
  this.__data__ = {
    "hash": new Hash_default(),
    "map": new (Map_default || ListCache_default)(),
    "string": new Hash_default()
  };
}
var mapCacheClear_default;
var init_mapCacheClear = __esm({
  "node_modules/lodash-es/_mapCacheClear.js"() {
    init_process_global();
    init_Hash();
    init_ListCache();
    init_Map();
    __name(mapCacheClear, "mapCacheClear");
    mapCacheClear_default = mapCacheClear;
  }
});

// node_modules/lodash-es/_isKeyable.js
function isKeyable(value) {
  var type = typeof value;
  return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null;
}
var isKeyable_default;
var init_isKeyable = __esm({
  "node_modules/lodash-es/_isKeyable.js"() {
    init_process_global();
    __name(isKeyable, "isKeyable");
    isKeyable_default = isKeyable;
  }
});

// node_modules/lodash-es/_getMapData.js
function getMapData(map, key) {
  var data31 = map.__data__;
  return isKeyable_default(key) ? data31[typeof key == "string" ? "string" : "hash"] : data31.map;
}
var getMapData_default;
var init_getMapData = __esm({
  "node_modules/lodash-es/_getMapData.js"() {
    init_process_global();
    init_isKeyable();
    __name(getMapData, "getMapData");
    getMapData_default = getMapData;
  }
});

// node_modules/lodash-es/_mapCacheDelete.js
function mapCacheDelete(key) {
  var result = getMapData_default(this, key)["delete"](key);
  this.size -= result ? 1 : 0;
  return result;
}
var mapCacheDelete_default;
var init_mapCacheDelete = __esm({
  "node_modules/lodash-es/_mapCacheDelete.js"() {
    init_process_global();
    init_getMapData();
    __name(mapCacheDelete, "mapCacheDelete");
    mapCacheDelete_default = mapCacheDelete;
  }
});

// node_modules/lodash-es/_mapCacheGet.js
function mapCacheGet(key) {
  return getMapData_default(this, key).get(key);
}
var mapCacheGet_default;
var init_mapCacheGet = __esm({
  "node_modules/lodash-es/_mapCacheGet.js"() {
    init_process_global();
    init_getMapData();
    __name(mapCacheGet, "mapCacheGet");
    mapCacheGet_default = mapCacheGet;
  }
});

// node_modules/lodash-es/_mapCacheHas.js
function mapCacheHas(key) {
  return getMapData_default(this, key).has(key);
}
var mapCacheHas_default;
var init_mapCacheHas = __esm({
  "node_modules/lodash-es/_mapCacheHas.js"() {
    init_process_global();
    init_getMapData();
    __name(mapCacheHas, "mapCacheHas");
    mapCacheHas_default = mapCacheHas;
  }
});

// node_modules/lodash-es/_mapCacheSet.js
function mapCacheSet(key, value) {
  var data31 = getMapData_default(this, key), size = data31.size;
  data31.set(key, value);
  this.size += data31.size == size ? 0 : 1;
  return this;
}
var mapCacheSet_default;
var init_mapCacheSet = __esm({
  "node_modules/lodash-es/_mapCacheSet.js"() {
    init_process_global();
    init_getMapData();
    __name(mapCacheSet, "mapCacheSet");
    mapCacheSet_default = mapCacheSet;
  }
});

// node_modules/lodash-es/_MapCache.js
function MapCache(entries) {
  var index = -1, length = entries == null ? 0 : entries.length;
  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}
var MapCache_default;
var init_MapCache = __esm({
  "node_modules/lodash-es/_MapCache.js"() {
    init_process_global();
    init_mapCacheClear();
    init_mapCacheDelete();
    init_mapCacheGet();
    init_mapCacheHas();
    init_mapCacheSet();
    __name(MapCache, "MapCache");
    MapCache.prototype.clear = mapCacheClear_default;
    MapCache.prototype["delete"] = mapCacheDelete_default;
    MapCache.prototype.get = mapCacheGet_default;
    MapCache.prototype.has = mapCacheHas_default;
    MapCache.prototype.set = mapCacheSet_default;
    MapCache_default = MapCache;
  }
});

// node_modules/lodash-es/_arrayPush.js
function arrayPush(array, values) {
  var index = -1, length = values.length, offset = array.length;
  while (++index < length) {
    array[offset + index] = values[index];
  }
  return array;
}
var arrayPush_default;
var init_arrayPush = __esm({
  "node_modules/lodash-es/_arrayPush.js"() {
    init_process_global();
    __name(arrayPush, "arrayPush");
    arrayPush_default = arrayPush;
  }
});

// node_modules/lodash-es/_stackClear.js
function stackClear() {
  this.__data__ = new ListCache_default();
  this.size = 0;
}
var stackClear_default;
var init_stackClear = __esm({
  "node_modules/lodash-es/_stackClear.js"() {
    init_process_global();
    init_ListCache();
    __name(stackClear, "stackClear");
    stackClear_default = stackClear;
  }
});

// node_modules/lodash-es/_stackDelete.js
function stackDelete(key) {
  var data31 = this.__data__, result = data31["delete"](key);
  this.size = data31.size;
  return result;
}
var stackDelete_default;
var init_stackDelete = __esm({
  "node_modules/lodash-es/_stackDelete.js"() {
    init_process_global();
    __name(stackDelete, "stackDelete");
    stackDelete_default = stackDelete;
  }
});

// node_modules/lodash-es/_stackGet.js
function stackGet(key) {
  return this.__data__.get(key);
}
var stackGet_default;
var init_stackGet = __esm({
  "node_modules/lodash-es/_stackGet.js"() {
    init_process_global();
    __name(stackGet, "stackGet");
    stackGet_default = stackGet;
  }
});

// node_modules/lodash-es/_stackHas.js
function stackHas(key) {
  return this.__data__.has(key);
}
var stackHas_default;
var init_stackHas = __esm({
  "node_modules/lodash-es/_stackHas.js"() {
    init_process_global();
    __name(stackHas, "stackHas");
    stackHas_default = stackHas;
  }
});

// node_modules/lodash-es/_stackSet.js
function stackSet(key, value) {
  var data31 = this.__data__;
  if (data31 instanceof ListCache_default) {
    var pairs = data31.__data__;
    if (!Map_default || pairs.length < LARGE_ARRAY_SIZE - 1) {
      pairs.push([key, value]);
      this.size = ++data31.size;
      return this;
    }
    data31 = this.__data__ = new MapCache_default(pairs);
  }
  data31.set(key, value);
  this.size = data31.size;
  return this;
}
var LARGE_ARRAY_SIZE, stackSet_default;
var init_stackSet = __esm({
  "node_modules/lodash-es/_stackSet.js"() {
    init_process_global();
    init_ListCache();
    init_Map();
    init_MapCache();
    LARGE_ARRAY_SIZE = 200;
    __name(stackSet, "stackSet");
    stackSet_default = stackSet;
  }
});

// node_modules/lodash-es/_Stack.js
function Stack(entries) {
  var data31 = this.__data__ = new ListCache_default(entries);
  this.size = data31.size;
}
var Stack_default;
var init_Stack = __esm({
  "node_modules/lodash-es/_Stack.js"() {
    init_process_global();
    init_ListCache();
    init_stackClear();
    init_stackDelete();
    init_stackGet();
    init_stackHas();
    init_stackSet();
    __name(Stack, "Stack");
    Stack.prototype.clear = stackClear_default;
    Stack.prototype["delete"] = stackDelete_default;
    Stack.prototype.get = stackGet_default;
    Stack.prototype.has = stackHas_default;
    Stack.prototype.set = stackSet_default;
    Stack_default = Stack;
  }
});

// node_modules/lodash-es/_arrayFilter.js
function arrayFilter(array, predicate) {
  var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = [];
  while (++index < length) {
    var value = array[index];
    if (predicate(value, index, array)) {
      result[resIndex++] = value;
    }
  }
  return result;
}
var arrayFilter_default;
var init_arrayFilter = __esm({
  "node_modules/lodash-es/_arrayFilter.js"() {
    init_process_global();
    __name(arrayFilter, "arrayFilter");
    arrayFilter_default = arrayFilter;
  }
});

// node_modules/lodash-es/stubArray.js
function stubArray() {
  return [];
}
var stubArray_default;
var init_stubArray = __esm({
  "node_modules/lodash-es/stubArray.js"() {
    init_process_global();
    __name(stubArray, "stubArray");
    stubArray_default = stubArray;
  }
});

// node_modules/lodash-es/_getSymbols.js
var objectProto10, propertyIsEnumerable2, nativeGetSymbols, getSymbols, getSymbols_default;
var init_getSymbols = __esm({
  "node_modules/lodash-es/_getSymbols.js"() {
    init_process_global();
    init_arrayFilter();
    init_stubArray();
    objectProto10 = Object.prototype;
    propertyIsEnumerable2 = objectProto10.propertyIsEnumerable;
    nativeGetSymbols = Object.getOwnPropertySymbols;
    getSymbols = !nativeGetSymbols ? stubArray_default : function(object) {
      if (object == null) {
        return [];
      }
      object = Object(object);
      return arrayFilter_default(nativeGetSymbols(object), function(symbol) {
        return propertyIsEnumerable2.call(object, symbol);
      });
    };
    getSymbols_default = getSymbols;
  }
});

// node_modules/lodash-es/_baseGetAllKeys.js
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  var result = keysFunc(object);
  return isArray_default(object) ? result : arrayPush_default(result, symbolsFunc(object));
}
var baseGetAllKeys_default;
var init_baseGetAllKeys = __esm({
  "node_modules/lodash-es/_baseGetAllKeys.js"() {
    init_process_global();
    init_arrayPush();
    init_isArray();
    __name(baseGetAllKeys, "baseGetAllKeys");
    baseGetAllKeys_default = baseGetAllKeys;
  }
});

// node_modules/lodash-es/_getAllKeys.js
function getAllKeys(object) {
  return baseGetAllKeys_default(object, keys_default, getSymbols_default);
}
var getAllKeys_default;
var init_getAllKeys = __esm({
  "node_modules/lodash-es/_getAllKeys.js"() {
    init_process_global();
    init_baseGetAllKeys();
    init_getSymbols();
    init_keys();
    __name(getAllKeys, "getAllKeys");
    getAllKeys_default = getAllKeys;
  }
});

// node_modules/lodash-es/_DataView.js
var DataView, DataView_default;
var init_DataView = __esm({
  "node_modules/lodash-es/_DataView.js"() {
    init_process_global();
    init_getNative();
    init_root();
    DataView = getNative_default(root_default, "DataView");
    DataView_default = DataView;
  }
});

// node_modules/lodash-es/_Promise.js
var Promise2, Promise_default;
var init_Promise = __esm({
  "node_modules/lodash-es/_Promise.js"() {
    init_process_global();
    init_getNative();
    init_root();
    Promise2 = getNative_default(root_default, "Promise");
    Promise_default = Promise2;
  }
});

// node_modules/lodash-es/_Set.js
var Set2, Set_default;
var init_Set = __esm({
  "node_modules/lodash-es/_Set.js"() {
    init_process_global();
    init_getNative();
    init_root();
    Set2 = getNative_default(root_default, "Set");
    Set_default = Set2;
  }
});

// node_modules/lodash-es/_getTag.js
var mapTag2, objectTag2, promiseTag, setTag2, weakMapTag2, dataViewTag2, dataViewCtorString, mapCtorString, promiseCtorString, setCtorString, weakMapCtorString, getTag, getTag_default;
var init_getTag = __esm({
  "node_modules/lodash-es/_getTag.js"() {
    init_process_global();
    init_DataView();
    init_Map();
    init_Promise();
    init_Set();
    init_WeakMap();
    init_baseGetTag();
    init_toSource();
    mapTag2 = "[object Map]";
    objectTag2 = "[object Object]";
    promiseTag = "[object Promise]";
    setTag2 = "[object Set]";
    weakMapTag2 = "[object WeakMap]";
    dataViewTag2 = "[object DataView]";
    dataViewCtorString = toSource_default(DataView_default);
    mapCtorString = toSource_default(Map_default);
    promiseCtorString = toSource_default(Promise_default);
    setCtorString = toSource_default(Set_default);
    weakMapCtorString = toSource_default(WeakMap_default);
    getTag = baseGetTag_default;
    if (DataView_default && getTag(new DataView_default(new ArrayBuffer(1))) != dataViewTag2 || Map_default && getTag(new Map_default()) != mapTag2 || Promise_default && getTag(Promise_default.resolve()) != promiseTag || Set_default && getTag(new Set_default()) != setTag2 || WeakMap_default && getTag(new WeakMap_default()) != weakMapTag2) {
      getTag = /* @__PURE__ */ __name(function(value) {
        var result = baseGetTag_default(value), Ctor = result == objectTag2 ? value.constructor : void 0, ctorString = Ctor ? toSource_default(Ctor) : "";
        if (ctorString) {
          switch (ctorString) {
            case dataViewCtorString:
              return dataViewTag2;
            case mapCtorString:
              return mapTag2;
            case promiseCtorString:
              return promiseTag;
            case setCtorString:
              return setTag2;
            case weakMapCtorString:
              return weakMapTag2;
          }
        }
        return result;
      }, "getTag");
    }
    getTag_default = getTag;
  }
});

// node_modules/lodash-es/_Uint8Array.js
var Uint8Array2, Uint8Array_default;
var init_Uint8Array = __esm({
  "node_modules/lodash-es/_Uint8Array.js"() {
    init_process_global();
    init_root();
    Uint8Array2 = root_default.Uint8Array;
    Uint8Array_default = Uint8Array2;
  }
});

// node_modules/lodash-es/_setCacheAdd.js
function setCacheAdd(value) {
  this.__data__.set(value, HASH_UNDEFINED3);
  return this;
}
var HASH_UNDEFINED3, setCacheAdd_default;
var init_setCacheAdd = __esm({
  "node_modules/lodash-es/_setCacheAdd.js"() {
    init_process_global();
    HASH_UNDEFINED3 = "__lodash_hash_undefined__";
    __name(setCacheAdd, "setCacheAdd");
    setCacheAdd_default = setCacheAdd;
  }
});

// node_modules/lodash-es/_setCacheHas.js
function setCacheHas(value) {
  return this.__data__.has(value);
}
var setCacheHas_default;
var init_setCacheHas = __esm({
  "node_modules/lodash-es/_setCacheHas.js"() {
    init_process_global();
    __name(setCacheHas, "setCacheHas");
    setCacheHas_default = setCacheHas;
  }
});

// node_modules/lodash-es/_SetCache.js
function SetCache(values) {
  var index = -1, length = values == null ? 0 : values.length;
  this.__data__ = new MapCache_default();
  while (++index < length) {
    this.add(values[index]);
  }
}
var SetCache_default;
var init_SetCache = __esm({
  "node_modules/lodash-es/_SetCache.js"() {
    init_process_global();
    init_MapCache();
    init_setCacheAdd();
    init_setCacheHas();
    __name(SetCache, "SetCache");
    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd_default;
    SetCache.prototype.has = setCacheHas_default;
    SetCache_default = SetCache;
  }
});

// node_modules/lodash-es/_arraySome.js
function arraySome(array, predicate) {
  var index = -1, length = array == null ? 0 : array.length;
  while (++index < length) {
    if (predicate(array[index], index, array)) {
      return true;
    }
  }
  return false;
}
var arraySome_default;
var init_arraySome = __esm({
  "node_modules/lodash-es/_arraySome.js"() {
    init_process_global();
    __name(arraySome, "arraySome");
    arraySome_default = arraySome;
  }
});

// node_modules/lodash-es/_cacheHas.js
function cacheHas(cache, key) {
  return cache.has(key);
}
var cacheHas_default;
var init_cacheHas = __esm({
  "node_modules/lodash-es/_cacheHas.js"() {
    init_process_global();
    __name(cacheHas, "cacheHas");
    cacheHas_default = cacheHas;
  }
});

// node_modules/lodash-es/_equalArrays.js
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length;
  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
    return false;
  }
  var arrStacked = stack.get(array);
  var othStacked = stack.get(other);
  if (arrStacked && othStacked) {
    return arrStacked == other && othStacked == array;
  }
  var index = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache_default() : void 0;
  stack.set(array, other);
  stack.set(other, array);
  while (++index < arrLength) {
    var arrValue = array[index], othValue = other[index];
    if (customizer) {
      var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);
    }
    if (compared !== void 0) {
      if (compared) {
        continue;
      }
      result = false;
      break;
    }
    if (seen) {
      if (!arraySome_default(other, function(othValue2, othIndex) {
        if (!cacheHas_default(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
          return seen.push(othIndex);
        }
      })) {
        result = false;
        break;
      }
    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
      result = false;
      break;
    }
  }
  stack["delete"](array);
  stack["delete"](other);
  return result;
}
var COMPARE_PARTIAL_FLAG, COMPARE_UNORDERED_FLAG, equalArrays_default;
var init_equalArrays = __esm({
  "node_modules/lodash-es/_equalArrays.js"() {
    init_process_global();
    init_SetCache();
    init_arraySome();
    init_cacheHas();
    COMPARE_PARTIAL_FLAG = 1;
    COMPARE_UNORDERED_FLAG = 2;
    __name(equalArrays, "equalArrays");
    equalArrays_default = equalArrays;
  }
});

// node_modules/lodash-es/_mapToArray.js
function mapToArray(map) {
  var index = -1, result = Array(map.size);
  map.forEach(function(value, key) {
    result[++index] = [key, value];
  });
  return result;
}
var mapToArray_default;
var init_mapToArray = __esm({
  "node_modules/lodash-es/_mapToArray.js"() {
    init_process_global();
    __name(mapToArray, "mapToArray");
    mapToArray_default = mapToArray;
  }
});

// node_modules/lodash-es/_setToArray.js
function setToArray(set) {
  var index = -1, result = Array(set.size);
  set.forEach(function(value) {
    result[++index] = value;
  });
  return result;
}
var setToArray_default;
var init_setToArray = __esm({
  "node_modules/lodash-es/_setToArray.js"() {
    init_process_global();
    __name(setToArray, "setToArray");
    setToArray_default = setToArray;
  }
});

// node_modules/lodash-es/_equalByTag.js
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
  switch (tag) {
    case dataViewTag3:
      if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
        return false;
      }
      object = object.buffer;
      other = other.buffer;
    case arrayBufferTag2:
      if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array_default(object), new Uint8Array_default(other))) {
        return false;
      }
      return true;
    case boolTag2:
    case dateTag2:
    case numberTag2:
      return eq_default(+object, +other);
    case errorTag2:
      return object.name == other.name && object.message == other.message;
    case regexpTag2:
    case stringTag2:
      return object == other + "";
    case mapTag3:
      var convert = mapToArray_default;
    case setTag3:
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG2;
      convert || (convert = setToArray_default);
      if (object.size != other.size && !isPartial) {
        return false;
      }
      var stacked = stack.get(object);
      if (stacked) {
        return stacked == other;
      }
      bitmask |= COMPARE_UNORDERED_FLAG2;
      stack.set(object, other);
      var result = equalArrays_default(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
      stack["delete"](object);
      return result;
    case symbolTag:
      if (symbolValueOf) {
        return symbolValueOf.call(object) == symbolValueOf.call(other);
      }
  }
  return false;
}
var COMPARE_PARTIAL_FLAG2, COMPARE_UNORDERED_FLAG2, boolTag2, dateTag2, errorTag2, mapTag3, numberTag2, regexpTag2, setTag3, stringTag2, symbolTag, arrayBufferTag2, dataViewTag3, symbolProto, symbolValueOf, equalByTag_default;
var init_equalByTag = __esm({
  "node_modules/lodash-es/_equalByTag.js"() {
    init_process_global();
    init_Symbol();
    init_Uint8Array();
    init_eq();
    init_equalArrays();
    init_mapToArray();
    init_setToArray();
    COMPARE_PARTIAL_FLAG2 = 1;
    COMPARE_UNORDERED_FLAG2 = 2;
    boolTag2 = "[object Boolean]";
    dateTag2 = "[object Date]";
    errorTag2 = "[object Error]";
    mapTag3 = "[object Map]";
    numberTag2 = "[object Number]";
    regexpTag2 = "[object RegExp]";
    setTag3 = "[object Set]";
    stringTag2 = "[object String]";
    symbolTag = "[object Symbol]";
    arrayBufferTag2 = "[object ArrayBuffer]";
    dataViewTag3 = "[object DataView]";
    symbolProto = Symbol_default ? Symbol_default.prototype : void 0;
    symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
    __name(equalByTag, "equalByTag");
    equalByTag_default = equalByTag;
  }
});

// node_modules/lodash-es/_equalObjects.js
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
  var isPartial = bitmask & COMPARE_PARTIAL_FLAG3, objProps = getAllKeys_default(object), objLength = objProps.length, othProps = getAllKeys_default(other), othLength = othProps.length;
  if (objLength != othLength && !isPartial) {
    return false;
  }
  var index = objLength;
  while (index--) {
    var key = objProps[index];
    if (!(isPartial ? key in other : hasOwnProperty8.call(other, key))) {
      return false;
    }
  }
  var objStacked = stack.get(object);
  var othStacked = stack.get(other);
  if (objStacked && othStacked) {
    return objStacked == other && othStacked == object;
  }
  var result = true;
  stack.set(object, other);
  stack.set(other, object);
  var skipCtor = isPartial;
  while (++index < objLength) {
    key = objProps[index];
    var objValue = object[key], othValue = other[key];
    if (customizer) {
      var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
    }
    if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
      result = false;
      break;
    }
    skipCtor || (skipCtor = key == "constructor");
  }
  if (result && !skipCtor) {
    var objCtor = object.constructor, othCtor = other.constructor;
    if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
      result = false;
    }
  }
  stack["delete"](object);
  stack["delete"](other);
  return result;
}
var COMPARE_PARTIAL_FLAG3, objectProto11, hasOwnProperty8, equalObjects_default;
var init_equalObjects = __esm({
  "node_modules/lodash-es/_equalObjects.js"() {
    init_process_global();
    init_getAllKeys();
    COMPARE_PARTIAL_FLAG3 = 1;
    objectProto11 = Object.prototype;
    hasOwnProperty8 = objectProto11.hasOwnProperty;
    __name(equalObjects, "equalObjects");
    equalObjects_default = equalObjects;
  }
});

// node_modules/lodash-es/_baseIsEqualDeep.js
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
  var objIsArr = isArray_default(object), othIsArr = isArray_default(other), objTag = objIsArr ? arrayTag2 : getTag_default(object), othTag = othIsArr ? arrayTag2 : getTag_default(other);
  objTag = objTag == argsTag3 ? objectTag3 : objTag;
  othTag = othTag == argsTag3 ? objectTag3 : othTag;
  var objIsObj = objTag == objectTag3, othIsObj = othTag == objectTag3, isSameTag = objTag == othTag;
  if (isSameTag && isBuffer_default(object)) {
    if (!isBuffer_default(other)) {
      return false;
    }
    objIsArr = true;
    objIsObj = false;
  }
  if (isSameTag && !objIsObj) {
    stack || (stack = new Stack_default());
    return objIsArr || isTypedArray_default(object) ? equalArrays_default(object, other, bitmask, customizer, equalFunc, stack) : equalByTag_default(object, other, objTag, bitmask, customizer, equalFunc, stack);
  }
  if (!(bitmask & COMPARE_PARTIAL_FLAG4)) {
    var objIsWrapped = objIsObj && hasOwnProperty9.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty9.call(other, "__wrapped__");
    if (objIsWrapped || othIsWrapped) {
      var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
      stack || (stack = new Stack_default());
      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
    }
  }
  if (!isSameTag) {
    return false;
  }
  stack || (stack = new Stack_default());
  return equalObjects_default(object, other, bitmask, customizer, equalFunc, stack);
}
var COMPARE_PARTIAL_FLAG4, argsTag3, arrayTag2, objectTag3, objectProto12, hasOwnProperty9, baseIsEqualDeep_default;
var init_baseIsEqualDeep = __esm({
  "node_modules/lodash-es/_baseIsEqualDeep.js"() {
    init_process_global();
    init_Stack();
    init_equalArrays();
    init_equalByTag();
    init_equalObjects();
    init_getTag();
    init_isArray();
    init_isBuffer();
    init_isTypedArray();
    COMPARE_PARTIAL_FLAG4 = 1;
    argsTag3 = "[object Arguments]";
    arrayTag2 = "[object Array]";
    objectTag3 = "[object Object]";
    objectProto12 = Object.prototype;
    hasOwnProperty9 = objectProto12.hasOwnProperty;
    __name(baseIsEqualDeep, "baseIsEqualDeep");
    baseIsEqualDeep_default = baseIsEqualDeep;
  }
});

// node_modules/lodash-es/_baseIsEqual.js
function baseIsEqual(value, other, bitmask, customizer, stack) {
  if (value === other) {
    return true;
  }
  if (value == null || other == null || !isObjectLike_default(value) && !isObjectLike_default(other)) {
    return value !== value && other !== other;
  }
  return baseIsEqualDeep_default(value, other, bitmask, customizer, baseIsEqual, stack);
}
var baseIsEqual_default;
var init_baseIsEqual = __esm({
  "node_modules/lodash-es/_baseIsEqual.js"() {
    init_process_global();
    init_baseIsEqualDeep();
    init_isObjectLike();
    __name(baseIsEqual, "baseIsEqual");
    baseIsEqual_default = baseIsEqual;
  }
});

// node_modules/lodash-es/isEqual.js
function isEqual(value, other) {
  return baseIsEqual_default(value, other);
}
var isEqual_default;
var init_isEqual = __esm({
  "node_modules/lodash-es/isEqual.js"() {
    init_process_global();
    init_baseIsEqual();
    __name(isEqual, "isEqual");
    isEqual_default = isEqual;
  }
});

// node_modules/lodash-es/lodash.js
var init_lodash = __esm({
  "node_modules/lodash-es/lodash.js"() {
    init_process_global();
    init_isEqual();
    /**
     * @license
     * Lodash (Custom Build) <https://lodash.com/>
     * Build: `lodash modularize exports="es" -o ./`
     * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
     * Released under MIT license <https://lodash.com/license>
     * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
     * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
     */
  }
});

// core/lib/lh-env.js
import process4 from "process";
var isUnderTest;
var init_lh_env = __esm({
  "core/lib/lh-env.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    isUnderTest = !!process4.env.CI || process4.env.NODE_ENV === "test";
  }
});

// shared/statistics.js
function erf(x) {
  const sign = Math.sign(x);
  x = Math.abs(x);
  const a1 = 0.254829592;
  const a2 = -0.284496736;
  const a3 = 1.421413741;
  const a4 = -1.453152027;
  const a5 = 1.061405429;
  const p = 0.3275911;
  const t = 1 / (1 + p * x);
  const y = t * (a1 + t * (a2 + t * (a3 + t * (a4 + t * a5))));
  return sign * (1 - y * Math.exp(-x * x));
}
function getLogNormalScore({ median, p10 }, value) {
  if (median <= 0) throw new Error("median must be greater than zero");
  if (p10 <= 0) throw new Error("p10 must be greater than zero");
  if (p10 >= median) throw new Error("p10 must be less than the median");
  if (value <= 0) return 1;
  const INVERSE_ERFC_ONE_FIFTH = 0.9061938024368232;
  const xRatio = Math.max(Number.MIN_VALUE, value / median);
  const xLogRatio = Math.log(xRatio);
  const p10Ratio = Math.max(Number.MIN_VALUE, p10 / median);
  const p10LogRatio = -Math.log(p10Ratio);
  const standardizedX = xLogRatio * INVERSE_ERFC_ONE_FIFTH / p10LogRatio;
  const complementaryPercentile = (1 - erf(standardizedX)) / 2;
  let score;
  if (value <= p10) {
    score = Math.max(MIN_PASSING_SCORE, Math.min(1, complementaryPercentile));
  } else if (value <= median) {
    score = Math.max(MIN_AVERAGE_SCORE, Math.min(MAX_AVERAGE_SCORE, complementaryPercentile));
  } else {
    score = Math.max(0, Math.min(MAX_FAILING_SCORE, complementaryPercentile));
  }
  return score;
}
var MIN_PASSING_SCORE, MAX_AVERAGE_SCORE, MIN_AVERAGE_SCORE, MAX_FAILING_SCORE;
var init_statistics = __esm({
  "shared/statistics.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    MIN_PASSING_SCORE = 0.9;
    MAX_AVERAGE_SCORE = 0.8999999999999999;
    MIN_AVERAGE_SCORE = 0.5;
    MAX_FAILING_SCORE = 0.49999999999999994;
    __name(erf, "erf");
    __name(getLogNormalScore, "getLogNormalScore");
  }
});

// shared/util.js
var ELLIPSIS, NBSP, PASS_THRESHOLD, RATINGS, listOfTlds, Util;
var init_util = __esm({
  "shared/util.js"() {
    "use strict";
    init_process_global();
    init_statistics();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ELLIPSIS = "…";
    NBSP = " ";
    PASS_THRESHOLD = 0.9;
    RATINGS = {
      PASS: { label: "pass", minScore: PASS_THRESHOLD },
      AVERAGE: { label: "average", minScore: 0.5 },
      FAIL: { label: "fail" },
      ERROR: { label: "error" }
    };
    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"
    ];
    Util = class _Util {
      static {
        __name(this, "Util");
      }
      static get RATINGS() {
        return RATINGS;
      }
      static get PASS_THRESHOLD() {
        return PASS_THRESHOLD;
      }
      static get MS_DISPLAY_VALUE() {
        return `%10d${NBSP}ms`;
      }
      /**
       * If LHR is older than 10.0 it will not have the `finalDisplayedUrl` property.
       * Old LHRs should have the `finalUrl` property which will work fine for the report.
       *
       * @param {LH.Result} lhr
       */
      static getFinalDisplayedUrl(lhr) {
        if (lhr.finalDisplayedUrl) return lhr.finalDisplayedUrl;
        if (lhr.finalUrl) return lhr.finalUrl;
        throw new Error("Could not determine final displayed URL");
      }
      /**
       * If LHR is older than 10.0 it will not have the `mainDocumentUrl` property.
       * Old LHRs should have the `finalUrl` property which is the same as `mainDocumentUrl`.
       *
       * @param {LH.Result} lhr
       */
      static getMainDocumentUrl(lhr) {
        return lhr.mainDocumentUrl || lhr.finalUrl;
      }
      /**
       * @param {LH.Result} lhr
       * @return {LH.Result.FullPageScreenshot=}
       */
      static getFullPageScreenshot(lhr) {
        if (lhr.fullPageScreenshot) {
          return lhr.fullPageScreenshot;
        }
        const details = (
          /** @type {LH.Result.FullPageScreenshot=} */
          lhr.audits["full-page-screenshot"]?.details
        );
        return details;
      }
      /**
       * Given the entity classification dataset and a URL, identify the entity.
       * @param {string} url
       * @param {LH.Result.Entities=} entities
       * @return {LH.Result.LhrEntity|string}
       */
      static getEntityFromUrl(url, entities) {
        if (!entities) {
          return _Util.getPseudoRootDomain(url);
        }
        const entity = entities.find((e) => e.origins.find((origin) => url.startsWith(origin)));
        return entity || _Util.getPseudoRootDomain(url);
      }
      /**
       * Split a string by markdown code spans (enclosed in `backticks`), splitting
       * into segments that were enclosed in backticks (marked as `isCode === true`)
       * and those that outside the backticks (`isCode === false`).
       * @param {string} text
       * @return {Array<{isCode: true, text: string}|{isCode: false, text: string}>}
       */
      static splitMarkdownCodeSpans(text) {
        const segments = [];
        const parts = text.split(/`(.*?)`/g);
        for (let i = 0; i < parts.length; i++) {
          const text2 = parts[i];
          if (!text2) continue;
          const isCode = i % 2 !== 0;
          segments.push({
            isCode,
            text: text2
          });
        }
        return segments;
      }
      /**
       * Split a string on markdown links (e.g. [some link](https://...)) into
       * segments of plain text that weren't part of a link (marked as
       * `isLink === false`), and segments with text content and a URL that did make
       * up a link (marked as `isLink === true`).
       * @param {string} text
       * @return {Array<{isLink: true, text: string, linkHref: string}|{isLink: false, text: string}>}
       */
      static splitMarkdownLink(text) {
        const segments = [];
        const parts = text.split(/\[([^\]]+?)\]\((https?:\/\/.*?)\)/g);
        while (parts.length) {
          const [preambleText, linkText, linkHref] = parts.splice(0, 3);
          if (preambleText) {
            segments.push({
              isLink: false,
              text: preambleText
            });
          }
          if (linkText && linkHref) {
            segments.push({
              isLink: true,
              text: linkText,
              linkHref
            });
          }
        }
        return segments;
      }
      /**
       * @param {string} string
       * @param {number} characterLimit
       * @param {string} ellipseSuffix
       */
      static truncate(string, characterLimit, ellipseSuffix = "…") {
        if (string.length <= characterLimit) {
          return string;
        }
        const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
        const iterator = segmenter.segment(string)[Symbol.iterator]();
        let lastSegmentIndex = 0;
        for (let i = 0; i <= characterLimit - ellipseSuffix.length; i++) {
          const result = iterator.next();
          if (result.done) {
            return string;
          }
          lastSegmentIndex = result.value.index;
        }
        for (let i = 0; i < ellipseSuffix.length; i++) {
          if (iterator.next().done) {
            return string;
          }
        }
        return string.slice(0, lastSegmentIndex) + ellipseSuffix;
      }
      /**
       * @param {URL} parsedUrl
       * @param {{numPathParts?: number, preserveQuery?: boolean, preserveHost?: boolean}=} options
       * @return {string}
       */
      static getURLDisplayName(parsedUrl, options) {
        options = options || {
          numPathParts: void 0,
          preserveQuery: void 0,
          preserveHost: void 0
        };
        const numPathParts = options.numPathParts !== void 0 ? options.numPathParts : 2;
        const preserveQuery = options.preserveQuery !== void 0 ? options.preserveQuery : true;
        const preserveHost = options.preserveHost || false;
        let name;
        if (parsedUrl.protocol === "about:" || parsedUrl.protocol === "data:") {
          name = parsedUrl.href;
        } else {
          name = parsedUrl.pathname;
          const parts = name.split("/").filter((part) => part.length);
          if (numPathParts && parts.length > numPathParts) {
            name = ELLIPSIS + parts.slice(-1 * numPathParts).join("/");
          }
          if (preserveHost) {
            name = `${parsedUrl.host}/${name.replace(/^\//, "")}`;
          }
          if (preserveQuery) {
            name = `${name}${parsedUrl.search}`;
          }
        }
        const MAX_LENGTH = 64;
        if (parsedUrl.protocol !== "data:") {
          name = name.slice(0, 200);
          name = name.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g, `$1${ELLIPSIS}`);
          name = name.replace(
            /([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,
            `$1${ELLIPSIS}`
          );
          name = name.replace(/(\d{3})\d{6,}/g, `$1${ELLIPSIS}`);
          name = name.replace(/\u2026+/g, ELLIPSIS);
          if (name.length > MAX_LENGTH && name.includes("?")) {
            name = name.replace(/\?([^=]*)(=)?.*/, `?$1$2${ELLIPSIS}`);
            if (name.length > MAX_LENGTH) {
              name = name.replace(/\?.*/, `?${ELLIPSIS}`);
            }
          }
        }
        if (name.length > MAX_LENGTH) {
          const dotIndex = name.lastIndexOf(".");
          if (dotIndex >= 0) {
            name = name.slice(0, MAX_LENGTH - 1 - (name.length - dotIndex)) + // Show file extension
            `${ELLIPSIS}${name.slice(dotIndex)}`;
          } else {
            name = name.slice(0, MAX_LENGTH - 1) + ELLIPSIS;
          }
        }
        return name;
      }
      /**
       * Returns the origin portion of a Chrome extension URL.
       * @param {string} url
       * @return {string}
       */
      static getChromeExtensionOrigin(url) {
        const parsedUrl = new URL(url);
        return parsedUrl.protocol + "//" + parsedUrl.host;
      }
      /**
       * Split a URL into a file, hostname and origin for easy display.
       * @param {string} url
       * @return {{file: string, hostname: string, origin: string}}
       */
      static parseURL(url) {
        const parsedUrl = new URL(url);
        return {
          file: _Util.getURLDisplayName(parsedUrl),
          hostname: parsedUrl.hostname,
          // Node's URL parsing behavior is different than Chrome and returns 'null'
          // for chrome-extension:// URLs. See https://github.com/nodejs/node/issues/21955.
          origin: parsedUrl.protocol === "chrome-extension:" ? _Util.getChromeExtensionOrigin(url) : parsedUrl.origin
        };
      }
      /**
       * @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
       * This function is used only while rendering pre-10.0 LHRs.
       *
       * @param {string} hostname
       * @return {string} tld
       */
      static getPseudoTld(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).
       * As it doesn't consult the Public Suffix List, it can sometimes lose detail.
       * See the `listOfTlds` comment above for more.
       * This function is used only while rendering pre-10.0 LHRs. See UrlUtils.getRootDomain
       * for the current method that makes use of PSL.
       * @param {string|URL} url hostname or URL object
       * @return {string}
       */
      static getPseudoRootDomain(url) {
        const hostname = _Util.createOrReturnURL(url).hostname;
        const tld = _Util.getPseudoTld(hostname);
        const splitTld = tld.split(".");
        return hostname.split(".").slice(-splitTld.length).join(".");
      }
      /**
       * Returns only lines that are near a message, or the first few lines if there are
       * no line messages.
       * @param {SnippetValue['lines']} lines
       * @param {SnippetValue['lineMessages']} lineMessages
       * @param {number} surroundingLineCount Number of lines to include before and after
       * the message. If this is e.g. 2 this function might return 5 lines.
       */
      static filterRelevantLines(lines, lineMessages, surroundingLineCount) {
        if (lineMessages.length === 0) {
          return lines.slice(0, surroundingLineCount * 2 + 1);
        }
        const minGapSize = 3;
        const lineNumbersToKeep = /* @__PURE__ */ new Set();
        lineMessages = lineMessages.sort((a, b) => (a.lineNumber || 0) - (b.lineNumber || 0));
        lineMessages.forEach(({ lineNumber }) => {
          let firstSurroundingLineNumber = lineNumber - surroundingLineCount;
          let lastSurroundingLineNumber = lineNumber + surroundingLineCount;
          while (firstSurroundingLineNumber < 1) {
            firstSurroundingLineNumber++;
            lastSurroundingLineNumber++;
          }
          if (lineNumbersToKeep.has(firstSurroundingLineNumber - minGapSize - 1)) {
            firstSurroundingLineNumber -= minGapSize;
          }
          for (let i = firstSurroundingLineNumber; i <= lastSurroundingLineNumber; i++) {
            const surroundingLineNumber = i;
            lineNumbersToKeep.add(surroundingLineNumber);
          }
        });
        return lines.filter((line) => lineNumbersToKeep.has(line.lineNumber));
      }
      /**
       * Computes a score between 0 and 1 based on the measured `value`. Score is determined by
       * considering a log-normal distribution governed by two control points (the 10th
       * percentile value and the median value) and represents the percentage of sites that are
       * greater than `value`.
       *
       * Score characteristics:
       * - within [0, 1]
       * - rounded to two digits
       * - value must meet or beat a controlPoint value to meet or exceed its percentile score:
       *   - value > median will give a score < 0.5; value ≤ median will give a score ≥ 0.5.
       *   - value > p10 will give a score < 0.9; value ≤ p10 will give a score ≥ 0.9.
       * - values < p10 will get a slight boost so a score of 1 is achievable by a
       *   `value` other than those close to 0. Scores of > ~0.99524 end up rounded to 1.
       * @param {{median: number, p10: number}} controlPoints
       * @param {number} value
       * @return {number}
       */
      static computeLogNormalScore(controlPoints, value) {
        let percentile = getLogNormalScore(controlPoints, value);
        if (percentile > 0.9) {
          percentile += 0.05 * (percentile - 0.9);
        }
        return Math.floor(percentile * 100) / 100;
      }
    };
  }
});

// core/audits/audit.js
var METRIC_SAVINGS_PRECISION, clampTo2Decimals, Audit;
var init_audit = __esm({
  "core/audits/audit.js"() {
    "use strict";
    init_process_global();
    init_lh();
    init_lh_env();
    init_util();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    METRIC_SAVINGS_PRECISION = {
      FCP: 50,
      LCP: 50,
      INP: 50,
      TBT: 50,
      CLS: 1e-3
    };
    clampTo2Decimals = /* @__PURE__ */ __name((val) => Math.round(val * 100) / 100, "clampTo2Decimals");
    Audit = class _Audit {
      static {
        __name(this, "Audit");
      }
      /**
       * @return {LH.Audit.ScoreDisplayModes}
       */
      static get SCORING_MODES() {
        return {
          NUMERIC: "numeric",
          METRIC_SAVINGS: "metricSavings",
          BINARY: "binary",
          MANUAL: "manual",
          INFORMATIVE: "informative",
          NOT_APPLICABLE: "notApplicable",
          ERROR: "error"
        };
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        throw new Error("Audit meta information must be overridden.");
      }
      /**
       * @return {Object}
       */
      static get defaultOptions() {
        return {};
      }
      /* eslint-disable no-unused-vars */
      /**
       *
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {LH.Audit.Product|Promise<LH.Audit.Product>}
       */
      static audit(artifacts, context) {
        throw new Error("audit() method must be overridden");
      }
      /* eslint-enable no-unused-vars */
      /**
       * Computes a score between 0 and 1 based on the measured `value`. Score is determined by
       * considering a log-normal distribution governed by two control points (the 10th
       * percentile value and the median value) and represents the percentage of sites that are
       * greater than `value`.
       *
       * Score characteristics:
       * - within [0, 1]
       * - rounded to two digits
       * - value must meet or beat a controlPoint value to meet or exceed its percentile score:
       *   - value > median will give a score < 0.5; value ≤ median will give a score ≥ 0.5.
       *   - value > p10 will give a score < 0.9; value ≤ p10 will give a score ≥ 0.9.
       * - values < p10 will get a slight boost so a score of 1 is achievable by a
       *   `value` other than those close to 0. Scores of > ~0.99524 end up rounded to 1.
       * @param {{median: number, p10: number}} controlPoints
       * @param {number} value
       * @return {number}
       */
      static computeLogNormalScore(controlPoints, value) {
        return Util.computeLogNormalScore(controlPoints, value);
      }
      /**
       * This catches typos in the `key` property of a heading definition of table/opportunity details.
       * Throws an error if any of keys referenced by headings don't exist in at least one of the items.
       *
       * @param {LH.Audit.Details.Table['headings']|LH.Audit.Details.Opportunity['headings']} headings
       * @param {LH.Audit.Details.Opportunity['items']|LH.Audit.Details.Table['items']} items
       */
      static assertHeadingKeysExist(headings, items) {
        if (!items.length) return;
        if (!isUnderTest) return;
        for (const heading of headings) {
          if (heading.key === null) continue;
          const key = heading.key;
          if (items.some((item) => key in item)) continue;
          throw new Error(`"${heading.key}" is missing from items`);
        }
      }
      /**
       * @param {LH.Audit.Details.Checklist['items']} items
       * @return {LH.Audit.Details.Checklist}
       */
      static makeChecklistDetails(items) {
        return {
          type: "checklist",
          items
        };
      }
      /**
       * @param {LH.Audit.Details.Table['headings']} headings
       * @param {LH.Audit.Details.Table['items']} results
       * @param {TableOptions=} options
       * @return {LH.Audit.Details.Table}
       */
      static makeTableDetails(headings, results, options = {}) {
        const { wastedBytes, wastedMs, sortedBy, skipSumming, isEntityGrouped } = options;
        const summary = wastedBytes || wastedMs ? { wastedBytes, wastedMs } : void 0;
        if (results.length === 0) {
          return {
            type: "table",
            headings,
            items: [],
            summary
          };
        }
        _Audit.assertHeadingKeysExist(headings, results);
        return {
          type: "table",
          headings,
          items: results,
          summary,
          sortedBy,
          skipSumming,
          isEntityGrouped
        };
      }
      /**
       * @param {LH.Audit.Details.List['items']} items
       * @return {LH.Audit.Details.List}
       */
      static makeListDetails(items) {
        return {
          type: "list",
          items
        };
      }
      /**
       * @param {LH.IcuMessage | string=} title
       * @param {LH.IcuMessage | string=} description
       * @param {LH.Audit.Details.ListableDetail} value
       * @return {LH.Audit.Details.ListSectionItem}
       */
      static makeListDetailSectionItem(value, title, description) {
        return {
          type: "list-section",
          title,
          description,
          value
        };
      }
      /** @typedef {{
       * content: string;
       * title: string;
       * lineMessages: LH.Audit.Details.SnippetValue['lineMessages'];
       * generalMessages: LH.Audit.Details.SnippetValue['generalMessages'];
       * node?: LH.Audit.Details.NodeValue;
       * maxLineLength?: number;
       * maxLinesAroundMessage?: number;
       * }} SnippetInfo */
      /**
       * @param {SnippetInfo} snippetInfo
       * @return {LH.Audit.Details.SnippetValue}
       */
      static makeSnippetDetails({
        content,
        title,
        lineMessages,
        generalMessages,
        node,
        maxLineLength = 200,
        maxLinesAroundMessage = 20
      }) {
        const allLines = _Audit._makeSnippetLinesArray(content, maxLineLength);
        const lines = Util.filterRelevantLines(allLines, lineMessages, maxLinesAroundMessage);
        return {
          type: "snippet",
          lines,
          title,
          lineMessages,
          generalMessages,
          lineCount: allLines.length,
          node
        };
      }
      /**
       * @param {string} content
       * @param {number} maxLineLength
       * @return {LH.Audit.Details.SnippetValue['lines']}
       */
      static _makeSnippetLinesArray(content, maxLineLength) {
        return content.split("\n").map((line, lineIndex) => {
          const lineNumber = lineIndex + 1;
          const lineDetail = {
            content: Util.truncate(line, maxLineLength),
            lineNumber
          };
          if (line.length > maxLineLength) {
            lineDetail.truncated = true;
          }
          return lineDetail;
        });
      }
      /**
       * @param {LH.Audit.Details.Opportunity['headings']} headings
       * @param {LH.Audit.Details.Opportunity['items']} items
       * @param {OpportunityOptions} options
       * @return {LH.Audit.Details.Opportunity}
       */
      static makeOpportunityDetails(headings, items, options) {
        _Audit.assertHeadingKeysExist(headings, items);
        const { overallSavingsMs, overallSavingsBytes, sortedBy, skipSumming, isEntityGrouped } = options;
        return {
          type: "opportunity",
          headings: items.length === 0 ? [] : headings,
          items,
          overallSavingsMs,
          overallSavingsBytes,
          sortedBy,
          skipSumming,
          isEntityGrouped
        };
      }
      /**
       * @param {LH.Artifacts.NodeDetails} node
       * @return {LH.Audit.Details.NodeValue}
       */
      static makeNodeItem(node) {
        return {
          type: "node",
          lhId: node.lhId,
          path: node.devtoolsNodePath,
          selector: node.selector,
          boundingRect: node.boundingRect,
          snippet: node.snippet,
          nodeLabel: node.nodeLabel
        };
      }
      /**
       * @param {LH.Artifacts.Bundle} bundle
       * @param {number} generatedLine
       * @param {number} generatedColumn
       * @return {LH.Audit.Details.SourceLocationValue['original']}
       */
      static _findOriginalLocation(bundle, generatedLine, generatedColumn) {
        const entry = bundle?.map.findEntry(generatedLine, generatedColumn);
        if (!entry) return;
        return {
          file: entry.sourceURL || "",
          line: entry.sourceLineNumber || 0,
          column: entry.sourceColumnNumber || 0
        };
      }
      /**
       * @param {string} url
       * @param {number} line 0-indexed
       * @param {number} column 0-indexed
       * @param {LH.Artifacts.Bundle=} bundle
       * @return {LH.Audit.Details.SourceLocationValue}
       */
      static makeSourceLocation(url, line, column, bundle) {
        return {
          type: "source-location",
          url,
          urlProvider: "network",
          line,
          column,
          original: bundle && this._findOriginalLocation(bundle, line, column)
        };
      }
      /**
       * @param {LH.Artifacts.ConsoleMessage} entry
       * @param {LH.Artifacts.Bundle=} bundle
       * @return {LH.Audit.Details.SourceLocationValue | undefined}
       */
      static makeSourceLocationFromConsoleMessage(entry, bundle) {
        if (!entry.url) return;
        const line = entry.lineNumber || 0;
        const column = entry.columnNumber || 0;
        return this.makeSourceLocation(entry.url, line, column, bundle);
      }
      /**
       * @param {number|null} score
       * @param {LH.Audit.ScoreDisplayMode} scoreDisplayMode
       * @param {string} auditId
       * @return {number|null}
       */
      static _normalizeAuditScore(score, scoreDisplayMode, auditId) {
        if (scoreDisplayMode === _Audit.SCORING_MODES.INFORMATIVE) {
          return 1;
        }
        if (scoreDisplayMode !== _Audit.SCORING_MODES.BINARY && scoreDisplayMode !== _Audit.SCORING_MODES.NUMERIC && scoreDisplayMode !== _Audit.SCORING_MODES.METRIC_SAVINGS) {
          return null;
        }
        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);
        return score;
      }
      /**
       * @param {LH.Audit.ProductMetricSavings|undefined} metricSavings
       * @return {LH.Audit.ProductMetricSavings|undefined}
       */
      static _quantizeMetricSavings(metricSavings) {
        if (!metricSavings) return;
        const normalizedMetricSavings = { ...metricSavings };
        for (
          const key of
          /** @type {Array<keyof LH.Audit.ProductMetricSavings>} */
          Object.keys(metricSavings)
        ) {
          let value = metricSavings[key];
          if (value === void 0) continue;
          value = Math.max(value, 0);
          const precision = METRIC_SAVINGS_PRECISION[key];
          if (precision !== void 0) {
            value = Math.round(value / precision) * precision;
          }
          normalizedMetricSavings[key] = value;
        }
        return normalizedMetricSavings;
      }
      /**
       * @param {typeof Audit} audit
       * @param {string | LH.IcuMessage} errorMessage
       * @param {string=} errorStack
       * @return {LH.RawIcu<LH.Audit.Result>}
       */
      static generateErrorAuditResult(audit, errorMessage, errorStack) {
        return _Audit.generateAuditResult(audit, {
          score: null,
          errorMessage,
          errorStack
        });
      }
      /**
       * @param {typeof Audit} audit
       * @param {LH.Audit.Product} product
       * @return {LH.RawIcu<LH.Audit.Result>}
       */
      static generateAuditResult(audit, product) {
        if (product.score === void 0) {
          throw new Error("generateAuditResult requires a score");
        }
        let scoreDisplayMode = audit.meta.scoreDisplayMode || _Audit.SCORING_MODES.BINARY;
        let score = product.score;
        if (product.errorMessage !== void 0) {
          scoreDisplayMode = _Audit.SCORING_MODES.ERROR;
        } else if (product.notApplicable) {
          scoreDisplayMode = _Audit.SCORING_MODES.NOT_APPLICABLE;
        } else if (product.scoreDisplayMode) {
          scoreDisplayMode = product.scoreDisplayMode;
        }
        const metricSavings = _Audit._quantizeMetricSavings(product.metricSavings);
        const hasSomeSavings = Object.values(metricSavings || {}).some((v) => v);
        if (scoreDisplayMode === _Audit.SCORING_MODES.METRIC_SAVINGS) {
          if (score && score >= Util.PASS_THRESHOLD) {
            score = 1;
          } else if (hasSomeSavings) {
            score = 0;
          } else {
            score = 0.5;
          }
        }
        score = _Audit._normalizeAuditScore(score, scoreDisplayMode, audit.meta.id);
        let auditTitle = audit.meta.title;
        if (audit.meta.failureTitle) {
          if (score !== null && score < Util.PASS_THRESHOLD) {
            auditTitle = audit.meta.failureTitle;
          }
        }
        const numericProduct = "numericUnit" in product ? product : void 0;
        return {
          id: audit.meta.id,
          title: auditTitle,
          description: audit.meta.description,
          score,
          scoreDisplayMode,
          numericValue: numericProduct?.numericValue,
          numericUnit: numericProduct?.numericUnit,
          displayValue: product.displayValue,
          explanation: product.explanation,
          errorMessage: product.errorMessage,
          errorStack: product.errorStack,
          warnings: product.warnings,
          scoringOptions: product.scoringOptions,
          metricSavings,
          details: product.details,
          guidanceLevel: audit.meta.guidanceLevel
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @returns {LH.Artifacts.MetricComputationDataInput}
       */
      static makeMetricComputationDataInput(artifacts, context) {
        const trace = artifacts.Trace;
        const devtoolsLog = artifacts.DevtoolsLog;
        const gatherContext = artifacts.GatherContext;
        const { URL: URL3, HostDPR, SourceMaps: SourceMaps2 } = artifacts;
        return { trace, devtoolsLog, gatherContext, settings: context.settings, URL: URL3, SourceMaps: SourceMaps2, HostDPR, simulator: null };
      }
    };
  }
});

// core/scoring.js
var clampTo2Decimals2, ReportScoring;
var init_scoring = __esm({
  "core/scoring.js"() {
    "use strict";
    init_process_global();
    init_audit();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    clampTo2Decimals2 = /* @__PURE__ */ __name((val) => Math.round(val * 100) / 100, "clampTo2Decimals");
    ReportScoring = class _ReportScoring {
      static {
        __name(this, "ReportScoring");
      }
      /**
       * Computes the weighted-average of the score of the list of items.
       * @param {Array<{score: number|null, weight: number}>} items
       * @return {number|null}
       */
      static arithmeticMean(items) {
        items = items.filter((item) => item.weight > 0);
        if (items.some((item) => item.score === null)) return null;
        const results = items.reduce(
          (result, item) => {
            const score = item.score;
            const weight = item.weight;
            return {
              weight: result.weight + weight,
              sum: result.sum + /** @type {number} */
              score * weight
            };
          },
          { weight: 0, sum: 0 }
        );
        return clampTo2Decimals2(results.sum / results.weight || 0);
      }
      /**
       * Returns the report JSON object with computed scores.
       * @param {Object<string, LH.Config.Category>} configCategories
       * @param {Object<string, LH.RawIcu<LH.Audit.Result>>} resultsByAuditId
       * @return {Object<string, LH.RawIcu<LH.Result.Category>>}
       */
      static scoreAllCategories(configCategories, resultsByAuditId) {
        const scoredCategories = {};
        for (const [categoryId, configCategory] of Object.entries(configCategories)) {
          const auditRefs = configCategory.auditRefs.map((configMember) => {
            const member = { ...configMember };
            const result = resultsByAuditId[member.id];
            if (result.scoreDisplayMode === Audit.SCORING_MODES.NOT_APPLICABLE || result.scoreDisplayMode === Audit.SCORING_MODES.INFORMATIVE || result.scoreDisplayMode === Audit.SCORING_MODES.MANUAL) {
              member.weight = 0;
            }
            return member;
          });
          const scores = auditRefs.map((auditRef) => ({
            score: resultsByAuditId[auditRef.id].score,
            weight: auditRef.weight
          }));
          const score = _ReportScoring.arithmeticMean(scores);
          scoredCategories[categoryId] = {
            ...configCategory,
            auditRefs,
            id: categoryId,
            score
          };
        }
        return scoredCategories;
      }
    };
  }
});

// node_modules/intl-messageformat/node_modules/tslib/tslib.es6.mjs
var tslib_es6_exports = {};
__export(tslib_es6_exports, {
  __addDisposableResource: () => __addDisposableResource,
  __assign: () => __assign,
  __asyncDelegator: () => __asyncDelegator,
  __asyncGenerator: () => __asyncGenerator,
  __asyncValues: () => __asyncValues,
  __await: () => __await,
  __awaiter: () => __awaiter,
  __classPrivateFieldGet: () => __classPrivateFieldGet,
  __classPrivateFieldIn: () => __classPrivateFieldIn,
  __classPrivateFieldSet: () => __classPrivateFieldSet,
  __createBinding: () => __createBinding,
  __decorate: () => __decorate,
  __disposeResources: () => __disposeResources,
  __esDecorate: () => __esDecorate,
  __exportStar: () => __exportStar,
  __extends: () => __extends,
  __generator: () => __generator,
  __importDefault: () => __importDefault,
  __importStar: () => __importStar,
  __makeTemplateObject: () => __makeTemplateObject,
  __metadata: () => __metadata,
  __param: () => __param,
  __propKey: () => __propKey,
  __read: () => __read,
  __rest: () => __rest,
  __runInitializers: () => __runInitializers,
  __setFunctionName: () => __setFunctionName,
  __spread: () => __spread,
  __spreadArray: () => __spreadArray,
  __spreadArrays: () => __spreadArrays,
  __values: () => __values,
  default: () => tslib_es6_default
});
function __extends(d, b) {
  if (typeof b !== "function" && b !== null)
    throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  extendStatics(d, b);
  function __() {
    this.constructor = d;
  }
  __name(__, "__");
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __rest(s, e) {
  var t = {};
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
    t[p] = s[p];
  if (s != null && typeof Object.getOwnPropertySymbols === "function")
    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
      if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
        t[p[i]] = s[p[i]];
    }
  return t;
}
function __decorate(decorators, target, key, desc) {
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param(paramIndex, decorator) {
  return function(target, key) {
    decorator(target, key, paramIndex);
  };
}
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
  function accept(f) {
    if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected");
    return f;
  }
  __name(accept, "accept");
  var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
  var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
  var _, done = false;
  for (var i = decorators.length - 1; i >= 0; i--) {
    var context = {};
    for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
    for (var p in contextIn.access) context.access[p] = contextIn.access[p];
    context.addInitializer = function(f) {
      if (done) throw new TypeError("Cannot add initializers after decoration has completed");
      extraInitializers.push(accept(f || null));
    };
    var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
    if (kind === "accessor") {
      if (result === void 0) continue;
      if (result === null || typeof result !== "object") throw new TypeError("Object expected");
      if (_ = accept(result.get)) descriptor.get = _;
      if (_ = accept(result.set)) descriptor.set = _;
      if (_ = accept(result.init)) initializers.unshift(_);
    } else if (_ = accept(result)) {
      if (kind === "field") initializers.unshift(_);
      else descriptor[key] = _;
    }
  }
  if (target) Object.defineProperty(target, contextIn.name, descriptor);
  done = true;
}
function __runInitializers(thisArg, initializers, value) {
  var useValue = arguments.length > 2;
  for (var i = 0; i < initializers.length; i++) {
    value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
  }
  return useValue ? value : void 0;
}
function __propKey(x) {
  return typeof x === "symbol" ? x : "".concat(x);
}
function __setFunctionName(f, name, prefix) {
  if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
  return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
}
function __metadata(metadataKey, metadataValue) {
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter(thisArg, _arguments, P, generator) {
  function adopt(value) {
    return value instanceof P ? value : new P(function(resolve) {
      resolve(value);
    });
  }
  __name(adopt, "adopt");
  return new (P || (P = Promise))(function(resolve, reject) {
    function fulfilled(value) {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    }
    __name(fulfilled, "fulfilled");
    function rejected(value) {
      try {
        step(generator["throw"](value));
      } catch (e) {
        reject(e);
      }
    }
    __name(rejected, "rejected");
    function step(result) {
      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
    }
    __name(step, "step");
    step((generator = generator.apply(thisArg, _arguments || [])).next());
  });
}
function __generator(thisArg, body) {
  var _ = { label: 0, sent: /* @__PURE__ */ __name(function() {
    if (t[0] & 1) throw t[1];
    return t[1];
  }, "sent"), trys: [], ops: [] }, f, y, t, g;
  return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
    return this;
  }), g;
  function verb(n) {
    return function(v) {
      return step([n, v]);
    };
  }
  __name(verb, "verb");
  function step(op) {
    if (f) throw new TypeError("Generator is already executing.");
    while (g && (g = 0, op[0] && (_ = 0)), _) try {
      if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
      if (y = 0, t) op = [op[0] & 2, t.value];
      switch (op[0]) {
        case 0:
        case 1:
          t = op;
          break;
        case 4:
          _.label++;
          return { value: op[1], done: false };
        case 5:
          _.label++;
          y = op[1];
          op = [0];
          continue;
        case 7:
          op = _.ops.pop();
          _.trys.pop();
          continue;
        default:
          if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
            _ = 0;
            continue;
          }
          if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
            _.label = op[1];
            break;
          }
          if (op[0] === 6 && _.label < t[1]) {
            _.label = t[1];
            t = op;
            break;
          }
          if (t && _.label < t[2]) {
            _.label = t[2];
            _.ops.push(op);
            break;
          }
          if (t[2]) _.ops.pop();
          _.trys.pop();
          continue;
      }
      op = body.call(thisArg, _);
    } catch (e) {
      op = [6, e];
      y = 0;
    } finally {
      f = t = 0;
    }
    if (op[0] & 5) throw op[1];
    return { value: op[0] ? op[1] : void 0, done: true };
  }
  __name(step, "step");
}
function __exportStar(m, o) {
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
}
function __values(o) {
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  if (m) return m.call(o);
  if (o && typeof o.length === "number") return {
    next: /* @__PURE__ */ __name(function() {
      if (o && i >= o.length) o = void 0;
      return { value: o && o[i++], done: !o };
    }, "next")
  };
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read(o, n) {
  var m = typeof Symbol === "function" && o[Symbol.iterator];
  if (!m) return o;
  var i = m.call(o), r, ar = [], e;
  try {
    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  } catch (error) {
    e = { error };
  } finally {
    try {
      if (r && !r.done && (m = i["return"])) m.call(i);
    } finally {
      if (e) throw e.error;
    }
  }
  return ar;
}
function __spread() {
  for (var ar = [], i = 0; i < arguments.length; i++)
    ar = ar.concat(__read(arguments[i]));
  return ar;
}
function __spreadArrays() {
  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
  for (var r = Array(s), k = 0, i = 0; i < il; i++)
    for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
      r[k] = a[j];
  return r;
}
function __spreadArray(to, from, pack) {
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
    if (ar || !(i in from)) {
      if (!ar) ar = Array.prototype.slice.call(from, 0, i);
      ar[i] = from[i];
    }
  }
  return to.concat(ar || Array.prototype.slice.call(from));
}
function __await(v) {
  return this instanceof __await ? (this.v = v, this) : new __await(v);
}
function __asyncGenerator(thisArg, _arguments, generator) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
  return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
    return this;
  }, i;
  function verb(n) {
    if (g[n]) i[n] = function(v) {
      return new Promise(function(a, b) {
        q.push([n, v, a, b]) > 1 || resume(n, v);
      });
    };
  }
  __name(verb, "verb");
  function resume(n, v) {
    try {
      step(g[n](v));
    } catch (e) {
      settle(q[0][3], e);
    }
  }
  __name(resume, "resume");
  function step(r) {
    r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
  }
  __name(step, "step");
  function fulfill(value) {
    resume("next", value);
  }
  __name(fulfill, "fulfill");
  function reject(value) {
    resume("throw", value);
  }
  __name(reject, "reject");
  function settle(f, v) {
    if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
  }
  __name(settle, "settle");
}
function __asyncDelegator(o) {
  var i, p;
  return i = {}, verb("next"), verb("throw", function(e) {
    throw e;
  }), verb("return"), i[Symbol.iterator] = function() {
    return this;
  }, i;
  function verb(n, f) {
    i[n] = o[n] ? function(v) {
      return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v;
    } : f;
  }
  __name(verb, "verb");
}
function __asyncValues(o) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var m = o[Symbol.asyncIterator], i;
  return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
    return this;
  }, i);
  function verb(n) {
    i[n] = o[n] && function(v) {
      return new Promise(function(resolve, reject) {
        v = o[n](v), settle(resolve, reject, v.done, v.value);
      });
    };
  }
  __name(verb, "verb");
  function settle(resolve, reject, d, v) {
    Promise.resolve(v).then(function(v2) {
      resolve({ value: v2, done: d });
    }, reject);
  }
  __name(settle, "settle");
}
function __makeTemplateObject(cooked, raw) {
  if (Object.defineProperty) {
    Object.defineProperty(cooked, "raw", { value: raw });
  } else {
    cooked.raw = raw;
  }
  return cooked;
}
function __importStar(mod2) {
  if (mod2 && mod2.__esModule) return mod2;
  var result = {};
  if (mod2 != null) {
    for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding(result, mod2, k);
  }
  __setModuleDefault(result, mod2);
  return result;
}
function __importDefault(mod2) {
  return mod2 && mod2.__esModule ? mod2 : { default: mod2 };
}
function __classPrivateFieldGet(receiver, state, kind, f) {
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}
function __classPrivateFieldSet(receiver, state, value, kind, f) {
  if (kind === "m") throw new TypeError("Private method is not writable");
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
}
function __classPrivateFieldIn(state, receiver) {
  if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object");
  return typeof state === "function" ? receiver === state : state.has(receiver);
}
function __addDisposableResource(env, value, async) {
  if (value !== null && value !== void 0) {
    if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
    var dispose;
    if (async) {
      if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
      dispose = value[Symbol.asyncDispose];
    }
    if (dispose === void 0) {
      if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
      dispose = value[Symbol.dispose];
    }
    if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
    env.stack.push({ value, dispose, async });
  } else if (async) {
    env.stack.push({ async: true });
  }
  return value;
}
function __disposeResources(env) {
  function fail(e) {
    env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
    env.hasError = true;
  }
  __name(fail, "fail");
  function next() {
    while (env.stack.length) {
      var rec = env.stack.pop();
      try {
        var result = rec.dispose && rec.dispose.call(rec.value);
        if (rec.async) return Promise.resolve(result).then(next, function(e) {
          fail(e);
          return next();
        });
      } catch (e) {
        fail(e);
      }
    }
    if (env.hasError) throw env.error;
  }
  __name(next, "next");
  return next();
}
var extendStatics, __assign, __createBinding, __setModuleDefault, _SuppressedError, tslib_es6_default;
var init_tslib_es6 = __esm({
  "node_modules/intl-messageformat/node_modules/tslib/tslib.es6.mjs"() {
    init_process_global();
    extendStatics = /* @__PURE__ */ __name(function(d, b) {
      extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
        d2.__proto__ = b2;
      } || function(d2, b2) {
        for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];
      };
      return extendStatics(d, b);
    }, "extendStatics");
    __name(__extends, "__extends");
    __assign = /* @__PURE__ */ __name(function() {
      __assign = Object.assign || /* @__PURE__ */ __name(function __assign4(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
          s = arguments[i];
          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
      }, "__assign");
      return __assign.apply(this, arguments);
    }, "__assign");
    __name(__rest, "__rest");
    __name(__decorate, "__decorate");
    __name(__param, "__param");
    __name(__esDecorate, "__esDecorate");
    __name(__runInitializers, "__runInitializers");
    __name(__propKey, "__propKey");
    __name(__setFunctionName, "__setFunctionName");
    __name(__metadata, "__metadata");
    __name(__awaiter, "__awaiter");
    __name(__generator, "__generator");
    __createBinding = Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      var desc = Object.getOwnPropertyDescriptor(m, k);
      if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
        desc = { enumerable: true, get: /* @__PURE__ */ __name(function() {
          return m[k];
        }, "get") };
      }
      Object.defineProperty(o, k2, desc);
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    });
    __name(__exportStar, "__exportStar");
    __name(__values, "__values");
    __name(__read, "__read");
    __name(__spread, "__spread");
    __name(__spreadArrays, "__spreadArrays");
    __name(__spreadArray, "__spreadArray");
    __name(__await, "__await");
    __name(__asyncGenerator, "__asyncGenerator");
    __name(__asyncDelegator, "__asyncDelegator");
    __name(__asyncValues, "__asyncValues");
    __name(__makeTemplateObject, "__makeTemplateObject");
    __setModuleDefault = Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    };
    __name(__importStar, "__importStar");
    __name(__importDefault, "__importDefault");
    __name(__classPrivateFieldGet, "__classPrivateFieldGet");
    __name(__classPrivateFieldSet, "__classPrivateFieldSet");
    __name(__classPrivateFieldIn, "__classPrivateFieldIn");
    __name(__addDisposableResource, "__addDisposableResource");
    _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
      var e = new Error(message);
      return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
    };
    __name(__disposeResources, "__disposeResources");
    tslib_es6_default = {
      __extends,
      __assign,
      __rest,
      __decorate,
      __param,
      __metadata,
      __awaiter,
      __generator,
      __createBinding,
      __exportStar,
      __values,
      __read,
      __spread,
      __spreadArrays,
      __spreadArray,
      __await,
      __asyncGenerator,
      __asyncDelegator,
      __asyncValues,
      __makeTemplateObject,
      __importStar,
      __importDefault,
      __classPrivateFieldGet,
      __classPrivateFieldSet,
      __classPrivateFieldIn,
      __addDisposableResource,
      __disposeResources
    };
  }
});

// node_modules/@formatjs/icu-messageformat-parser/node_modules/tslib/tslib.es6.mjs
var tslib_es6_exports2 = {};
__export(tslib_es6_exports2, {
  __addDisposableResource: () => __addDisposableResource2,
  __assign: () => __assign2,
  __asyncDelegator: () => __asyncDelegator2,
  __asyncGenerator: () => __asyncGenerator2,
  __asyncValues: () => __asyncValues2,
  __await: () => __await2,
  __awaiter: () => __awaiter2,
  __classPrivateFieldGet: () => __classPrivateFieldGet2,
  __classPrivateFieldIn: () => __classPrivateFieldIn2,
  __classPrivateFieldSet: () => __classPrivateFieldSet2,
  __createBinding: () => __createBinding2,
  __decorate: () => __decorate2,
  __disposeResources: () => __disposeResources2,
  __esDecorate: () => __esDecorate2,
  __exportStar: () => __exportStar2,
  __extends: () => __extends2,
  __generator: () => __generator2,
  __importDefault: () => __importDefault2,
  __importStar: () => __importStar2,
  __makeTemplateObject: () => __makeTemplateObject2,
  __metadata: () => __metadata2,
  __param: () => __param2,
  __propKey: () => __propKey2,
  __read: () => __read2,
  __rest: () => __rest2,
  __runInitializers: () => __runInitializers2,
  __setFunctionName: () => __setFunctionName2,
  __spread: () => __spread2,
  __spreadArray: () => __spreadArray2,
  __spreadArrays: () => __spreadArrays2,
  __values: () => __values2,
  default: () => tslib_es6_default2
});
function __extends2(d, b) {
  if (typeof b !== "function" && b !== null)
    throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  extendStatics2(d, b);
  function __() {
    this.constructor = d;
  }
  __name(__, "__");
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __rest2(s, e) {
  var t = {};
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
    t[p] = s[p];
  if (s != null && typeof Object.getOwnPropertySymbols === "function")
    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
      if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
        t[p[i]] = s[p[i]];
    }
  return t;
}
function __decorate2(decorators, target, key, desc) {
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param2(paramIndex, decorator) {
  return function(target, key) {
    decorator(target, key, paramIndex);
  };
}
function __esDecorate2(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
  function accept(f) {
    if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected");
    return f;
  }
  __name(accept, "accept");
  var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
  var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
  var _, done = false;
  for (var i = decorators.length - 1; i >= 0; i--) {
    var context = {};
    for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
    for (var p in contextIn.access) context.access[p] = contextIn.access[p];
    context.addInitializer = function(f) {
      if (done) throw new TypeError("Cannot add initializers after decoration has completed");
      extraInitializers.push(accept(f || null));
    };
    var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
    if (kind === "accessor") {
      if (result === void 0) continue;
      if (result === null || typeof result !== "object") throw new TypeError("Object expected");
      if (_ = accept(result.get)) descriptor.get = _;
      if (_ = accept(result.set)) descriptor.set = _;
      if (_ = accept(result.init)) initializers.unshift(_);
    } else if (_ = accept(result)) {
      if (kind === "field") initializers.unshift(_);
      else descriptor[key] = _;
    }
  }
  if (target) Object.defineProperty(target, contextIn.name, descriptor);
  done = true;
}
function __runInitializers2(thisArg, initializers, value) {
  var useValue = arguments.length > 2;
  for (var i = 0; i < initializers.length; i++) {
    value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
  }
  return useValue ? value : void 0;
}
function __propKey2(x) {
  return typeof x === "symbol" ? x : "".concat(x);
}
function __setFunctionName2(f, name, prefix) {
  if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
  return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
}
function __metadata2(metadataKey, metadataValue) {
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter2(thisArg, _arguments, P, generator) {
  function adopt(value) {
    return value instanceof P ? value : new P(function(resolve) {
      resolve(value);
    });
  }
  __name(adopt, "adopt");
  return new (P || (P = Promise))(function(resolve, reject) {
    function fulfilled(value) {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    }
    __name(fulfilled, "fulfilled");
    function rejected(value) {
      try {
        step(generator["throw"](value));
      } catch (e) {
        reject(e);
      }
    }
    __name(rejected, "rejected");
    function step(result) {
      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
    }
    __name(step, "step");
    step((generator = generator.apply(thisArg, _arguments || [])).next());
  });
}
function __generator2(thisArg, body) {
  var _ = { label: 0, sent: /* @__PURE__ */ __name(function() {
    if (t[0] & 1) throw t[1];
    return t[1];
  }, "sent"), trys: [], ops: [] }, f, y, t, g;
  return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
    return this;
  }), g;
  function verb(n) {
    return function(v) {
      return step([n, v]);
    };
  }
  __name(verb, "verb");
  function step(op) {
    if (f) throw new TypeError("Generator is already executing.");
    while (g && (g = 0, op[0] && (_ = 0)), _) try {
      if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
      if (y = 0, t) op = [op[0] & 2, t.value];
      switch (op[0]) {
        case 0:
        case 1:
          t = op;
          break;
        case 4:
          _.label++;
          return { value: op[1], done: false };
        case 5:
          _.label++;
          y = op[1];
          op = [0];
          continue;
        case 7:
          op = _.ops.pop();
          _.trys.pop();
          continue;
        default:
          if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
            _ = 0;
            continue;
          }
          if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
            _.label = op[1];
            break;
          }
          if (op[0] === 6 && _.label < t[1]) {
            _.label = t[1];
            t = op;
            break;
          }
          if (t && _.label < t[2]) {
            _.label = t[2];
            _.ops.push(op);
            break;
          }
          if (t[2]) _.ops.pop();
          _.trys.pop();
          continue;
      }
      op = body.call(thisArg, _);
    } catch (e) {
      op = [6, e];
      y = 0;
    } finally {
      f = t = 0;
    }
    if (op[0] & 5) throw op[1];
    return { value: op[0] ? op[1] : void 0, done: true };
  }
  __name(step, "step");
}
function __exportStar2(m, o) {
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding2(o, m, p);
}
function __values2(o) {
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  if (m) return m.call(o);
  if (o && typeof o.length === "number") return {
    next: /* @__PURE__ */ __name(function() {
      if (o && i >= o.length) o = void 0;
      return { value: o && o[i++], done: !o };
    }, "next")
  };
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read2(o, n) {
  var m = typeof Symbol === "function" && o[Symbol.iterator];
  if (!m) return o;
  var i = m.call(o), r, ar = [], e;
  try {
    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  } catch (error) {
    e = { error };
  } finally {
    try {
      if (r && !r.done && (m = i["return"])) m.call(i);
    } finally {
      if (e) throw e.error;
    }
  }
  return ar;
}
function __spread2() {
  for (var ar = [], i = 0; i < arguments.length; i++)
    ar = ar.concat(__read2(arguments[i]));
  return ar;
}
function __spreadArrays2() {
  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
  for (var r = Array(s), k = 0, i = 0; i < il; i++)
    for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
      r[k] = a[j];
  return r;
}
function __spreadArray2(to, from, pack) {
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
    if (ar || !(i in from)) {
      if (!ar) ar = Array.prototype.slice.call(from, 0, i);
      ar[i] = from[i];
    }
  }
  return to.concat(ar || Array.prototype.slice.call(from));
}
function __await2(v) {
  return this instanceof __await2 ? (this.v = v, this) : new __await2(v);
}
function __asyncGenerator2(thisArg, _arguments, generator) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
  return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
    return this;
  }, i;
  function verb(n) {
    if (g[n]) i[n] = function(v) {
      return new Promise(function(a, b) {
        q.push([n, v, a, b]) > 1 || resume(n, v);
      });
    };
  }
  __name(verb, "verb");
  function resume(n, v) {
    try {
      step(g[n](v));
    } catch (e) {
      settle(q[0][3], e);
    }
  }
  __name(resume, "resume");
  function step(r) {
    r.value instanceof __await2 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
  }
  __name(step, "step");
  function fulfill(value) {
    resume("next", value);
  }
  __name(fulfill, "fulfill");
  function reject(value) {
    resume("throw", value);
  }
  __name(reject, "reject");
  function settle(f, v) {
    if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
  }
  __name(settle, "settle");
}
function __asyncDelegator2(o) {
  var i, p;
  return i = {}, verb("next"), verb("throw", function(e) {
    throw e;
  }), verb("return"), i[Symbol.iterator] = function() {
    return this;
  }, i;
  function verb(n, f) {
    i[n] = o[n] ? function(v) {
      return (p = !p) ? { value: __await2(o[n](v)), done: false } : f ? f(v) : v;
    } : f;
  }
  __name(verb, "verb");
}
function __asyncValues2(o) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var m = o[Symbol.asyncIterator], i;
  return m ? m.call(o) : (o = typeof __values2 === "function" ? __values2(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
    return this;
  }, i);
  function verb(n) {
    i[n] = o[n] && function(v) {
      return new Promise(function(resolve, reject) {
        v = o[n](v), settle(resolve, reject, v.done, v.value);
      });
    };
  }
  __name(verb, "verb");
  function settle(resolve, reject, d, v) {
    Promise.resolve(v).then(function(v2) {
      resolve({ value: v2, done: d });
    }, reject);
  }
  __name(settle, "settle");
}
function __makeTemplateObject2(cooked, raw) {
  if (Object.defineProperty) {
    Object.defineProperty(cooked, "raw", { value: raw });
  } else {
    cooked.raw = raw;
  }
  return cooked;
}
function __importStar2(mod2) {
  if (mod2 && mod2.__esModule) return mod2;
  var result = {};
  if (mod2 != null) {
    for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding2(result, mod2, k);
  }
  __setModuleDefault2(result, mod2);
  return result;
}
function __importDefault2(mod2) {
  return mod2 && mod2.__esModule ? mod2 : { default: mod2 };
}
function __classPrivateFieldGet2(receiver, state, kind, f) {
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}
function __classPrivateFieldSet2(receiver, state, value, kind, f) {
  if (kind === "m") throw new TypeError("Private method is not writable");
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
}
function __classPrivateFieldIn2(state, receiver) {
  if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object");
  return typeof state === "function" ? receiver === state : state.has(receiver);
}
function __addDisposableResource2(env, value, async) {
  if (value !== null && value !== void 0) {
    if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
    var dispose;
    if (async) {
      if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
      dispose = value[Symbol.asyncDispose];
    }
    if (dispose === void 0) {
      if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
      dispose = value[Symbol.dispose];
    }
    if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
    env.stack.push({ value, dispose, async });
  } else if (async) {
    env.stack.push({ async: true });
  }
  return value;
}
function __disposeResources2(env) {
  function fail(e) {
    env.error = env.hasError ? new _SuppressedError2(e, env.error, "An error was suppressed during disposal.") : e;
    env.hasError = true;
  }
  __name(fail, "fail");
  function next() {
    while (env.stack.length) {
      var rec = env.stack.pop();
      try {
        var result = rec.dispose && rec.dispose.call(rec.value);
        if (rec.async) return Promise.resolve(result).then(next, function(e) {
          fail(e);
          return next();
        });
      } catch (e) {
        fail(e);
      }
    }
    if (env.hasError) throw env.error;
  }
  __name(next, "next");
  return next();
}
var extendStatics2, __assign2, __createBinding2, __setModuleDefault2, _SuppressedError2, tslib_es6_default2;
var init_tslib_es62 = __esm({
  "node_modules/@formatjs/icu-messageformat-parser/node_modules/tslib/tslib.es6.mjs"() {
    init_process_global();
    extendStatics2 = /* @__PURE__ */ __name(function(d, b) {
      extendStatics2 = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
        d2.__proto__ = b2;
      } || function(d2, b2) {
        for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];
      };
      return extendStatics2(d, b);
    }, "extendStatics");
    __name(__extends2, "__extends");
    __assign2 = /* @__PURE__ */ __name(function() {
      __assign2 = Object.assign || /* @__PURE__ */ __name(function __assign4(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
          s = arguments[i];
          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
      }, "__assign");
      return __assign2.apply(this, arguments);
    }, "__assign");
    __name(__rest2, "__rest");
    __name(__decorate2, "__decorate");
    __name(__param2, "__param");
    __name(__esDecorate2, "__esDecorate");
    __name(__runInitializers2, "__runInitializers");
    __name(__propKey2, "__propKey");
    __name(__setFunctionName2, "__setFunctionName");
    __name(__metadata2, "__metadata");
    __name(__awaiter2, "__awaiter");
    __name(__generator2, "__generator");
    __createBinding2 = Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      var desc = Object.getOwnPropertyDescriptor(m, k);
      if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
        desc = { enumerable: true, get: /* @__PURE__ */ __name(function() {
          return m[k];
        }, "get") };
      }
      Object.defineProperty(o, k2, desc);
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    });
    __name(__exportStar2, "__exportStar");
    __name(__values2, "__values");
    __name(__read2, "__read");
    __name(__spread2, "__spread");
    __name(__spreadArrays2, "__spreadArrays");
    __name(__spreadArray2, "__spreadArray");
    __name(__await2, "__await");
    __name(__asyncGenerator2, "__asyncGenerator");
    __name(__asyncDelegator2, "__asyncDelegator");
    __name(__asyncValues2, "__asyncValues");
    __name(__makeTemplateObject2, "__makeTemplateObject");
    __setModuleDefault2 = Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    };
    __name(__importStar2, "__importStar");
    __name(__importDefault2, "__importDefault");
    __name(__classPrivateFieldGet2, "__classPrivateFieldGet");
    __name(__classPrivateFieldSet2, "__classPrivateFieldSet");
    __name(__classPrivateFieldIn2, "__classPrivateFieldIn");
    __name(__addDisposableResource2, "__addDisposableResource");
    _SuppressedError2 = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
      var e = new Error(message);
      return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
    };
    __name(__disposeResources2, "__disposeResources");
    tslib_es6_default2 = {
      __extends: __extends2,
      __assign: __assign2,
      __rest: __rest2,
      __decorate: __decorate2,
      __param: __param2,
      __metadata: __metadata2,
      __awaiter: __awaiter2,
      __generator: __generator2,
      __createBinding: __createBinding2,
      __exportStar: __exportStar2,
      __values: __values2,
      __read: __read2,
      __spread: __spread2,
      __spreadArrays: __spreadArrays2,
      __spreadArray: __spreadArray2,
      __await: __await2,
      __asyncGenerator: __asyncGenerator2,
      __asyncDelegator: __asyncDelegator2,
      __asyncValues: __asyncValues2,
      __makeTemplateObject: __makeTemplateObject2,
      __importStar: __importStar2,
      __importDefault: __importDefault2,
      __classPrivateFieldGet: __classPrivateFieldGet2,
      __classPrivateFieldSet: __classPrivateFieldSet2,
      __classPrivateFieldIn: __classPrivateFieldIn2,
      __addDisposableResource: __addDisposableResource2,
      __disposeResources: __disposeResources2
    };
  }
});

// node_modules/@formatjs/icu-messageformat-parser/error.js
var require_error = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/error.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.ErrorKind = void 0;
    var ErrorKind;
    (function(ErrorKind2) {
      ErrorKind2[ErrorKind2["EXPECT_ARGUMENT_CLOSING_BRACE"] = 1] = "EXPECT_ARGUMENT_CLOSING_BRACE";
      ErrorKind2[ErrorKind2["EMPTY_ARGUMENT"] = 2] = "EMPTY_ARGUMENT";
      ErrorKind2[ErrorKind2["MALFORMED_ARGUMENT"] = 3] = "MALFORMED_ARGUMENT";
      ErrorKind2[ErrorKind2["EXPECT_ARGUMENT_TYPE"] = 4] = "EXPECT_ARGUMENT_TYPE";
      ErrorKind2[ErrorKind2["INVALID_ARGUMENT_TYPE"] = 5] = "INVALID_ARGUMENT_TYPE";
      ErrorKind2[ErrorKind2["EXPECT_ARGUMENT_STYLE"] = 6] = "EXPECT_ARGUMENT_STYLE";
      ErrorKind2[ErrorKind2["INVALID_NUMBER_SKELETON"] = 7] = "INVALID_NUMBER_SKELETON";
      ErrorKind2[ErrorKind2["INVALID_DATE_TIME_SKELETON"] = 8] = "INVALID_DATE_TIME_SKELETON";
      ErrorKind2[ErrorKind2["EXPECT_NUMBER_SKELETON"] = 9] = "EXPECT_NUMBER_SKELETON";
      ErrorKind2[ErrorKind2["EXPECT_DATE_TIME_SKELETON"] = 10] = "EXPECT_DATE_TIME_SKELETON";
      ErrorKind2[ErrorKind2["UNCLOSED_QUOTE_IN_ARGUMENT_STYLE"] = 11] = "UNCLOSED_QUOTE_IN_ARGUMENT_STYLE";
      ErrorKind2[ErrorKind2["EXPECT_SELECT_ARGUMENT_OPTIONS"] = 12] = "EXPECT_SELECT_ARGUMENT_OPTIONS";
      ErrorKind2[ErrorKind2["EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE"] = 13] = "EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE";
      ErrorKind2[ErrorKind2["INVALID_PLURAL_ARGUMENT_OFFSET_VALUE"] = 14] = "INVALID_PLURAL_ARGUMENT_OFFSET_VALUE";
      ErrorKind2[ErrorKind2["EXPECT_SELECT_ARGUMENT_SELECTOR"] = 15] = "EXPECT_SELECT_ARGUMENT_SELECTOR";
      ErrorKind2[ErrorKind2["EXPECT_PLURAL_ARGUMENT_SELECTOR"] = 16] = "EXPECT_PLURAL_ARGUMENT_SELECTOR";
      ErrorKind2[ErrorKind2["EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT"] = 17] = "EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT";
      ErrorKind2[ErrorKind2["EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT"] = 18] = "EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT";
      ErrorKind2[ErrorKind2["INVALID_PLURAL_ARGUMENT_SELECTOR"] = 19] = "INVALID_PLURAL_ARGUMENT_SELECTOR";
      ErrorKind2[ErrorKind2["DUPLICATE_PLURAL_ARGUMENT_SELECTOR"] = 20] = "DUPLICATE_PLURAL_ARGUMENT_SELECTOR";
      ErrorKind2[ErrorKind2["DUPLICATE_SELECT_ARGUMENT_SELECTOR"] = 21] = "DUPLICATE_SELECT_ARGUMENT_SELECTOR";
      ErrorKind2[ErrorKind2["MISSING_OTHER_CLAUSE"] = 22] = "MISSING_OTHER_CLAUSE";
      ErrorKind2[ErrorKind2["INVALID_TAG"] = 23] = "INVALID_TAG";
      ErrorKind2[ErrorKind2["INVALID_TAG_NAME"] = 25] = "INVALID_TAG_NAME";
      ErrorKind2[ErrorKind2["UNMATCHED_CLOSING_TAG"] = 26] = "UNMATCHED_CLOSING_TAG";
      ErrorKind2[ErrorKind2["UNCLOSED_TAG"] = 27] = "UNCLOSED_TAG";
    })(ErrorKind = exports2.ErrorKind || (exports2.ErrorKind = {}));
  }
});

// node_modules/@formatjs/icu-messageformat-parser/types.js
var require_types = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/types.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.createNumberElement = exports2.createLiteralElement = exports2.isDateTimeSkeleton = exports2.isNumberSkeleton = exports2.isTagElement = exports2.isPoundElement = exports2.isPluralElement = exports2.isSelectElement = exports2.isTimeElement = exports2.isDateElement = exports2.isNumberElement = exports2.isArgumentElement = exports2.isLiteralElement = exports2.SKELETON_TYPE = exports2.TYPE = void 0;
    var TYPE2;
    (function(TYPE3) {
      TYPE3[TYPE3["literal"] = 0] = "literal";
      TYPE3[TYPE3["argument"] = 1] = "argument";
      TYPE3[TYPE3["number"] = 2] = "number";
      TYPE3[TYPE3["date"] = 3] = "date";
      TYPE3[TYPE3["time"] = 4] = "time";
      TYPE3[TYPE3["select"] = 5] = "select";
      TYPE3[TYPE3["plural"] = 6] = "plural";
      TYPE3[TYPE3["pound"] = 7] = "pound";
      TYPE3[TYPE3["tag"] = 8] = "tag";
    })(TYPE2 = exports2.TYPE || (exports2.TYPE = {}));
    var SKELETON_TYPE;
    (function(SKELETON_TYPE2) {
      SKELETON_TYPE2[SKELETON_TYPE2["number"] = 0] = "number";
      SKELETON_TYPE2[SKELETON_TYPE2["dateTime"] = 1] = "dateTime";
    })(SKELETON_TYPE = exports2.SKELETON_TYPE || (exports2.SKELETON_TYPE = {}));
    function isLiteralElement(el) {
      return el.type === TYPE2.literal;
    }
    __name(isLiteralElement, "isLiteralElement");
    exports2.isLiteralElement = isLiteralElement;
    function isArgumentElement(el) {
      return el.type === TYPE2.argument;
    }
    __name(isArgumentElement, "isArgumentElement");
    exports2.isArgumentElement = isArgumentElement;
    function isNumberElement(el) {
      return el.type === TYPE2.number;
    }
    __name(isNumberElement, "isNumberElement");
    exports2.isNumberElement = isNumberElement;
    function isDateElement(el) {
      return el.type === TYPE2.date;
    }
    __name(isDateElement, "isDateElement");
    exports2.isDateElement = isDateElement;
    function isTimeElement(el) {
      return el.type === TYPE2.time;
    }
    __name(isTimeElement, "isTimeElement");
    exports2.isTimeElement = isTimeElement;
    function isSelectElement(el) {
      return el.type === TYPE2.select;
    }
    __name(isSelectElement, "isSelectElement");
    exports2.isSelectElement = isSelectElement;
    function isPluralElement(el) {
      return el.type === TYPE2.plural;
    }
    __name(isPluralElement, "isPluralElement");
    exports2.isPluralElement = isPluralElement;
    function isPoundElement(el) {
      return el.type === TYPE2.pound;
    }
    __name(isPoundElement, "isPoundElement");
    exports2.isPoundElement = isPoundElement;
    function isTagElement(el) {
      return el.type === TYPE2.tag;
    }
    __name(isTagElement, "isTagElement");
    exports2.isTagElement = isTagElement;
    function isNumberSkeleton(el) {
      return !!(el && typeof el === "object" && el.type === SKELETON_TYPE.number);
    }
    __name(isNumberSkeleton, "isNumberSkeleton");
    exports2.isNumberSkeleton = isNumberSkeleton;
    function isDateTimeSkeleton(el) {
      return !!(el && typeof el === "object" && el.type === SKELETON_TYPE.dateTime);
    }
    __name(isDateTimeSkeleton, "isDateTimeSkeleton");
    exports2.isDateTimeSkeleton = isDateTimeSkeleton;
    function createLiteralElement(value) {
      return {
        type: TYPE2.literal,
        value
      };
    }
    __name(createLiteralElement, "createLiteralElement");
    exports2.createLiteralElement = createLiteralElement;
    function createNumberElement(value, style) {
      return {
        type: TYPE2.number,
        value,
        style
      };
    }
    __name(createNumberElement, "createNumberElement");
    exports2.createNumberElement = createNumberElement;
  }
});

// node_modules/@formatjs/icu-messageformat-parser/regex.generated.js
var require_regex_generated = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/regex.generated.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.WHITE_SPACE_REGEX = exports2.SPACE_SEPARATOR_REGEX = void 0;
    exports2.SPACE_SEPARATOR_REGEX = /[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/;
    exports2.WHITE_SPACE_REGEX = /[\t-\r \x85\u200E\u200F\u2028\u2029]/;
  }
});

// node_modules/@formatjs/icu-skeleton-parser/node_modules/tslib/tslib.es6.mjs
var tslib_es6_exports3 = {};
__export(tslib_es6_exports3, {
  __addDisposableResource: () => __addDisposableResource3,
  __assign: () => __assign3,
  __asyncDelegator: () => __asyncDelegator3,
  __asyncGenerator: () => __asyncGenerator3,
  __asyncValues: () => __asyncValues3,
  __await: () => __await3,
  __awaiter: () => __awaiter3,
  __classPrivateFieldGet: () => __classPrivateFieldGet3,
  __classPrivateFieldIn: () => __classPrivateFieldIn3,
  __classPrivateFieldSet: () => __classPrivateFieldSet3,
  __createBinding: () => __createBinding3,
  __decorate: () => __decorate3,
  __disposeResources: () => __disposeResources3,
  __esDecorate: () => __esDecorate3,
  __exportStar: () => __exportStar3,
  __extends: () => __extends3,
  __generator: () => __generator3,
  __importDefault: () => __importDefault3,
  __importStar: () => __importStar3,
  __makeTemplateObject: () => __makeTemplateObject3,
  __metadata: () => __metadata3,
  __param: () => __param3,
  __propKey: () => __propKey3,
  __read: () => __read3,
  __rest: () => __rest3,
  __runInitializers: () => __runInitializers3,
  __setFunctionName: () => __setFunctionName3,
  __spread: () => __spread3,
  __spreadArray: () => __spreadArray3,
  __spreadArrays: () => __spreadArrays3,
  __values: () => __values3,
  default: () => tslib_es6_default3
});
function __extends3(d, b) {
  if (typeof b !== "function" && b !== null)
    throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  extendStatics3(d, b);
  function __() {
    this.constructor = d;
  }
  __name(__, "__");
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __rest3(s, e) {
  var t = {};
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
    t[p] = s[p];
  if (s != null && typeof Object.getOwnPropertySymbols === "function")
    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
      if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
        t[p[i]] = s[p[i]];
    }
  return t;
}
function __decorate3(decorators, target, key, desc) {
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param3(paramIndex, decorator) {
  return function(target, key) {
    decorator(target, key, paramIndex);
  };
}
function __esDecorate3(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
  function accept(f) {
    if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected");
    return f;
  }
  __name(accept, "accept");
  var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
  var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
  var _, done = false;
  for (var i = decorators.length - 1; i >= 0; i--) {
    var context = {};
    for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
    for (var p in contextIn.access) context.access[p] = contextIn.access[p];
    context.addInitializer = function(f) {
      if (done) throw new TypeError("Cannot add initializers after decoration has completed");
      extraInitializers.push(accept(f || null));
    };
    var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
    if (kind === "accessor") {
      if (result === void 0) continue;
      if (result === null || typeof result !== "object") throw new TypeError("Object expected");
      if (_ = accept(result.get)) descriptor.get = _;
      if (_ = accept(result.set)) descriptor.set = _;
      if (_ = accept(result.init)) initializers.unshift(_);
    } else if (_ = accept(result)) {
      if (kind === "field") initializers.unshift(_);
      else descriptor[key] = _;
    }
  }
  if (target) Object.defineProperty(target, contextIn.name, descriptor);
  done = true;
}
function __runInitializers3(thisArg, initializers, value) {
  var useValue = arguments.length > 2;
  for (var i = 0; i < initializers.length; i++) {
    value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
  }
  return useValue ? value : void 0;
}
function __propKey3(x) {
  return typeof x === "symbol" ? x : "".concat(x);
}
function __setFunctionName3(f, name, prefix) {
  if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
  return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
}
function __metadata3(metadataKey, metadataValue) {
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter3(thisArg, _arguments, P, generator) {
  function adopt(value) {
    return value instanceof P ? value : new P(function(resolve) {
      resolve(value);
    });
  }
  __name(adopt, "adopt");
  return new (P || (P = Promise))(function(resolve, reject) {
    function fulfilled(value) {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    }
    __name(fulfilled, "fulfilled");
    function rejected(value) {
      try {
        step(generator["throw"](value));
      } catch (e) {
        reject(e);
      }
    }
    __name(rejected, "rejected");
    function step(result) {
      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
    }
    __name(step, "step");
    step((generator = generator.apply(thisArg, _arguments || [])).next());
  });
}
function __generator3(thisArg, body) {
  var _ = { label: 0, sent: /* @__PURE__ */ __name(function() {
    if (t[0] & 1) throw t[1];
    return t[1];
  }, "sent"), trys: [], ops: [] }, f, y, t, g;
  return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
    return this;
  }), g;
  function verb(n) {
    return function(v) {
      return step([n, v]);
    };
  }
  __name(verb, "verb");
  function step(op) {
    if (f) throw new TypeError("Generator is already executing.");
    while (g && (g = 0, op[0] && (_ = 0)), _) try {
      if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
      if (y = 0, t) op = [op[0] & 2, t.value];
      switch (op[0]) {
        case 0:
        case 1:
          t = op;
          break;
        case 4:
          _.label++;
          return { value: op[1], done: false };
        case 5:
          _.label++;
          y = op[1];
          op = [0];
          continue;
        case 7:
          op = _.ops.pop();
          _.trys.pop();
          continue;
        default:
          if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
            _ = 0;
            continue;
          }
          if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
            _.label = op[1];
            break;
          }
          if (op[0] === 6 && _.label < t[1]) {
            _.label = t[1];
            t = op;
            break;
          }
          if (t && _.label < t[2]) {
            _.label = t[2];
            _.ops.push(op);
            break;
          }
          if (t[2]) _.ops.pop();
          _.trys.pop();
          continue;
      }
      op = body.call(thisArg, _);
    } catch (e) {
      op = [6, e];
      y = 0;
    } finally {
      f = t = 0;
    }
    if (op[0] & 5) throw op[1];
    return { value: op[0] ? op[1] : void 0, done: true };
  }
  __name(step, "step");
}
function __exportStar3(m, o) {
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding3(o, m, p);
}
function __values3(o) {
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  if (m) return m.call(o);
  if (o && typeof o.length === "number") return {
    next: /* @__PURE__ */ __name(function() {
      if (o && i >= o.length) o = void 0;
      return { value: o && o[i++], done: !o };
    }, "next")
  };
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read3(o, n) {
  var m = typeof Symbol === "function" && o[Symbol.iterator];
  if (!m) return o;
  var i = m.call(o), r, ar = [], e;
  try {
    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  } catch (error) {
    e = { error };
  } finally {
    try {
      if (r && !r.done && (m = i["return"])) m.call(i);
    } finally {
      if (e) throw e.error;
    }
  }
  return ar;
}
function __spread3() {
  for (var ar = [], i = 0; i < arguments.length; i++)
    ar = ar.concat(__read3(arguments[i]));
  return ar;
}
function __spreadArrays3() {
  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
  for (var r = Array(s), k = 0, i = 0; i < il; i++)
    for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
      r[k] = a[j];
  return r;
}
function __spreadArray3(to, from, pack) {
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
    if (ar || !(i in from)) {
      if (!ar) ar = Array.prototype.slice.call(from, 0, i);
      ar[i] = from[i];
    }
  }
  return to.concat(ar || Array.prototype.slice.call(from));
}
function __await3(v) {
  return this instanceof __await3 ? (this.v = v, this) : new __await3(v);
}
function __asyncGenerator3(thisArg, _arguments, generator) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
  return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
    return this;
  }, i;
  function verb(n) {
    if (g[n]) i[n] = function(v) {
      return new Promise(function(a, b) {
        q.push([n, v, a, b]) > 1 || resume(n, v);
      });
    };
  }
  __name(verb, "verb");
  function resume(n, v) {
    try {
      step(g[n](v));
    } catch (e) {
      settle(q[0][3], e);
    }
  }
  __name(resume, "resume");
  function step(r) {
    r.value instanceof __await3 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
  }
  __name(step, "step");
  function fulfill(value) {
    resume("next", value);
  }
  __name(fulfill, "fulfill");
  function reject(value) {
    resume("throw", value);
  }
  __name(reject, "reject");
  function settle(f, v) {
    if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
  }
  __name(settle, "settle");
}
function __asyncDelegator3(o) {
  var i, p;
  return i = {}, verb("next"), verb("throw", function(e) {
    throw e;
  }), verb("return"), i[Symbol.iterator] = function() {
    return this;
  }, i;
  function verb(n, f) {
    i[n] = o[n] ? function(v) {
      return (p = !p) ? { value: __await3(o[n](v)), done: false } : f ? f(v) : v;
    } : f;
  }
  __name(verb, "verb");
}
function __asyncValues3(o) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var m = o[Symbol.asyncIterator], i;
  return m ? m.call(o) : (o = typeof __values3 === "function" ? __values3(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
    return this;
  }, i);
  function verb(n) {
    i[n] = o[n] && function(v) {
      return new Promise(function(resolve, reject) {
        v = o[n](v), settle(resolve, reject, v.done, v.value);
      });
    };
  }
  __name(verb, "verb");
  function settle(resolve, reject, d, v) {
    Promise.resolve(v).then(function(v2) {
      resolve({ value: v2, done: d });
    }, reject);
  }
  __name(settle, "settle");
}
function __makeTemplateObject3(cooked, raw) {
  if (Object.defineProperty) {
    Object.defineProperty(cooked, "raw", { value: raw });
  } else {
    cooked.raw = raw;
  }
  return cooked;
}
function __importStar3(mod2) {
  if (mod2 && mod2.__esModule) return mod2;
  var result = {};
  if (mod2 != null) {
    for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding3(result, mod2, k);
  }
  __setModuleDefault3(result, mod2);
  return result;
}
function __importDefault3(mod2) {
  return mod2 && mod2.__esModule ? mod2 : { default: mod2 };
}
function __classPrivateFieldGet3(receiver, state, kind, f) {
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}
function __classPrivateFieldSet3(receiver, state, value, kind, f) {
  if (kind === "m") throw new TypeError("Private method is not writable");
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
}
function __classPrivateFieldIn3(state, receiver) {
  if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object");
  return typeof state === "function" ? receiver === state : state.has(receiver);
}
function __addDisposableResource3(env, value, async) {
  if (value !== null && value !== void 0) {
    if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
    var dispose;
    if (async) {
      if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
      dispose = value[Symbol.asyncDispose];
    }
    if (dispose === void 0) {
      if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
      dispose = value[Symbol.dispose];
    }
    if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
    env.stack.push({ value, dispose, async });
  } else if (async) {
    env.stack.push({ async: true });
  }
  return value;
}
function __disposeResources3(env) {
  function fail(e) {
    env.error = env.hasError ? new _SuppressedError3(e, env.error, "An error was suppressed during disposal.") : e;
    env.hasError = true;
  }
  __name(fail, "fail");
  function next() {
    while (env.stack.length) {
      var rec = env.stack.pop();
      try {
        var result = rec.dispose && rec.dispose.call(rec.value);
        if (rec.async) return Promise.resolve(result).then(next, function(e) {
          fail(e);
          return next();
        });
      } catch (e) {
        fail(e);
      }
    }
    if (env.hasError) throw env.error;
  }
  __name(next, "next");
  return next();
}
var extendStatics3, __assign3, __createBinding3, __setModuleDefault3, _SuppressedError3, tslib_es6_default3;
var init_tslib_es63 = __esm({
  "node_modules/@formatjs/icu-skeleton-parser/node_modules/tslib/tslib.es6.mjs"() {
    init_process_global();
    extendStatics3 = /* @__PURE__ */ __name(function(d, b) {
      extendStatics3 = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
        d2.__proto__ = b2;
      } || function(d2, b2) {
        for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];
      };
      return extendStatics3(d, b);
    }, "extendStatics");
    __name(__extends3, "__extends");
    __assign3 = /* @__PURE__ */ __name(function() {
      __assign3 = Object.assign || /* @__PURE__ */ __name(function __assign4(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
          s = arguments[i];
          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
      }, "__assign");
      return __assign3.apply(this, arguments);
    }, "__assign");
    __name(__rest3, "__rest");
    __name(__decorate3, "__decorate");
    __name(__param3, "__param");
    __name(__esDecorate3, "__esDecorate");
    __name(__runInitializers3, "__runInitializers");
    __name(__propKey3, "__propKey");
    __name(__setFunctionName3, "__setFunctionName");
    __name(__metadata3, "__metadata");
    __name(__awaiter3, "__awaiter");
    __name(__generator3, "__generator");
    __createBinding3 = Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      var desc = Object.getOwnPropertyDescriptor(m, k);
      if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
        desc = { enumerable: true, get: /* @__PURE__ */ __name(function() {
          return m[k];
        }, "get") };
      }
      Object.defineProperty(o, k2, desc);
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    });
    __name(__exportStar3, "__exportStar");
    __name(__values3, "__values");
    __name(__read3, "__read");
    __name(__spread3, "__spread");
    __name(__spreadArrays3, "__spreadArrays");
    __name(__spreadArray3, "__spreadArray");
    __name(__await3, "__await");
    __name(__asyncGenerator3, "__asyncGenerator");
    __name(__asyncDelegator3, "__asyncDelegator");
    __name(__asyncValues3, "__asyncValues");
    __name(__makeTemplateObject3, "__makeTemplateObject");
    __setModuleDefault3 = Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    };
    __name(__importStar3, "__importStar");
    __name(__importDefault3, "__importDefault");
    __name(__classPrivateFieldGet3, "__classPrivateFieldGet");
    __name(__classPrivateFieldSet3, "__classPrivateFieldSet");
    __name(__classPrivateFieldIn3, "__classPrivateFieldIn");
    __name(__addDisposableResource3, "__addDisposableResource");
    _SuppressedError3 = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
      var e = new Error(message);
      return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
    };
    __name(__disposeResources3, "__disposeResources");
    tslib_es6_default3 = {
      __extends: __extends3,
      __assign: __assign3,
      __rest: __rest3,
      __decorate: __decorate3,
      __param: __param3,
      __metadata: __metadata3,
      __awaiter: __awaiter3,
      __generator: __generator3,
      __createBinding: __createBinding3,
      __exportStar: __exportStar3,
      __values: __values3,
      __read: __read3,
      __spread: __spread3,
      __spreadArrays: __spreadArrays3,
      __spreadArray: __spreadArray3,
      __await: __await3,
      __asyncGenerator: __asyncGenerator3,
      __asyncDelegator: __asyncDelegator3,
      __asyncValues: __asyncValues3,
      __makeTemplateObject: __makeTemplateObject3,
      __importStar: __importStar3,
      __importDefault: __importDefault3,
      __classPrivateFieldGet: __classPrivateFieldGet3,
      __classPrivateFieldSet: __classPrivateFieldSet3,
      __classPrivateFieldIn: __classPrivateFieldIn3,
      __addDisposableResource: __addDisposableResource3,
      __disposeResources: __disposeResources3
    };
  }
});

// node_modules/@formatjs/icu-skeleton-parser/date-time.js
var require_date_time = __commonJS({
  "node_modules/@formatjs/icu-skeleton-parser/date-time.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.parseDateTimeSkeleton = void 0;
    var DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;
    function parseDateTimeSkeleton(skeleton) {
      var result = {};
      skeleton.replace(DATE_TIME_REGEX, function(match) {
        var len = match.length;
        switch (match[0]) {
          // Era
          case "G":
            result.era = len === 4 ? "long" : len === 5 ? "narrow" : "short";
            break;
          // Year
          case "y":
            result.year = len === 2 ? "2-digit" : "numeric";
            break;
          case "Y":
          case "u":
          case "U":
          case "r":
            throw new RangeError("`Y/u/U/r` (year) patterns are not supported, use `y` instead");
          // Quarter
          case "q":
          case "Q":
            throw new RangeError("`q/Q` (quarter) patterns are not supported");
          // Month
          case "M":
          case "L":
            result.month = ["numeric", "2-digit", "short", "long", "narrow"][len - 1];
            break;
          // Week
          case "w":
          case "W":
            throw new RangeError("`w/W` (week) patterns are not supported");
          case "d":
            result.day = ["numeric", "2-digit"][len - 1];
            break;
          case "D":
          case "F":
          case "g":
            throw new RangeError("`D/F/g` (day) patterns are not supported, use `d` instead");
          // Weekday
          case "E":
            result.weekday = len === 4 ? "short" : len === 5 ? "narrow" : "short";
            break;
          case "e":
            if (len < 4) {
              throw new RangeError("`e..eee` (weekday) patterns are not supported");
            }
            result.weekday = ["short", "long", "narrow", "short"][len - 4];
            break;
          case "c":
            if (len < 4) {
              throw new RangeError("`c..ccc` (weekday) patterns are not supported");
            }
            result.weekday = ["short", "long", "narrow", "short"][len - 4];
            break;
          // Period
          case "a":
            result.hour12 = true;
            break;
          case "b":
          // am, pm, noon, midnight
          case "B":
            throw new RangeError("`b/B` (period) patterns are not supported, use `a` instead");
          // Hour
          case "h":
            result.hourCycle = "h12";
            result.hour = ["numeric", "2-digit"][len - 1];
            break;
          case "H":
            result.hourCycle = "h23";
            result.hour = ["numeric", "2-digit"][len - 1];
            break;
          case "K":
            result.hourCycle = "h11";
            result.hour = ["numeric", "2-digit"][len - 1];
            break;
          case "k":
            result.hourCycle = "h24";
            result.hour = ["numeric", "2-digit"][len - 1];
            break;
          case "j":
          case "J":
          case "C":
            throw new RangeError("`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead");
          // Minute
          case "m":
            result.minute = ["numeric", "2-digit"][len - 1];
            break;
          // Second
          case "s":
            result.second = ["numeric", "2-digit"][len - 1];
            break;
          case "S":
          case "A":
            throw new RangeError("`S/A` (second) patterns are not supported, use `s` instead");
          // Zone
          case "z":
            result.timeZoneName = len < 4 ? "short" : "long";
            break;
          case "Z":
          // 1..3, 4, 5: The ISO8601 varios formats
          case "O":
          // 1, 4: miliseconds in day short, long
          case "v":
          // 1, 4: generic non-location format
          case "V":
          // 1, 2, 3, 4: time zone ID or city
          case "X":
          // 1, 2, 3, 4: The ISO8601 varios formats
          case "x":
            throw new RangeError("`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead");
        }
        return "";
      });
      return result;
    }
    __name(parseDateTimeSkeleton, "parseDateTimeSkeleton");
    exports2.parseDateTimeSkeleton = parseDateTimeSkeleton;
  }
});

// node_modules/@formatjs/icu-skeleton-parser/regex.generated.js
var require_regex_generated2 = __commonJS({
  "node_modules/@formatjs/icu-skeleton-parser/regex.generated.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.WHITE_SPACE_REGEX = void 0;
    exports2.WHITE_SPACE_REGEX = /[\t-\r \x85\u200E\u200F\u2028\u2029]/i;
  }
});

// node_modules/@formatjs/icu-skeleton-parser/number.js
var require_number = __commonJS({
  "node_modules/@formatjs/icu-skeleton-parser/number.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.parseNumberSkeleton = exports2.parseNumberSkeletonFromString = void 0;
    var tslib_1 = (init_tslib_es63(), __toCommonJS(tslib_es6_exports3));
    var regex_generated_1 = require_regex_generated2();
    function parseNumberSkeletonFromString(skeleton) {
      if (skeleton.length === 0) {
        throw new Error("Number skeleton cannot be empty");
      }
      var stringTokens = skeleton.split(regex_generated_1.WHITE_SPACE_REGEX).filter(function(x) {
        return x.length > 0;
      });
      var tokens = [];
      for (var _i = 0, stringTokens_1 = stringTokens; _i < stringTokens_1.length; _i++) {
        var stringToken = stringTokens_1[_i];
        var stemAndOptions = stringToken.split("/");
        if (stemAndOptions.length === 0) {
          throw new Error("Invalid number skeleton");
        }
        var stem = stemAndOptions[0], options = stemAndOptions.slice(1);
        for (var _a3 = 0, options_1 = options; _a3 < options_1.length; _a3++) {
          var option = options_1[_a3];
          if (option.length === 0) {
            throw new Error("Invalid number skeleton");
          }
        }
        tokens.push({ stem, options });
      }
      return tokens;
    }
    __name(parseNumberSkeletonFromString, "parseNumberSkeletonFromString");
    exports2.parseNumberSkeletonFromString = parseNumberSkeletonFromString;
    function icuUnitToEcma(unit) {
      return unit.replace(/^(.*?)-/, "");
    }
    __name(icuUnitToEcma, "icuUnitToEcma");
    var FRACTION_PRECISION_REGEX = /^\.(?:(0+)(\*)?|(#+)|(0+)(#+))$/g;
    var SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\+|#+)?[rs]?$/g;
    var INTEGER_WIDTH_REGEX = /(\*)(0+)|(#+)(0+)|(0+)/g;
    var CONCISE_INTEGER_WIDTH_REGEX = /^(0+)$/;
    function parseSignificantPrecision(str) {
      var result = {};
      if (str[str.length - 1] === "r") {
        result.roundingPriority = "morePrecision";
      } else if (str[str.length - 1] === "s") {
        result.roundingPriority = "lessPrecision";
      }
      str.replace(SIGNIFICANT_PRECISION_REGEX, function(_, g1, g2) {
        if (typeof g2 !== "string") {
          result.minimumSignificantDigits = g1.length;
          result.maximumSignificantDigits = g1.length;
        } else if (g2 === "+") {
          result.minimumSignificantDigits = g1.length;
        } else if (g1[0] === "#") {
          result.maximumSignificantDigits = g1.length;
        } else {
          result.minimumSignificantDigits = g1.length;
          result.maximumSignificantDigits = g1.length + (typeof g2 === "string" ? g2.length : 0);
        }
        return "";
      });
      return result;
    }
    __name(parseSignificantPrecision, "parseSignificantPrecision");
    function parseSign(str) {
      switch (str) {
        case "sign-auto":
          return {
            signDisplay: "auto"
          };
        case "sign-accounting":
        case "()":
          return {
            currencySign: "accounting"
          };
        case "sign-always":
        case "+!":
          return {
            signDisplay: "always"
          };
        case "sign-accounting-always":
        case "()!":
          return {
            signDisplay: "always",
            currencySign: "accounting"
          };
        case "sign-except-zero":
        case "+?":
          return {
            signDisplay: "exceptZero"
          };
        case "sign-accounting-except-zero":
        case "()?":
          return {
            signDisplay: "exceptZero",
            currencySign: "accounting"
          };
        case "sign-never":
        case "+_":
          return {
            signDisplay: "never"
          };
      }
    }
    __name(parseSign, "parseSign");
    function parseConciseScientificAndEngineeringStem(stem) {
      var result;
      if (stem[0] === "E" && stem[1] === "E") {
        result = {
          notation: "engineering"
        };
        stem = stem.slice(2);
      } else if (stem[0] === "E") {
        result = {
          notation: "scientific"
        };
        stem = stem.slice(1);
      }
      if (result) {
        var signDisplay = stem.slice(0, 2);
        if (signDisplay === "+!") {
          result.signDisplay = "always";
          stem = stem.slice(2);
        } else if (signDisplay === "+?") {
          result.signDisplay = "exceptZero";
          stem = stem.slice(2);
        }
        if (!CONCISE_INTEGER_WIDTH_REGEX.test(stem)) {
          throw new Error("Malformed concise eng/scientific notation");
        }
        result.minimumIntegerDigits = stem.length;
      }
      return result;
    }
    __name(parseConciseScientificAndEngineeringStem, "parseConciseScientificAndEngineeringStem");
    function parseNotationOptions(opt) {
      var result = {};
      var signOpts = parseSign(opt);
      if (signOpts) {
        return signOpts;
      }
      return result;
    }
    __name(parseNotationOptions, "parseNotationOptions");
    function parseNumberSkeleton(tokens) {
      var result = {};
      for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
        var token = tokens_1[_i];
        switch (token.stem) {
          case "percent":
          case "%":
            result.style = "percent";
            continue;
          case "%x100":
            result.style = "percent";
            result.scale = 100;
            continue;
          case "currency":
            result.style = "currency";
            result.currency = token.options[0];
            continue;
          case "group-off":
          case ",_":
            result.useGrouping = false;
            continue;
          case "precision-integer":
          case ".":
            result.maximumFractionDigits = 0;
            continue;
          case "measure-unit":
          case "unit":
            result.style = "unit";
            result.unit = icuUnitToEcma(token.options[0]);
            continue;
          case "compact-short":
          case "K":
            result.notation = "compact";
            result.compactDisplay = "short";
            continue;
          case "compact-long":
          case "KK":
            result.notation = "compact";
            result.compactDisplay = "long";
            continue;
          case "scientific":
            result = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, result), { notation: "scientific" }), token.options.reduce(function(all, opt2) {
              return tslib_1.__assign(tslib_1.__assign({}, all), parseNotationOptions(opt2));
            }, {}));
            continue;
          case "engineering":
            result = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, result), { notation: "engineering" }), token.options.reduce(function(all, opt2) {
              return tslib_1.__assign(tslib_1.__assign({}, all), parseNotationOptions(opt2));
            }, {}));
            continue;
          case "notation-simple":
            result.notation = "standard";
            continue;
          // https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/unicode/unumberformatter.h
          case "unit-width-narrow":
            result.currencyDisplay = "narrowSymbol";
            result.unitDisplay = "narrow";
            continue;
          case "unit-width-short":
            result.currencyDisplay = "code";
            result.unitDisplay = "short";
            continue;
          case "unit-width-full-name":
            result.currencyDisplay = "name";
            result.unitDisplay = "long";
            continue;
          case "unit-width-iso-code":
            result.currencyDisplay = "symbol";
            continue;
          case "scale":
            result.scale = parseFloat(token.options[0]);
            continue;
          // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width
          case "integer-width":
            if (token.options.length > 1) {
              throw new RangeError("integer-width stems only accept a single optional option");
            }
            token.options[0].replace(INTEGER_WIDTH_REGEX, function(_, g1, g2, g3, g4, g5) {
              if (g1) {
                result.minimumIntegerDigits = g2.length;
              } else if (g3 && g4) {
                throw new Error("We currently do not support maximum integer digits");
              } else if (g5) {
                throw new Error("We currently do not support exact integer digits");
              }
              return "";
            });
            continue;
        }
        if (CONCISE_INTEGER_WIDTH_REGEX.test(token.stem)) {
          result.minimumIntegerDigits = token.stem.length;
          continue;
        }
        if (FRACTION_PRECISION_REGEX.test(token.stem)) {
          if (token.options.length > 1) {
            throw new RangeError("Fraction-precision stems only accept a single optional option");
          }
          token.stem.replace(FRACTION_PRECISION_REGEX, function(_, g1, g2, g3, g4, g5) {
            if (g2 === "*") {
              result.minimumFractionDigits = g1.length;
            } else if (g3 && g3[0] === "#") {
              result.maximumFractionDigits = g3.length;
            } else if (g4 && g5) {
              result.minimumFractionDigits = g4.length;
              result.maximumFractionDigits = g4.length + g5.length;
            } else {
              result.minimumFractionDigits = g1.length;
              result.maximumFractionDigits = g1.length;
            }
            return "";
          });
          var opt = token.options[0];
          if (opt === "w") {
            result = tslib_1.__assign(tslib_1.__assign({}, result), { trailingZeroDisplay: "stripIfInteger" });
          } else if (opt) {
            result = tslib_1.__assign(tslib_1.__assign({}, result), parseSignificantPrecision(opt));
          }
          continue;
        }
        if (SIGNIFICANT_PRECISION_REGEX.test(token.stem)) {
          result = tslib_1.__assign(tslib_1.__assign({}, result), parseSignificantPrecision(token.stem));
          continue;
        }
        var signOpts = parseSign(token.stem);
        if (signOpts) {
          result = tslib_1.__assign(tslib_1.__assign({}, result), signOpts);
        }
        var conciseScientificAndEngineeringOpts = parseConciseScientificAndEngineeringStem(token.stem);
        if (conciseScientificAndEngineeringOpts) {
          result = tslib_1.__assign(tslib_1.__assign({}, result), conciseScientificAndEngineeringOpts);
        }
      }
      return result;
    }
    __name(parseNumberSkeleton, "parseNumberSkeleton");
    exports2.parseNumberSkeleton = parseNumberSkeleton;
  }
});

// node_modules/@formatjs/icu-skeleton-parser/index.js
var require_icu_skeleton_parser = __commonJS({
  "node_modules/@formatjs/icu-skeleton-parser/index.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    var tslib_1 = (init_tslib_es63(), __toCommonJS(tslib_es6_exports3));
    tslib_1.__exportStar(require_date_time(), exports2);
    tslib_1.__exportStar(require_number(), exports2);
  }
});

// node_modules/@formatjs/icu-messageformat-parser/time-data.generated.js
var require_time_data_generated = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/time-data.generated.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.timeData = void 0;
    exports2.timeData = {
      "001": [
        "H",
        "h"
      ],
      "AC": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "AD": [
        "H",
        "hB"
      ],
      "AE": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "AF": [
        "H",
        "hb",
        "hB",
        "h"
      ],
      "AG": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "AI": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "AL": [
        "h",
        "H",
        "hB"
      ],
      "AM": [
        "H",
        "hB"
      ],
      "AO": [
        "H",
        "hB"
      ],
      "AR": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "AS": [
        "h",
        "H"
      ],
      "AT": [
        "H",
        "hB"
      ],
      "AU": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "AW": [
        "H",
        "hB"
      ],
      "AX": [
        "H"
      ],
      "AZ": [
        "H",
        "hB",
        "h"
      ],
      "BA": [
        "H",
        "hB",
        "h"
      ],
      "BB": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "BD": [
        "h",
        "hB",
        "H"
      ],
      "BE": [
        "H",
        "hB"
      ],
      "BF": [
        "H",
        "hB"
      ],
      "BG": [
        "H",
        "hB",
        "h"
      ],
      "BH": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "BJ": [
        "H",
        "hB"
      ],
      "BL": [
        "H",
        "hB"
      ],
      "BM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "BN": [
        "hb",
        "hB",
        "h",
        "H"
      ],
      "BO": [
        "H",
        "hB",
        "h",
        "hb"
      ],
      "BQ": [
        "H"
      ],
      "BR": [
        "H",
        "hB"
      ],
      "BS": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "BT": [
        "h",
        "H"
      ],
      "BW": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "BZ": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "CA": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "CC": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "CD": [
        "hB",
        "H"
      ],
      "CF": [
        "H",
        "h",
        "hB"
      ],
      "CG": [
        "H",
        "hB"
      ],
      "CH": [
        "H",
        "hB",
        "h"
      ],
      "CI": [
        "H",
        "hB"
      ],
      "CK": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "CL": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "CM": [
        "H",
        "h",
        "hB"
      ],
      "CN": [
        "H",
        "hB",
        "hb",
        "h"
      ],
      "CO": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "CP": [
        "H"
      ],
      "CR": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "CU": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "CV": [
        "H",
        "hB"
      ],
      "CX": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "CY": [
        "h",
        "H",
        "hb",
        "hB"
      ],
      "CZ": [
        "H"
      ],
      "DE": [
        "H",
        "hB"
      ],
      "DG": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "DJ": [
        "h",
        "H"
      ],
      "DK": [
        "H"
      ],
      "DM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "DO": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "DZ": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "EA": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "EC": [
        "H",
        "hB",
        "h",
        "hb"
      ],
      "EE": [
        "H",
        "hB"
      ],
      "EG": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "EH": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "ER": [
        "h",
        "H"
      ],
      "ES": [
        "H",
        "hB",
        "h",
        "hb"
      ],
      "ET": [
        "hB",
        "hb",
        "h",
        "H"
      ],
      "FI": [
        "H"
      ],
      "FJ": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "FK": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "FM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "FR": [
        "H",
        "hB"
      ],
      "GA": [
        "H",
        "hB"
      ],
      "GB": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "GD": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "GE": [
        "H",
        "hB",
        "h"
      ],
      "GF": [
        "H",
        "hB"
      ],
      "GG": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "GH": [
        "h",
        "H"
      ],
      "GI": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "GM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "GN": [
        "H",
        "hB"
      ],
      "GP": [
        "H",
        "hB"
      ],
      "GQ": [
        "H",
        "hB",
        "h",
        "hb"
      ],
      "GR": [
        "h",
        "H",
        "hb",
        "hB"
      ],
      "GT": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "GU": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "GW": [
        "H",
        "hB"
      ],
      "GY": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "HK": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "HN": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "HR": [
        "H",
        "hB"
      ],
      "IC": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "ID": [
        "H"
      ],
      "IE": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "IL": [
        "H",
        "hB"
      ],
      "IM": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "IN": [
        "h",
        "H"
      ],
      "IO": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "IQ": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "IR": [
        "hB",
        "H"
      ],
      "IS": [
        "H"
      ],
      "IT": [
        "H",
        "hB"
      ],
      "JE": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "JM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "JO": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "JP": [
        "H",
        "h",
        "K"
      ],
      "KE": [
        "hB",
        "hb",
        "H",
        "h"
      ],
      "KG": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "KH": [
        "hB",
        "h",
        "H",
        "hb"
      ],
      "KI": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "KM": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "KN": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "KP": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "KR": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "KW": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "KY": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "KZ": [
        "H",
        "hB"
      ],
      "LA": [
        "H",
        "hb",
        "hB",
        "h"
      ],
      "LB": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "LC": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "LI": [
        "H",
        "hB",
        "h"
      ],
      "LK": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "LR": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "LS": [
        "h",
        "H"
      ],
      "LT": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "LU": [
        "H",
        "h",
        "hB"
      ],
      "LV": [
        "H",
        "hB",
        "hb",
        "h"
      ],
      "LY": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "MA": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "MC": [
        "H",
        "hB"
      ],
      "MD": [
        "H",
        "hB"
      ],
      "ME": [
        "H",
        "hB",
        "h"
      ],
      "MF": [
        "H",
        "hB"
      ],
      "MH": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "MK": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "ML": [
        "H"
      ],
      "MM": [
        "hB",
        "hb",
        "H",
        "h"
      ],
      "MN": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "MO": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "MP": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "MQ": [
        "H",
        "hB"
      ],
      "MR": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "MS": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "MW": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "MX": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "MY": [
        "hb",
        "hB",
        "h",
        "H"
      ],
      "MZ": [
        "H",
        "hB"
      ],
      "NA": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "NC": [
        "H",
        "hB"
      ],
      "NE": [
        "H"
      ],
      "NF": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "NG": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "NI": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "NL": [
        "H",
        "hB"
      ],
      "NP": [
        "H",
        "h",
        "hB"
      ],
      "NR": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "NU": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "NZ": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "OM": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "PA": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "PE": [
        "H",
        "hB",
        "h",
        "hb"
      ],
      "PF": [
        "H",
        "h",
        "hB"
      ],
      "PG": [
        "h",
        "H"
      ],
      "PH": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "PK": [
        "h",
        "hB",
        "H"
      ],
      "PM": [
        "H",
        "hB"
      ],
      "PN": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "PR": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "PS": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "PT": [
        "H",
        "hB"
      ],
      "PW": [
        "h",
        "H"
      ],
      "PY": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "QA": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "RE": [
        "H",
        "hB"
      ],
      "RO": [
        "H",
        "hB"
      ],
      "RS": [
        "H",
        "hB",
        "h"
      ],
      "RU": [
        "H"
      ],
      "SA": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "SB": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "SC": [
        "H",
        "h",
        "hB"
      ],
      "SD": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "SE": [
        "H"
      ],
      "SG": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "SH": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "SI": [
        "H",
        "hB"
      ],
      "SJ": [
        "H"
      ],
      "SK": [
        "H"
      ],
      "SL": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "SM": [
        "H",
        "h",
        "hB"
      ],
      "SN": [
        "H",
        "h",
        "hB"
      ],
      "SO": [
        "h",
        "H"
      ],
      "SR": [
        "H",
        "hB"
      ],
      "SS": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "ST": [
        "H",
        "hB"
      ],
      "SV": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "SX": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "SY": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "SZ": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "TA": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "TC": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "TD": [
        "h",
        "H",
        "hB"
      ],
      "TF": [
        "H",
        "h",
        "hB"
      ],
      "TG": [
        "H",
        "hB"
      ],
      "TL": [
        "H",
        "hB",
        "hb",
        "h"
      ],
      "TN": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "TO": [
        "h",
        "H"
      ],
      "TR": [
        "H",
        "hB"
      ],
      "TT": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "TW": [
        "hB",
        "hb",
        "h",
        "H"
      ],
      "TZ": [
        "hB",
        "hb",
        "H",
        "h"
      ],
      "UA": [
        "H",
        "hB",
        "h"
      ],
      "UG": [
        "hB",
        "hb",
        "H",
        "h"
      ],
      "UM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "US": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "UY": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "UZ": [
        "H",
        "hB",
        "h"
      ],
      "VA": [
        "H",
        "h",
        "hB"
      ],
      "VC": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "VE": [
        "h",
        "H",
        "hB",
        "hb"
      ],
      "VG": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "VI": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "VU": [
        "h",
        "H"
      ],
      "WF": [
        "H",
        "hB"
      ],
      "WS": [
        "h",
        "H"
      ],
      "XK": [
        "H",
        "hB",
        "h"
      ],
      "YE": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "YT": [
        "H",
        "hB"
      ],
      "ZA": [
        "H",
        "h",
        "hb",
        "hB"
      ],
      "ZM": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "af-ZA": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "ar-001": [
        "h",
        "hB",
        "hb",
        "H"
      ],
      "ca-ES": [
        "H",
        "h",
        "hB"
      ],
      "en-001": [
        "h",
        "hb",
        "H",
        "hB"
      ],
      "es-BO": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "es-BR": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "es-EC": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "es-ES": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "es-GQ": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "es-PE": [
        "H",
        "h",
        "hB",
        "hb"
      ],
      "fr-CA": [
        "H",
        "h",
        "hB"
      ],
      "gl-ES": [
        "H",
        "h",
        "hB"
      ],
      "gu-IN": [
        "hB",
        "hb",
        "h",
        "H"
      ],
      "hi-IN": [
        "hB",
        "h",
        "H"
      ],
      "it-CH": [
        "H",
        "h",
        "hB"
      ],
      "it-IT": [
        "H",
        "h",
        "hB"
      ],
      "kn-IN": [
        "hB",
        "h",
        "H"
      ],
      "ml-IN": [
        "hB",
        "h",
        "H"
      ],
      "mr-IN": [
        "hB",
        "hb",
        "h",
        "H"
      ],
      "pa-IN": [
        "hB",
        "hb",
        "h",
        "H"
      ],
      "ta-IN": [
        "hB",
        "h",
        "hb",
        "H"
      ],
      "te-IN": [
        "hB",
        "h",
        "H"
      ],
      "zu-ZA": [
        "H",
        "hB",
        "hb",
        "h"
      ]
    };
  }
});

// node_modules/@formatjs/icu-messageformat-parser/date-time-pattern-generator.js
var require_date_time_pattern_generator = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/date-time-pattern-generator.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.getBestPattern = void 0;
    var time_data_generated_1 = require_time_data_generated();
    function getBestPattern(skeleton, locale) {
      var skeletonCopy = "";
      for (var patternPos = 0; patternPos < skeleton.length; patternPos++) {
        var patternChar = skeleton.charAt(patternPos);
        if (patternChar === "j") {
          var extraLength = 0;
          while (patternPos + 1 < skeleton.length && skeleton.charAt(patternPos + 1) === patternChar) {
            extraLength++;
            patternPos++;
          }
          var hourLen = 1 + (extraLength & 1);
          var dayPeriodLen = extraLength < 2 ? 1 : 3 + (extraLength >> 1);
          var dayPeriodChar = "a";
          var hourChar = getDefaultHourSymbolFromLocale(locale);
          if (hourChar == "H" || hourChar == "k") {
            dayPeriodLen = 0;
          }
          while (dayPeriodLen-- > 0) {
            skeletonCopy += dayPeriodChar;
          }
          while (hourLen-- > 0) {
            skeletonCopy = hourChar + skeletonCopy;
          }
        } else if (patternChar === "J") {
          skeletonCopy += "H";
        } else {
          skeletonCopy += patternChar;
        }
      }
      return skeletonCopy;
    }
    __name(getBestPattern, "getBestPattern");
    exports2.getBestPattern = getBestPattern;
    function getDefaultHourSymbolFromLocale(locale) {
      var hourCycle = locale.hourCycle;
      if (hourCycle === void 0 && // @ts-ignore hourCycle(s) is not identified yet
      locale.hourCycles && // @ts-ignore
      locale.hourCycles.length) {
        hourCycle = locale.hourCycles[0];
      }
      if (hourCycle) {
        switch (hourCycle) {
          case "h24":
            return "k";
          case "h23":
            return "H";
          case "h12":
            return "h";
          case "h11":
            return "K";
          default:
            throw new Error("Invalid hourCycle");
        }
      }
      var languageTag = locale.language;
      var regionTag;
      if (languageTag !== "root") {
        regionTag = locale.maximize().region;
      }
      var hourCycles = time_data_generated_1.timeData[regionTag || ""] || time_data_generated_1.timeData[languageTag || ""] || time_data_generated_1.timeData["".concat(languageTag, "-001")] || time_data_generated_1.timeData["001"];
      return hourCycles[0];
    }
    __name(getDefaultHourSymbolFromLocale, "getDefaultHourSymbolFromLocale");
  }
});

// node_modules/@formatjs/icu-messageformat-parser/parser.js
var require_parser = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/parser.js"(exports2) {
    "use strict";
    init_process_global();
    var _a3;
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.Parser = void 0;
    var tslib_1 = (init_tslib_es62(), __toCommonJS(tslib_es6_exports2));
    var error_1 = require_error();
    var types_1 = require_types();
    var regex_generated_1 = require_regex_generated();
    var icu_skeleton_parser_1 = require_icu_skeleton_parser();
    var date_time_pattern_generator_1 = require_date_time_pattern_generator();
    var SPACE_SEPARATOR_START_REGEX = new RegExp("^".concat(regex_generated_1.SPACE_SEPARATOR_REGEX.source, "*"));
    var SPACE_SEPARATOR_END_REGEX = new RegExp("".concat(regex_generated_1.SPACE_SEPARATOR_REGEX.source, "*$"));
    function createLocation(start, end) {
      return { start, end };
    }
    __name(createLocation, "createLocation");
    var hasNativeStartsWith = !!String.prototype.startsWith && "_a".startsWith("a", 1);
    var hasNativeFromCodePoint = !!String.fromCodePoint;
    var hasNativeFromEntries = !!Object.fromEntries;
    var hasNativeCodePointAt = !!String.prototype.codePointAt;
    var hasTrimStart = !!String.prototype.trimStart;
    var hasTrimEnd = !!String.prototype.trimEnd;
    var hasNativeIsSafeInteger = !!Number.isSafeInteger;
    var isSafeInteger = hasNativeIsSafeInteger ? Number.isSafeInteger : function(n) {
      return typeof n === "number" && isFinite(n) && Math.floor(n) === n && Math.abs(n) <= 9007199254740991;
    };
    var REGEX_SUPPORTS_U_AND_Y = true;
    try {
      re = RE("([^\\p{White_Space}\\p{Pattern_Syntax}]*)", "yu");
      REGEX_SUPPORTS_U_AND_Y = ((_a3 = re.exec("a")) === null || _a3 === void 0 ? void 0 : _a3[0]) === "a";
    } catch (_) {
      REGEX_SUPPORTS_U_AND_Y = false;
    }
    var re;
    var startsWith = hasNativeStartsWith ? (
      // Native
      /* @__PURE__ */ __name(function startsWith2(s, search, position) {
        return s.startsWith(search, position);
      }, "startsWith")
    ) : (
      // For IE11
      /* @__PURE__ */ __name(function startsWith2(s, search, position) {
        return s.slice(position, position + search.length) === search;
      }, "startsWith")
    );
    var fromCodePoint = hasNativeFromCodePoint ? String.fromCodePoint : (
      // IE11
      /* @__PURE__ */ __name(function fromCodePoint2() {
        var codePoints = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          codePoints[_i] = arguments[_i];
        }
        var elements = "";
        var length = codePoints.length;
        var i = 0;
        var code;
        while (length > i) {
          code = codePoints[i++];
          if (code > 1114111)
            throw RangeError(code + " is not a valid code point");
          elements += code < 65536 ? String.fromCharCode(code) : String.fromCharCode(((code -= 65536) >> 10) + 55296, code % 1024 + 56320);
        }
        return elements;
      }, "fromCodePoint")
    );
    var fromEntries = (
      // native
      hasNativeFromEntries ? Object.fromEntries : (
        // Ponyfill
        /* @__PURE__ */ __name(function fromEntries2(entries) {
          var obj = {};
          for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
            var _a4 = entries_1[_i], k = _a4[0], v = _a4[1];
            obj[k] = v;
          }
          return obj;
        }, "fromEntries")
      )
    );
    var codePointAt = hasNativeCodePointAt ? (
      // Native
      /* @__PURE__ */ __name(function codePointAt2(s, index) {
        return s.codePointAt(index);
      }, "codePointAt")
    ) : (
      // IE 11
      /* @__PURE__ */ __name(function codePointAt2(s, index) {
        var size = s.length;
        if (index < 0 || index >= size) {
          return void 0;
        }
        var first = s.charCodeAt(index);
        var second;
        return first < 55296 || first > 56319 || index + 1 === size || (second = s.charCodeAt(index + 1)) < 56320 || second > 57343 ? first : (first - 55296 << 10) + (second - 56320) + 65536;
      }, "codePointAt")
    );
    var trimStart = hasTrimStart ? (
      // Native
      /* @__PURE__ */ __name(function trimStart2(s) {
        return s.trimStart();
      }, "trimStart")
    ) : (
      // Ponyfill
      /* @__PURE__ */ __name(function trimStart2(s) {
        return s.replace(SPACE_SEPARATOR_START_REGEX, "");
      }, "trimStart")
    );
    var trimEnd = hasTrimEnd ? (
      // Native
      /* @__PURE__ */ __name(function trimEnd2(s) {
        return s.trimEnd();
      }, "trimEnd")
    ) : (
      // Ponyfill
      /* @__PURE__ */ __name(function trimEnd2(s) {
        return s.replace(SPACE_SEPARATOR_END_REGEX, "");
      }, "trimEnd")
    );
    function RE(s, flag) {
      return new RegExp(s, flag);
    }
    __name(RE, "RE");
    var matchIdentifierAtIndex;
    if (REGEX_SUPPORTS_U_AND_Y) {
      IDENTIFIER_PREFIX_RE_1 = RE("([^\\p{White_Space}\\p{Pattern_Syntax}]*)", "yu");
      matchIdentifierAtIndex = /* @__PURE__ */ __name(function matchIdentifierAtIndex2(s, index) {
        var _a4;
        IDENTIFIER_PREFIX_RE_1.lastIndex = index;
        var match = IDENTIFIER_PREFIX_RE_1.exec(s);
        return (_a4 = match[1]) !== null && _a4 !== void 0 ? _a4 : "";
      }, "matchIdentifierAtIndex");
    } else {
      matchIdentifierAtIndex = /* @__PURE__ */ __name(function matchIdentifierAtIndex2(s, index) {
        var match = [];
        while (true) {
          var c = codePointAt(s, index);
          if (c === void 0 || _isWhiteSpace(c) || _isPatternSyntax(c)) {
            break;
          }
          match.push(c);
          index += c >= 65536 ? 2 : 1;
        }
        return fromCodePoint.apply(void 0, match);
      }, "matchIdentifierAtIndex");
    }
    var IDENTIFIER_PREFIX_RE_1;
    var Parser = (
      /** @class */
      (function() {
        function Parser2(message, options) {
          if (options === void 0) {
            options = {};
          }
          this.message = message;
          this.position = { offset: 0, line: 1, column: 1 };
          this.ignoreTag = !!options.ignoreTag;
          this.locale = options.locale;
          this.requiresOtherClause = !!options.requiresOtherClause;
          this.shouldParseSkeletons = !!options.shouldParseSkeletons;
        }
        __name(Parser2, "Parser");
        Parser2.prototype.parse = function() {
          if (this.offset() !== 0) {
            throw Error("parser can only be used once");
          }
          return this.parseMessage(0, "", false);
        };
        Parser2.prototype.parseMessage = function(nestingLevel, parentArgType, expectingCloseTag) {
          var elements = [];
          while (!this.isEOF()) {
            var char = this.char();
            if (char === 123) {
              var result = this.parseArgument(nestingLevel, expectingCloseTag);
              if (result.err) {
                return result;
              }
              elements.push(result.val);
            } else if (char === 125 && nestingLevel > 0) {
              break;
            } else if (char === 35 && (parentArgType === "plural" || parentArgType === "selectordinal")) {
              var position = this.clonePosition();
              this.bump();
              elements.push({
                type: types_1.TYPE.pound,
                location: createLocation(position, this.clonePosition())
              });
            } else if (char === 60 && !this.ignoreTag && this.peek() === 47) {
              if (expectingCloseTag) {
                break;
              } else {
                return this.error(error_1.ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(this.clonePosition(), this.clonePosition()));
              }
            } else if (char === 60 && !this.ignoreTag && _isAlpha(this.peek() || 0)) {
              var result = this.parseTag(nestingLevel, parentArgType);
              if (result.err) {
                return result;
              }
              elements.push(result.val);
            } else {
              var result = this.parseLiteral(nestingLevel, parentArgType);
              if (result.err) {
                return result;
              }
              elements.push(result.val);
            }
          }
          return { val: elements, err: null };
        };
        Parser2.prototype.parseTag = function(nestingLevel, parentArgType) {
          var startPosition = this.clonePosition();
          this.bump();
          var tagName = this.parseTagName();
          this.bumpSpace();
          if (this.bumpIf("/>")) {
            return {
              val: {
                type: types_1.TYPE.literal,
                value: "<".concat(tagName, "/>"),
                location: createLocation(startPosition, this.clonePosition())
              },
              err: null
            };
          } else if (this.bumpIf(">")) {
            var childrenResult = this.parseMessage(nestingLevel + 1, parentArgType, true);
            if (childrenResult.err) {
              return childrenResult;
            }
            var children = childrenResult.val;
            var endTagStartPosition = this.clonePosition();
            if (this.bumpIf("</")) {
              if (this.isEOF() || !_isAlpha(this.char())) {
                return this.error(error_1.ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));
              }
              var closingTagNameStartPosition = this.clonePosition();
              var closingTagName = this.parseTagName();
              if (tagName !== closingTagName) {
                return this.error(error_1.ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(closingTagNameStartPosition, this.clonePosition()));
              }
              this.bumpSpace();
              if (!this.bumpIf(">")) {
                return this.error(error_1.ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));
              }
              return {
                val: {
                  type: types_1.TYPE.tag,
                  value: tagName,
                  children,
                  location: createLocation(startPosition, this.clonePosition())
                },
                err: null
              };
            } else {
              return this.error(error_1.ErrorKind.UNCLOSED_TAG, createLocation(startPosition, this.clonePosition()));
            }
          } else {
            return this.error(error_1.ErrorKind.INVALID_TAG, createLocation(startPosition, this.clonePosition()));
          }
        };
        Parser2.prototype.parseTagName = function() {
          var startOffset = this.offset();
          this.bump();
          while (!this.isEOF() && _isPotentialElementNameChar(this.char())) {
            this.bump();
          }
          return this.message.slice(startOffset, this.offset());
        };
        Parser2.prototype.parseLiteral = function(nestingLevel, parentArgType) {
          var start = this.clonePosition();
          var value = "";
          while (true) {
            var parseQuoteResult = this.tryParseQuote(parentArgType);
            if (parseQuoteResult) {
              value += parseQuoteResult;
              continue;
            }
            var parseUnquotedResult = this.tryParseUnquoted(nestingLevel, parentArgType);
            if (parseUnquotedResult) {
              value += parseUnquotedResult;
              continue;
            }
            var parseLeftAngleResult = this.tryParseLeftAngleBracket();
            if (parseLeftAngleResult) {
              value += parseLeftAngleResult;
              continue;
            }
            break;
          }
          var location = createLocation(start, this.clonePosition());
          return {
            val: { type: types_1.TYPE.literal, value, location },
            err: null
          };
        };
        Parser2.prototype.tryParseLeftAngleBracket = function() {
          if (!this.isEOF() && this.char() === 60 && (this.ignoreTag || // If at the opening tag or closing tag position, bail.
          !_isAlphaOrSlash(this.peek() || 0))) {
            this.bump();
            return "<";
          }
          return null;
        };
        Parser2.prototype.tryParseQuote = function(parentArgType) {
          if (this.isEOF() || this.char() !== 39) {
            return null;
          }
          switch (this.peek()) {
            case 39:
              this.bump();
              this.bump();
              return "'";
            // '{', '<', '>', '}'
            case 123:
            case 60:
            case 62:
            case 125:
              break;
            case 35:
              if (parentArgType === "plural" || parentArgType === "selectordinal") {
                break;
              }
              return null;
            default:
              return null;
          }
          this.bump();
          var codePoints = [this.char()];
          this.bump();
          while (!this.isEOF()) {
            var ch = this.char();
            if (ch === 39) {
              if (this.peek() === 39) {
                codePoints.push(39);
                this.bump();
              } else {
                this.bump();
                break;
              }
            } else {
              codePoints.push(ch);
            }
            this.bump();
          }
          return fromCodePoint.apply(void 0, codePoints);
        };
        Parser2.prototype.tryParseUnquoted = function(nestingLevel, parentArgType) {
          if (this.isEOF()) {
            return null;
          }
          var ch = this.char();
          if (ch === 60 || ch === 123 || ch === 35 && (parentArgType === "plural" || parentArgType === "selectordinal") || ch === 125 && nestingLevel > 0) {
            return null;
          } else {
            this.bump();
            return fromCodePoint(ch);
          }
        };
        Parser2.prototype.parseArgument = function(nestingLevel, expectingCloseTag) {
          var openingBracePosition = this.clonePosition();
          this.bump();
          this.bumpSpace();
          if (this.isEOF()) {
            return this.error(error_1.ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));
          }
          if (this.char() === 125) {
            this.bump();
            return this.error(error_1.ErrorKind.EMPTY_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));
          }
          var value = this.parseIdentifierIfPossible().value;
          if (!value) {
            return this.error(error_1.ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));
          }
          this.bumpSpace();
          if (this.isEOF()) {
            return this.error(error_1.ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));
          }
          switch (this.char()) {
            // Simple argument: `{name}`
            case 125: {
              this.bump();
              return {
                val: {
                  type: types_1.TYPE.argument,
                  // value does not include the opening and closing braces.
                  value,
                  location: createLocation(openingBracePosition, this.clonePosition())
                },
                err: null
              };
            }
            // Argument with options: `{name, format, ...}`
            case 44: {
              this.bump();
              this.bumpSpace();
              if (this.isEOF()) {
                return this.error(error_1.ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));
              }
              return this.parseArgumentOptions(nestingLevel, expectingCloseTag, value, openingBracePosition);
            }
            default:
              return this.error(error_1.ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));
          }
        };
        Parser2.prototype.parseIdentifierIfPossible = function() {
          var startingPosition = this.clonePosition();
          var startOffset = this.offset();
          var value = matchIdentifierAtIndex(this.message, startOffset);
          var endOffset = startOffset + value.length;
          this.bumpTo(endOffset);
          var endPosition = this.clonePosition();
          var location = createLocation(startingPosition, endPosition);
          return { value, location };
        };
        Parser2.prototype.parseArgumentOptions = function(nestingLevel, expectingCloseTag, value, openingBracePosition) {
          var _a4;
          var typeStartPosition = this.clonePosition();
          var argType = this.parseIdentifierIfPossible().value;
          var typeEndPosition = this.clonePosition();
          switch (argType) {
            case "":
              return this.error(error_1.ErrorKind.EXPECT_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));
            case "number":
            case "date":
            case "time": {
              this.bumpSpace();
              var styleAndLocation = null;
              if (this.bumpIf(",")) {
                this.bumpSpace();
                var styleStartPosition = this.clonePosition();
                var result = this.parseSimpleArgStyleIfPossible();
                if (result.err) {
                  return result;
                }
                var style = trimEnd(result.val);
                if (style.length === 0) {
                  return this.error(error_1.ErrorKind.EXPECT_ARGUMENT_STYLE, createLocation(this.clonePosition(), this.clonePosition()));
                }
                var styleLocation = createLocation(styleStartPosition, this.clonePosition());
                styleAndLocation = { style, styleLocation };
              }
              var argCloseResult = this.tryParseArgumentClose(openingBracePosition);
              if (argCloseResult.err) {
                return argCloseResult;
              }
              var location_1 = createLocation(openingBracePosition, this.clonePosition());
              if (styleAndLocation && startsWith(styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style, "::", 0)) {
                var skeleton = trimStart(styleAndLocation.style.slice(2));
                if (argType === "number") {
                  var result = this.parseNumberSkeletonFromString(skeleton, styleAndLocation.styleLocation);
                  if (result.err) {
                    return result;
                  }
                  return {
                    val: { type: types_1.TYPE.number, value, location: location_1, style: result.val },
                    err: null
                  };
                } else {
                  if (skeleton.length === 0) {
                    return this.error(error_1.ErrorKind.EXPECT_DATE_TIME_SKELETON, location_1);
                  }
                  var dateTimePattern = skeleton;
                  if (this.locale) {
                    dateTimePattern = (0, date_time_pattern_generator_1.getBestPattern)(skeleton, this.locale);
                  }
                  var style = {
                    type: types_1.SKELETON_TYPE.dateTime,
                    pattern: dateTimePattern,
                    location: styleAndLocation.styleLocation,
                    parsedOptions: this.shouldParseSkeletons ? (0, icu_skeleton_parser_1.parseDateTimeSkeleton)(dateTimePattern) : {}
                  };
                  var type = argType === "date" ? types_1.TYPE.date : types_1.TYPE.time;
                  return {
                    val: { type, value, location: location_1, style },
                    err: null
                  };
                }
              }
              return {
                val: {
                  type: argType === "number" ? types_1.TYPE.number : argType === "date" ? types_1.TYPE.date : types_1.TYPE.time,
                  value,
                  location: location_1,
                  style: (_a4 = styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style) !== null && _a4 !== void 0 ? _a4 : null
                },
                err: null
              };
            }
            case "plural":
            case "selectordinal":
            case "select": {
              var typeEndPosition_1 = this.clonePosition();
              this.bumpSpace();
              if (!this.bumpIf(",")) {
                return this.error(error_1.ErrorKind.EXPECT_SELECT_ARGUMENT_OPTIONS, createLocation(typeEndPosition_1, tslib_1.__assign({}, typeEndPosition_1)));
              }
              this.bumpSpace();
              var identifierAndLocation = this.parseIdentifierIfPossible();
              var pluralOffset = 0;
              if (argType !== "select" && identifierAndLocation.value === "offset") {
                if (!this.bumpIf(":")) {
                  return this.error(error_1.ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, createLocation(this.clonePosition(), this.clonePosition()));
                }
                this.bumpSpace();
                var result = this.tryParseDecimalInteger(error_1.ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, error_1.ErrorKind.INVALID_PLURAL_ARGUMENT_OFFSET_VALUE);
                if (result.err) {
                  return result;
                }
                this.bumpSpace();
                identifierAndLocation = this.parseIdentifierIfPossible();
                pluralOffset = result.val;
              }
              var optionsResult = this.tryParsePluralOrSelectOptions(nestingLevel, argType, expectingCloseTag, identifierAndLocation);
              if (optionsResult.err) {
                return optionsResult;
              }
              var argCloseResult = this.tryParseArgumentClose(openingBracePosition);
              if (argCloseResult.err) {
                return argCloseResult;
              }
              var location_2 = createLocation(openingBracePosition, this.clonePosition());
              if (argType === "select") {
                return {
                  val: {
                    type: types_1.TYPE.select,
                    value,
                    options: fromEntries(optionsResult.val),
                    location: location_2
                  },
                  err: null
                };
              } else {
                return {
                  val: {
                    type: types_1.TYPE.plural,
                    value,
                    options: fromEntries(optionsResult.val),
                    offset: pluralOffset,
                    pluralType: argType === "plural" ? "cardinal" : "ordinal",
                    location: location_2
                  },
                  err: null
                };
              }
            }
            default:
              return this.error(error_1.ErrorKind.INVALID_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));
          }
        };
        Parser2.prototype.tryParseArgumentClose = function(openingBracePosition) {
          if (this.isEOF() || this.char() !== 125) {
            return this.error(error_1.ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));
          }
          this.bump();
          return { val: true, err: null };
        };
        Parser2.prototype.parseSimpleArgStyleIfPossible = function() {
          var nestedBraces = 0;
          var startPosition = this.clonePosition();
          while (!this.isEOF()) {
            var ch = this.char();
            switch (ch) {
              case 39: {
                this.bump();
                var apostrophePosition = this.clonePosition();
                if (!this.bumpUntil("'")) {
                  return this.error(error_1.ErrorKind.UNCLOSED_QUOTE_IN_ARGUMENT_STYLE, createLocation(apostrophePosition, this.clonePosition()));
                }
                this.bump();
                break;
              }
              case 123: {
                nestedBraces += 1;
                this.bump();
                break;
              }
              case 125: {
                if (nestedBraces > 0) {
                  nestedBraces -= 1;
                } else {
                  return {
                    val: this.message.slice(startPosition.offset, this.offset()),
                    err: null
                  };
                }
                break;
              }
              default:
                this.bump();
                break;
            }
          }
          return {
            val: this.message.slice(startPosition.offset, this.offset()),
            err: null
          };
        };
        Parser2.prototype.parseNumberSkeletonFromString = function(skeleton, location) {
          var tokens = [];
          try {
            tokens = (0, icu_skeleton_parser_1.parseNumberSkeletonFromString)(skeleton);
          } catch (e) {
            return this.error(error_1.ErrorKind.INVALID_NUMBER_SKELETON, location);
          }
          return {
            val: {
              type: types_1.SKELETON_TYPE.number,
              tokens,
              location,
              parsedOptions: this.shouldParseSkeletons ? (0, icu_skeleton_parser_1.parseNumberSkeleton)(tokens) : {}
            },
            err: null
          };
        };
        Parser2.prototype.tryParsePluralOrSelectOptions = function(nestingLevel, parentArgType, expectCloseTag, parsedFirstIdentifier) {
          var _a4;
          var hasOtherClause = false;
          var options = [];
          var parsedSelectors = /* @__PURE__ */ new Set();
          var selector = parsedFirstIdentifier.value, selectorLocation = parsedFirstIdentifier.location;
          while (true) {
            if (selector.length === 0) {
              var startPosition = this.clonePosition();
              if (parentArgType !== "select" && this.bumpIf("=")) {
                var result = this.tryParseDecimalInteger(error_1.ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, error_1.ErrorKind.INVALID_PLURAL_ARGUMENT_SELECTOR);
                if (result.err) {
                  return result;
                }
                selectorLocation = createLocation(startPosition, this.clonePosition());
                selector = this.message.slice(startPosition.offset, this.offset());
              } else {
                break;
              }
            }
            if (parsedSelectors.has(selector)) {
              return this.error(parentArgType === "select" ? error_1.ErrorKind.DUPLICATE_SELECT_ARGUMENT_SELECTOR : error_1.ErrorKind.DUPLICATE_PLURAL_ARGUMENT_SELECTOR, selectorLocation);
            }
            if (selector === "other") {
              hasOtherClause = true;
            }
            this.bumpSpace();
            var openingBracePosition = this.clonePosition();
            if (!this.bumpIf("{")) {
              return this.error(parentArgType === "select" ? error_1.ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT : error_1.ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT, createLocation(this.clonePosition(), this.clonePosition()));
            }
            var fragmentResult = this.parseMessage(nestingLevel + 1, parentArgType, expectCloseTag);
            if (fragmentResult.err) {
              return fragmentResult;
            }
            var argCloseResult = this.tryParseArgumentClose(openingBracePosition);
            if (argCloseResult.err) {
              return argCloseResult;
            }
            options.push([
              selector,
              {
                value: fragmentResult.val,
                location: createLocation(openingBracePosition, this.clonePosition())
              }
            ]);
            parsedSelectors.add(selector);
            this.bumpSpace();
            _a4 = this.parseIdentifierIfPossible(), selector = _a4.value, selectorLocation = _a4.location;
          }
          if (options.length === 0) {
            return this.error(parentArgType === "select" ? error_1.ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR : error_1.ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, createLocation(this.clonePosition(), this.clonePosition()));
          }
          if (this.requiresOtherClause && !hasOtherClause) {
            return this.error(error_1.ErrorKind.MISSING_OTHER_CLAUSE, createLocation(this.clonePosition(), this.clonePosition()));
          }
          return { val: options, err: null };
        };
        Parser2.prototype.tryParseDecimalInteger = function(expectNumberError, invalidNumberError) {
          var sign = 1;
          var startingPosition = this.clonePosition();
          if (this.bumpIf("+")) {
          } else if (this.bumpIf("-")) {
            sign = -1;
          }
          var hasDigits = false;
          var decimal = 0;
          while (!this.isEOF()) {
            var ch = this.char();
            if (ch >= 48 && ch <= 57) {
              hasDigits = true;
              decimal = decimal * 10 + (ch - 48);
              this.bump();
            } else {
              break;
            }
          }
          var location = createLocation(startingPosition, this.clonePosition());
          if (!hasDigits) {
            return this.error(expectNumberError, location);
          }
          decimal *= sign;
          if (!isSafeInteger(decimal)) {
            return this.error(invalidNumberError, location);
          }
          return { val: decimal, err: null };
        };
        Parser2.prototype.offset = function() {
          return this.position.offset;
        };
        Parser2.prototype.isEOF = function() {
          return this.offset() === this.message.length;
        };
        Parser2.prototype.clonePosition = function() {
          return {
            offset: this.position.offset,
            line: this.position.line,
            column: this.position.column
          };
        };
        Parser2.prototype.char = function() {
          var offset = this.position.offset;
          if (offset >= this.message.length) {
            throw Error("out of bound");
          }
          var code = codePointAt(this.message, offset);
          if (code === void 0) {
            throw Error("Offset ".concat(offset, " is at invalid UTF-16 code unit boundary"));
          }
          return code;
        };
        Parser2.prototype.error = function(kind, location) {
          return {
            val: null,
            err: {
              kind,
              message: this.message,
              location
            }
          };
        };
        Parser2.prototype.bump = function() {
          if (this.isEOF()) {
            return;
          }
          var code = this.char();
          if (code === 10) {
            this.position.line += 1;
            this.position.column = 1;
            this.position.offset += 1;
          } else {
            this.position.column += 1;
            this.position.offset += code < 65536 ? 1 : 2;
          }
        };
        Parser2.prototype.bumpIf = function(prefix) {
          if (startsWith(this.message, prefix, this.offset())) {
            for (var i = 0; i < prefix.length; i++) {
              this.bump();
            }
            return true;
          }
          return false;
        };
        Parser2.prototype.bumpUntil = function(pattern) {
          var currentOffset = this.offset();
          var index = this.message.indexOf(pattern, currentOffset);
          if (index >= 0) {
            this.bumpTo(index);
            return true;
          } else {
            this.bumpTo(this.message.length);
            return false;
          }
        };
        Parser2.prototype.bumpTo = function(targetOffset) {
          if (this.offset() > targetOffset) {
            throw Error("targetOffset ".concat(targetOffset, " must be greater than or equal to the current offset ").concat(this.offset()));
          }
          targetOffset = Math.min(targetOffset, this.message.length);
          while (true) {
            var offset = this.offset();
            if (offset === targetOffset) {
              break;
            }
            if (offset > targetOffset) {
              throw Error("targetOffset ".concat(targetOffset, " is at invalid UTF-16 code unit boundary"));
            }
            this.bump();
            if (this.isEOF()) {
              break;
            }
          }
        };
        Parser2.prototype.bumpSpace = function() {
          while (!this.isEOF() && _isWhiteSpace(this.char())) {
            this.bump();
          }
        };
        Parser2.prototype.peek = function() {
          if (this.isEOF()) {
            return null;
          }
          var code = this.char();
          var offset = this.offset();
          var nextCode = this.message.charCodeAt(offset + (code >= 65536 ? 2 : 1));
          return nextCode !== null && nextCode !== void 0 ? nextCode : null;
        };
        return Parser2;
      })()
    );
    exports2.Parser = Parser;
    function _isAlpha(codepoint) {
      return codepoint >= 97 && codepoint <= 122 || codepoint >= 65 && codepoint <= 90;
    }
    __name(_isAlpha, "_isAlpha");
    function _isAlphaOrSlash(codepoint) {
      return _isAlpha(codepoint) || codepoint === 47;
    }
    __name(_isAlphaOrSlash, "_isAlphaOrSlash");
    function _isPotentialElementNameChar(c) {
      return c === 45 || c === 46 || c >= 48 && c <= 57 || c === 95 || c >= 97 && c <= 122 || c >= 65 && c <= 90 || c == 183 || c >= 192 && c <= 214 || c >= 216 && c <= 246 || c >= 248 && c <= 893 || c >= 895 && c <= 8191 || c >= 8204 && c <= 8205 || c >= 8255 && c <= 8256 || c >= 8304 && c <= 8591 || c >= 11264 && c <= 12271 || c >= 12289 && c <= 55295 || c >= 63744 && c <= 64975 || c >= 65008 && c <= 65533 || c >= 65536 && c <= 983039;
    }
    __name(_isPotentialElementNameChar, "_isPotentialElementNameChar");
    function _isWhiteSpace(c) {
      return c >= 9 && c <= 13 || c === 32 || c === 133 || c >= 8206 && c <= 8207 || c === 8232 || c === 8233;
    }
    __name(_isWhiteSpace, "_isWhiteSpace");
    function _isPatternSyntax(c) {
      return c >= 33 && c <= 35 || c === 36 || c >= 37 && c <= 39 || c === 40 || c === 41 || c === 42 || c === 43 || c === 44 || c === 45 || c >= 46 && c <= 47 || c >= 58 && c <= 59 || c >= 60 && c <= 62 || c >= 63 && c <= 64 || c === 91 || c === 92 || c === 93 || c === 94 || c === 96 || c === 123 || c === 124 || c === 125 || c === 126 || c === 161 || c >= 162 && c <= 165 || c === 166 || c === 167 || c === 169 || c === 171 || c === 172 || c === 174 || c === 176 || c === 177 || c === 182 || c === 187 || c === 191 || c === 215 || c === 247 || c >= 8208 && c <= 8213 || c >= 8214 && c <= 8215 || c === 8216 || c === 8217 || c === 8218 || c >= 8219 && c <= 8220 || c === 8221 || c === 8222 || c === 8223 || c >= 8224 && c <= 8231 || c >= 8240 && c <= 8248 || c === 8249 || c === 8250 || c >= 8251 && c <= 8254 || c >= 8257 && c <= 8259 || c === 8260 || c === 8261 || c === 8262 || c >= 8263 && c <= 8273 || c === 8274 || c === 8275 || c >= 8277 && c <= 8286 || c >= 8592 && c <= 8596 || c >= 8597 &&
      c <= 8601 || c >= 8602 && c <= 8603 || c >= 8604 && c <= 8607 || c === 8608 || c >= 8609 && c <= 8610 || c === 8611 || c >= 8612 && c <= 8613 || c === 8614 || c >= 8615 && c <= 8621 || c === 8622 || c >= 8623 && c <= 8653 || c >= 8654 && c <= 8655 || c >= 8656 && c <= 8657 || c === 8658 || c === 8659 || c === 8660 || c >= 8661 && c <= 8691 || c >= 8692 && c <= 8959 || c >= 8960 && c <= 8967 || c === 8968 || c === 8969 || c === 8970 || c === 8971 || c >= 8972 && c <= 8991 || c >= 8992 && c <= 8993 || c >= 8994 && c <= 9e3 || c === 9001 || c === 9002 || c >= 9003 && c <= 9083 || c === 9084 || c >= 9085 && c <= 9114 || c >= 9115 && c <= 9139 || c >= 9140 && c <= 9179 || c >= 9180 && c <= 9185 || c >= 9186 && c <= 9254 || c >= 9255 && c <= 9279 || c >= 9280 && c <= 9290 || c >= 9291 && c <= 9311 || c >= 9472 && c <= 9654 || c === 9655 || c >= 9656 && c <= 9664 || c === 9665 || c >= 9666 && c <= 9719 || c >= 9720 && c <= 9727 || c >= 9728 && c <= 9838 || c === 9839 || c >= 9840 && c <=
      10087 || c === 10088 || c === 10089 || c === 10090 || c === 10091 || c === 10092 || c === 10093 || c === 10094 || c === 10095 || c === 10096 || c === 10097 || c === 10098 || c === 10099 || c === 10100 || c === 10101 || c >= 10132 && c <= 10175 || c >= 10176 && c <= 10180 || c === 10181 || c === 10182 || c >= 10183 && c <= 10213 || c === 10214 || c === 10215 || c === 10216 || c === 10217 || c === 10218 || c === 10219 || c === 10220 || c === 10221 || c === 10222 || c === 10223 || c >= 10224 && c <= 10239 || c >= 10240 && c <= 10495 || c >= 10496 && c <= 10626 || c === 10627 || c === 10628 || c === 10629 || c === 10630 || c === 10631 || c === 10632 || c === 10633 || c === 10634 || c === 10635 || c === 10636 || c === 10637 || c === 10638 || c === 10639 || c === 10640 || c === 10641 || c === 10642 || c === 10643 || c === 10644 || c === 10645 || c === 10646 || c === 10647 || c === 10648 || c >= 10649 && c <= 10711 || c === 10712 || c === 10713 || c === 10714 || c === 10715 || c >= 10716 &&
      c <= 10747 || c === 10748 || c === 10749 || c >= 10750 && c <= 11007 || c >= 11008 && c <= 11055 || c >= 11056 && c <= 11076 || c >= 11077 && c <= 11078 || c >= 11079 && c <= 11084 || c >= 11085 && c <= 11123 || c >= 11124 && c <= 11125 || c >= 11126 && c <= 11157 || c === 11158 || c >= 11159 && c <= 11263 || c >= 11776 && c <= 11777 || c === 11778 || c === 11779 || c === 11780 || c === 11781 || c >= 11782 && c <= 11784 || c === 11785 || c === 11786 || c === 11787 || c === 11788 || c === 11789 || c >= 11790 && c <= 11798 || c === 11799 || c >= 11800 && c <= 11801 || c === 11802 || c === 11803 || c === 11804 || c === 11805 || c >= 11806 && c <= 11807 || c === 11808 || c === 11809 || c === 11810 || c === 11811 || c === 11812 || c === 11813 || c === 11814 || c === 11815 || c === 11816 || c === 11817 || c >= 11818 && c <= 11822 || c === 11823 || c >= 11824 && c <= 11833 || c >= 11834 && c <= 11835 || c >= 11836 && c <= 11839 || c === 11840 || c === 11841 || c === 11842 || c >= 11843 &&
      c <= 11855 || c >= 11856 && c <= 11857 || c === 11858 || c >= 11859 && c <= 11903 || c >= 12289 && c <= 12291 || c === 12296 || c === 12297 || c === 12298 || c === 12299 || c === 12300 || c === 12301 || c === 12302 || c === 12303 || c === 12304 || c === 12305 || c >= 12306 && c <= 12307 || c === 12308 || c === 12309 || c === 12310 || c === 12311 || c === 12312 || c === 12313 || c === 12314 || c === 12315 || c === 12316 || c === 12317 || c >= 12318 && c <= 12319 || c === 12320 || c === 12336 || c === 64830 || c === 64831 || c >= 65093 && c <= 65094;
    }
    __name(_isPatternSyntax, "_isPatternSyntax");
  }
});

// node_modules/@formatjs/icu-messageformat-parser/index.js
var require_icu_messageformat_parser = __commonJS({
  "node_modules/@formatjs/icu-messageformat-parser/index.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2._Parser = exports2.parse = void 0;
    var tslib_1 = (init_tslib_es62(), __toCommonJS(tslib_es6_exports2));
    var error_1 = require_error();
    var parser_1 = require_parser();
    var types_1 = require_types();
    function pruneLocation(els) {
      els.forEach(function(el) {
        delete el.location;
        if ((0, types_1.isSelectElement)(el) || (0, types_1.isPluralElement)(el)) {
          for (var k in el.options) {
            delete el.options[k].location;
            pruneLocation(el.options[k].value);
          }
        } else if ((0, types_1.isNumberElement)(el) && (0, types_1.isNumberSkeleton)(el.style)) {
          delete el.style.location;
        } else if (((0, types_1.isDateElement)(el) || (0, types_1.isTimeElement)(el)) && (0, types_1.isDateTimeSkeleton)(el.style)) {
          delete el.style.location;
        } else if ((0, types_1.isTagElement)(el)) {
          pruneLocation(el.children);
        }
      });
    }
    __name(pruneLocation, "pruneLocation");
    function parse(message, opts) {
      if (opts === void 0) {
        opts = {};
      }
      opts = tslib_1.__assign({ shouldParseSkeletons: true, requiresOtherClause: true }, opts);
      var result = new parser_1.Parser(message, opts).parse();
      if (result.err) {
        var error = SyntaxError(error_1.ErrorKind[result.err.kind]);
        error.location = result.err.location;
        error.originalMessage = result.err.message;
        throw error;
      }
      if (!(opts === null || opts === void 0 ? void 0 : opts.captureLocation)) {
        pruneLocation(result.val);
      }
      return result.val;
    }
    __name(parse, "parse");
    exports2.parse = parse;
    tslib_1.__exportStar(require_types(), exports2);
    exports2._Parser = parser_1.Parser;
  }
});

// node_modules/@formatjs/fast-memoize/index.js
var require_fast_memoize = __commonJS({
  "node_modules/@formatjs/fast-memoize/index.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.strategies = exports2.memoize = void 0;
    function memoize(fn, options) {
      var cache = options && options.cache ? options.cache : cacheDefault;
      var serializer = options && options.serializer ? options.serializer : serializerDefault;
      var strategy = options && options.strategy ? options.strategy : strategyDefault;
      return strategy(fn, {
        cache,
        serializer
      });
    }
    __name(memoize, "memoize");
    exports2.memoize = memoize;
    function isPrimitive(value) {
      return value == null || typeof value === "number" || typeof value === "boolean";
    }
    __name(isPrimitive, "isPrimitive");
    function monadic(fn, cache, serializer, arg) {
      var cacheKey = isPrimitive(arg) ? arg : serializer(arg);
      var computedValue = cache.get(cacheKey);
      if (typeof computedValue === "undefined") {
        computedValue = fn.call(this, arg);
        cache.set(cacheKey, computedValue);
      }
      return computedValue;
    }
    __name(monadic, "monadic");
    function variadic(fn, cache, serializer) {
      var args = Array.prototype.slice.call(arguments, 3);
      var cacheKey = serializer(args);
      var computedValue = cache.get(cacheKey);
      if (typeof computedValue === "undefined") {
        computedValue = fn.apply(this, args);
        cache.set(cacheKey, computedValue);
      }
      return computedValue;
    }
    __name(variadic, "variadic");
    function assemble(fn, context, strategy, cache, serialize) {
      return strategy.bind(context, fn, cache, serialize);
    }
    __name(assemble, "assemble");
    function strategyDefault(fn, options) {
      var strategy = fn.length === 1 ? monadic : variadic;
      return assemble(fn, this, strategy, options.cache.create(), options.serializer);
    }
    __name(strategyDefault, "strategyDefault");
    function strategyVariadic(fn, options) {
      return assemble(fn, this, variadic, options.cache.create(), options.serializer);
    }
    __name(strategyVariadic, "strategyVariadic");
    function strategyMonadic(fn, options) {
      return assemble(fn, this, monadic, options.cache.create(), options.serializer);
    }
    __name(strategyMonadic, "strategyMonadic");
    var serializerDefault = /* @__PURE__ */ __name(function() {
      return JSON.stringify(arguments);
    }, "serializerDefault");
    function ObjectWithoutPrototypeCache() {
      this.cache = /* @__PURE__ */ Object.create(null);
    }
    __name(ObjectWithoutPrototypeCache, "ObjectWithoutPrototypeCache");
    ObjectWithoutPrototypeCache.prototype.get = function(key) {
      return this.cache[key];
    };
    ObjectWithoutPrototypeCache.prototype.set = function(key, value) {
      this.cache[key] = value;
    };
    var cacheDefault = {
      create: /* @__PURE__ */ __name(function create() {
        return new ObjectWithoutPrototypeCache();
      }, "create")
    };
    exports2.strategies = {
      variadic: strategyVariadic,
      monadic: strategyMonadic
    };
  }
});

// node_modules/intl-messageformat/src/error.js
var require_error2 = __commonJS({
  "node_modules/intl-messageformat/src/error.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.MissingValueError = exports2.InvalidValueTypeError = exports2.InvalidValueError = exports2.FormatError = exports2.ErrorCode = void 0;
    var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports));
    var ErrorCode;
    (function(ErrorCode2) {
      ErrorCode2["MISSING_VALUE"] = "MISSING_VALUE";
      ErrorCode2["INVALID_VALUE"] = "INVALID_VALUE";
      ErrorCode2["MISSING_INTL_API"] = "MISSING_INTL_API";
    })(ErrorCode = exports2.ErrorCode || (exports2.ErrorCode = {}));
    var FormatError = (
      /** @class */
      (function(_super) {
        tslib_1.__extends(FormatError2, _super);
        function FormatError2(msg, code, originalMessage) {
          var _this = _super.call(this, msg) || this;
          _this.code = code;
          _this.originalMessage = originalMessage;
          return _this;
        }
        __name(FormatError2, "FormatError");
        FormatError2.prototype.toString = function() {
          return "[formatjs Error: ".concat(this.code, "] ").concat(this.message);
        };
        return FormatError2;
      })(Error)
    );
    exports2.FormatError = FormatError;
    var InvalidValueError = (
      /** @class */
      (function(_super) {
        tslib_1.__extends(InvalidValueError2, _super);
        function InvalidValueError2(variableId, value, options, originalMessage) {
          return _super.call(this, 'Invalid values for "'.concat(variableId, '": "').concat(value, '". Options are "').concat(Object.keys(options).join('", "'), '"'), ErrorCode.INVALID_VALUE, originalMessage) || this;
        }
        __name(InvalidValueError2, "InvalidValueError");
        return InvalidValueError2;
      })(FormatError)
    );
    exports2.InvalidValueError = InvalidValueError;
    var InvalidValueTypeError = (
      /** @class */
      (function(_super) {
        tslib_1.__extends(InvalidValueTypeError2, _super);
        function InvalidValueTypeError2(value, type, originalMessage) {
          return _super.call(this, 'Value for "'.concat(value, '" must be of type ').concat(type), ErrorCode.INVALID_VALUE, originalMessage) || this;
        }
        __name(InvalidValueTypeError2, "InvalidValueTypeError");
        return InvalidValueTypeError2;
      })(FormatError)
    );
    exports2.InvalidValueTypeError = InvalidValueTypeError;
    var MissingValueError = (
      /** @class */
      (function(_super) {
        tslib_1.__extends(MissingValueError2, _super);
        function MissingValueError2(variableId, originalMessage) {
          return _super.call(this, 'The intl string context variable "'.concat(variableId, '" was not provided to the string "').concat(originalMessage, '"'), ErrorCode.MISSING_VALUE, originalMessage) || this;
        }
        __name(MissingValueError2, "MissingValueError");
        return MissingValueError2;
      })(FormatError)
    );
    exports2.MissingValueError = MissingValueError;
  }
});

// node_modules/intl-messageformat/src/formatters.js
var require_formatters = __commonJS({
  "node_modules/intl-messageformat/src/formatters.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.formatToParts = exports2.isFormatXMLElementFn = exports2.PART_TYPE = void 0;
    var icu_messageformat_parser_1 = require_icu_messageformat_parser();
    var error_1 = require_error2();
    var PART_TYPE;
    (function(PART_TYPE2) {
      PART_TYPE2[PART_TYPE2["literal"] = 0] = "literal";
      PART_TYPE2[PART_TYPE2["object"] = 1] = "object";
    })(PART_TYPE = exports2.PART_TYPE || (exports2.PART_TYPE = {}));
    function mergeLiteral(parts) {
      if (parts.length < 2) {
        return parts;
      }
      return parts.reduce(function(all, part) {
        var lastPart = all[all.length - 1];
        if (!lastPart || lastPart.type !== PART_TYPE.literal || part.type !== PART_TYPE.literal) {
          all.push(part);
        } else {
          lastPart.value += part.value;
        }
        return all;
      }, []);
    }
    __name(mergeLiteral, "mergeLiteral");
    function isFormatXMLElementFn(el) {
      return typeof el === "function";
    }
    __name(isFormatXMLElementFn, "isFormatXMLElementFn");
    exports2.isFormatXMLElementFn = isFormatXMLElementFn;
    function formatToParts(els, locales2, formatters, formats2, values, currentPluralValue, originalMessage) {
      if (els.length === 1 && (0, icu_messageformat_parser_1.isLiteralElement)(els[0])) {
        return [
          {
            type: PART_TYPE.literal,
            value: els[0].value
          }
        ];
      }
      var result = [];
      for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {
        var el = els_1[_i];
        if ((0, icu_messageformat_parser_1.isLiteralElement)(el)) {
          result.push({
            type: PART_TYPE.literal,
            value: el.value
          });
          continue;
        }
        if ((0, icu_messageformat_parser_1.isPoundElement)(el)) {
          if (typeof currentPluralValue === "number") {
            result.push({
              type: PART_TYPE.literal,
              value: formatters.getNumberFormat(locales2).format(currentPluralValue)
            });
          }
          continue;
        }
        var varName = el.value;
        if (!(values && varName in values)) {
          throw new error_1.MissingValueError(varName, originalMessage);
        }
        var value = values[varName];
        if ((0, icu_messageformat_parser_1.isArgumentElement)(el)) {
          if (!value || typeof value === "string" || typeof value === "number") {
            value = typeof value === "string" || typeof value === "number" ? String(value) : "";
          }
          result.push({
            type: typeof value === "string" ? PART_TYPE.literal : PART_TYPE.object,
            value
          });
          continue;
        }
        if ((0, icu_messageformat_parser_1.isDateElement)(el)) {
          var style = typeof el.style === "string" ? formats2.date[el.style] : (0, icu_messageformat_parser_1.isDateTimeSkeleton)(el.style) ? el.style.parsedOptions : void 0;
          result.push({
            type: PART_TYPE.literal,
            value: formatters.getDateTimeFormat(locales2, style).format(value)
          });
          continue;
        }
        if ((0, icu_messageformat_parser_1.isTimeElement)(el)) {
          var style = typeof el.style === "string" ? formats2.time[el.style] : (0, icu_messageformat_parser_1.isDateTimeSkeleton)(el.style) ? el.style.parsedOptions : formats2.time.medium;
          result.push({
            type: PART_TYPE.literal,
            value: formatters.getDateTimeFormat(locales2, style).format(value)
          });
          continue;
        }
        if ((0, icu_messageformat_parser_1.isNumberElement)(el)) {
          var style = typeof el.style === "string" ? formats2.number[el.style] : (0, icu_messageformat_parser_1.isNumberSkeleton)(el.style) ? el.style.parsedOptions : void 0;
          if (style && style.scale) {
            value = value * (style.scale || 1);
          }
          result.push({
            type: PART_TYPE.literal,
            value: formatters.getNumberFormat(locales2, style).format(value)
          });
          continue;
        }
        if ((0, icu_messageformat_parser_1.isTagElement)(el)) {
          var children = el.children, value_1 = el.value;
          var formatFn = values[value_1];
          if (!isFormatXMLElementFn(formatFn)) {
            throw new error_1.InvalidValueTypeError(value_1, "function", originalMessage);
          }
          var parts = formatToParts(children, locales2, formatters, formats2, values, currentPluralValue);
          var chunks = formatFn(parts.map(function(p) {
            return p.value;
          }));
          if (!Array.isArray(chunks)) {
            chunks = [chunks];
          }
          result.push.apply(result, chunks.map(function(c) {
            return {
              type: typeof c === "string" ? PART_TYPE.literal : PART_TYPE.object,
              value: c
            };
          }));
        }
        if ((0, icu_messageformat_parser_1.isSelectElement)(el)) {
          var opt = el.options[value] || el.options.other;
          if (!opt) {
            throw new error_1.InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);
          }
          result.push.apply(result, formatToParts(opt.value, locales2, formatters, formats2, values));
          continue;
        }
        if ((0, icu_messageformat_parser_1.isPluralElement)(el)) {
          var opt = el.options["=".concat(value)];
          if (!opt) {
            if (!Intl.PluralRules) {
              throw new error_1.FormatError('Intl.PluralRules is not available in this environment.\nTry polyfilling it using "@formatjs/intl-pluralrules"\n', error_1.ErrorCode.MISSING_INTL_API, originalMessage);
            }
            var rule = formatters.getPluralRules(locales2, { type: el.pluralType }).select(value - (el.offset || 0));
            opt = el.options[rule] || el.options.other;
          }
          if (!opt) {
            throw new error_1.InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);
          }
          result.push.apply(result, formatToParts(opt.value, locales2, formatters, formats2, values, value - (el.offset || 0)));
          continue;
        }
      }
      return mergeLiteral(result);
    }
    __name(formatToParts, "formatToParts");
    exports2.formatToParts = formatToParts;
  }
});

// node_modules/intl-messageformat/src/core.js
var require_core = __commonJS({
  "node_modules/intl-messageformat/src/core.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.IntlMessageFormat = void 0;
    var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports));
    var icu_messageformat_parser_1 = require_icu_messageformat_parser();
    var fast_memoize_1 = require_fast_memoize();
    var formatters_1 = require_formatters();
    function mergeConfig(c1, c2) {
      if (!c2) {
        return c1;
      }
      return tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, c1 || {}), c2 || {}), Object.keys(c1).reduce(function(all, k) {
        all[k] = tslib_1.__assign(tslib_1.__assign({}, c1[k]), c2[k] || {});
        return all;
      }, {}));
    }
    __name(mergeConfig, "mergeConfig");
    function mergeConfigs(defaultConfig2, configs) {
      if (!configs) {
        return defaultConfig2;
      }
      return Object.keys(defaultConfig2).reduce(function(all, k) {
        all[k] = mergeConfig(defaultConfig2[k], configs[k]);
        return all;
      }, tslib_1.__assign({}, defaultConfig2));
    }
    __name(mergeConfigs, "mergeConfigs");
    function createFastMemoizeCache(store) {
      return {
        create: /* @__PURE__ */ __name(function() {
          return {
            get: /* @__PURE__ */ __name(function(key) {
              return store[key];
            }, "get"),
            set: /* @__PURE__ */ __name(function(key, value) {
              store[key] = value;
            }, "set")
          };
        }, "create")
      };
    }
    __name(createFastMemoizeCache, "createFastMemoizeCache");
    function createDefaultFormatters(cache) {
      if (cache === void 0) {
        cache = {
          number: {},
          dateTime: {},
          pluralRules: {}
        };
      }
      return {
        getNumberFormat: (0, fast_memoize_1.memoize)(function() {
          var _a3;
          var args = [];
          for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
          }
          return new ((_a3 = Intl.NumberFormat).bind.apply(_a3, tslib_1.__spreadArray([void 0], args, false)))();
        }, {
          cache: createFastMemoizeCache(cache.number),
          strategy: fast_memoize_1.strategies.variadic
        }),
        getDateTimeFormat: (0, fast_memoize_1.memoize)(function() {
          var _a3;
          var args = [];
          for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
          }
          return new ((_a3 = Intl.DateTimeFormat).bind.apply(_a3, tslib_1.__spreadArray([void 0], args, false)))();
        }, {
          cache: createFastMemoizeCache(cache.dateTime),
          strategy: fast_memoize_1.strategies.variadic
        }),
        getPluralRules: (0, fast_memoize_1.memoize)(function() {
          var _a3;
          var args = [];
          for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
          }
          return new ((_a3 = Intl.PluralRules).bind.apply(_a3, tslib_1.__spreadArray([void 0], args, false)))();
        }, {
          cache: createFastMemoizeCache(cache.pluralRules),
          strategy: fast_memoize_1.strategies.variadic
        })
      };
    }
    __name(createDefaultFormatters, "createDefaultFormatters");
    var IntlMessageFormat2 = exports2.IntlMessageFormat = /** @class */
    (function() {
      function IntlMessageFormat3(message, locales2, overrideFormats, opts) {
        if (locales2 === void 0) {
          locales2 = IntlMessageFormat3.defaultLocale;
        }
        var _this = this;
        this.formatterCache = {
          number: {},
          dateTime: {},
          pluralRules: {}
        };
        this.format = function(values) {
          var parts = _this.formatToParts(values);
          if (parts.length === 1) {
            return parts[0].value;
          }
          var result = parts.reduce(function(all, part) {
            if (!all.length || part.type !== formatters_1.PART_TYPE.literal || typeof all[all.length - 1] !== "string") {
              all.push(part.value);
            } else {
              all[all.length - 1] += part.value;
            }
            return all;
          }, []);
          if (result.length <= 1) {
            return result[0] || "";
          }
          return result;
        };
        this.formatToParts = function(values) {
          return (0, formatters_1.formatToParts)(_this.ast, _this.locales, _this.formatters, _this.formats, values, void 0, _this.message);
        };
        this.resolvedOptions = function() {
          var _a4;
          return {
            locale: ((_a4 = _this.resolvedLocale) === null || _a4 === void 0 ? void 0 : _a4.toString()) || Intl.NumberFormat.supportedLocalesOf(_this.locales)[0]
          };
        };
        this.getAst = function() {
          return _this.ast;
        };
        this.locales = locales2;
        this.resolvedLocale = IntlMessageFormat3.resolveLocale(locales2);
        if (typeof message === "string") {
          this.message = message;
          if (!IntlMessageFormat3.__parse) {
            throw new TypeError("IntlMessageFormat.__parse must be set to process `message` of type `string`");
          }
          var _a3 = opts || {}, formatters = _a3.formatters, parseOpts = tslib_1.__rest(_a3, ["formatters"]);
          this.ast = IntlMessageFormat3.__parse(message, tslib_1.__assign(tslib_1.__assign({}, parseOpts), { locale: this.resolvedLocale }));
        } else {
          this.ast = message;
        }
        if (!Array.isArray(this.ast)) {
          throw new TypeError("A message must be provided as a String or AST.");
        }
        this.formats = mergeConfigs(IntlMessageFormat3.formats, overrideFormats);
        this.formatters = opts && opts.formatters || createDefaultFormatters(this.formatterCache);
      }
      __name(IntlMessageFormat3, "IntlMessageFormat");
      Object.defineProperty(IntlMessageFormat3, "defaultLocale", {
        get: /* @__PURE__ */ __name(function() {
          if (!IntlMessageFormat3.memoizedDefaultLocale) {
            IntlMessageFormat3.memoizedDefaultLocale = new Intl.NumberFormat().resolvedOptions().locale;
          }
          return IntlMessageFormat3.memoizedDefaultLocale;
        }, "get"),
        enumerable: false,
        configurable: true
      });
      IntlMessageFormat3.memoizedDefaultLocale = null;
      IntlMessageFormat3.resolveLocale = function(locales2) {
        if (typeof Intl.Locale === "undefined") {
          return;
        }
        var supportedLocales = Intl.NumberFormat.supportedLocalesOf(locales2);
        if (supportedLocales.length > 0) {
          return new Intl.Locale(supportedLocales[0]);
        }
        return new Intl.Locale(typeof locales2 === "string" ? locales2 : locales2[0]);
      };
      IntlMessageFormat3.__parse = icu_messageformat_parser_1.parse;
      IntlMessageFormat3.formats = {
        number: {
          integer: {
            maximumFractionDigits: 0
          },
          currency: {
            style: "currency"
          },
          percent: {
            style: "percent"
          }
        },
        date: {
          short: {
            month: "numeric",
            day: "numeric",
            year: "2-digit"
          },
          medium: {
            month: "short",
            day: "numeric",
            year: "numeric"
          },
          long: {
            month: "long",
            day: "numeric",
            year: "numeric"
          },
          full: {
            weekday: "long",
            month: "long",
            day: "numeric",
            year: "numeric"
          }
        },
        time: {
          short: {
            hour: "numeric",
            minute: "numeric"
          },
          medium: {
            hour: "numeric",
            minute: "numeric",
            second: "numeric"
          },
          long: {
            hour: "numeric",
            minute: "numeric",
            second: "numeric",
            timeZoneName: "short"
          },
          full: {
            hour: "numeric",
            minute: "numeric",
            second: "numeric",
            timeZoneName: "short"
          }
        }
      };
      return IntlMessageFormat3;
    })();
  }
});

// node_modules/intl-messageformat/index.js
var require_intl_messageformat = __commonJS({
  "node_modules/intl-messageformat/index.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports));
    var core_1 = require_core();
    tslib_1.__exportStar(require_formatters(), exports2);
    tslib_1.__exportStar(require_core(), exports2);
    tslib_1.__exportStar(require_error2(), exports2);
    exports2.default = core_1.IntlMessageFormat;
  }
});

// replace-modules:module
var createRequire;
var init_module = __esm({
  "replace-modules:module"() {
    init_process_global();
    createRequire = /* @__PURE__ */ __name(() => ({
      resolve() {
        throw new Error("createRequire.resolve is not supported");
      }
    }), "createRequire");
  }
});

// replace-modules:url
var URL2, fileURLToPath, url_default;
var init_url = __esm({
  "replace-modules:url"() {
    init_process_global();
    URL2 = globalThis.URL;
    fileURLToPath = /* @__PURE__ */ __name((url) => url, "fileURLToPath");
    url_default = { URL: URL2, fileURLToPath };
  }
});

// shared/esm-utils.js
function getModulePath(importMeta) {
  return url_default.fileURLToPath(importMeta.url);
}
var init_esm_utils = __esm({
  "shared/esm-utils.js"() {
    "use strict";
    init_process_global();
    init_module();
    init_url();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(getModulePath, "getModulePath");
  }
});

// shared/type-verifiers.js
function isObjectOfUnknownValues(val) {
  return typeof val === "object" && val !== null && !Array.isArray(val);
}
function isObjectOrArrayOfUnknownValues(val) {
  return typeof val === "object" && val !== null;
}
var init_type_verifiers = __esm({
  "shared/type-verifiers.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(isObjectOfUnknownValues, "isObjectOfUnknownValues");
    __name(isObjectOrArrayOfUnknownValues, "isObjectOrArrayOfUnknownValues");
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/shared/localization/locales.js
var locales;
var init_locales = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/shared/localization/locales.js"() {
    init_process_global();
    locales = {};
  }
});

// shared/localization/format.js
function collectAllCustomElementsFromICU(icuElements, customElements = /* @__PURE__ */ new Map()) {
  for (const el of icuElements) {
    if (el.type === TYPE.literal || el.type === TYPE.pound) continue;
    customElements.set(el.value, el);
    if (el.type === TYPE.plural) {
      for (const option of Object.values(el.options)) {
        collectAllCustomElementsFromICU(option.value, customElements);
      }
    }
  }
  return customElements;
}
function _preformatValues(messageFormatter, values = {}, lhlMessage) {
  const customElements = collectAllCustomElementsFromICU(messageFormatter.getAst());
  const formattedValues = {};
  for (const [id, element] of customElements) {
    if (!(id in values)) {
      throw new Error(`ICU Message "${lhlMessage}" contains a value reference ("${id}") that wasn't provided`);
    }
    const value = values[id];
    if (element.type !== TYPE.number) {
      formattedValues[id] = value;
      continue;
    }
    if (typeof value !== "number") {
      throw new Error(`ICU Message "${lhlMessage}" contains a numeric reference ("${id}") but provided value was not a number`);
    }
    if (element.style === "milliseconds") {
      formattedValues[id] = Math.round(value / 10) * 10;
    } else if (element.style === "seconds" && id === "timeInMs") {
      formattedValues[id] = Math.round(value / 100) / 10;
    } else if (element.style === "bytes") {
      formattedValues[id] = value / 1024;
    } else {
      formattedValues[id] = value;
    }
  }
  for (const valueId of Object.keys(values)) {
    if (valueId in formattedValues) continue;
    if (valueId === "errorCode") {
      formattedValues.errorCode = values.errorCode;
      continue;
    }
    throw new Error(`Provided value "${valueId}" does not match any placeholder in ICU message "${lhlMessage}"`);
  }
  return formattedValues;
}
function escapeIcuMessage(message) {
  return message.replace(/'/g, `''`).replace(/\\{/g, `'{`).replace(/\\}/g, `'}`);
}
function formatMessage(message, values, locale) {
  message = escapeIcuMessage(message);
  const localeForMessageFormat = locale === "en-XA" || locale === "en-XL" ? "de-DE" : locale;
  const IntlMessageFormatCtor = import_intl_messageformat.default.IntlMessageFormat || import_intl_messageformat.default;
  const formatter = new IntlMessageFormatCtor(message, localeForMessageFormat, formats, {
    ignoreTag: true
  });
  const valuesForMessageFormat = _preformatValues(formatter, values, message);
  const formattedResult = formatter.format(valuesForMessageFormat);
  if (typeof formattedResult !== "string") {
    throw new Error("unexpected formatted result");
  }
  return formattedResult;
}
function _localizeIcuMessage(icuMessage, locale) {
  const localeMessages = _getLocaleMessages(locale);
  const localeMessage = localeMessages[icuMessage.i18nId];
  if (!localeMessage) {
    return icuMessage.formattedDefault;
  }
  return formatMessage(localeMessage.message, icuMessage.values, locale);
}
function getRendererFormattedStrings(locale) {
  const localeMessages = _getLocaleMessages(locale);
  const icuMessageIds = Object.keys(localeMessages).filter((f) => f.startsWith("report/renderer/report-utils.js"));
  const strings = {};
  for (const icuMessageId of icuMessageIds) {
    const { filename, key } = getIcuMessageIdParts(icuMessageId);
    if (!filename.endsWith("report-utils.js")) {
      throw new Error(`Unexpected message: ${icuMessageId}`);
    }
    strings[key] = localeMessages[icuMessageId].message;
  }
  return strings;
}
function isIcuMessage(icuMessageOrNot) {
  if (!isObjectOfUnknownValues(icuMessageOrNot)) {
    return false;
  }
  const { i18nId, values, formattedDefault } = icuMessageOrNot;
  if (typeof i18nId !== "string") {
    return false;
  }
  if (typeof formattedDefault !== "string") {
    return false;
  }
  if (values !== void 0) {
    if (!isObjectOfUnknownValues(values)) {
      return false;
    }
    for (const value of Object.values(values)) {
      if (typeof value !== "string" && typeof value !== "number") {
        return false;
      }
    }
  }
  return MESSAGE_I18N_ID_REGEX.test(i18nId);
}
function getFormatted(icuMessageOrRawString, locale) {
  if (isIcuMessage(icuMessageOrRawString)) {
    return _localizeIcuMessage(icuMessageOrRawString, locale);
  }
  if (typeof icuMessageOrRawString === "string") {
    return icuMessageOrRawString;
  }
  throw new Error("Attempted to format invalid icuMessage type");
}
function _formatPathAsString(pathInLHR) {
  let pathAsString = "";
  for (const property of pathInLHR) {
    if (/^[a-z]+$/i.test(property)) {
      if (pathAsString.length) pathAsString += ".";
      pathAsString += property;
    } else {
      if (/]|"|'|\s/.test(property)) throw new Error(`Cannot handle "${property}" in i18n`);
      pathAsString += `[${property}]`;
    }
  }
  return pathAsString;
}
function replaceIcuMessages(inputObject, locale) {
  function replaceInObject(subObject, icuMessagePaths2, pathInLHR = []) {
    if (!isObjectOrArrayOfUnknownValues(subObject)) return;
    for (const [property, possibleIcuMessage] of Object.entries(subObject)) {
      const currentPathInLHR = pathInLHR.concat([property]);
      if (isIcuMessage(possibleIcuMessage)) {
        const formattedString = getFormatted(possibleIcuMessage, locale);
        const messageInstancesInLHR = icuMessagePaths2[possibleIcuMessage.i18nId] || [];
        const currentPathAsString = _formatPathAsString(currentPathInLHR);
        messageInstancesInLHR.push(
          possibleIcuMessage.values ? { values: possibleIcuMessage.values, path: currentPathAsString } : currentPathAsString
        );
        subObject[property] = formattedString;
        icuMessagePaths2[possibleIcuMessage.i18nId] = messageInstancesInLHR;
      } else {
        replaceInObject(possibleIcuMessage, icuMessagePaths2, currentPathInLHR);
      }
    }
  }
  __name(replaceInObject, "replaceInObject");
  const icuMessagePaths = {};
  replaceInObject(inputObject, icuMessagePaths);
  return icuMessagePaths;
}
function _getLocaleMessages(locale) {
  const localeMessages = LOCALE_MESSAGES[locale];
  if (!localeMessages) {
    if (locale === DEFAULT_LOCALE) {
      return {};
    }
    throw new Error(`Unsupported locale '${locale}'`);
  }
  return localeMessages;
}
function getAvailableLocales() {
  const localesWithMessages = /* @__PURE__ */ new Set([...Object.keys(LOCALE_MESSAGES), DEFAULT_LOCALE]);
  return (
    /** @type {Array<LH.Locale>} */
    [...localesWithMessages].sort()
  );
}
function getIcuMessageIdParts(i18nMessageId) {
  if (!MESSAGE_I18N_ID_REGEX.test(i18nMessageId)) {
    throw Error(`"${i18nMessageId}" does not appear to be a valid ICU message id`);
  }
  const [filename, key] = i18nMessageId.split(" | ");
  return { filename, key };
}
var import_intl_messageformat, TYPE, LOCALE_MESSAGES, DEFAULT_LOCALE, CANONICAL_LOCALES, MESSAGE_I18N_ID_REGEX, formats;
var init_format = __esm({
  "shared/localization/format.js"() {
    "use strict";
    init_process_global();
    import_intl_messageformat = __toESM(require_intl_messageformat(), 1);
    init_esm_utils();
    init_type_verifiers();
    init_locales();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    TYPE = /** @type {const} */
    {
      literal: 0,
      argument: 1,
      number: 2,
      date: 3,
      time: 4,
      select: 5,
      plural: 6,
      pound: 7,
      tag: 8
    };
    LOCALE_MESSAGES = locales;
    DEFAULT_LOCALE = "en-US";
    CANONICAL_LOCALES = ["ar-XB.json", "ar.json", "bg.json", "ca.json", "cs.json", "da.json", "de.json", "el.json", "en-GB.json", "en-US.ctc.json", "en-US.json", "en-XA.json", "en-XL.ctc.json", "en-XL.json", "es-419.json", "es.json", "fi.json", "fil.json", "fr.json", "he.json", "hi.json", "hr.json", "hu.json", "id.json", "it.json", "ja.json", "ko.json", "lt.json", "lv.json", "nl.json", "no.json", "pl.json", "pt-PT.json", "pt.json", "ro.json", "ru.json", "sk.json", "sl.json", "sr-Latn.json", "sr.json", "sv.json", "ta.json", "te.json", "th.json", "tr.json", "uk.json", "vi.json", "zh-HK.json", "zh-TW.json", "zh.json"].filter((basename) => basename.endsWith(".json") && !basename.endsWith(".ctc.json")).map((locale) => locale.replace(".json", "")).sort();
    MESSAGE_I18N_ID_REGEX = / | [^\s]+$/;
    formats = {
      number: {
        bytes: {
          maximumFractionDigits: 0
        },
        milliseconds: {
          maximumFractionDigits: 0
        },
        seconds: {
          // Force the seconds to the tenths place for limited output and ease of scanning
          minimumFractionDigits: 1,
          maximumFractionDigits: 1
        },
        extendedPercent: {
          // Force allow up to two digits after decimal place in percentages. (Intl.NumberFormat options)
          maximumFractionDigits: 2,
          style: "percent"
        }
      }
    };
    __name(collectAllCustomElementsFromICU, "collectAllCustomElementsFromICU");
    __name(_preformatValues, "_preformatValues");
    __name(escapeIcuMessage, "escapeIcuMessage");
    __name(formatMessage, "formatMessage");
    __name(_localizeIcuMessage, "_localizeIcuMessage");
    __name(getRendererFormattedStrings, "getRendererFormattedStrings");
    __name(isIcuMessage, "isIcuMessage");
    __name(getFormatted, "getFormatted");
    __name(_formatPathAsString, "_formatPathAsString");
    __name(replaceIcuMessages, "replaceIcuMessages");
    __name(_getLocaleMessages, "_getLocaleMessages");
    __name(getAvailableLocales, "getAvailableLocales");
    __name(getIcuMessageIdParts, "getIcuMessageIdParts");
  }
});

// node_modules/lighthouse-stack-packs/packs/amp.js
var require_amp = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/amp.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="%230379c4" fill-rule="evenodd" d="m171.887 116.28-53.696 89.36h-9.728l9.617-58.227-30.2.047a4.852 4.852 0 0 1-4.855-4.855c0-1.152 1.07-3.102 1.07-3.102l53.52-89.254 9.9.043-9.86 58.317 30.413-.043a4.852 4.852 0 0 1 4.855 4.855c0 1.088-.427 2.044-1.033 2.854l.004.004zM128 0C57.306 0 0 57.3 0 128s57.306 128 128 128 128-57.306 128-128S198.7 0 128 0z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can improve image loading by using WebP in the context of AMP. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "modern-image-formats": "Consider displaying all [`amp-img`](https://amp.dev/documentation/components/amp-img/?format=websites) components in WebP formats while specifying an appropriate fallback for other browsers. [Learn more](https://amp.dev/documentation/components/amp-img/#example:-specifying-a-fallback-image).",
      /** Additional description of a Lighthouse audit that tells the user how images are automatically lazy loaded for the AMP framewok. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "offscreen-images": "Ensure that you are using [`amp-img`](https://amp.dev/documentation/components/amp-img/?format=websites) for images to automatically lazy-load. [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/media_iframes_3p/?format=websites#images).",
      /** 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 AMP framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "render-blocking-resources": "Use tools such as [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/master/packages/optimizer) to [server-side render AMP layouts](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/server-side-rendering/).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by ensuring all the CSS written is supported by the AMP framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-css": "Refer to the [AMP documentation](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages/) to ensure all styles are supported.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by using a runtime-managed animated image in the context of the AMP framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "efficient-animated-content": "For animated content, use [`amp-anim`](https://amp.dev/documentation/components/amp-anim/) to minimize CPU usage when the content is offscreen.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by using responsive images in the context of the AMP framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-responsive-images": "The [`amp-img`](https://amp.dev/documentation/components/amp-img/?format=websites) component supports the [`srcset`](https://web.dev/use-srcset-to-automatically-choose-the-right-image/) attribute to specify which image assets to use based on the screen size. [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/art_direction/)."
    };
    module2.exports = {
      id: "amp",
      title: "AMP",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/angular.js
var require_angular = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/angular.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"><path fill="%23dd0031" d="M125 30 31.9 63.2l14.2 123.1L125 230l78.9-43.7 14.2-123.1z"/><path fill="%23c3002f" d="M125 30v22.2-.1V230l78.9-43.7 14.2-123.1L125 30z"/><path fill="%23fff" d="M125 52.1 66.8 182.6h21.7l11.7-29.2h49.4l11.7 29.2H183L125 52.1zm17 83.3h-34l17-40.9 17 40.9z"/></svg>`;
    var UIStrings137 = {
      /** 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 Angular framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "total-byte-weight": "Apply [route-level code splitting](https://web.dev/route-level-code-splitting-in-angular/) to minimize the size of your JavaScript bundles. Also, consider precaching assets with the [Angular service worker](https://web.dev/precaching-with-the-angular-service-worker/).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by minifying their CSS and JS files in the context of the Angular framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-warning": "If you are using Angular CLI, ensure that builds are generated in production mode. [Learn more](https://angular.io/guide/deployment#enable-runtime-production-mode).",
      /** 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 Angular framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-javascript": "If you are using Angular CLI, include source maps in your production build to inspect your bundles. [Learn more](https://angular.io/guide/deployment#inspect-the-bundles).",
      /** Additional description of a Lighthouse audit that tells the user how they can use responsive images in the context of the Angular framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-responsive-images": "Consider using the `BreakpointObserver` utility in the Component Dev Kit (CDK) to manage image breakpoints. [Learn more](https://material.angular.io/cdk/layout/overview).",
      /** Additional description of a Lighthouse audit that tells the user how they can use preload to improve performance in the context of the Angular framework. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-rel-preload": "Preload routes ahead of time to speed up navigation. [Learn more](https://web.dev/route-preloading-in-angular/).",
      /** Additional description of a Lighthouse audit that tells the user and *how* they should reduce the size of the web page's DOM in the context of the Angular framework. 'Learn More' becomes link text to additional documentation. */
      "dom-size": "Consider virtual scrolling with the Component Dev Kit (CDK) if very large lists are being rendered. [Learn more](https://web.dev/virtualize-lists-with-angular-cdk/)."
    };
    module2.exports = {
      id: "angular",
      title: "Angular",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/drupal.js
var require_drupal = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/drupal.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 186.525 243.713"><path fill="%23009cde" d="M131.64 51.91C114.491 34.769 98.13 18.429 93.26 0c-4.87 18.429-21.234 34.769-38.38 51.91C29.16 77.613 0 106.743 0 150.434a93.263 93.263 0 1 0 186.525 0c0-43.688-29.158-72.821-54.885-98.524m-92 120.256c-5.719-.194-26.824-36.571 12.329-75.303l25.909 28.3a2.215 2.215 0 0 1-.173 3.306c-6.183 6.34-32.534 32.765-35.81 41.902-.675 1.886-1.663 1.815-2.256 1.795m53.624 47.943a32.075 32.075 0 0 1-32.076-32.075 33.423 33.423 0 0 1 7.995-21.187c5.784-7.072 24.077-26.963 24.077-26.963s18.012 20.183 24.033 26.896a31.368 31.368 0 0 1 8.046 21.254 32.076 32.076 0 0 1-32.075 32.075m61.392-52.015c-.691 1.512-2.26 4.036-4.376 4.113-3.773.138-4.176-1.796-6.965-5.923-6.122-9.06-59.551-64.9-69.545-75.699-8.79-9.498-1.238-16.195 2.266-19.704 4.395-4.403 17.224-17.225 17.224-17.225s38.255 36.296 54.19 61.096 10.444 46.26 7.206 53.342"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by removing unused CSS, in the context of the `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-css-rules": "Consider removing unused CSS rules and only attach the needed `Drupal` libraries to the relevant page or component in a page. See the [`Drupal` documentation](https://www.drupal.org/docs/develop/theming-drupal/adding-assets-css-js-to-a-drupal-theme-via-librariesyml#define) for details. To identify attached libraries that are adding extraneous CSS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage) in Chrome DevTools. You can identify the theme/module responsible from the URL of the stylesheet when CSS aggregation is disabled in your `Drupal` site. Look out for themes/modules that have many stylesheets in the list which have a lot of red in code coverage. A theme/module should only attach a stylesheet library if it is actually used on the page.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve image loading by using webp in the context of the `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "modern-image-formats": "Consider configuring [WebP image formats with a Convert image style](https://www.drupal.org/docs/core-modules-and-themes/core-modules/image-module/working-with-images#styles) on your site.",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "offscreen-images": "Consider configuring lazy load images in `Drupal`. The field formatters for images support `lazy` or `eager`.",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "total-byte-weight": "Consider using [Responsive Image Styles](https://www.drupal.org/documentation/modules/responsive_image) to reduce the size of images loaded on your page. If you are using `Views` to show multiple content items on a page, consider implementing pagination to limit the number of content items shown on a given page.",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "render-blocking-resources": "Consider using [a module](https://www.drupal.org/project/critical_css) to inline critical CSS and JavaScript, and use the defer attribute for non-critical CSS or JavaScript.",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-css": 'Ensure you have enabled "Aggregate CSS files" in the "Administration » Configuration » Development" page.',
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-javascript": 'Ensure you have enabled "Aggregate JavaScript files" in the "Administration » Configuration » Development" page.',
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "efficient-animated-content": "Consider uploading your `GIF` to a service which will make it available to embed as an HTML5 video.",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-javascript": "Consider removing unused JavaScript assets and only attach the needed `Drupal` libraries to the relevant page or component in a page. See the [Drupal documentation](https://www.drupal.org/docs/develop/theming-drupal/adding-assets-css-js-to-a-drupal-theme-via-librariesyml#define) for details. To identify attached libraries that are adding extraneous JavaScript, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage) in Chrome DevTools. You can identify the theme/module responsible from the URL of the script when JavaScript aggregation is disabled in your `Drupal` site. Look out for themes/modules that have many scripts in the list which have a lot of red in code coverage. A theme/module should only attach a script library if it is actually used on the page.",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-long-cache-ttl": 'Set the "Browser and proxy cache maximum age" in the "Administration » Configuration » Development" page. Read about [`Drupal` cache and optimizing for performance](https://www.drupal.org/docs/8/api/cache-api/cache-api).',
      /** Additional description of a Lighthouse audit that tells the user how they can improve site performance by optimizing images, in the context of the `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-optimized-images": "Consider using [a module](https://www.drupal.org/project/project_module?f%5B0%5D=&f%5B1%5D=&f%5B2%5D=im_vid_3%3A123&f%5B3%5D=&f%5B4%5D=sm_field_project_type%3Afull&f%5B5%5D=&f%5B6%5D=&text=image&solrsort=iss_project_release_usage+desc&op=Search) that automatically optimizes and reduces the size of images uploaded through the site while retaining quality. Also, ensure you are using the native [Responsive Image Styles](https://www.drupal.org/documentation/modules/responsive_image) provided from `Drupal` for all images rendered on the site.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Drupal`. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-text-compression": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. Consider using a CDN that natively supports this, or configure the web server to perform this operation. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/text-compression).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by using responsive images in the context of the `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-responsive-images": "Ensure that you are using the native [Responsive Image Styles](https://www.drupal.org/documentation/modules/responsive_image) provided from `Drupal`. Use the Responsive Image Styles when rendering image fields through view modes, views, or images uploaded through the WYSIWYG editor.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Drupal`. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "prioritize-lcp-image": "If the LCP element is dynamically added to the page, you should optimize the image in order to improve LCP. [Learn more](https://www.smashingmagazine.com/2023/08/methods-improving-drupal-largest-contentful-paint-core-web-vital/).",
      /** 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 `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "server-response-time": "Offload traffic with one or more `Drupal` caching modules such as `Internal Page Cache`, `Internal Dynamic Page Cache`, and `BigPipe`. Couple these with a CDN to further improve response time. Your hosting servers should make use of PHP OPcache. Consider using memory-caching such as Redis or Memcached to reduce database query times. Lastly use performant themes, modules, and faster servers to lower server response time.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Drupal`. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "redirects": "Redirects introduce additional delays before the page can be loaded. If the [Redirect](https://www.drupal.org/project/redirect) module is installed, review if unnecessary redirects can be removed. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/redirects).",
      /** Additional description of a Lighthouse audit that tells the user how they can add preconnect or dns-prefetch resource hints, in the context of the `Drupal` CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-rel-preconnect": "`Preconnect` or `dns-prefetch` resource hints can be added by installing and configuring [a module](https://www.drupal.org/project/project_module?f%5B0%5D=&f%5B1%5D=&f%5B2%5D=&f%5B3%5D=&f%5B4%5D=sm_field_project_type%3Afull&f%5B5%5D=&f%5B6%5D=&text=Preconnect&solrsort=score+desc&op=Search) that provides facilities for user agent resource hints."
    };
    module2.exports = {
      id: "drupal",
      title: "Drupal",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/ezoic.js
var require_ezoic = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/ezoic.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 82 82"><path fill="%235FA624" fill-rule="evenodd" d="M81.37 48.117C85.301 25.821 70.413 4.56 48.117.63 25.821-3.3 4.56 11.586.63 33.883-3.3 56.178 11.586 77.44 33.883 81.37 56.18 85.301 77.44 70.412 81.37 48.117Zm-8.935-14.17c2.77 12.357-1.942 25.721-12.96 33.436-14.57 10.203-34.656 6.662-44.859-7.909a32.434 32.434 0 0 1-2.869-4.98l28.7-20.097a6.53 6.53 0 1 0-3.744-5.347L9.564 48.054c-2.768-12.359 1.943-25.724 12.96-33.439 14.572-10.203 34.656-6.662 44.86 7.91a32.349 32.349 0 0 1 2.868 4.98L41.554 47.6a6.53 6.53 0 1 0 3.746 5.35l27.136-19.003Z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Remove Unused CSS is a setting name. */
      "unused-css-rules": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Remove Unused CSS` to help with this issue. It will identify the CSS classes that are actually used on each page of your site, and remove any others to keep the file size small.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Next-Gen Formats is a setting name.*/
      "modern-image-formats": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Next-Gen Formats` to convert images to WebP.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Lazy Load Images is a setting name.*/
      "offscreen-images": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Lazy Load Images` to defer loading off-screen images until they are needed.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Script Delay is a setting name.*/
      "render-blocking-resources": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Script Delay` to defer non-critical JS.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Minify CSS is a setting name.*/
      "unminified-css": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Minify CSS` to automatically minify your CSS to reduce network payload sizes.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Minify Javascript is a setting name.*/
      "unminified-javascript": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Minify Javascript` to automatically minify your JS to reduce network payload sizes.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Efficient Static Cache Policy is a setting name.*/
      "uses-long-cache-ttl": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Efficient Static Cache Policy` to set recommended values in the caching header for static assests.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Next-Gen Formats is a setting name.*/
      "uses-optimized-images": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Next-Gen Formats` to convert images to WebP.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Resize Images is a setting name.*/
      "uses-responsive-images": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Resize Images` to resize images to a device appropriate size, reducing network payload sizes.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Cloud Caching is Ezoic's CDN.*/
      "server-response-time": "Use [Ezoic Cloud Caching](https://pubdash.ezoic.com/leap/caching) to cache your content across our world wide network, improving time to first byte.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Pre-Connect Origins is a setting name.*/
      "uses-rel-preconnect": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Pre-Connect Origins` to automatically add `preconnect` resource hints to establish early connections to important third-party origins.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Preload Fonts and Preload Background Images are setting names.*/
      "uses-rel-preload": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Preload Fonts` and `Preload Background Images` to add `preload` links to prioritize fetching resources that are currently requested later in page load.",
      /** Additional description of a Lighthouse audit for a third-party framework called `Ezoic`. This is displayed after a user expands the section to see more. No character length limits. Ezoic Leap is Ezoic's site speed improvement toolset. Optimize Fonts is a setting name.*/
      "font-display": "Use [Ezoic Leap](https://pubdash.ezoic.com/leap) and enable `Optimize Fonts` to automatically leverage the `font-display` CSS feature to ensure text is user-visible while webfonts are loading."
    };
    module2.exports = {
      id: "ezoic",
      title: "Ezoic",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/gatsby.js
var require_gatsby = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/gatsby.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28"><circle cx="14" cy="14" r="14" fill="%23639"/><path fill="%23fff" d="M6.2 21.8C4.1 19.7 3 16.9 3 14.2L13.9 25c-2.8-.1-5.6-1.1-7.7-3.2zm10.2 2.9L3.3 11.6C4.4 6.7 8.8 3 14 3c3.7 0 6.9 1.8 8.9 4.5l-1.5 1.3C19.7 6.5 17 5 14 5c-3.9 0-7.2 2.5-8.5 6L17 22.5c2.9-1 5.1-3.5 5.8-6.5H18v-2h7c0 5.2-3.7 9.6-8.6 10.7z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can remove unused CSS rules by configuring the Gatsby plugin `gatsby-plugin-purgecss` which sets up PurgeCSS */
      "unused-css-rules": "Use the `PurgeCSS` `Gatsby` plugin to remove unused rules from stylesheets. [Learn more](https://purgecss.com/plugins/gatsby.html).",
      /** Additional description of a Lighthouse audit that tells the user to use the gatsby-plugin-image component to automatically optimize image format */
      "modern-image-formats": "Use the `gatsby-plugin-image` component instead of `<img>` to automatically optimize image format. [Learn more](https://www.gatsbyjs.com/docs/how-to/images-and-media/using-gatsby-plugin-image).",
      /** Additional description of a Lighthouse audit that tells the user to defer loading images which are not shown on screen using the gatsby-plugin-image component */
      "offscreen-images": "Use the `gatsby-plugin-image` component instead of `<img>` to automatically lazy-load images. [Learn more](https://www.gatsbyjs.com/docs/how-to/images-and-media/using-gatsby-plugin-image).",
      /** Additional description of a Lighthouse audit that tells the user to use gatsby-script to defer loading of non-critical third-party libraries */
      "render-blocking-resources": "Use the `Gatsby Script API` to defer loading of non-critical third-party scripts. [Learn more](https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-script/).",
      /** Additional description of a Lighthouse audit that tells the user to use Webpack Bundle Analyzer to discover JavaScript code that is not used */
      "unused-javascript": "Use `Webpack Bundle Analyzer` to detect unused JavaScript code. [Learn more](https://www.gatsbyjs.com/plugins/gatsby-plugin-webpack-bundle-analyser-v2/)",
      /** Additional description of a Lighthouse audit that tells the user to enable caching for assets (e.g. images) and artifacts that don't change between deployments */
      "uses-long-cache-ttl": "Configure caching for immutable assets. [Learn more](https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting/caching/).",
      /** Additional description of a Lighthouse audit that tells the user to use the gatsby-plugin-image component to adjust image quality */
      "uses-optimized-images": "Use the `gatsby-plugin-image` component instead of `<img>` to adjust image quality. [Learn more](https://www.gatsbyjs.com/docs/how-to/images-and-media/using-gatsby-plugin-image).",
      /** Additional description of a Lighthouse audit that tells the user to serve responsive images using the gatsby-plugin-image component with appropriate `sizes` set */
      "uses-responsive-images": "Use the `gatsby-plugin-image` component to set appropriate `sizes`. [Learn more](https://www.gatsbyjs.com/docs/how-to/images-and-media/using-gatsby-plugin-image).",
      /** Additional description of a Lighthouse audit that tells the user to use the gatsby-plugin-image component to automatically preload LCP images. "prop" is short for "property" */
      "prioritize-lcp-image": "Use the `gatsby-plugin-image` component and set the `loading` prop to `eager`. [Learn more](https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-plugin-image#shared-props)."
    };
    module2.exports = {
      id: "gatsby",
      title: "Gatsby",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/joomla.js
var require_joomla = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/joomla.js"(exports2, module2) {
    "use strict";
    init_process_global();
    /**
     * @license Copyright 2020 The Lighthouse Authors. All Rights Reserved.
     * Licensed under the Apache License, Version 2.0 (the 'License'); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
     */
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" viewBox="0 0 256 258"><path fill="%23F9AE41" d="M255.7 35.6a33.7 33.7 0 0 0-67-4.8l-.4-.2c-27.6-12.4-50.8 9.6-50.8 9.6l-61.4 61.7 24.3 23.4 49.4-48.6c23-23 35.6-7.4 35.6-7.4 17.4 14.6.6 32 .6 32l24.9 24c20.3-22 21.5-41.1 15.3-56.3a33.7 33.7 0 0 0 29.5-33.4"/><path fill="%23EE4035" d="m226.5 190.5.2-.3c12.4-27.6-9.6-50.8-9.6-50.8L155.4 78l-23.3 24.3 48.5 49.4c23 23 7.5 35.6 7.5 35.6-14.7 17.4-32 .6-32 .6l-24 24.9c21.9 20.3 41 21.5 56.2 15.3a33.7 33.7 0 1 0 38.2-37.6"/><path fill="%234F91CD" d="m156 133-49.5 48.6c-23 23-35.6 7.4-35.6 7.4-17.4-14.6-.6-32-.6-32l-24.9-24c-20.3 22-21.4 41.1-15.3 56.3a33.7 33.7 0 1 0 37.6 38.2l.3.2c27.6 12.4 50.8-9.6 50.8-9.6l61.4-61.7-24.3-23.4"/><path fill="%237AC043" d="M75.7 106.6c-23-23-7.4-35.6-7.4-35.6 14.6-17.4 32-.6 32-.6l24-24.9c-22-20.3-41-21.5-56.3-15.3a33.7 33.7 0 1 0-38.2 37.6l-.2.3C17.2 95.7 39.2 119 39.2 119l61.7 61.4 23.4-24.3-48.6-49.4"/\
></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by removing unused CSS, in the context of the Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-css-rules": "Consider reducing, or switching, the number of [Joomla extensions](https://extensions.joomla.org/) loading unused CSS in your page. To identify extensions 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.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve image loading by using webp in the context of the Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "modern-image-formats": "Consider using a [plugin](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=webp) or service that will automatically convert your uploaded images to the optimal formats.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "offscreen-images": "Install a [lazy-load Joomla plugin](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=lazy%20loading) that provides the ability to defer any offscreen images, or switch to a template that provides that functionality. Starting with Joomla 4.0, all new images will [automatically](https://github.com/joomla/joomla-cms/pull/30748) get the `loading` attribute from the core.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "total-byte-weight": "Consider showing excerpts in your article categories (e.g. via the read more link), reducing the number of articles shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "render-blocking-resources": "There are a number of Joomla plugins that can help you [inline critical assets](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=performance) or [defer less important resources](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=performance). Beware that optimizations provided by these plugins may break features of your templates or plugins, so you will need to test these thoroughly.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-css": "A number of [Joomla extensions](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=performance) can speed up your site by concatenating, minifying, and compressing your css styles. There are also templates that provide this functionality.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-javascript": "A number of [Joomla extensions](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=performance) can speed up your site by concatenating, minifying, and compressing your scripts. There are also templates that provide this functionality.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "efficient-animated-content": "Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-javascript": "Consider reducing, or switching, the number of [Joomla extensions](https://extensions.joomla.org/) 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 extension responsible from the URL of the script. Look out for extensions that have many scripts in the list which have a lot of red in code coverage. An extension should only enqueue a script if it is actually used on the page.",
      /** 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 Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-long-cache-ttl": "Read about [Browser Caching in Joomla](https://docs.joomla.org/Cache).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve site performance by optimizing images, in the context of the Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-optimized-images": "Consider using an [image optimization plugin](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=performance) that compresses your images while retaining quality.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance via enabling text compression in the context of the Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-text-compression": "You can enable text compression by enabling Gzip Page Compression in Joomla (System > Global configuration > Server).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by using responsive images in the context of the Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-responsive-images": "Consider using a [responsive images plugin](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=responsive%20images) to use responsive images in your content.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve the server-response-time speed metric, in the context of the Joomla CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "server-response-time": "Templates, extensions, and server specifications all contribute to server response time. Consider finding a more optimized template, carefully selecting an optimization extension, and/or upgrading your server."
    };
    module2.exports = {
      id: "joomla",
      title: "Joomla",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/magento.js
var require_magento = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/magento.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" fill="%23f26322" viewBox="0 0 1000 1000"><path d="M916.9 267.4v465.3l-111.3 67.4V331.4l-1.5-.9-303.9-189-304.6 189.2-1.2.8V799L83.1 732.6V267.4l.7-.4L500.3 10l416 257 .6.4zM560.7 468.5v383.3L500.3 890l-61-38.2V306.7l-136 84.3v476.6l197 122.5 196.4-122.5V391l-136-84.3v161.8z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can improve image loading by using webp in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "modern-image-formats": "Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=webp) for a variety of third-party extensions to leverage newer image formats.",
      /** 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 Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "offscreen-images": "Consider modifying your product and catalog templates to make use of the web platform's [lazy loading](https://web.dev/native-lazy-loading) feature.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve site loading performance by disabling JS bundling in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "disable-bundling": "Disable Magento's built-in [JavaScript bundling and minification](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html), and consider using [baler](https://github.com/magento/baler/) instead.",
      /** 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 Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-css": `Enable the "Minify CSS Files" option in your store's Developer settings. [Learn more](https://devdocs.magento.com/guides/v2.3/performance-best-practices/configuration.html?itm_source=devdocs&itm_medium=search_page&itm_campaign=federated_search&itm_term=minify%20css%20files).`,
      /** 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 Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-javascript": "Use [Terser](https://www.npmjs.com/package/terser) to minify all JavaScript assets from static content deployment, and disable the built-in minification feature.",
      /** 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 Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-javascript": "Disable Magento's built-in [JavaScript bundling](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve site performance by optimizing images, in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-optimized-images": "Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=optimize%20image) for a variety of third party extensions to optimize images.",
      /** 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 Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "server-response-time": "Use Magento's [Varnish integration](https://devdocs.magento.com/guides/v2.3/config-guide/varnish/config-varnish.html).",
      /** Additional description of a Lighthouse audit that tells the user how they can add preconnect or dns-prefetch resource hints, in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-rel-preconnect": "Preconnect or dns-prefetch resource hints can be added by [modifying a themes's layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).",
      /** Additional description of a Lighthouse audit that tells the user how they can add preload tags, in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-rel-preload": "`<link rel=preload>` tags can be added by [modifying a themes's layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).",
      /** Additional description of a Lighthouse audit that tells the user how they can minimize critical request chains, in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "critical-request-chains": "If you are not bundling your JavaScript assets, consider using [baler](https://github.com/magento/baler).",
      /** Additional description of a Lighthouse audit that tells the user how they can specify font-display, in the context of the Magento platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "font-display": "Specify `@font-display` when [defining custom fonts](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/css-topics/using-fonts.html)."
    };
    module2.exports = {
      id: "magento",
      title: "Magento",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/next.js
var require_next = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/next.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 207 124"><path fill="%23000" d="M48.942 32.632h38.96v3.082h-35.39v23.193H85.79v3.082H52.513v25.464h35.794v3.081H48.942V32.632Zm42.45 0h4.139l18.343 25.464 18.749-25.464L158.124.287l-41.896 60.485 21.59 29.762h-4.302l-19.642-27.086L94.15 90.534h-4.22l21.751-29.762-20.29-28.14Zm47.967 3.082v-3.082h44.397v3.082h-20.453v54.82h-3.571v-54.82h-20.373ZM.203 32.632h4.464l61.557 91.671-25.439-33.769L3.936 37.011l-.162 53.523H.203zm183.194 53.891c.738 0 1.276-.563 1.276-1.29 0-.727-.538-1.29-1.276-1.29-.73 0-1.277.563-1.277 1.29 0 .727.547 1.29 1.277 1.29Zm3.509-3.393c0 2.146 1.555 3.549 3.822 3.549 2.414 0 3.874-1.446 3.874-3.956v-8.837h-1.946v8.828c0 1.394-.704 2.138-1.946 2.138-1.112 0-1.867-.692-1.893-1.722h-1.911Zm10.24-.113c.14 2.233 2.007 3.662 4.787 3.662 2.97 0 4.83-1.498 4.83-3.887 0-1.878-1.06-2.917-3.632-3.514l-1.38-.338c-1.634-.38-2.294-.891-2.294-1.783 0-1.125 1.025-1.86 2.563-1.86 1.459 0 2.466.\
718 2.649 1.869h1.893c-.113-2.103-1.971-3.583-4.516-3.583-2.737 0-4.56 1.48-4.56 3.704 0 1.835 1.033 2.926 3.3 3.454l1.616.39c1.659.389 2.388.96 2.388 1.912 0 1.108-1.146 1.913-2.71 1.913-1.676 0-2.84-.753-3.005-1.939h-1.928Z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can remove unusused CSS rules by configuring a plugin named PurgeCSS. */
      "unused-css-rules": "Consider setting up `PurgeCSS` in `Next.js` configuration to remove unused rules from stylesheets. [Learn more](https://purgecss.com/guides/next.html).",
      /** Additional description of a Lighthouse audit that tells the user to use the next/image component to automatically optimize image format. */
      "modern-image-formats": "Use the `next/image` component instead of `<img>` to automatically optimize image format. [Learn more](https://nextjs.org/docs/app/getting-started/images).",
      /** Additional description of a Lighthouse audit that tells the user to defer loading images which are not shown on screen using the next/image component. */
      "offscreen-images": "Use the `next/image` component instead of `<img>` to automatically lazy-load images. [Learn more](https://nextjs.org/docs/app/getting-started/images).",
      /** Additional description of a Lighthouse audit that tells the user to use next/script to defer loading of non-critical third-party libraries. */
      "render-blocking-resources": "Use the `next/script` component to defer loading of non-critical third-party scripts. [Learn more](https://nextjs.org/docs/app/guides/scripts).",
      /** Additional description of a Lighthouse audit that tells the user to use Webpack Bundle Analyzer to discover JavaScript code that is not used. */
      "unused-javascript": "Use `Webpack Bundle Analyzer` to detect unused JavaScript code. [Learn more](https://github.com/vercel/next.js/tree/canary/packages/next-bundle-analyzer)",
      /** Additional description of a Lighthouse audit that tells the user to enable caching for assets (e.g. images) and server-side rendered (SSR) pages that don't change between deployments. */
      "uses-long-cache-ttl": "Configure caching for immutable assets and `Server-side Rendered` (SSR) pages. [Learn more](https://nextjs.org/docs/13/pages/building-your-application/deploying/production-checklist#caching).",
      /** Additional description of a Lighthouse audit that tells the user to use the next/image component to adjust image quality. */
      "uses-optimized-images": "Use the `next/image` component instead of `<img>` to adjust image quality. [Learn more](https://nextjs.org/docs/app/getting-started/images).",
      /** Additional description of a Lighthouse audit that tells the user to enable compression (gzip, brotli) on their servers. */
      "uses-text-compression": "Enable compression on your Next.js server. [Learn more](https://nextjs.org/docs/api-reference/next.config.js/compression).",
      /** Additional description of a Lighthouse audit that tells the user to serve responsive images using the next/image component with appropriate `sizes` set. */
      "uses-responsive-images": "Use the `next/image` component to set the appropriate `sizes`. [Learn more](https://nextjs.org/docs/api-reference/next/image#sizes).",
      /** Additional description of a Lighthouse audit that tells the user to analyze the performance of their applications using Next.js Analytics. */
      "user-timings": "Consider using `Next.js Analytics` to measure your app's real-world performance. [Learn more](https://nextjs.org/docs/pages/guides/analytics).",
      /** Additional description of a Lighthouse audit that tells the user to use the next/image component to automatically preload LCP images. */
      "prioritize-lcp-image": 'Use the `next/image` component and set "priority" to true to preload LCP image. [Learn more](https://nextjs.org/docs/api-reference/next/image#priority).',
      /** Additional description of a Lighthouse audit that tells the user to use the next/image component to make sure `width` and `height` of image elements are always specified. */
      "unsized-images": "Use the `next/image` component to make sure images are always sized appropriately. [Learn more](https://nextjs.org/docs/api-reference/next/image#width)."
    };
    module2.exports = {
      id: "next.js",
      title: "Next.js",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/nitropack.js
var require_nitropack = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/nitropack.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="142" height="54"><g fill="none" fill-rule="evenodd"><g fill="%231B004E"><path d="M19.486 53.24h-3.891L4.682 39.247v13.936H0V32.946h5.444l9.475 12.398V32.946h4.567zM21.346 32.94h4.647v3.57h-4.647v-3.57Zm0 5.477h4.647V53.18h-4.647V38.417ZM40.569 53.183H36c-3.408 0-4.991-1.625-4.991-4.697v-6.22h-3.777V38.42h3.777v-5.474h4.598v5.474h4.958v3.846h-4.958v4.588c0 1.597.477 2.252 2.197 2.252h2.764v4.077ZM46.688 53.183h-4.57V38.42h4.57v2.308c.31-.686 1.351-2.336 4.425-2.336h3.13v4.56h-4.004c-2.593 0-3.55.967-3.55 3.019v7.212ZM70.612 45.802c0 4.56-3.409 7.75-8.01 7.75s-8.006-3.19-8.006-7.75c0-4.56 3.408-7.755 8.006-7.755 4.598 0 8.01 3.195 8.01 7.755Zm-4.599 0c0-2.14-1.35-3.733-3.408-3.733-2.057 0-3.44 1.594-3.44 3.733 0 2.139 1.41 3.733 3.44 3.733 2.03 0 3.408-1.598 3.408-3.733ZM72.47 32.946h11.7c4.543 0 7.192 2.28 7.192 6.526 0 4.247-2.649 6.577-7.191 6.577h-6.935v7.125h-4.765V32.946Zm4.766 4.218v4.676h6.485c1.832\
 0 2.736-.883 2.736-2.34 0-1.565-.904-2.336-2.736-2.336h-6.485ZM102.662 51.016c-.254.485-1.636 2.48-4.71 2.48-3.665 0-6.627-2.906-6.627-7.694 0-4.789 2.962-7.667 6.656-7.667 2.962 0 4.372 1.851 4.626 2.336v-2.05h4.567v14.762h-4.512v-2.167Zm-3.327-8.932c-2.03 0-3.384 1.594-3.384 3.733 0 2.14 1.354 3.733 3.384 3.733s3.327-1.597 3.327-3.733-1.298-3.733-3.327-3.733ZM119.184 43.578a2.98 2.98 0 0 0-2.749-1.494c-1.918 0-3.13 1.594-3.13 3.733 0 2.14 1.24 3.758 3.158 3.758 1.807 0 2.625-1.168 2.764-1.51h4.4c-.143 2.052-2.116 5.5-7.275 5.5-4.286 0-7.641-3.078-7.641-7.75 0-4.673 3.328-7.755 7.585-7.755 5.159 0 7.105 3.392 7.33 5.53l-4.442-.012ZM129.712 46.6v6.577h-4.567V32.194h4.567v11.998l5.838-5.784h5.751l-6.994 6.811 7.362 7.952h-5.921z"/></g><g fill="%2325F5CE"><path d="M49.159 4.65c12.832 0 23.235 10.41 23.235 23.251h4.648C77.042 12.491 64.558 0 49.159 0c-15.4 0-27.883 12.492-27.883 27.901h4.647c0-12.841 10.403-23.25 23.236-23.25Z"/><path d="M44.852 25.793a3.632 3.632 0 0 1 2.6-5.097L63.8 16\
.951 50.426 27.09a3.626 3.626 0 0 1-5.574-1.296Z"/></g></g></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Reduce Unused CSS` is the name of a feature and becomes link text to additional documentation.*/
      "unused-css-rules": "Enable [`Reduce Unused CSS`](https://support.nitropack.io/hc/en-us/articles/360020418457-Reduce-Unused-CSS) to remove CSS rules that are not applicable to this page.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Image Optimization` is the name of a feature and becomes link text to additional documentation. `WebP` is the name of a standardized image format for the web.*/
      "modern-image-formats": "Use [`Image Optimization`](https://support.nitropack.io/hc/en-us/articles/16547237162513) to automatically convert your images to WebP.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Automatic Image Lazy Loading` is the name of a feature and becomes link text to additional documentation.*/
      "offscreen-images": "Defer offscreen images by enabling [`Automatic Image Lazy Loading`](https://support.nitropack.io/hc/en-us/articles/12457493524369-NitroPack-Lazy-Loading-Feature-for-Images).",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Remove render-blocking resources` is the name of a feature and becomes link text to additional documentation.*/
      "render-blocking-resources": "Enable [`Remove render-blocking resources`](https://support.nitropack.io/hc/en-us/articles/13820893500049-How-to-Deal-with-Render-Blocking-Resources-in-NitroPack) in NitroPack for faster initial load times.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Minify resources` is the name of a feature and becomes link text to additional documentation.*/
      "unminified-css": "Enable [`Minify resources`](https://support.nitropack.io/hc/en-us/articles/360061059394-Minify-Resources) in your Caching settings to reduce the size of your CSS, HTML, and JavaScript files for faster load times.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Minify resources` is the name of a feature and becomes link text to additional documentation.*/
      "unminified-javascript": "Enable [`Minify resources`](https://support.nitropack.io/hc/en-us/articles/360061059394-Minify-Resources) in your Caching settings to reduce the size of your JS, HTML, and CSS files for faster load times.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Delayed Scripts` is the name of a feature and becomes link text to additional documentation.*/
      "unused-javascript": "Configure [`Delayed Scripts`](https://support.nitropack.io/hc/en-us/articles/1500002600942-Delayed-Scripts) in NitroPack to delay loading of scripts until they are needed.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Improve Server Response Time` is the name of a feature and becomes link text to additional documentation.*/
      "uses-long-cache-ttl": "Go to the [`Improve Server Response Time`](https://support.nitropack.io/hc/en-us/articles/1500002321821-Improve-Server-Response-Time) feature in the `Caching` menu and adjust your page cache expiration time to improve loading times and user experience.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Image Optimization` is the name of a feature and becomes link text to additional documentation.*/
      "uses-optimized-images": "Automatically compress, optimize, and convert your images into WebP by enabling the [`Image Optimization`](https://support.nitropack.io/hc/en-us/articles/14177271695121-How-to-serve-images-in-next-gen-formats-using-NitroPack) setting.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Adaptive Image Sizing` is the name of a feature and becomes link text to additional documentation.*/
      "uses-responsive-images": "Enable [`Adaptive Image Sizing`](https://support.nitropack.io/hc/en-us/articles/10123833029905-How-to-Enable-Adaptive-Image-Sizing-For-Your-Site) to preemptively optimize your images and make them match the dimensions of the containers they’re displayed in across all devices.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `HTML Lazy Load` is the name of a feature.*/
      "dom-size": "Contact your account manager to enable [`HTML Lazy Load`](https://support.nitropack.io/hc/en-us/articles/17144942904337). Configuring it will prioritize and optimize your page rendering performance.",
      /** Additional description of a Lighthouse audit for a third-party framework called `NitroPack`. This is displayed after a user expands the section to see more. No character length limits. `Override Font Rendering Behavior` is the name of a feature and becomes link text to additional documentation.*/
      "font-display": "Use the [`Override Font Rendering Behavior`](https://support.nitropack.io/hc/en-us/articles/16547358865041) option in NitroPack to set a desired value for the CSS font-display rule."
    };
    module2.exports = {
      id: "nitropack",
      title: "NitroPack",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/nuxt.js
var require_nuxt = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/nuxt.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 512 512"><path fill="%2300DC82" d="M281.44 397.667h156.88c5.006 0 9.798-1.759 14.133-4.244.336-2.481 8.805-5.596 11.307-9.894 2.502-4.297 4.242-9.173 4.24-14.134-.002-4.962-1.734-9.836-4.24-14.131l-106-182.321c-2.502-4.297-5.559-7.413-9.893-9.894-4.335-2.48-10.542-4.24-15.547-4.24-5.005 0-9.799 1.76-14.133 4.24-4.335 2.481-7.392 5.597-9.894 9.894l-26.853 46.64-53.707-90.457c-2.504-4.296-5.557-8.823-9.893-11.303-4.336-2.481-9.127-2.827-14.133-2.827-5.006 0-9.798.346-14.134 2.827-4.335 2.48-8.802 7.007-11.306 11.303L46.827 355.268c-2.506 4.295-2.8259.169-2.827 14.131-.002 4.961.325 9.836 2.827 14.134 2.502 4.297 6.97 7.413 11.306 9.894 4.336 2.481 9.127 4.24 14.134 4.24H171.2c39.201 0 67.734-17.585 87.627-50.88L306.88 263.4l25.44-43.813 77.733 132.853H306.88l-25.44 45.227ZM169.787 352.44h-69.254l103.174-178.08L256 263.4l-34.639 60.384c-13.21 21.603-28.272 28.656-51.574 28.656Z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user to use the nuxt/image component to serve modern formats like WebP. */
      "modern-image-formats": 'Use the `nuxt/image` component and set `format="webp"`. [Learn more](https://image.nuxt.com/usage/nuxt-img#format).',
      /** Additional description of a Lighthouse audit that tells the user to use the nuxt/image component to defer loading images which are not shown on screen. */
      "offscreen-images": 'Use the `nuxt/image` component and set `loading="lazy"` for offscreen images. [Learn more](https://image.nuxt.com/usage/nuxt-img#loading).',
      /** Additional description of a Lighthouse audit that tells the user to use the nuxt/image component to automatically compress their images. */
      "uses-optimized-images": "Use the `nuxt/image` component and set the appropriate `quality`. [Learn more](https://image.nuxt.com/usage/nuxt-img#quality).",
      /** Additional description of a Lighthouse audit that tells the user to use the nuxt/image component to serve appropriately sized images to different devices. */
      "uses-responsive-images": "Use the `nuxt/image` component and set the appropriate `sizes`. [Learn more](https://image.nuxt.com/usage/nuxt-img#sizes).",
      /** Additional description of a Lighthouse audit that tells the user to use the nuxt/image component to prioritize the loading of the image that is part of the Largest Contentful Paint (LCP). */
      "prioritize-lcp-image": "Use the `nuxt/image` component and specify `preload` for LCP image. [Learn more](https://image.nuxt.com/usage/nuxt-img#preload).",
      /** Additional description of a Lighthouse audit that tells the user to use the nuxt/image component to provide explicit `width` and `height` for images to prevent layout shift. */
      "unsized-images": "Use the `nuxt/image` component and specify explicit `width` and `height`. [Learn more](https://image.nuxt.com/usage/nuxt-img#width-height)."
    };
    module2.exports = {
      id: "nuxt",
      title: "Nuxt",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/octobercms.js
var require_octobercms = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/octobercms.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 310 310"><path fill="none" d="M-1-1h802v602H-1z"/><path fill="%23de6c26" d="M135 6.9c-14.2 4.4-34.9 21.8-49.9 42C55.8 88.5 39.6 135.8 41.4 177c.8 20.2 4.9 35.5 14.4 54.5 13.6 27.4 40.8 55.1 65.5 66.9 14.1 6.7 13.4 6.9 14.1-2.8.3-4.4 1-32.4 1.6-62.1 2.7-137.3 4.4-176 8.2-191.3.6-2.3 1.4-4.2 1.9-4.2 1.2 0 3.6 9.1 4.9 18.3.5 4.3 1 17.7 1 29.8 0 12 .3 21.9.7 21.9.3 0 5.7-5 11.9-11 6.9-6.8 12-11 13.3-11 1.8 0 1.9.3 1 2.7-1.2 3.1-7.9 13.2-19.1 28.5L153 128l.1 31.2c.1 17.2.4 37.4.8 44.9l.6 13.7 11-12.6c14-16 35.1-37.1 39.5-39.6l3.3-1.9-.6 3.2c-2 9.8-9.5 20.7-37.4 54.3L154 240.8v31.1c0 18.3.4 31.1.9 31.1 2.8 0 19.3-6.4 26.8-10.5 13.8-7.3 23.8-15 38.3-29.5 15.7-15.7 24.4-27.4 33.4-45.2 20.5-40 21-80.3 1.6-119-17.8-35.6-54.6-72.1-87.8-86.9-11.7-5.3-24.6-7.3-32.2-5z"/></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by removing unused CSS, in the context of the October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-css-rules": "Consider reviewing the [plugins](https://octobercms.com/plugins) loading unused CSS on the website. To identify plugins that add unnecessary CSS, run [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. Identify the theme/plugin responsible from the stylesheet URL. Look for plugins with many stylesheets with lots of red in code coverage. A plugin should only add a stylesheet if it is actually used on the web page.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve image loading by using webp in the context of the October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "modern-image-formats": "Consider using a [plugin](https://octobercms.com/plugins?search=image) or service that will automatically convert the uploaded images to the optimal formats. [WebP lossless images](https://developers.google.com/speed/webp) are 26% smaller in size compared to PNGs and 25-34% smaller than comparable JPEG images at the equivalent SSIM quality index. Another next-gen image format to consider is [AVIF](https://jakearchibald.com/2020/avif-has-landed/).",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "offscreen-images": "Consider installing an [image lazy loading plugin](https://octobercms.com/plugins?search=lazy) 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://octobercms.com/plugins?search=Accelerated+Mobile+Pages).",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "total-byte-weight": "Consider showing excerpts in the post lists (e.g. using a `show more` button), reducing the number of posts shown on a given web page, breaking long posts into multiple web pages, or using a plugin to lazy-load comments.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "render-blocking-resources": "There are many plugins that help [inline critical assets](https://octobercms.com/plugins?search=css). These plugins may break other plugins, so you should test thoroughly.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-css": "There are many [plugins](https://octobercms.com/plugins?search=css) that can speed up a website by concatenating, minifying and compressing the styles. Using a build process to do this minification up-front can speed up development.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-javascript": "There are many [plugins](https://octobercms.com/plugins?search=javascript) that can speed up a website by concatenating, minifying and compressing the scripts. Using a build process to do this minification up-front can speed up development.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "efficient-animated-content": "[Replace animated GIFs with video](https://web.dev/replace-gifs-with-videos/) for faster web page loads and consider using modern file formats such as [WebM](https://web.dev/replace-gifs-with-videos/#create-webm-videos) or [AV1](https://developers.google.com/web/updates/2018/09/chrome-70-media-updates#av1-decoder) to improve compression efficiency by greater than 30% over the current state-of-the-art video codec, VP9.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-javascript": "Consider reviewing the [plugins](https://octobercms.com/plugins?search=javascript) that load unused JavaScript in the web page. To identify plugins that add unnecessary JavaScript, run [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. Identify the theme/plugin responsible from the URL of the script. Look for plugins with many scripts with lots of red in code coverage. A plugin should only add a script if it is actually used on the web page.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-long-cache-ttl": "Read about [preventing unnecessary network requests with the HTTP Cache](https://web.dev/http-cache/#caching-checklist). There are many [plugins](https://octobercms.com/plugins?search=Caching) that can be used to speed up caching.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve site performance by optimizing images, in the context of the October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-optimized-images": "Consider using an [image optimization plugin](https://octobercms.com/plugins?search=image) to compresses images while retaining the quality.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance via enabling text compression in the context of the October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-text-compression": "Enable text compression in the web server configuration.",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by using responsive images in the context of the October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "uses-responsive-images": "Upload images directly in the media manager to ensure the required image sizes are available. Consider using the [resize filter](https://octobercms.com/docs/markup/filter-resize) or an [image resizing plugin](https://octobercms.com/plugins?search=image) to ensure the optimal image sizes are used.",
      /** 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 October CMS platform. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "server-response-time": "Themes, plugins and server specifications all contribute to the server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin and/or upgrade the server. October CMS also allows developers to use [`Queues`](https://octobercms.com/docs/services/queues) to defer the processing of a time consuming task, such as sending an e-mail. This drastically speeds up web requests."
    };
    module2.exports = {
      id: "octobercms",
      title: "October CMS",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/react.js
var require_react = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/react.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="%2361DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-2\
3.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 \
13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>`;
    var UIStrings137 = {
      /** 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 React library. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-css": "If your build system minifies CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).",
      /** 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 React library. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unminified-javascript": "If your build system minifies JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).",
      /** 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 React library. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "unused-javascript": "If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://loadable-components.com/).",
      /** 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 React library. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "server-response-time": "If you are server-side rendering any React components, consider using `renderToPipeableStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#renderToPipeableStream).",
      /** Additional description of a Lighthouse audit that tells the user how they can minimize redirects, in the context of the React library. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "redirects": "If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).",
      /** Additional description of a Lighthouse audit that tells the user how they can use the Profiler to help measure performance. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      "user-timings": "Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)",
      /** Additional description of a Lighthouse audit that tells the user *why* and *how* they should reduce the size of the web page"s DOM, in the context of the React library, as well as how to maximize component performance when many DOM nodes are present. 'Learn More' becomes link text to additional documentation. */
      "dom-size": 'Consider using a "windowing" library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unnecessary re-renders using [`shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [`PureComponent`](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [`React.memo`](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the `Effect` hook to improve runtime performance.'
    };
    module2.exports = {
      id: "react",
      title: "React",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/wix.js
var require_wix = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/wix.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 28"><path fill-rule="evenodd" d="M0 .032s2.796-.356 4.66 1.31C5.81 2.37 6.145 4.008 6.145 4.008L9.952 18.96l3.165-12.239c.309-1.301.864-2.909 1.743-3.997 1.121-1.385 3.398-1.472 3.641-1.472.242 0 2.519.087 3.639 1.472.88 1.088 1.435 2.696 1.744 3.997l3.165 12.239 3.806-14.953s.336-1.638 1.486-2.666C34.205-.324 37 .032 37 .032l-7.289 27.945s-2.404.176-3.607-.446c-1.58-.816-2.332-1.447-3.289-5.249l-.099-.395c-.349-1.399-.883-3.59-1.424-5.813l-.162-.667-.162-.664c-.779-3.198-1.497-6.143-1.612-6.517-.108-.351-.236-1.187-.855-1.187-.607 0-.746.837-.857 1.187-.13.412-.99 3.955-1.856 7.514l-.162.667c-.512 2.107-1.01 4.151-1.341 5.48l-.1.395c-.956 3.802-1.708 4.433-3.288 5.249-1.204.622-3.608.446-3.608.446zM43.998 5v.995L44 5.994v16.628c-.014 3.413-.373 4.17-1.933 4.956-1.213.61-3.067.379-3.067.379V9.332c0-.935.315-1.548 1.477-2.098.693-.329 1.34-.58 2.012-.953C43.54 5.703 43.998 5 43.998 5zM46 .125s3.87\
7-.673 5.797 1.107c1.228 1.14 2.602 3.19 2.602 3.19l3.38 4.965c.164.258.378.54.72.54.343 0 .558-.282.722-.54l3.38-4.965s1.374-2.05 2.602-3.19C67.123-.548 71 .125 71 .125l-9.186 13.923 9.161 13.881-.032.004c-.38.045-4.036.423-5.855-1.266-1.229-1.138-2.487-2.992-2.487-2.992l-3.38-4.964c-.164-.26-.379-.54-.721-.54-.343 0-.557.28-.721.54l-3.38 4.964s-1.19 1.854-2.418 2.992c-1.92 1.783-5.957 1.262-5.957 1.262l9.161-13.88zM43.96 0H44c0 1.91-.186 3.042-1.387 3.923-.384.28-1.048.71-1.826.992C39.719 5.304 39 6 39 6c0-3.476.53-4.734 1.95-5.48.865-.452 2.272-.514 2.82-.52z"></path></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit that tells the user to optimize image formats, in the context of the Wix CMS platform. */
      "modern-image-formats": "Upload images using `Wix Media Manager` to ensure they are automatically served as WebP. Find [more ways to optimize](https://support.wix.com/en/article/site-performance-optimizing-your-media) your site's media.",
      /** Additional description of a Lighthouse audit that tells the user to defer loading of non-critical third-party libraries, in the context of the Wix CMS platform. */
      "render-blocking-resources": "When [adding third-party code](https://support.wix.com/en/article/site-performance-using-third-party-code-on-your-site) in the `Custom Code` tab of your site's dashboard, make sure it's deferred or loaded at the end of the code body. Where possible, use Wix’s [integrations](https://support.wix.com/en/article/about-marketing-integrations) to embed marketing tools on your site. ",
      /** Additional description of a Lighthouse audit that tells the user how they can improve performance by avoiding animated images and using videos where possible, in the context of the Wix CMS platform. */
      "efficient-animated-content": "Place videos inside `VideoBoxes`, customize them using `Video Masks` or add `Transparent Videos`. [Learn more](https://support.wix.com/en/article/wix-video-about-wix-video).",
      /** Additional description of a Lighthouse audit that tells the user to be aware of JavaScript code that is not used, particularly from third-parties, in the context of the Wix CMS platform. */
      "unused-javascript": "Review any third-party code you've added to your site in the `Custom Code` tab of your site's dashboard and only keep the services that are necessary to your site. [Find out more](https://support.wix.com/en/article/site-performance-removing-unused-javascript).",
      /** Additional description of a Lighthouse audit that tells the user how they can improve the server response time, in the context of the Wix CMS platform. */
      "server-response-time": "Wix utilizes CDNs and caching to serve responses as fast as possible for most visitors. Consider [manually enabling caching](https://support.wix.com/en/article/site-performance-caching-pages-to-optimize-loading-speed) for your site, especially if using `Velo`."
    };
    module2.exports = {
      id: "wix",
      title: "Wix",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/wordpress.js
var require_wordpress = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/wordpress.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 122.5 122.5"><g fill="%232f3439"><path 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.4zm88-2.7c0-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"/><path d="m62.2 65.9-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"/><path 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"/></g></svg>`;
    var UIStrings137 = {
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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://developer.chrome.com/docs/devtools/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.",
      /** 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. */
      "modern-image-formats": "Consider using the [Performance Lab](https://wordpress.org/plugins/performance-lab/) plugin to automatically convert your uploaded JPEG images into WebP, wherever supported.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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/).",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "efficient-animated-content": "Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "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://developer.chrome.com/docs/devtools/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.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "uses-long-cache-ttl": "Read about [Browser Caching in WordPress](https://wordpress.org/support/article/optimization/#browser-caching).",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "uses-optimized-images": "Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "uses-text-compression": "You can enable text compression in your web server configuration.",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "uses-responsive-images": "Upload images directly through the [media library](https://wordpress.org/support/article/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://wordpress.org/support/article/inserting-images-into-posts-and-pages/).",
      /** 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. 'Learn More' becomes link text to additional documentation. */
      "server-response-time": "Choose a lightweight theme (ideally a block theme) and implement full-page caching or a static site solution. Disable unnecessary plugins to minimize server overhead. Consider upgrading your hosting to managed or dedicated service."
    };
    module2.exports = {
      id: "wordpress",
      title: "WordPress",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/packs/wp-rocket.js
var require_wp_rocket = __commonJS({
  "node_modules/lighthouse-stack-packs/packs/wp-rocket.js"(exports2, module2) {
    init_process_global();
    var icon = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 294 524"><defs><linearGradient id="a" x1="36.742%" x2="37.116%" y1="100.518%" y2="-.001%"><stop offset="0%" stop-color="%23DD5F29"/><stop offset="26.042%" stop-color="%23F26B32"/><stop offset="100%" stop-color="%23FAC932"/></linearGradient><linearGradient id="b" x1="28.046%" x2="28.421%" y1="100.518%" y2="-.003%"><stop offset="0%" stop-color="%23DD5F29"/><stop offset="26.042%" stop-color="%23F26B32"/><stop offset="100%" stop-color="%23FAC932"/></linearGradient><linearGradient id="c" x1="38.215%" x2="38.589%" y1="100.518%" y2="0%"><stop offset="0%" stop-color="%23DD5F29"/><stop offset="26.042%" stop-color="%23F26B32"/><stop offset="100%" stop-color="%23FAC932"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><path fill="url(%23a)" d="M218.617 270.615c-9.752 0-18.896-5.689-23.366-14.63l-7.72-17.27h-76.6l-7.722 17.27c-4.47 8.941-13.613 14.63-23.366 14.63H75.78l32.712 249.306c1.625 4.671 4.67\
3 4.671 6.502 0l32.51-79.648 28.242 79.442c1.625 4.676 4.673 4.676 6.501 0L220.04 270.82l-1.423-.204Z" transform="translate(-1.58 -.2)"/><path fill="url(%23b)" d="M184.47 231.784h-70.3l-10.77 24.179c-3.657 7.314-10.768 12.597-18.489 14.02L109.7 423.791c1.625 2.844 4.673 2.844 6.501 0l31.697-48.155 29.055 47.951c1.829 2.845 4.673 2.845 6.502 0l28.039-154.012c-6.908-2.032-13.004-6.908-16.255-13.613l-10.768-24.18Z" transform="translate(-1.58 -.2)"/><path fill="url(%23c)" d="m195.259 255.988-46.123-103.014-45.92 103.014c-1.625 3.048-3.656 5.69-6.095 7.925l19.1 102.2c1.015 1.423 3.657 1.83 5.485 0l25.601-33.931 25.602 33.728c1.625 2.032 4.47 1.626 5.485 0l21.131-103.42c-1.625-2.032-3.047-4.064-4.266-6.502Z" transform="translate(-1.58 -.2)"/><path fill="%23F56F46" d="M.439 12.559c-1.422-4.877 1.422-8.33 6.299-8.33H47.17c2.845 0 5.486 2.437 6.299 4.876l29.665 116.83h1.422l53.437-121.3c1.016-2.032 3.048-3.86 5.892-3.86h6.299c3.047 0 5.08 1.625 5.892 3.86l53.437 121.3h1.423L240.6 9.105c.61-2.43\
9 3.454-4.877 6.299-4.877h40.433c4.877 0 7.518 3.454 6.299 8.33l-65.221 231.63c-.61 2.845-3.454 4.876-6.298 4.876h-5.487c-2.438 0-4.876-1.625-5.892-3.86l-63.19-141.009h-1.015L83.744 245.203c-1.016 2.032-3.454 3.86-5.892 3.86h-5.486c-2.845 0-5.486-2.031-6.299-4.876L.44 12.559Z"/></g></svg>`;
    var UIStrings137 = {
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Remove Unused CSS is a name of the feature */
      "unused-css-rules": `Enable [Remove Unused CSS](https://docs.wp-rocket.me/article/1529-remove-unused-css) in 'WP Rocket' to fix this issue. It reduces page size by removing all CSS and stylesheets that are not used while keeping only the used CSS for each page.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. `Imagify` is an image optimization add-on */
      "modern-image-formats": `Enable 'Imagify' from the Image Optimization tab in 'WP Rocket' to convert your images to WebP.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Delay JavaScript, LazyLoad for iframes and videos and Replace YouTube iframe with preview image are names of the features */
      "unused-javascript": `Enable [Delay JavaScript execution](https://docs.wp-rocket.me/article/1349-delay-javascript-execution) in 'WP Rocket' to fix this problem. It will improve the loading of your page by delaying the execution of scripts until user interaction. If your site has iframes, you can use WP Rocket's [LazyLoad for iframes and videos](https://docs.wp-rocket.me/article/1674-lazyload-for-iframes-and-videos) and [Replace YouTube iframe with preview image](https://docs.wp-rocket.me/article/1488-replace-youtube-iframe-with-preview-image) as well.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Remove Unused CSS, Load JavaScript deferred are names of the features */
      "render-blocking-resources": `Enable [Remove Unused CSS](https://docs.wp-rocket.me/article/1529-remove-unused-css) and [Load JavaScript deferred](https://docs.wp-rocket.me/article/1265-load-javascript-deferred) in 'WP Rocket' to address this recommendation. These features will respectively optimize the CSS and JavaScript files so that they don't block the rendering of your page.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Minify CSS Files is a name of the feature */
      "unminified-css": `Enable [Minify CSS files](https://docs.wp-rocket.me/article/1350-css-minify-combine) in 'WP Rocket' to fix this issue. Any spaces and comments in your site's CSS files will be removed to make the file size smaller and faster to download.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Minify JavaScript Files is a name of the feature */
      "unminified-javascript": `Enable [Minify JavaScript files](https://docs.wp-rocket.me/article/1351-javascript-minify-combine) in 'WP Rocket' to fix this issue. Empty spaces and comments will be removed from JavaScript files to make their size smaller and faster to download.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. `Imagify` is an image optimization add-on */
      "uses-optimized-images": `Enable 'Imagify' from the Image Optimization tab in 'WP Rocket' and run Bulk Optimization to compress your images.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Prefetch DNS Requests, Enable CDN are names of the features */
      "uses-rel-preconnect": `Use [Prefetch DNS Requests](https://docs.wp-rocket.me/article/1302-prefetch-dns-requests) in 'WP Rocket' to add "dns-prefetch" and speed up the connection with external domains. Also, 'WP Rocket' automatically adds "preconnect" to [Google Fonts domain](https://docs.wp-rocket.me/article/1312-optimize-google-fonts) and any CNAME(S) added via the [Enable CDN](https://docs.wp-rocket.me/article/42-using-wp-rocket-with-a-cdn) feature.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. Remove Unused CSS is a name of the feature*/
      "uses-rel-preload": `To fix this issue for fonts, enable [Remove Unused CSS](https://docs.wp-rocket.me/article/1529-remove-unused-css) in 'WP Rocket'. Your site's critical fonts will be preloaded with priority.`,
      /** Additional description of a Lighthouse audit for a third-party framework called 'WP Rocket'. This is displayed after a user expands the section to see more. No character length limits. LazyLoad for images is a name of the feature*/
      "offscreen-images": `Enable [LazyLoad](https://docs.wp-rocket.me/article/1141-lazyload-for-images) in WP Rocket to fix this recommendation. This feature delays the loading of the images until the visitor scrolls down the page and actually needs to see them.`
    };
    module2.exports = {
      id: "wp-rocket",
      title: "WP Rocket",
      icon,
      UIStrings: UIStrings137
    };
  }
});

// node_modules/lighthouse-stack-packs/index.js
var require_lighthouse_stack_packs = __commonJS({
  "node_modules/lighthouse-stack-packs/index.js"(exports2, module2) {
    init_process_global();
    var stackPacks2 = [
      require_amp(),
      require_angular(),
      require_drupal(),
      require_ezoic(),
      require_gatsby(),
      require_joomla(),
      require_magento(),
      require_next(),
      require_nitropack(),
      require_nuxt(),
      require_octobercms(),
      require_react(),
      require_wix(),
      require_wordpress(),
      require_wp_rocket()
    ];
    module2.exports = stackPacks2;
  }
});

// node_modules/lookup-closest-locale/index.js
var require_lookup_closest_locale = __commonJS({
  "node_modules/lookup-closest-locale/index.js"(exports2, module2) {
    init_process_global();
    module2.exports = /* @__PURE__ */ __name(function lookupClosestLocale2(locale, available) {
      if (typeof locale === "string" && available[locale]) return locale;
      var locales2 = [].concat(locale || []);
      for (var l = 0, ll = locales2.length; l < ll; ++l) {
        var current = locales2[l].split("-");
        while (current.length) {
          var candidate = current.join("-");
          if (available[candidate]) return candidate;
          current.pop();
        }
      }
    }, "lookupClosestLocale");
  }
});

// shared/root.js
import path from "path";
var LH_ROOT, pkg, lighthouseVersion;
var init_root2 = __esm({
  "shared/root.js"() {
    "use strict";
    init_process_global();
    init_esm_utils();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    LH_ROOT = path.dirname("");
    pkg = JSON.parse(`{
  "name": "lighthouse",
  "type": "module",
  "version": "13.2.0",
  "description": "Automated auditing, performance metrics, and best practices for the web.",
  "main": "./core/index.js",
  "bin": {
    "lighthouse": "./cli/index.js",
    "chrome-debug": "./core/scripts/manual-chrome-launcher.js",
    "smokehouse": "./cli/test/smokehouse/frontends/smokehouse-bin.js"
  },
  "engines": {
    "node": ">=22.19"
  },
  "scripts": {
    "prepack": "yarn build-report --standalone --flow --esm && yarn build-types",
    "postpack": "yarn clean-types",
    "build-all": "yarn build-report && yarn build-cdt-strings && yarn build-devtools && concurrently 'yarn build-extension' 'yarn build-lr' 'yarn build-viewer' 'yarn build-treemap' 'yarn build-smokehouse-bundle' 'yarn build-legacy-javascript' 'yarn build-devtools-mcp' && yarn build-pack",
    "build-cdt-lib": "node ./build/build-cdt-lib.js",
    "build-cdt-strings": "node ./build/build-cdt-strings.js",
    "build-extension": "yarn build-extension-chrome && yarn build-extension-firefox",
    "build-extension-chrome": "node ./build/build-extension.js chrome",
    "build-extension-firefox": "node ./build/build-extension.js firefox",
    "build-devtools": "yarn reset-link && node ./build/build-bundle.js clients/devtools/devtools-entry.js dist/lighthouse-dt-bundle.js && node ./build/build-dt-report-resources.js",
    "build-legacy-javascript": "node ./build/build-legacy-javascript.js",
    "build-devtools-mcp": "node ./build/build-bundle-mcp.js clients/devtools-mcp/devtools-mcp-entry.js dist/lighthouse-devtools-mcp-bundle.js",
    "build-smokehouse-bundle": "node ./build/build-smokehouse-bundle.js",
    "build-lr": "yarn reset-link && node --max-old-space-size=4096 ./build/build-lightrider-bundles.js",
    "build-pack": "bash build/build-pack.sh",
    "build-report": "node build/build-report-components.js && node build/build-report.js",
    "build-sample-reports": "yarn build-report && node build/build-sample-reports.js",
    "build-treemap": "node ./build/build-treemap.js",
    "build-viewer": "node ./build/build-viewer.js",
    "build-types": "yarn type-check && rsync -a .tmp/tsbuildinfo/ ./ --include='*.d.ts' --include='*.d.cts' --exclude='*.map' --exclude='*.tsbuildinfo'",
    "reset-link": "(yarn unlink || true) && yarn link && yarn link lighthouse",
    "c8": "bash core/scripts/c8.sh",
    "clean": "rm -r dist proto/scripts/*.json proto/scripts/*_pb2.* proto/scripts/*_pb.* proto/scripts/__pycache__ proto/scripts/*.pyc *.report.html *.report.dom.html *.report.json *.devtoolslog.json *.trace.json shared/localization/locales/*.ctc.json || true",
    "clean-types": "git clean -xfq '*.d.ts' '*.d.cts' -e 'node_modules/' -e 'dist/' -e '.tmp/' -e '**/types/'",
    "lint": "[ \\"$CI\\" = true ] && eslint --quiet -f codeframe . || eslint .",
    "smoke": "node -r source-map-support/register cli/test/smokehouse/frontends/smokehouse-bin.js",
    "debug": "node --inspect-brk ./cli/index.js",
    "start": "yarn build-report --standalone && node ./cli/index.js",
    "mocha": "node core/test/scripts/run-mocha-tests.js",
    "test": "yarn diff:sample-json && yarn lint --quiet && yarn unit && yarn type-check",
    "test-bundle": "yarn smoke --runner bundle",
    "test-clients": "yarn mocha --testMatch clients/**/*-test.js && yarn mocha --testMatch clients/**/*-test-pptr.js",
    "test-viewer": "yarn unit-viewer && yarn mocha --testMatch viewer/**/*-test-pptr.js --timeout 35000",
    "test-treemap": "yarn unit-treemap && yarn mocha --testMatch treemap/**/*-test-pptr.js --timeout 35000",
    "test-lantern": "bash core/scripts/test-lantern.sh",
    "test-legacy-javascript": "bash core/scripts/test-legacy-javascript.sh",
    "test-docs": "yarn --cwd docs/recipes/ test",
    "test-proto": "yarn compile-proto && yarn build-proto-roundtrip",
    "unit-core": "yarn mocha core",
    "unit-cli": "yarn mocha --testMatch cli/**/*-test.js",
    "unit-lantern-trace": "INTERNAL_LANTERN_USE_TRACE=1 yarn mocha core/test/computed/metrics core/test/audits",
    "unit-report": "yarn mocha --testMatch report/**/*-test.js",
    "unit-treemap": "yarn mocha --testMatch treemap/**/*-test.js",
    "unit-viewer": "yarn mocha --testMatch viewer/**/*-test.js",
    "unit-flow": "bash flow-report/test/run-flow-report-tests.sh",
    "unit": "yarn unit-flow && yarn mocha && yarn unit-lantern-trace",
    "unit:ci": "NODE_OPTIONS=--max-old-space-size=8192 npm run unit",
    "unit-lantern-trace:ci": "NODE_OPTIONS=--max-old-space-size=8192 npm run unit-lantern-trace",
    "core-unit": "yarn unit-core",
    "cli-unit": "yarn unit-cli",
    "viewer-unit": "yarn unit-viewer",
    "watch": "yarn unit-core --watch",
    "unit:cicoverage": "yarn c8 --all yarn unit:ci && yarn c8 --all yarn unit-lantern-trace:ci",
    "coverage": "yarn unit:cicoverage && c8 report --reporter html",
    "coverage:smoke": "yarn c8 yarn smoke -j=1 && c8 report --reporter html",
    "devtools": "bash core/scripts/roll-to-devtools.sh",
    "chrome": "node core/scripts/manual-chrome-launcher.js",
    "fast": "node ./cli/index.js --preset=desktop --throttlingMethod=provided",
    "deploy-treemap": "yarn build-treemap --deploy",
    "deploy-viewer": "yarn build-viewer --deploy",
    "vercel-build": "yarn build-sample-reports && yarn build-viewer && yarn build-treemap",
    "dogfood-lhci": "./core/scripts/dogfood-lhci.sh",
    "timing-trace": "node core/scripts/generate-timing-trace.js",
    "changelog": "conventional-changelog --config ./build/changelog-generator/index.cjs --infile changelog.md --same-file",
    "type-check": "tsc --build ./tsconfig-all.json",
    "i18n:checks": "./core/scripts/i18n/assert-strings-collected.sh",
    "i18n:collect-strings": "node core/scripts/i18n/collect-strings.js",
    "update:lantern-baseline": "node core/scripts/lantern/update-baseline-lantern-values.js",
    "update:sample-artifacts": "node core/scripts/update-report-fixtures.js",
    "update:sample-json": "yarn i18n:collect-strings && node ./cli -A=./core/test/results/artifacts --config-path=./core/test/results/sample-config.js --output=json --output-path=./core/test/results/sample_v2.json && node core/scripts/cleanup-LHR-for-diff.js ./core/test/results/sample_v2.json --only-remove-timing && node ./core/scripts/update-flow-fixtures.js",
    "update:flow-sample-json": "yarn i18n:collect-strings && node ./core/scripts/update-flow-fixtures.js",
    "test-devtools": "bash core/test/devtools-tests/test-locally.sh",
    "open-devtools": "bash core/scripts/open-devtools.sh",
    "run-devtools": "node core/scripts/pptr-run-devtools.js",
    "diff:sample-json": "yarn i18n:checks && bash core/scripts/assert-golden-lhr-unchanged.sh",
    "diff:flow-sample-json": "yarn i18n:collect-strings && bash core/scripts/assert-baseline-flow-result-unchanged.sh",
    "computeBenchmarkIndex": "./core/scripts/benchmark.js",
    "save-latest-run": "./core/scripts/save-latest-run.sh",
    "compile-proto": "protoc --python_out=./ ./proto/lighthouse-result.proto && mv ./proto/*_pb2.py ./proto/scripts || (echo \\"❌ Install protobuf = 3.20.x to compile the proto file.\\" && false)",
    "build-proto-roundtrip": "mkdir -p .tmp && python3 proto/scripts/json_roundtrip_via_proto.py",
    "static-server": "node cli/test/fixtures/static-server.js",
    "serve-dist": "cd dist && python3 -m http.server 7878",
    "serve-gh-pages": "cd dist/gh-pages && python3 -m http.server 7333",
    "serve-treemap": "yarn serve-gh-pages",
    "serve-viewer": "yarn serve-gh-pages",
    "flow-report": "yarn build-report --flow && node ./core/scripts/build-test-flow-report.js",
    "generate-insight-audits": "node core/scripts/generate-insight-audits.js"
  },
  "devDependencies": {
    "@build-tracker/cli": "^1.0.0-beta.15",
    "@esbuild-kit/esm-loader": "^2.6.5",
    "@esbuild-plugins/node-modules-polyfill": "^0.1.4",
    "@eslint/compat": "^1.3.0",
    "@eslint/eslintrc": "^3.3.1",
    "@eslint/js": "^9.28.0",
    "@formatjs/icu-messageformat-parser": "^2.6.2",
    "@jest/fake-timers": "^29.7.0",
    "@testing-library/preact": "^3.1.1",
    "@testing-library/preact-hooks": "^1.1.0",
    "@types/archiver": "^2.1.2",
    "@types/chrome": "^0.0.154",
    "@types/configstore": "^6.0.2",
    "@types/cpy": "^5.1.0",
    "@types/debug": "^4.1.7",
    "@types/eslint": "^9.6.1",
    "@types/estree": "^0.0.50",
    "@types/gh-pages": "^2.0.0",
    "@types/google.analytics": "0.0.39",
    "@types/gtag.js": "0.0.20",
    "@types/jpeg-js": "^0.3.7",
    "@types/jsdom": "^16.2.13",
    "@types/lodash-es": "^4.17.12",
    "@types/mocha": "^9.0.0",
    "@types/node": "*",
    "@types/pako": "^1.0.1",
    "@types/resize-observer-browser": "^0.1.1",
    "@types/resolve": "^1.20.2",
    "@types/semver": "^5.5.0",
    "@types/ws": "^7.0.0",
    "@types/yargs": "^17.0.8",
    "@types/yargs-parser": "^20.2.1",
    "@typescript-eslint/eslint-plugin": "^8.34.0",
    "@typescript-eslint/parser": "^8.34.0",
    "acorn": "^8.5.0",
    "angular": "^1.7.4",
    "archiver": "^7.0.1",
    "builtin-modules": "^3.3.0",
    "c8": "^7.11.3",
    "chalk": "^2.4.1",
    "chrome-devtools-frontend": "1.0.1621678",
    "colors": "^1.4.0",
    "concurrently": "^9.2.1",
    "conventional-changelog-cli": "^2.1.1",
    "core-js-compat": "^3.44.0",
    "cpy": "^8.1.2",
    "csv-validator": "^0.0.3",
    "esbuild": "0.25.9",
    "eslint": "^9.28.0",
    "eslint-config-google": "^0.14.0",
    "eslint-formatter-codeframe": "^7.32.1",
    "eslint-plugin-import": "^2.25.3",
    "eslint-plugin-local-rules": "1.1.0",
    "expect": "^28.1.0",
    "firebase": "^9.0.2",
    "gh-pages": "^2.0.1",
    "glob": "^7.1.3",
    "globals": "^15.14.0",
    "idb-keyval": "2.2.0",
    "jest-mock": "^29.7.0",
    "jest-snapshot": "^29.7.0",
    "jsdom": "^12.2.0",
    "lighthouse-plugin-soft-navigation": "^1.1.0",
    "magic-string": "^0.25.7",
    "mime-types": "^2.1.30",
    "mocha": "^10.0.0",
    "pako": "^2.1.0",
    "preact": "^10.7.2",
    "pretty-json-stringify": "^0.0.2",
    "puppeteer": "^24.42.0",
    "resolve": "^1.22.10",
    "rollup-plugin-polyfill-node": "^0.12.0",
    "source-map-support": "^0.5.21",
    "terser": "^5.18.2",
    "testdouble": "^3.20.2",
    "typed-query-selector": "^2.12.0",
    "typescript": "5.8.2",
    "wait-for-expect": "^3.0.2",
    "webtreemap-cdt": "^3.2.1"
  },
  "dependencies": {
    "@paulirish/trace_engine": "0.0.64",
    "@sentry/node": "^9.28.1",
    "axe-core": "^4.11.4",
    "chrome-launcher": "^1.2.1",
    "configstore": "^7.0.0",
    "csp_evaluator": "1.1.5",
    "devtools-protocol": "0.0.1621552",
    "enquirer": "^2.3.6",
    "http-link-header": "^1.1.1",
    "intl-messageformat": "^10.5.3",
    "jpeg-js": "^0.4.4",
    "js-library-detector": "^6.7.0",
    "lighthouse-logger": "^2.0.2",
    "lighthouse-stack-packs": "1.12.3",
    "lodash-es": "^4.17.21",
    "lookup-closest-locale": "6.2.0",
    "open": "^8.4.0",
    "puppeteer-core": "^24.42.0",
    "robots-parser": "^3.0.1",
    "speedline-core": "^1.4.3",
    "third-party-web": "^0.29.0",
    "tldts-icann": "^7.0.29",
    "web-features": "^3.25.0",
    "ws": "^7.0.0",
    "yargs": "^17.3.1",
    "yargs-parser": "^21.0.0"
  },
  "resolutions": {
    "puppeteer/**/devtools-protocol": "0.0.1621552",
    "puppeteer-core/**/devtools-protocol": "0.0.1621552"
  },
  "repository": "GoogleChrome/lighthouse",
  "keywords": [
    "google",
    "chrome",
    "devtools"
  ],
  "author": "Google LLC",
  "license": "Apache-2.0",
  "bugs": {
    "url": "https://github.com/GoogleChrome/lighthouse/issues"
  },
  "homepage": "https://github.com/GoogleChrome/lighthouse#readme",
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}
`);
    lighthouseVersion = pkg.version;
  }
});

// core/lib/i18n/i18n.js
import path2 from "path";
function lookupLocale(locales2, possibleLocales) {
  if (typeof Intl !== "object") {
    throw new Error("Lighthouse must be run in Node with `Intl` support. See https://nodejs.org/api/intl.html for help");
  }
  const canonicalLocales = Intl.getCanonicalLocales(locales2);
  const availableLocales = Intl.NumberFormat.supportedLocalesOf(canonicalLocales);
  const localesWithMessages = possibleLocales || getAvailableLocales();
  const localesWithmessagesObj = (
    /** @type {Record<LH.Locale, LhlMessages>} */
    Object.fromEntries(localesWithMessages.map((l) => [l, {}]))
  );
  const closestLocale = (0, import_lookup_closest_locale.default)(availableLocales, localesWithmessagesObj);
  if (!closestLocale) {
    if (Intl.NumberFormat.supportedLocalesOf("es").length === 0) {
      lighthouse_logger_default.warn("i18n", "Requested locale not available in this version of node. The `full-icu` npm module can provide additional locales. For help, see https://github.com/GoogleChrome/lighthouse/blob/main/readme.md#how-do-i-get-localized-lighthouse-results-via-the-cli");
    }
    lighthouse_logger_default.warn("i18n", `locale(s) '${locales2}' not available. Falling back to default '${DEFAULT_LOCALE}'`);
  }
  return closestLocale || DEFAULT_LOCALE;
}
function createIcuMessageFn(filename, fileStrings = {}) {
  if (filename.startsWith("file://")) filename = url_default.fileURLToPath(filename);
  if (path2.isAbsolute(filename)) filename = path2.relative(LH_ROOT, filename);
  const mergedStrings = { ...UIStrings, ...fileStrings };
  const getIcuMessageFn = /* @__PURE__ */ __name((message, values) => {
    const keyname = Object.keys(mergedStrings).find((key) => mergedStrings[key] === message);
    if (!keyname) throw new Error(`Could not locate: ${message}`);
    const filenameToLookup = keyname in fileStrings ? filename : path2.relative(LH_ROOT, getModulePath({ url: "core/lib/i18n/i18n.js" }));
    const unixStyleFilename = filenameToLookup.replace(/\\/g, "/");
    const i18nId = `${unixStyleFilename} | ${keyname}`;
    return {
      i18nId,
      values,
      formattedDefault: formatMessage(message, values, DEFAULT_LOCALE)
    };
  }, "getIcuMessageFn");
  return getIcuMessageFn;
}
function isStringOrIcuMessage(value) {
  return typeof value === "string" || isIcuMessage(value);
}
var import_lookup_closest_locale, UIStrings;
var init_i18n = __esm({
  "core/lib/i18n/i18n.js"() {
    "use strict";
    init_process_global();
    init_url();
    import_lookup_closest_locale = __toESM(require_lookup_closest_locale(), 1);
    init_lighthouse_logger();
    init_format();
    init_root2();
    init_format();
    init_esm_utils();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings = {
      /** 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) */
      ms: "{timeInMs, number, milliseconds} ms",
      /** 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) */
      seconds: "{timeInMs, number, seconds} s",
      /** Label shown per-audit to show how many bytes smaller the page could be if the user implemented the suggestions. The `{wastedBytes}` placeholder will be replaced with the number of bytes, shown in kibibytes (e.g. 148 KiB) */
      displayValueByteSavings: "Est savings of {wastedBytes, number, bytes} KiB",
      /** 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) */
      displayValueMsSavings: "Est savings of {wastedMs, number, milliseconds} ms",
      /** Label shown per-audit to show how many HTML elements did not pass the audit. The `{# elements found}` placeholder will be replaced with the number of failing HTML elements. */
      displayValueElementsFound: `{nodeCount, plural, =1 {1 element found} other {# elements found}}`,
      /** Label for a column in a data table; entries will be the URL of a web resource */
      columnURL: "URL",
      /** Label for a column in a data table; entries will be the size or quantity of some resource, e.g. the width and height dimensions of an image or the number of images in a web page. */
      columnSize: "Size",
      /** Label for a column in a data table; entries will be the file size of a web resource in kilobytes. */
      columnResourceSize: "Resource Size",
      /** Label for a column in a data table; entries will be the download size of a web resource in kilobytes. */
      columnTransferSize: "Transfer Size",
      /** Label for a column in a data table; entries will be the time to live value of the cache header on a web resource. */
      columnCacheTTL: "Cache TTL",
      /** Label for a column in a data table; entries will be the number of kilobytes the user could reduce their page by if they implemented the suggestions. */
      columnWastedBytes: "Est Savings",
      /** Label for a column in a data table; entries will be the number of milliseconds the user could reduce page load by if they implemented the suggestions. */
      columnWastedMs: "Est Savings",
      /** Label for a table column that displays how much time each row spent blocking other work on the main thread, entries will be the number of milliseconds spent. */
      columnBlockingTime: "Main-Thread Blocking Time",
      /** Label for a column in a data table; entries will be the number of milliseconds spent during a particular activity. */
      columnTimeSpent: "Time Spent",
      /** Label for a column in a data table; entries will be the location of a specific line of code in a file, in the format "line: 102". */
      columnLocation: "Location",
      /** Label for a column in a data table; entries will be types of resources loaded over the network, e.g. "Scripts", "Third-Party", "Stylesheet". */
      columnResourceType: "Resource Type",
      /** Label for a column in a data table; entries will be the number of network requests done by a webpage. */
      columnRequests: "Requests",
      /** Label for a column in a data table; entries will be the names of arbitrary objects, e.g. the name of a Javascript library, or the name of a user defined timing event. */
      columnName: "Name",
      /** Label for a column in a data table; entries will be the locations of JavaScript or CSS code, e.g. the name of a Javascript package or module. */
      columnSource: "Source",
      /** Label for a column in a data table; entries will be a representation of a DOM element. */
      columnElement: "Element",
      /** Label for a column in a data table; entries will be the number of milliseconds since the page started loading. */
      columnStartTime: "Start Time",
      /** Label for a column in a data table; entries will be the total number of milliseconds from the start time until the end time. */
      columnDuration: "Duration",
      /** Label for a column in a data table; entries will be a representation of a DOM element that did not meet certain suggestions. */
      columnFailingElem: "Failing Elements",
      /** Label for a column in a data table; entries will be a description of the table item. */
      columnDescription: "Description",
      /** Label for a row in a data table; the row represents the total number of something. */
      total: "Total",
      /** 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. */
      totalResourceType: "Total",
      /** 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. */
      documentResourceType: "Document",
      /** 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. */
      scriptResourceType: "Script",
      /** 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. */
      stylesheetResourceType: "Stylesheet",
      /** 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. */
      imageResourceType: "Image",
      /** 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. */
      mediaResourceType: "Media",
      /** 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. */
      fontResourceType: "Font",
      /** 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.*/
      otherResourceType: "Other",
      /** 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. */
      thirdPartyResourceType: "Third-party",
      /** Label used to identify a value in a table where many individual values are aggregated to a single value, for brevity. "Other resources" could also be read as "the rest of the resources". Resource refers to network resources requested by the browser. */
      otherResourcesLabel: "Other resources",
      /** The name of the metric that marks the time at which the first text or image is painted by the browser. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      firstContentfulPaintMetric: "First Contentful Paint",
      /** 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. */
      interactiveMetric: "Time to Interactive",
      /** The name of the metric that marks the time at which a majority of the content has been painted by the browser. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      firstMeaningfulPaintMetric: "First Meaningful Paint",
      /** The name of a metric that calculates the total duration of blocking time for a web page. Blocking times are time periods when the page would be blocked (prevented) from responding to user input (clicks, taps, and keypresses will feel slow to respond). Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      totalBlockingTimeMetric: "Total Blocking Time",
      /** 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. */
      maxPotentialFIDMetric: "Max Potential First Input Delay",
      /** The name of the metric that summarizes how quickly the page looked visually complete. The name of this metric is largely abstract and can be loosely translated. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      speedIndexMetric: "Speed Index",
      /** The name of the metric that marks the time at which the largest text or image is painted by the browser. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      largestContentfulPaintMetric: "Largest Contentful Paint",
      /** The name of the metric "Cumulative Layout Shift" that indicates how much the page changes its layout while it loads. If big segments of the page shift their location during load, the Cumulative Layout Shift will be higher. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      cumulativeLayoutShiftMetric: "Cumulative Layout Shift",
      /** The name of the "Interaction to Next Paint" metric that measures the time between a user interaction and when the browser displays a response on screen. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit. */
      interactionToNextPaint: "Interaction to Next Paint",
      /** Table item value for the severity of a small, or low impact vulnerability. Part of a ranking scale in the form: low, medium, high. */
      itemSeverityLow: "Low",
      /** Table item value for the severity of a vulnerability. Part of a ranking scale in the form: low, medium, high. */
      itemSeverityMedium: "Medium",
      /** Table item value for the severity of a high impact, or dangerous vulnerability. Part of a ranking scale in the form: low, medium, high. */
      itemSeverityHigh: "High"
    };
    __name(lookupLocale, "lookupLocale");
    __name(createIcuMessageFn, "createIcuMessageFn");
    __name(isStringOrIcuMessage, "isStringOrIcuMessage");
  }
});

// core/lib/stack-packs.js
function getStackPacks(pageStacks) {
  if (!pageStacks) return [];
  const packs = [];
  for (const pageStack of pageStacks) {
    const stackPackToIncl = stackPacksToInclude.find((stackPackToIncl2) => stackPackToIncl2.requiredStacks.includes(`${pageStack.detector}:${pageStack.id}`));
    if (!stackPackToIncl) {
      continue;
    }
    const matchedPack = import_lighthouse_stack_packs.default.find((pack) => pack.id === stackPackToIncl.packId);
    if (!matchedPack) {
      lighthouse_logger_default.warn(
        "StackPacks",
        `'${stackPackToIncl.packId}' stack pack was matched but is not found in stack-packs lib`
      );
      continue;
    }
    const str_116 = createIcuMessageFn(
      `node_modules/lighthouse-stack-packs/packs/${matchedPack.id}.js`,
      matchedPack.UIStrings
    );
    const descriptions = {};
    const UIStrings137 = matchedPack.UIStrings;
    for (const key in UIStrings137) {
      if (UIStrings137[key]) {
        descriptions[key] = str_116(UIStrings137[key]);
      }
    }
    packs.push({
      id: matchedPack.id,
      title: matchedPack.title,
      iconDataURL: matchedPack.icon,
      descriptions
    });
  }
  return packs.sort((a, b) => {
    const aVal = stackPacksToInclude.findIndex((p) => p.packId === a.id);
    const bVal = stackPacksToInclude.findIndex((p) => p.packId === b.id);
    return aVal - bVal;
  });
}
var import_lighthouse_stack_packs, stackPacksToInclude;
var init_stack_packs = __esm({
  "core/lib/stack-packs.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    import_lighthouse_stack_packs = __toESM(require_lighthouse_stack_packs(), 1);
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    stackPacksToInclude = [
      {
        packId: "gatsby",
        requiredStacks: ["js:gatsby"]
      },
      {
        packId: "wordpress",
        requiredStacks: ["js:wordpress"]
      },
      {
        packId: "wix",
        requiredStacks: ["js:wix"]
      },
      {
        packId: "wp-rocket",
        requiredStacks: ["js:wp-rocket"]
      },
      {
        packId: "ezoic",
        requiredStacks: ["js:ezoic"]
      },
      {
        packId: "drupal",
        requiredStacks: ["js:drupal"]
      },
      {
        packId: "nitropack",
        requiredStacks: ["js:nitropack"]
      },
      {
        packId: "amp",
        requiredStacks: ["js:amp"]
      },
      {
        packId: "magento",
        requiredStacks: ["js:magento"]
      },
      {
        packId: "octobercms",
        requiredStacks: ["js:octobercms"]
      },
      {
        packId: "joomla",
        requiredStacks: ["js:joomla"]
      },
      {
        packId: "next.js",
        requiredStacks: ["js:next"]
      },
      {
        packId: "nuxt",
        requiredStacks: ["js:nuxt"]
      },
      {
        packId: "angular",
        requiredStacks: ["js:angular"]
      },
      {
        packId: "react",
        requiredStacks: ["js:react"]
      }
    ];
    __name(getStackPacks, "getStackPacks");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/core/LanternError.js
var LanternError;
var init_LanternError = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/core/LanternError.js"() {
    init_process_global();
    LanternError = class extends Error {
      static {
        __name(this, "LanternError");
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/core/NetworkAnalyzer.js
var UrlUtils, INITIAL_CWD, DEFAULT_SERVER_RESPONSE_PERCENTAGE, SERVER_RESPONSE_PERCENTAGE_OF_TTFB, NetworkAnalyzer;
var init_NetworkAnalyzer = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/core/NetworkAnalyzer.js"() {
    init_process_global();
    init_LanternError();
    UrlUtils = class {
      static {
        __name(this, "UrlUtils");
      }
      /**
       * There is fancy URL rewriting logic for the chrome://settings page that we need to work around.
       * Why? Special handling was added by Chrome team to allow a pushState transition between chrome:// pages.
       * As a result, the network URL (chrome://chrome/settings/) doesn't match the final document URL (chrome://settings/).
       */
      static rewriteChromeInternalUrl(url) {
        if (!url?.startsWith("chrome://")) {
          return url;
        }
        if (url.endsWith("/")) {
          url = url.replace(/\/$/, "");
        }
        return url.replace(/^chrome:\/\/chrome\//, "chrome://");
      }
      /**
       * Determine if url1 equals url2, ignoring URL fragments.
       */
      static equalWithExcludedFragments(url1, url2) {
        [url1, url2] = [url1, url2].map(this.rewriteChromeInternalUrl);
        try {
          const urla = new URL(url1);
          urla.hash = "";
          const urlb = new URL(url2);
          urlb.hash = "";
          return urla.href === urlb.href;
        } catch {
          return false;
        }
      }
    };
    INITIAL_CWD = 14 * 1024;
    DEFAULT_SERVER_RESPONSE_PERCENTAGE = 0.4;
    SERVER_RESPONSE_PERCENTAGE_OF_TTFB = {
      Document: 0.9,
      XHR: 0.9,
      Fetch: 0.9
    };
    NetworkAnalyzer = class _NetworkAnalyzer {
      static {
        __name(this, "NetworkAnalyzer");
      }
      static get summary() {
        return "__SUMMARY__";
      }
      static groupByOrigin(records) {
        const grouped = /* @__PURE__ */ new Map();
        records.forEach((item) => {
          const key = item.parsedURL.securityOrigin;
          const group = grouped.get(key) || [];
          group.push(item);
          grouped.set(key, group);
        });
        return grouped;
      }
      static getSummary(values) {
        values.sort((a, b) => a - b);
        let median;
        if (values.length === 0) {
          median = values[0];
        } else if (values.length % 2 === 0) {
          const a = values[Math.floor((values.length - 1) / 2)];
          const b = values[Math.floor((values.length - 1) / 2) + 1];
          median = (a + b) / 2;
        } else {
          median = values[Math.floor((values.length - 1) / 2)];
        }
        return {
          min: values[0],
          max: values[values.length - 1],
          avg: values.reduce((a, b) => a + b, 0) / values.length,
          median
        };
      }
      static summarize(values) {
        const summaryByKey = /* @__PURE__ */ new Map();
        const allEstimates = [];
        for (const [key, estimates] of values) {
          summaryByKey.set(key, _NetworkAnalyzer.getSummary(estimates));
          allEstimates.push(...estimates);
        }
        summaryByKey.set(_NetworkAnalyzer.summary, _NetworkAnalyzer.getSummary(allEstimates));
        return summaryByKey;
      }
      static estimateValueByOrigin(requests, iteratee) {
        const connectionWasReused = _NetworkAnalyzer.estimateIfConnectionWasReused(requests);
        const groupedByOrigin = _NetworkAnalyzer.groupByOrigin(requests);
        const estimates = /* @__PURE__ */ new Map();
        for (const [origin, originRequests] of groupedByOrigin.entries()) {
          let originEstimates = [];
          for (const request of originRequests) {
            const timing = request.timing;
            if (!timing) {
              continue;
            }
            const value = iteratee({
              request,
              timing,
              connectionReused: connectionWasReused.get(request.requestId)
            });
            if (typeof value !== "undefined") {
              originEstimates = originEstimates.concat(value);
            }
          }
          if (!originEstimates.length) {
            continue;
          }
          estimates.set(origin, originEstimates);
        }
        return estimates;
      }
      /**
       * Estimates the observed RTT to each origin based on how long the connection setup.
       * For h1 and h2, this could includes two estimates - one for the TCP handshake, another for
       * SSL negotiation.
       * For h3, we get only one estimate since QUIC establishes a secure connection in a
       * single handshake.
       * This is the most accurate and preferred method of measurement when the data is available.
       */
      static estimateRTTViaConnectionTiming(info) {
        const { timing, connectionReused, request } = info;
        if (connectionReused) {
          return;
        }
        const { connectStart, sslStart, sslEnd, connectEnd } = timing;
        if (connectEnd >= 0 && connectStart >= 0 && request.protocol.startsWith("h3")) {
          return connectEnd - connectStart;
        }
        if (sslStart >= 0 && sslEnd >= 0 && sslStart !== connectStart) {
          return [connectEnd - sslStart, sslStart - connectStart];
        }
        if (connectStart >= 0 && connectEnd >= 0) {
          return connectEnd - connectStart;
        }
        return;
      }
      /**
       * Estimates the observed RTT to each origin based on how long a download took on a fresh connection.
       * NOTE: this will tend to overestimate the actual RTT quite significantly as the download can be
       * slow for other reasons as well such as bandwidth constraints.
       */
      static estimateRTTViaDownloadTiming(info) {
        const { timing, connectionReused, request } = info;
        if (connectionReused) {
          return;
        }
        if (request.transferSize <= INITIAL_CWD) {
          return;
        }
        if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) {
          return;
        }
        const totalTime = request.networkEndTime - request.networkRequestTime;
        const downloadTimeAfterFirstByte = totalTime - timing.receiveHeadersEnd;
        const numberOfRoundTrips = Math.log2(request.transferSize / INITIAL_CWD);
        if (numberOfRoundTrips > 5) {
          return;
        }
        return downloadTimeAfterFirstByte / numberOfRoundTrips;
      }
      /**
       * Estimates the observed RTT to each origin based on how long it took until Chrome could
       * start sending the actual request when a new connection was required.
       * NOTE: this will tend to overestimate the actual RTT as the request can be delayed for other
       * reasons as well such as more SSL handshakes if TLS False Start is not enabled.
       */
      static estimateRTTViaSendStartTiming(info) {
        const { timing, connectionReused, request } = info;
        if (connectionReused) {
          return;
        }
        if (!Number.isFinite(timing.sendStart) || timing.sendStart < 0) {
          return;
        }
        let roundTrips = 1;
        if (!request.protocol.startsWith("h3")) {
          roundTrips += 1;
        }
        if (request.parsedURL.scheme === "https") {
          roundTrips += 1;
        }
        return timing.sendStart / roundTrips;
      }
      /**
       * Estimates the observed RTT to each origin based on how long it took until Chrome received the
       * headers of the response (~TTFB).
       * NOTE: this is the most inaccurate way to estimate the RTT, but in some environments it's all
       * we have access to :(
       */
      static estimateRTTViaHeadersEndTiming(info) {
        const { timing, connectionReused, request } = info;
        if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) {
          return;
        }
        if (!request.resourceType) {
          return;
        }
        const serverResponseTimePercentage = SERVER_RESPONSE_PERCENTAGE_OF_TTFB[request.resourceType] || DEFAULT_SERVER_RESPONSE_PERCENTAGE;
        const estimatedServerResponseTime = timing.receiveHeadersEnd * serverResponseTimePercentage;
        let roundTrips = 1;
        if (!connectionReused) {
          roundTrips += 1;
          if (!request.protocol.startsWith("h3")) {
            roundTrips += 1;
          }
          if (request.parsedURL.scheme === "https") {
            roundTrips += 1;
          }
        }
        return Math.max((timing.receiveHeadersEnd - estimatedServerResponseTime) / roundTrips, 3);
      }
      /**
       * Given the RTT to each origin, estimates the observed server response times.
       */
      static estimateResponseTimeByOrigin(records, rttByOrigin) {
        return _NetworkAnalyzer.estimateValueByOrigin(records, ({ request, timing }) => {
          if (request.serverResponseTime !== void 0) {
            return request.serverResponseTime;
          }
          if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) {
            return;
          }
          if (!Number.isFinite(timing.sendEnd) || timing.sendEnd < 0) {
            return;
          }
          const ttfb = timing.receiveHeadersEnd - timing.sendEnd;
          const origin = request.parsedURL.securityOrigin;
          const rtt = rttByOrigin.get(origin) || rttByOrigin.get(_NetworkAnalyzer.summary) || 0;
          return Math.max(ttfb - rtt, 0);
        });
      }
      static canTrustConnectionInformation(requests) {
        const connectionIdWasStarted = /* @__PURE__ */ new Map();
        for (const request of requests) {
          const started = connectionIdWasStarted.get(request.connectionId) || !request.connectionReused;
          connectionIdWasStarted.set(request.connectionId, started);
        }
        if (connectionIdWasStarted.size <= 1) {
          return false;
        }
        return Array.from(connectionIdWasStarted.values()).every((started) => started);
      }
      /**
       * Returns a map of requestId -> connectionReused, estimating the information if the information
       * available in the records themselves appears untrustworthy.
       */
      static estimateIfConnectionWasReused(records, options) {
        const { forceCoarseEstimates = false } = options || {};
        if (!forceCoarseEstimates && _NetworkAnalyzer.canTrustConnectionInformation(records)) {
          return new Map(records.map((request) => [request.requestId, Boolean(request.connectionReused)]));
        }
        const connectionWasReused = /* @__PURE__ */ new Map();
        const groupedByOrigin = _NetworkAnalyzer.groupByOrigin(records);
        for (const originRecords of groupedByOrigin.values()) {
          const earliestReusePossible = originRecords.map((request) => request.networkEndTime).reduce((a, b) => Math.min(a, b), Infinity);
          for (const request of originRecords) {
            connectionWasReused.set(request.requestId, request.networkRequestTime >= earliestReusePossible || request.protocol === "h2");
          }
          const firstRecord = originRecords.reduce((a, b) => {
            return a.networkRequestTime > b.networkRequestTime ? b : a;
          });
          connectionWasReused.set(firstRecord.requestId, false);
        }
        return connectionWasReused;
      }
      /**
       * Estimates the RTT to each origin by examining observed network timing information.
       * Attempts to use the most accurate information first and falls back to coarser estimates when it
       * is unavailable.
       */
      static estimateRTTByOrigin(records, options) {
        const {
          forceCoarseEstimates = false,
          // coarse estimates include lots of extra time and noise
          // multiply by some factor to deflate the estimates a bit.
          coarseEstimateMultiplier = 0.3,
          useDownloadEstimates = true,
          useSendStartEstimates = true,
          useHeadersEndEstimates = true
        } = options || {};
        const connectionWasReused = _NetworkAnalyzer.estimateIfConnectionWasReused(records);
        const groupedByOrigin = _NetworkAnalyzer.groupByOrigin(records);
        const estimatesByOrigin = /* @__PURE__ */ new Map();
        for (const [origin, originRequests] of groupedByOrigin.entries()) {
          let collectEstimates = function(estimator, multiplier = 1) {
            for (const request of originRequests) {
              const timing = request.timing;
              if (!timing || !request.transferSize) {
                continue;
              }
              const estimates = estimator({
                request,
                timing,
                connectionReused: connectionWasReused.get(request.requestId)
              });
              if (estimates === void 0) {
                continue;
              }
              if (!Array.isArray(estimates)) {
                originEstimates.push(estimates * multiplier);
              } else {
                originEstimates.push(...estimates.map((e) => e * multiplier));
              }
            }
          };
          __name(collectEstimates, "collectEstimates");
          const originEstimates = [];
          if (!forceCoarseEstimates) {
            collectEstimates(this.estimateRTTViaConnectionTiming);
          }
          if (!originEstimates.length) {
            if (useDownloadEstimates) {
              collectEstimates(this.estimateRTTViaDownloadTiming, coarseEstimateMultiplier);
            }
            if (useSendStartEstimates) {
              collectEstimates(this.estimateRTTViaSendStartTiming, coarseEstimateMultiplier);
            }
            if (useHeadersEndEstimates) {
              collectEstimates(this.estimateRTTViaHeadersEndTiming, coarseEstimateMultiplier);
            }
          }
          if (originEstimates.length) {
            estimatesByOrigin.set(origin, originEstimates);
          }
        }
        if (!estimatesByOrigin.size) {
          throw new LanternError("No timing information available");
        }
        return _NetworkAnalyzer.summarize(estimatesByOrigin);
      }
      /**
       * Estimates the server response time of each origin. RTT times can be passed in or will be
       * estimated automatically if not provided.
       */
      static estimateServerResponseTimeByOrigin(records, options) {
        let rttByOrigin = options?.rttByOrigin;
        if (!rttByOrigin) {
          rttByOrigin = /* @__PURE__ */ new Map();
          const rttSummaryByOrigin = _NetworkAnalyzer.estimateRTTByOrigin(records, options);
          for (const [origin, summary] of rttSummaryByOrigin.entries()) {
            rttByOrigin.set(origin, summary.min);
          }
        }
        const estimatesByOrigin = _NetworkAnalyzer.estimateResponseTimeByOrigin(records, rttByOrigin);
        return _NetworkAnalyzer.summarize(estimatesByOrigin);
      }
      /**
       * Computes the average throughput for the given requests in bits/second.
       * Excludes data URI, failed or otherwise incomplete, and cached requests.
       * Returns null if there were no analyzable network requests.
       */
      static estimateThroughput(records) {
        let totalBytes = 0;
        const timeBoundaries = records.reduce((boundaries, request) => {
          const scheme = request.parsedURL?.scheme;
          if (scheme === "data" || request.failed || !request.finished || request.statusCode > 300 || !request.transferSize) {
            return boundaries;
          }
          totalBytes += request.transferSize;
          boundaries.push({ time: request.responseHeadersEndTime / 1e3, isStart: true });
          boundaries.push({ time: request.networkEndTime / 1e3, isStart: false });
          return boundaries;
        }, []).sort((a, b) => a.time - b.time);
        if (!timeBoundaries.length) {
          return null;
        }
        let inflight = 0;
        let currentStart = 0;
        let totalDuration = 0;
        timeBoundaries.forEach((boundary) => {
          if (boundary.isStart) {
            if (inflight === 0) {
              currentStart = boundary.time;
            }
            inflight++;
          } else {
            inflight--;
            if (inflight === 0) {
              totalDuration += boundary.time - currentStart;
            }
          }
        });
        return totalBytes * 8 / totalDuration;
      }
      static computeRTTAndServerResponseTime(records) {
        const rttByOrigin = /* @__PURE__ */ new Map();
        for (const [origin, summary] of _NetworkAnalyzer.estimateRTTByOrigin(records).entries()) {
          rttByOrigin.set(origin, summary.min);
        }
        const minimumRtt = Math.min(...Array.from(rttByOrigin.values()));
        const responseTimeSummaries = _NetworkAnalyzer.estimateServerResponseTimeByOrigin(records, {
          rttByOrigin
        });
        const additionalRttByOrigin = /* @__PURE__ */ new Map();
        const serverResponseTimeByOrigin = /* @__PURE__ */ new Map();
        for (const [origin, summary] of responseTimeSummaries.entries()) {
          const rttForOrigin = rttByOrigin.get(origin) || minimumRtt;
          additionalRttByOrigin.set(origin, rttForOrigin - minimumRtt);
          serverResponseTimeByOrigin.set(origin, summary.median);
        }
        return {
          rtt: minimumRtt,
          additionalRttByOrigin,
          serverResponseTimeByOrigin
        };
      }
      static analyze(records) {
        const throughput = _NetworkAnalyzer.estimateThroughput(records);
        if (throughput === null) {
          return null;
        }
        return {
          throughput,
          ..._NetworkAnalyzer.computeRTTAndServerResponseTime(records)
        };
      }
      static findResourceForUrl(records, resourceUrl) {
        return records.find((request) => resourceUrl.startsWith(request.url) && UrlUtils.equalWithExcludedFragments(request.url, resourceUrl));
      }
      static findLastDocumentForUrl(records, resourceUrl) {
        const matchingRequests = records.filter((request) => request.resourceType === "Document" && !request.failed && // Note: `request.url` should never have a fragment, else this optimization gives wrong results.
        resourceUrl.startsWith(request.url) && UrlUtils.equalWithExcludedFragments(request.url, resourceUrl));
        return matchingRequests[matchingRequests.length - 1];
      }
      /**
       * Resolves redirect chain given a main document.
       * See: {@link NetworkAnalyzer.findLastDocumentForUrl} for how to retrieve main document.
       */
      static resolveRedirects(request) {
        while (request.redirectDestination) {
          request = request.redirectDestination;
        }
        return request;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/core/core.js
var core_exports = {};
__export(core_exports, {
  LanternError: () => LanternError,
  NetworkAnalyzer: () => NetworkAnalyzer
});
var init_core = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/core/core.js"() {
    init_process_global();
    init_LanternError();
    init_NetworkAnalyzer();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/graph/BaseNode.js
var BaseNode;
var init_BaseNode = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/graph/BaseNode.js"() {
    init_process_global();
    init_core();
    BaseNode = class _BaseNode {
      static {
        __name(this, "BaseNode");
      }
      static types = {
        NETWORK: "network",
        CPU: "cpu"
      };
      _id;
      _isMainDocument;
      dependents;
      dependencies;
      constructor(id) {
        this._id = id;
        this._isMainDocument = false;
        this.dependents = [];
        this.dependencies = [];
      }
      get id() {
        return this._id;
      }
      get type() {
        throw new LanternError("Unimplemented");
      }
      /**
       * In microseconds
       */
      get startTime() {
        throw new LanternError("Unimplemented");
      }
      /**
       * In microseconds
       */
      get endTime() {
        throw new LanternError("Unimplemented");
      }
      setIsMainDocument(value) {
        this._isMainDocument = value;
      }
      isMainDocument() {
        return this._isMainDocument;
      }
      getDependents() {
        return this.dependents.slice();
      }
      getNumberOfDependents() {
        return this.dependents.length;
      }
      getDependencies() {
        return this.dependencies.slice();
      }
      getNumberOfDependencies() {
        return this.dependencies.length;
      }
      getRootNode() {
        let rootNode = this;
        while (rootNode.dependencies.length) {
          rootNode = rootNode.dependencies[0];
        }
        return rootNode;
      }
      addDependent(node) {
        node.addDependency(this);
      }
      addDependency(node) {
        if (node === this) {
          throw new LanternError("Cannot add dependency on itself");
        }
        if (this.dependencies.includes(node)) {
          return;
        }
        node.dependents.push(this);
        this.dependencies.push(node);
      }
      removeDependent(node) {
        node.removeDependency(this);
      }
      removeDependency(node) {
        if (!this.dependencies.includes(node)) {
          return;
        }
        const thisIndex = node.dependents.indexOf(this);
        node.dependents.splice(thisIndex, 1);
        this.dependencies.splice(this.dependencies.indexOf(node), 1);
      }
      // Unused in devtools, but used in LH.
      removeAllDependencies() {
        for (const node of this.dependencies.slice()) {
          this.removeDependency(node);
        }
      }
      /**
       * Computes whether the given node is anywhere in the dependency graph of this node.
       * While this method can prevent cycles, it walks the graph and should be used sparingly.
       * Nodes are always considered dependent on themselves for the purposes of cycle detection.
       */
      isDependentOn(node) {
        let isDependentOnNode = false;
        this.traverse((currentNode) => {
          if (isDependentOnNode) {
            return;
          }
          isDependentOnNode = currentNode === node;
        }, (currentNode) => {
          if (isDependentOnNode) {
            return [];
          }
          return currentNode.getDependencies();
        });
        return isDependentOnNode;
      }
      /**
       * Clones the node's information without adding any dependencies/dependents.
       */
      cloneWithoutRelationships() {
        const node = new _BaseNode(this.id);
        node.setIsMainDocument(this._isMainDocument);
        return node;
      }
      /**
       * Clones the entire graph connected to this node filtered by the optional predicate. If a node is
       * included by the predicate, all nodes along the paths between the node and the root will be included. If the
       * node this was called on is not included in the resulting filtered graph, the method will throw.
       *
       * This does not clone NetworkNode's `record` or `rawRecord` fields. It may be reasonable to clone the former,
       * to assist in graph construction, but the latter should never be cloned as one constraint of Lantern is that
       * the underlying data records are accessible for plain object reference equality checks.
       */
      cloneWithRelationships(predicate) {
        const rootNode = this.getRootNode();
        const idsToIncludedClones = /* @__PURE__ */ new Map();
        rootNode.traverse((node) => {
          if (idsToIncludedClones.has(node.id)) {
            return;
          }
          if (predicate === void 0) {
            idsToIncludedClones.set(node.id, node.cloneWithoutRelationships());
            return;
          }
          if (predicate(node)) {
            node.traverse(
              (node2) => idsToIncludedClones.set(node2.id, node2.cloneWithoutRelationships()),
              // Dependencies already cloned have already cloned ancestors, so no need to visit again.
              (node2) => node2.dependencies.filter((parent) => !idsToIncludedClones.has(parent.id))
            );
          }
        });
        rootNode.traverse((originalNode) => {
          const clonedNode = idsToIncludedClones.get(originalNode.id);
          if (!clonedNode) {
            return;
          }
          for (const dependency of originalNode.dependencies) {
            const clonedDependency = idsToIncludedClones.get(dependency.id);
            if (!clonedDependency) {
              throw new LanternError("Dependency somehow not cloned");
            }
            clonedNode.addDependency(clonedDependency);
          }
        });
        const clonedThisNode = idsToIncludedClones.get(this.id);
        if (!clonedThisNode) {
          throw new LanternError("Cloned graph missing node");
        }
        return clonedThisNode;
      }
      /**
       * Traverses all connected nodes in BFS order, calling `callback` exactly once
       * on each. `traversalPath` is the shortest (though not necessarily unique)
       * path from `node` to the root of the iteration.
       *
       * The `getNextNodes` function takes a visited node and returns which nodes to
       * visit next. It defaults to returning the node's dependents.
       */
      traverse(callback, getNextNodes) {
        for (const { node, traversalPath } of this.traverseGenerator(getNextNodes)) {
          callback(node, traversalPath);
        }
      }
      /**
       * @see BaseNode.traverse
       */
      // clang-format off
      *traverseGenerator(getNextNodes) {
        if (!getNextNodes) {
          getNextNodes = /* @__PURE__ */ __name((node) => node.getDependents(), "getNextNodes");
        }
        const queue = [[this]];
        const visited = /* @__PURE__ */ new Set([this.id]);
        while (queue.length) {
          const traversalPath = queue.shift();
          const node = traversalPath[0];
          yield { node, traversalPath };
          for (const nextNode of getNextNodes(node)) {
            if (visited.has(nextNode.id)) {
              continue;
            }
            visited.add(nextNode.id);
            queue.push([nextNode, ...traversalPath]);
          }
        }
      }
      /**
       * If the given node has a cycle, returns a path representing that cycle.
       * Else returns null.
       *
       * Does a DFS on in its dependent graph.
       */
      static findCycle(node, direction = "both") {
        if (direction === "both") {
          return _BaseNode.findCycle(node, "dependents") || _BaseNode.findCycle(node, "dependencies");
        }
        const visited = /* @__PURE__ */ new Set();
        const currentPath = [];
        const toVisit = [node];
        const depthAdded = /* @__PURE__ */ new Map([[node, 0]]);
        while (toVisit.length) {
          const currentNode = toVisit.pop();
          if (currentPath.includes(currentNode)) {
            return currentPath;
          }
          if (visited.has(currentNode)) {
            continue;
          }
          while (currentPath.length > depthAdded.get(currentNode)) {
            currentPath.pop();
          }
          visited.add(currentNode);
          currentPath.push(currentNode);
          const nodesToExplore = direction === "dependents" ? currentNode.dependents : currentNode.dependencies;
          for (const nextNode of nodesToExplore) {
            if (toVisit.includes(nextNode)) {
              continue;
            }
            toVisit.push(nextNode);
            depthAdded.set(nextNode, currentPath.length);
          }
        }
        return null;
      }
      canDependOn(node) {
        return node.startTime <= this.startTime;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/graph/CPUNode.js
var CPUNode;
var init_CPUNode = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/graph/CPUNode.js"() {
    init_process_global();
    init_BaseNode();
    CPUNode = class _CPUNode extends BaseNode {
      static {
        __name(this, "CPUNode");
      }
      _event;
      _childEvents;
      correctedEndTs;
      constructor(parentEvent, childEvents = [], correctedEndTs) {
        const nodeId = `${parentEvent.tid}.${parentEvent.ts}`;
        super(nodeId);
        this._event = parentEvent;
        this._childEvents = childEvents;
        this.correctedEndTs = correctedEndTs;
      }
      get type() {
        return BaseNode.types.CPU;
      }
      get startTime() {
        return this._event.ts;
      }
      get endTime() {
        if (this.correctedEndTs) {
          return this.correctedEndTs;
        }
        return this._event.ts + this._event.dur;
      }
      get duration() {
        return this.endTime - this.startTime;
      }
      get event() {
        return this._event;
      }
      get childEvents() {
        return this._childEvents;
      }
      /**
       * Returns true if this node contains a Layout task.
       */
      didPerformLayout() {
        return this._childEvents.some((evt) => evt.name === "Layout");
      }
      /**
       * Returns the script URLs that had their EvaluateScript events occur in this task.
       */
      getEvaluateScriptURLs() {
        const urls = /* @__PURE__ */ new Set();
        for (const event of this._childEvents) {
          if (event.name !== "EvaluateScript") {
            continue;
          }
          if (!event.args.data?.url) {
            continue;
          }
          urls.add(event.args.data.url);
        }
        return urls;
      }
      cloneWithoutRelationships() {
        return new _CPUNode(this._event, this._childEvents, this.correctedEndTs);
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/graph/NetworkNode.js
function isNonNetworkProtocol(protocol) {
  const urlScheme = protocol.includes(":") ? protocol.slice(0, protocol.indexOf(":")) : protocol;
  return NON_NETWORK_SCHEMES.includes(urlScheme);
}
var NON_NETWORK_SCHEMES, NetworkNode;
var init_NetworkNode = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/graph/NetworkNode.js"() {
    init_process_global();
    init_BaseNode();
    NON_NETWORK_SCHEMES = [
      "blob",
      // @see https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
      "data",
      // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
      "intent",
      // @see https://developer.chrome.com/docs/multidevice/android/intents/
      "file",
      // @see https://en.wikipedia.org/wiki/File_URI_scheme
      "filesystem",
      // @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystem
      "chrome-extension"
    ];
    __name(isNonNetworkProtocol, "isNonNetworkProtocol");
    NetworkNode = class _NetworkNode extends BaseNode {
      static {
        __name(this, "NetworkNode");
      }
      _request;
      constructor(networkRequest) {
        super(networkRequest.requestId);
        this._request = networkRequest;
      }
      get type() {
        return BaseNode.types.NETWORK;
      }
      get startTime() {
        return this._request.rendererStartTime * 1e3;
      }
      get endTime() {
        return this._request.networkEndTime * 1e3;
      }
      get rawRequest() {
        return this._request.rawRequest;
      }
      get request() {
        return this._request;
      }
      get initiatorType() {
        return this._request.initiator.type;
      }
      get fromDiskCache() {
        return Boolean(this._request.fromDiskCache);
      }
      get isNonNetworkProtocol() {
        return isNonNetworkProtocol(this.request.protocol) || // But `protocol` can fail to be populated if the request fails, so fallback to scheme.
        isNonNetworkProtocol(this.request.parsedURL.scheme);
      }
      /**
       * Returns whether this network request can be downloaded without a TCP connection.
       * During simulation we treat data coming in over a network connection separately from on-device data.
       */
      get isConnectionless() {
        return this.fromDiskCache || this.isNonNetworkProtocol;
      }
      hasRenderBlockingPriority() {
        const priority = this._request.priority;
        const isScript = this._request.resourceType === "Script";
        const isDocument = this._request.resourceType === "Document";
        const isBlockingScript = priority === "High" && isScript;
        const isBlockingHtmlImport = priority === "High" && isDocument;
        return priority === "VeryHigh" || isBlockingScript || isBlockingHtmlImport;
      }
      cloneWithoutRelationships() {
        const node = new _NetworkNode(this._request);
        node.setIsMainDocument(this._isMainDocument);
        return node;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/graph/PageDependencyGraph.js
var SCHEDULABLE_TASK_TITLE_LH2, SCHEDULABLE_TASK_TITLE_ALT12, SCHEDULABLE_TASK_TITLE_ALT22, SCHEDULABLE_TASK_TITLE_ALT32, SIGNIFICANT_DUR_THRESHOLD_MS, IGNORED_MIME_TYPES_REGEX, PageDependencyGraph;
var init_PageDependencyGraph = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/graph/PageDependencyGraph.js"() {
    init_process_global();
    init_core();
    init_CPUNode();
    init_NetworkNode();
    SCHEDULABLE_TASK_TITLE_LH2 = "RunTask";
    SCHEDULABLE_TASK_TITLE_ALT12 = "ThreadControllerImpl::RunTask";
    SCHEDULABLE_TASK_TITLE_ALT22 = "ThreadControllerImpl::DoWork";
    SCHEDULABLE_TASK_TITLE_ALT32 = "TaskQueueManager::ProcessTaskFromWorkQueue";
    SIGNIFICANT_DUR_THRESHOLD_MS = 10;
    IGNORED_MIME_TYPES_REGEX = /^video/;
    PageDependencyGraph = class _PageDependencyGraph {
      static {
        __name(this, "PageDependencyGraph");
      }
      static getNetworkInitiators(request) {
        if (!request.initiator) {
          return [];
        }
        if (request.initiator.url) {
          return [request.initiator.url];
        }
        if (request.initiator.type === "script") {
          const scriptURLs = /* @__PURE__ */ new Set();
          let stack = request.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 [];
      }
      static getNetworkNodeOutput(networkRequests) {
        const nodes = [];
        const idToNodeMap = /* @__PURE__ */ new Map();
        const urlToNodeMap = /* @__PURE__ */ new Map();
        const frameIdToNodeMap = /* @__PURE__ */ new Map();
        networkRequests.forEach((request) => {
          if (IGNORED_MIME_TYPES_REGEX.test(request.mimeType)) {
            return;
          }
          if (request.fromWorker) {
            return;
          }
          while (idToNodeMap.has(request.requestId)) {
            request.requestId += ":duplicate";
          }
          const node = new NetworkNode(request);
          nodes.push(node);
          const urlList = urlToNodeMap.get(request.url) || [];
          urlList.push(node);
          idToNodeMap.set(request.requestId, node);
          urlToNodeMap.set(request.url, urlList);
          if (request.frameId && request.resourceType === "Document" && request.documentURL === request.url) {
            const value = frameIdToNodeMap.has(request.frameId) ? null : node;
            frameIdToNodeMap.set(request.frameId, value);
          }
        });
        return { nodes, idToNodeMap, urlToNodeMap, frameIdToNodeMap };
      }
      static isScheduleableTask(evt) {
        return evt.name === SCHEDULABLE_TASK_TITLE_LH2 || evt.name === SCHEDULABLE_TASK_TITLE_ALT12 || evt.name === SCHEDULABLE_TASK_TITLE_ALT22 || evt.name === SCHEDULABLE_TASK_TITLE_ALT32;
      }
      /**
       * There should *always* be at least one top level event, having 0 typically means something is
       * drastically wrong with the trace and we should just give up early and loudly.
       */
      static assertHasToplevelEvents(events) {
        const hasToplevelTask = events.some(this.isScheduleableTask);
        if (!hasToplevelTask) {
          throw new LanternError("Could not find any top level events");
        }
      }
      static getCPUNodes(mainThreadEvents) {
        const nodes = [];
        let i = 0;
        _PageDependencyGraph.assertHasToplevelEvents(mainThreadEvents);
        while (i < mainThreadEvents.length) {
          const evt = mainThreadEvents[i];
          i++;
          if (!_PageDependencyGraph.isScheduleableTask(evt) || !evt.dur) {
            continue;
          }
          let correctedEndTs = void 0;
          const children = [];
          for (const endTime = evt.ts + evt.dur; i < mainThreadEvents.length && mainThreadEvents[i].ts < endTime; i++) {
            const event = mainThreadEvents[i];
            if (_PageDependencyGraph.isScheduleableTask(event) && event.dur) {
              correctedEndTs = event.ts - 1;
              break;
            }
            children.push(event);
          }
          nodes.push(new CPUNode(evt, children, correctedEndTs));
        }
        return nodes;
      }
      static linkNetworkNodes(rootNode, networkNodeOutput) {
        networkNodeOutput.nodes.forEach((node) => {
          const directInitiatorRequest = node.request.initiatorRequest || rootNode.request;
          const directInitiatorNode = networkNodeOutput.idToNodeMap.get(directInitiatorRequest.requestId) || rootNode;
          const canDependOnInitiator = !directInitiatorNode.isDependentOn(node) && node.canDependOn(directInitiatorNode);
          const initiators = _PageDependencyGraph.getNetworkInitiators(node.request);
          if (initiators.length) {
            initiators.forEach((initiator) => {
              const parentCandidates = networkNodeOutput.urlToNodeMap.get(initiator) || [];
              if (parentCandidates.length === 1 && parentCandidates[0].startTime <= node.startTime && !parentCandidates[0].isDependentOn(node)) {
                node.addDependency(parentCandidates[0]);
              } else if (canDependOnInitiator) {
                directInitiatorNode.addDependent(node);
              }
            });
          } else if (canDependOnInitiator) {
            directInitiatorNode.addDependent(node);
          }
          if (node !== rootNode && node.getDependencies().length === 0 && node.canDependOn(rootNode)) {
            node.addDependency(rootNode);
          }
          if (!node.request.redirects) {
            return;
          }
          const redirects = [...node.request.redirects, node.request];
          for (let i = 1; i < redirects.length; i++) {
            const redirectNode = networkNodeOutput.idToNodeMap.get(redirects[i - 1].requestId);
            const actualNode = networkNodeOutput.idToNodeMap.get(redirects[i].requestId);
            if (actualNode && redirectNode) {
              actualNode.addDependency(redirectNode);
            }
          }
        });
      }
      static linkCPUNodes(rootNode, networkNodeOutput, cpuNodes) {
        const linkableResourceTypes = /* @__PURE__ */ new Set([
          "XHR",
          "Fetch",
          "Script"
        ]);
        function addDependentNetworkRequest(cpuNode, reqId) {
          const networkNode = networkNodeOutput.idToNodeMap.get(reqId);
          if (!networkNode || // Ignore all network nodes that started before this CPU task started
          // A network request that started earlier could not possibly have been started by this task
          networkNode.startTime <= cpuNode.startTime) {
            return;
          }
          const { request } = networkNode;
          const resourceType = request.resourceType || request.redirectDestination?.resourceType;
          if (!linkableResourceTypes.has(resourceType)) {
            return;
          }
          cpuNode.addDependent(networkNode);
        }
        __name(addDependentNetworkRequest, "addDependentNetworkRequest");
        function addDependencyOnFrame(cpuNode, frameId) {
          if (!frameId) {
            return;
          }
          const networkNode = networkNodeOutput.frameIdToNodeMap.get(frameId);
          if (!networkNode) {
            return;
          }
          if (networkNode.startTime >= cpuNode.startTime) {
            return;
          }
          cpuNode.addDependency(networkNode);
        }
        __name(addDependencyOnFrame, "addDependencyOnFrame");
        function addDependencyOnUrl(cpuNode, url) {
          if (!url) {
            return;
          }
          const minimumAllowableTimeSinceNetworkNodeEnd = -100 * 1e3;
          const candidates = networkNodeOutput.urlToNodeMap.get(url) || [];
          let minCandidate = null;
          let minDistance = Infinity;
          for (const candidate of candidates) {
            if (cpuNode.startTime <= candidate.startTime) {
              return;
            }
            const distance = cpuNode.startTime - candidate.endTime;
            if (distance >= minimumAllowableTimeSinceNetworkNodeEnd && distance < minDistance) {
              minCandidate = candidate;
              minDistance = distance;
            }
          }
          if (!minCandidate) {
            return;
          }
          cpuNode.addDependency(minCandidate);
        }
        __name(addDependencyOnUrl, "addDependencyOnUrl");
        const timers = /* @__PURE__ */ new Map();
        for (const node of cpuNodes) {
          for (const evt of node.childEvents) {
            if (!evt.args.data) {
              continue;
            }
            const argsUrl = evt.args.data.url;
            const stackTraceUrls = (evt.args.data.stackTrace || []).map((l) => l.url).filter(Boolean);
            switch (evt.name) {
              case "TimerInstall":
                timers.set(evt.args.data.timerId, node);
                stackTraceUrls.forEach((url) => addDependencyOnUrl(node, url));
                break;
              case "TimerFire": {
                const installer = timers.get(evt.args.data.timerId);
                if (!installer || installer.endTime > node.startTime) {
                  break;
                }
                installer.addDependent(node);
                break;
              }
              case "InvalidateLayout":
              case "ScheduleStyleRecalculation":
                addDependencyOnFrame(node, evt.args.data.frame);
                stackTraceUrls.forEach((url) => addDependencyOnUrl(node, url));
                break;
              case "EvaluateScript":
                addDependencyOnFrame(node, evt.args.data.frame);
                addDependencyOnUrl(node, argsUrl);
                stackTraceUrls.forEach((url) => addDependencyOnUrl(node, url));
                break;
              case "XHRReadyStateChange":
                if (evt.args.data.readyState !== 4) {
                  break;
                }
                addDependencyOnUrl(node, argsUrl);
                stackTraceUrls.forEach((url) => addDependencyOnUrl(node, url));
                break;
              case "FunctionCall":
              case "v8.compile":
                addDependencyOnFrame(node, evt.args.data.frame);
                addDependencyOnUrl(node, argsUrl);
                break;
              case "ParseAuthorStyleSheet":
                addDependencyOnFrame(node, evt.args.data.frame);
                addDependencyOnUrl(node, evt.args.data.styleSheetUrl);
                break;
              case "ResourceSendRequest":
                addDependencyOnFrame(node, evt.args.data.frame);
                addDependentNetworkRequest(node, evt.args.data.requestId);
                stackTraceUrls.forEach((url) => addDependencyOnUrl(node, url));
                break;
            }
          }
          if (node.getNumberOfDependencies() === 0 && node.canDependOn(rootNode)) {
            node.addDependency(rootNode);
          }
        }
        const minimumEvtDur = SIGNIFICANT_DUR_THRESHOLD_MS * 1e3;
        let foundFirstLayout = false;
        let foundFirstPaint = false;
        let foundFirstParse = false;
        for (const node of cpuNodes) {
          let isFirst = false;
          if (!foundFirstLayout && node.childEvents.some((evt) => evt.name === "Layout")) {
            isFirst = foundFirstLayout = true;
          }
          if (!foundFirstPaint && node.childEvents.some((evt) => evt.name === "Paint")) {
            isFirst = foundFirstPaint = true;
          }
          if (!foundFirstParse && node.childEvents.some((evt) => evt.name === "ParseHTML")) {
            isFirst = foundFirstParse = true;
          }
          if (isFirst || node.duration >= minimumEvtDur) {
            continue;
          }
          if (node.getNumberOfDependencies() === 1 || node.getNumberOfDependents() <= 1) {
            _PageDependencyGraph.pruneNode(node);
          }
        }
      }
      /**
       * Removes the given node from the graph, but retains all paths between its dependencies and
       * dependents.
       */
      static pruneNode(node) {
        const dependencies = node.getDependencies();
        const dependents = node.getDependents();
        for (const dependency of dependencies) {
          node.removeDependency(dependency);
          for (const dependent of dependents) {
            dependency.addDependent(dependent);
          }
        }
        for (const dependent of dependents) {
          node.removeDependent(dependent);
        }
      }
      /**
       * TODO: remove when CDT backend in Lighthouse is gone. Until then, this is a useful debugging tool
       * to find delta between using CDP or the trace to create the network requests.
       *
       * When a test fails using the trace backend, I enabled this debug method and copied the network
       * requests when CDP was used, then when trace is used, and diff'd them. This method helped
       * remove non-logical differences from the comparison (order of properties, slight rounding
       * discrepancies, removing object cycles, etc).
       *
       * When using for a unit test, make sure to do `.only` so you are getting what you expect.
       */
      static debugNormalizeRequests(lanternRequests) {
        for (const request of lanternRequests) {
          request.rendererStartTime = Math.round(request.rendererStartTime * 1e3) / 1e3;
          request.networkRequestTime = Math.round(request.networkRequestTime * 1e3) / 1e3;
          request.responseHeadersEndTime = Math.round(request.responseHeadersEndTime * 1e3) / 1e3;
          request.networkEndTime = Math.round(request.networkEndTime * 1e3) / 1e3;
        }
        for (const r of lanternRequests) {
          delete r.rawRequest;
          if (r.initiatorRequest) {
            r.initiatorRequest = { id: r.initiatorRequest.requestId };
          }
          if (r.redirectDestination) {
            r.redirectDestination = { id: r.redirectDestination.requestId };
          }
          if (r.redirectSource) {
            r.redirectSource = { id: r.redirectSource.requestId };
          }
          if (r.redirects) {
            r.redirects = r.redirects.map((r2) => r2.requestId);
          }
        }
        const requests = lanternRequests.map((r) => ({
          requestId: r.requestId,
          connectionId: r.connectionId,
          connectionReused: r.connectionReused,
          url: r.url,
          protocol: r.protocol,
          parsedURL: r.parsedURL,
          documentURL: r.documentURL,
          rendererStartTime: r.rendererStartTime,
          networkRequestTime: r.networkRequestTime,
          responseHeadersEndTime: r.responseHeadersEndTime,
          networkEndTime: r.networkEndTime,
          transferSize: r.transferSize,
          resourceSize: r.resourceSize,
          fromDiskCache: r.fromDiskCache,
          fromMemoryCache: r.fromMemoryCache,
          finished: r.finished,
          statusCode: r.statusCode,
          redirectSource: r.redirectSource,
          redirectDestination: r.redirectDestination,
          redirects: r.redirects,
          failed: r.failed,
          initiator: r.initiator,
          timing: r.timing ? {
            requestTime: r.timing.requestTime,
            proxyStart: r.timing.proxyStart,
            proxyEnd: r.timing.proxyEnd,
            dnsStart: r.timing.dnsStart,
            dnsEnd: r.timing.dnsEnd,
            connectStart: r.timing.connectStart,
            connectEnd: r.timing.connectEnd,
            sslStart: r.timing.sslStart,
            sslEnd: r.timing.sslEnd,
            workerStart: r.timing.workerStart,
            workerReady: r.timing.workerReady,
            workerFetchStart: r.timing.workerFetchStart,
            workerRespondWithSettled: r.timing.workerRespondWithSettled,
            sendStart: r.timing.sendStart,
            sendEnd: r.timing.sendEnd,
            pushStart: r.timing.pushStart,
            pushEnd: r.timing.pushEnd,
            receiveHeadersStart: r.timing.receiveHeadersStart,
            receiveHeadersEnd: r.timing.receiveHeadersEnd
          } : r.timing,
          resourceType: r.resourceType,
          mimeType: r.mimeType,
          priority: r.priority,
          initiatorRequest: r.initiatorRequest,
          frameId: r.frameId,
          fromWorker: r.fromWorker,
          isLinkPreload: r.isLinkPreload,
          serverResponseTime: r.serverResponseTime
        })).filter((r) => !r.fromWorker);
        const debug2 = requests;
        console.log(debug2);
      }
      static createGraph(mainThreadEvents, networkRequests, url) {
        const networkNodeOutput = _PageDependencyGraph.getNetworkNodeOutput(networkRequests);
        const cpuNodes = _PageDependencyGraph.getCPUNodes(mainThreadEvents);
        const { requestedUrl, mainDocumentUrl } = url;
        if (!requestedUrl) {
          throw new LanternError("requestedUrl is required to get the root request");
        }
        if (!mainDocumentUrl) {
          throw new LanternError("mainDocumentUrl is required to get the main resource");
        }
        const rootRequest = NetworkAnalyzer.findResourceForUrl(networkRequests, requestedUrl);
        if (!rootRequest) {
          throw new LanternError("rootRequest not found");
        }
        const rootNode = networkNodeOutput.idToNodeMap.get(rootRequest.requestId);
        if (!rootNode) {
          throw new LanternError("rootNode not found");
        }
        const mainDocumentRequest = NetworkAnalyzer.findLastDocumentForUrl(networkRequests, mainDocumentUrl);
        if (!mainDocumentRequest) {
          throw new LanternError("mainDocumentRequest not found");
        }
        const mainDocumentNode = networkNodeOutput.idToNodeMap.get(mainDocumentRequest.requestId);
        if (!mainDocumentNode) {
          throw new LanternError("mainDocumentNode not found");
        }
        _PageDependencyGraph.linkNetworkNodes(rootNode, networkNodeOutput);
        _PageDependencyGraph.linkCPUNodes(rootNode, networkNodeOutput, cpuNodes);
        mainDocumentNode.setIsMainDocument(true);
        if (NetworkNode.findCycle(rootNode)) {
          throw new LanternError("Invalid dependency graph created, cycle detected");
        }
        return rootNode;
      }
      // Unused, but useful for debugging.
      static printGraph(rootNode, widthInCharacters = 80) {
        function padRight(str, target, padChar = " ") {
          return str + padChar.repeat(Math.max(target - str.length, 0));
        }
        __name(padRight, "padRight");
        const nodes = [];
        rootNode.traverse((node) => nodes.push(node));
        nodes.sort((a, b) => a.startTime - b.startTime);
        const nodeToLabel = /* @__PURE__ */ new Map();
        rootNode.traverse((node) => {
          const ascii = 65 + nodeToLabel.size;
          let label;
          if (ascii > 90) {
            label = `Z${ascii - 90}`;
          } else {
            label = String.fromCharCode(ascii);
          }
          nodeToLabel.set(node, label);
        });
        const min = nodes[0].startTime;
        const max = nodes.reduce((max2, node) => Math.max(max2, node.endTime), 0);
        const totalTime = max - min;
        const timePerCharacter = totalTime / widthInCharacters;
        nodes.forEach((node) => {
          const offset = Math.round((node.startTime - min) / timePerCharacter);
          const length = Math.ceil((node.endTime - node.startTime) / timePerCharacter);
          const bar = padRight("", offset) + padRight("", length, "=");
          const displayName = node.request ? node.request.url : node.type;
          console.log(padRight(bar, widthInCharacters), `| ${displayName.slice(0, 50)}`);
        });
        console.log();
        nodes.forEach((node) => {
          const displayName = node.request ? node.request.url : node.type;
          console.log(nodeToLabel.get(node), displayName.slice(0, widthInCharacters - 5));
          for (const child of node.dependents) {
            const displayName2 = child.request ? child.request.url : child.type;
            console.log("  ->", nodeToLabel.get(child), displayName2.slice(0, widthInCharacters - 10));
          }
          console.log();
        });
        const cyclePath = NetworkNode.findCycle(rootNode);
        console.log("Cycle?", cyclePath ? "yes" : "no");
        if (cyclePath) {
          const path7 = [...cyclePath];
          path7.push(path7[0]);
          console.log(path7.map((node) => nodeToLabel.get(node)).join(" -> "));
        }
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/graph/graph.js
var graph_exports = {};
__export(graph_exports, {
  BaseNode: () => BaseNode,
  CPUNode: () => CPUNode,
  NetworkNode: () => NetworkNode,
  PageDependencyGraph: () => PageDependencyGraph
});
var init_graph = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/graph/graph.js"() {
    init_process_global();
    init_BaseNode();
    init_CPUNode();
    init_NetworkNode();
    init_PageDependencyGraph();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/Metric.js
var Metric;
var init_Metric = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/Metric.js"() {
    init_process_global();
    init_core();
    init_graph();
    Metric = class {
      static {
        __name(this, "Metric");
      }
      static getScriptUrls(dependencyGraph, treatNodeAsRenderBlocking) {
        const scriptUrls = /* @__PURE__ */ new Set();
        dependencyGraph.traverse((node) => {
          if (node.type !== BaseNode.types.NETWORK) {
            return;
          }
          if (node.request.resourceType !== "Script") {
            return;
          }
          if (treatNodeAsRenderBlocking?.(node)) {
            scriptUrls.add(node.request.url);
          }
        });
        return scriptUrls;
      }
      static get coefficients() {
        throw new LanternError("coefficients unimplemented!");
      }
      /**
       * Returns the coefficients, scaled by the throttling settings if needed by the metric.
       * Some lantern metrics (speed-index) use components in their estimate that are not
       * from the simulator. In this case, we need to adjust the coefficients as the target throttling
       * settings change.
       */
      static getScaledCoefficients(_rttMs) {
        return this.coefficients;
      }
      static getOptimisticGraph(_dependencyGraph, _processedNavigation) {
        throw new LanternError("Optimistic graph unimplemented!");
      }
      static getPessimisticGraph(_dependencyGraph, _processedNavigation) {
        throw new LanternError("Pessmistic graph unimplemented!");
      }
      static getEstimateFromSimulation(simulationResult, _extras) {
        return simulationResult;
      }
      static compute(data31, extras) {
        const { simulator, graph: graph2, processedNavigation } = data31;
        const metricName = this.name.replace("Lantern", "");
        const optimisticGraph = this.getOptimisticGraph(graph2, processedNavigation);
        const pessimisticGraph = this.getPessimisticGraph(graph2, processedNavigation);
        let simulateOptions = { label: `optimistic${metricName}` };
        const optimisticSimulation = simulator.simulate(optimisticGraph, simulateOptions);
        simulateOptions = { label: `pessimistic${metricName}` };
        const pessimisticSimulation = simulator.simulate(pessimisticGraph, simulateOptions);
        const optimisticEstimate = this.getEstimateFromSimulation(optimisticSimulation, { ...extras, optimistic: true });
        const pessimisticEstimate = this.getEstimateFromSimulation(pessimisticSimulation, { ...extras, optimistic: false });
        const coefficients = this.getScaledCoefficients(simulator.rtt);
        const interceptMultiplier = coefficients.intercept > 0 ? Math.min(1, optimisticEstimate.timeInMs / 1e3) : 1;
        const timing = coefficients.intercept * interceptMultiplier + coefficients.optimistic * optimisticEstimate.timeInMs + coefficients.pessimistic * pessimisticEstimate.timeInMs;
        return {
          timing,
          optimisticEstimate,
          pessimisticEstimate,
          optimisticGraph,
          pessimisticGraph
        };
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/FirstContentfulPaint.js
var FirstContentfulPaint;
var init_FirstContentfulPaint = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/FirstContentfulPaint.js"() {
    init_process_global();
    init_graph();
    init_Metric();
    FirstContentfulPaint = class extends Metric {
      static {
        __name(this, "FirstContentfulPaint");
      }
      static get coefficients() {
        return {
          intercept: 0,
          optimistic: 0.5,
          pessimistic: 0.5
        };
      }
      /**
       * Computes the set of URLs that *appeared* to be render-blocking based on our filter,
       * *but definitely were not* render-blocking based on the timing of their EvaluateScript task.
       * It also computes the set of corresponding CPU node ids that were needed for the paint at the
       * given timestamp.
       */
      static getRenderBlockingNodeData(graph2, { cutoffTimestamp, treatNodeAsRenderBlocking, additionalCpuNodesToTreatAsRenderBlocking }) {
        const scriptUrlToNodeMap = /* @__PURE__ */ new Map();
        const cpuNodes = [];
        graph2.traverse((node) => {
          if (node.type === BaseNode.types.CPU) {
            if (node.startTime <= cutoffTimestamp) {
              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);
        const possiblyRenderBlockingScriptUrls = Metric.getScriptUrls(graph2, (node) => {
          return node.endTime <= cutoffTimestamp && treatNodeAsRenderBlocking(node);
        });
        const definitelyNotRenderBlockingScriptUrls = /* @__PURE__ */ new Set();
        const renderBlockingCpuNodeIds = /* @__PURE__ */ new Set();
        for (const url of possiblyRenderBlockingScriptUrls) {
          const cpuNodeForUrl = scriptUrlToNodeMap.get(url);
          if (!cpuNodeForUrl) {
            continue;
          }
          if (cpuNodes.includes(cpuNodeForUrl)) {
            renderBlockingCpuNodeIds.add(cpuNodeForUrl.id);
            continue;
          }
          definitelyNotRenderBlockingScriptUrls.add(url);
        }
        const firstLayout = cpuNodes.find((node) => node.didPerformLayout());
        if (firstLayout) {
          renderBlockingCpuNodeIds.add(firstLayout.id);
        }
        const firstPaint = cpuNodes.find((node) => node.childEvents.some((e) => e.name === "Paint"));
        if (firstPaint) {
          renderBlockingCpuNodeIds.add(firstPaint.id);
        }
        const firstParse = cpuNodes.find((node) => node.childEvents.some((e) => e.name === "ParseHTML"));
        if (firstParse) {
          renderBlockingCpuNodeIds.add(firstParse.id);
        }
        if (additionalCpuNodesToTreatAsRenderBlocking) {
          cpuNodes.filter(additionalCpuNodesToTreatAsRenderBlocking).forEach((node) => renderBlockingCpuNodeIds.add(node.id));
        }
        return {
          definitelyNotRenderBlockingScriptUrls,
          renderBlockingCpuNodeIds
        };
      }
      /**
       * Computes the graph required for the first paint of interest.
       */
      static getFirstPaintBasedGraph(dependencyGraph, { cutoffTimestamp, treatNodeAsRenderBlocking, additionalCpuNodesToTreatAsRenderBlocking }) {
        const rbData = this.getRenderBlockingNodeData(dependencyGraph, {
          cutoffTimestamp,
          treatNodeAsRenderBlocking,
          additionalCpuNodesToTreatAsRenderBlocking
        });
        const { definitelyNotRenderBlockingScriptUrls, renderBlockingCpuNodeIds } = rbData;
        return dependencyGraph.cloneWithRelationships((node) => {
          if (node.type === BaseNode.types.NETWORK) {
            const endedAfterPaint = node.endTime > cutoffTimestamp || node.startTime > cutoffTimestamp;
            if (endedAfterPaint && !node.isMainDocument()) {
              return false;
            }
            const url = node.request.url;
            if (definitelyNotRenderBlockingScriptUrls.has(url)) {
              return false;
            }
            return treatNodeAsRenderBlocking(node);
          }
          return renderBlockingCpuNodeIds.has(node.id);
        });
      }
      static getOptimisticGraph(dependencyGraph, processedNavigation) {
        return this.getFirstPaintBasedGraph(dependencyGraph, {
          cutoffTimestamp: processedNavigation.timestamps.firstContentfulPaint,
          // In the optimistic graph we exclude resources that appeared to be render-blocking but were
          // initiated by a script. While they typically have a very high importance and tend to have a
          // significant impact on the page's content, these resources don't technically block rendering.
          treatNodeAsRenderBlocking: /* @__PURE__ */ __name((node) => node.hasRenderBlockingPriority() && node.initiatorType !== "script", "treatNodeAsRenderBlocking")
        });
      }
      static getPessimisticGraph(dependencyGraph, processedNavigation) {
        return this.getFirstPaintBasedGraph(dependencyGraph, {
          cutoffTimestamp: processedNavigation.timestamps.firstContentfulPaint,
          treatNodeAsRenderBlocking: /* @__PURE__ */ __name((node) => node.hasRenderBlockingPriority(), "treatNodeAsRenderBlocking")
        });
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/Interactive.js
var CRITICAL_LONG_TASK_THRESHOLD, Interactive;
var init_Interactive = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/Interactive.js"() {
    init_process_global();
    init_core();
    init_graph();
    init_Metric();
    CRITICAL_LONG_TASK_THRESHOLD = 20;
    Interactive = class _Interactive extends Metric {
      static {
        __name(this, "Interactive");
      }
      static get coefficients() {
        return {
          intercept: 0,
          optimistic: 0.45,
          pessimistic: 0.55
        };
      }
      static getOptimisticGraph(dependencyGraph) {
        const minimumCpuTaskDuration = CRITICAL_LONG_TASK_THRESHOLD * 1e3;
        return dependencyGraph.cloneWithRelationships((node) => {
          if (node.type === BaseNode.types.CPU) {
            return node.duration > minimumCpuTaskDuration;
          }
          const isImage = node.request.resourceType === "Image";
          const isScript = node.request.resourceType === "Script";
          return !isImage && (isScript || node.request.priority === "High" || node.request.priority === "VeryHigh");
        });
      }
      static getPessimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getEstimateFromSimulation(simulationResult, extras) {
        if (!extras.lcpResult) {
          throw new LanternError("missing lcpResult");
        }
        const lastTaskAt = _Interactive.getLastLongTaskEndTime(simulationResult.nodeTimings);
        const minimumTime = extras.optimistic ? extras.lcpResult.optimisticEstimate.timeInMs : extras.lcpResult.pessimisticEstimate.timeInMs;
        return {
          timeInMs: Math.max(minimumTime, lastTaskAt),
          nodeTimings: simulationResult.nodeTimings
        };
      }
      static compute(data31, extras) {
        const lcpResult = extras?.lcpResult;
        if (!lcpResult) {
          throw new LanternError("LCP is required to calculate the Interactive metric");
        }
        const metricResult = super.compute(data31, extras);
        metricResult.timing = Math.max(metricResult.timing, lcpResult.timing);
        return metricResult;
      }
      static getLastLongTaskEndTime(nodeTimings, duration = 50) {
        return Array.from(nodeTimings.entries()).filter(([node, timing]) => {
          if (node.type !== BaseNode.types.CPU) {
            return false;
          }
          return timing.duration > duration;
        }).map(([_, timing]) => timing.endTime).reduce((max, x) => Math.max(max || 0, x || 0), 0);
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/LargestContentfulPaint.js
var LargestContentfulPaint;
var init_LargestContentfulPaint = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/LargestContentfulPaint.js"() {
    init_process_global();
    init_core();
    init_FirstContentfulPaint();
    init_Metric();
    LargestContentfulPaint = class _LargestContentfulPaint extends Metric {
      static {
        __name(this, "LargestContentfulPaint");
      }
      static get coefficients() {
        return {
          intercept: 0,
          optimistic: 0.5,
          pessimistic: 0.5
        };
      }
      /**
       * Low priority image nodes are usually offscreen and very unlikely to be the
       * resource that is required for LCP. Our LCP graphs include everything except for these images.
       */
      static isNotLowPriorityImageNode(node) {
        if (node.type !== "network") {
          return true;
        }
        const isImage = node.request.resourceType === "Image";
        const isLowPriority = node.request.priority === "Low" || node.request.priority === "VeryLow";
        return !isImage || !isLowPriority;
      }
      static getOptimisticGraph(dependencyGraph, processedNavigation) {
        const lcp = processedNavigation.timestamps.largestContentfulPaint;
        if (!lcp) {
          throw new LanternError("NO_LCP");
        }
        return FirstContentfulPaint.getFirstPaintBasedGraph(dependencyGraph, {
          cutoffTimestamp: lcp,
          treatNodeAsRenderBlocking: _LargestContentfulPaint.isNotLowPriorityImageNode
        });
      }
      static getPessimisticGraph(dependencyGraph, processedNavigation) {
        const lcp = processedNavigation.timestamps.largestContentfulPaint;
        if (!lcp) {
          throw new LanternError("NO_LCP");
        }
        return FirstContentfulPaint.getFirstPaintBasedGraph(dependencyGraph, {
          cutoffTimestamp: lcp,
          treatNodeAsRenderBlocking: /* @__PURE__ */ __name((_) => true, "treatNodeAsRenderBlocking"),
          // For pessimistic LCP we'll include *all* layout nodes
          additionalCpuNodesToTreatAsRenderBlocking: /* @__PURE__ */ __name((node) => node.didPerformLayout(), "additionalCpuNodesToTreatAsRenderBlocking")
        });
      }
      static getEstimateFromSimulation(simulationResult) {
        const nodeTimesNotOffscreenImages = Array.from(simulationResult.nodeTimings.entries()).filter((entry) => _LargestContentfulPaint.isNotLowPriorityImageNode(entry[0])).map((entry) => entry[1].endTime);
        return {
          timeInMs: Math.max(...nodeTimesNotOffscreenImages),
          nodeTimings: simulationResult.nodeTimings
        };
      }
      static compute(data31, extras) {
        const fcpResult = extras?.fcpResult;
        if (!fcpResult) {
          throw new LanternError("FCP is required to calculate the LCP metric");
        }
        const metricResult = super.compute(data31, extras);
        metricResult.timing = Math.max(metricResult.timing, fcpResult.timing);
        return metricResult;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/MaxPotentialFID.js
var MaxPotentialFID;
var init_MaxPotentialFID = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/MaxPotentialFID.js"() {
    init_process_global();
    init_core();
    init_graph();
    init_Metric();
    MaxPotentialFID = class _MaxPotentialFID extends Metric {
      static {
        __name(this, "MaxPotentialFID");
      }
      static get coefficients() {
        return {
          intercept: 0,
          optimistic: 0.5,
          pessimistic: 0.5
        };
      }
      static getOptimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getPessimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getEstimateFromSimulation(simulation, extras) {
        if (!extras.fcpResult) {
          throw new LanternError("missing fcpResult");
        }
        const fcpTimeInMs = extras.optimistic ? extras.fcpResult.pessimisticEstimate.timeInMs : extras.fcpResult.optimisticEstimate.timeInMs;
        const timings = _MaxPotentialFID.getTimingsAfterFCP(simulation.nodeTimings, fcpTimeInMs);
        return {
          timeInMs: Math.max(...timings.map((timing) => timing.duration), 16),
          nodeTimings: simulation.nodeTimings
        };
      }
      static compute(data31, extras) {
        const fcpResult = extras?.fcpResult;
        if (!fcpResult) {
          throw new LanternError("FCP is required to calculate the Max Potential FID metric");
        }
        return super.compute(data31, extras);
      }
      static getTimingsAfterFCP(nodeTimings, fcpTimeInMs) {
        return Array.from(nodeTimings.entries()).filter(([node, timing]) => node.type === BaseNode.types.CPU && timing.endTime > fcpTimeInMs).map(([_, timing]) => timing);
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/SpeedIndex.js
var mobileSlow4GRtt, SpeedIndex;
var init_SpeedIndex = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/SpeedIndex.js"() {
    init_process_global();
    init_core();
    init_graph();
    init_Metric();
    mobileSlow4GRtt = 150;
    SpeedIndex = class _SpeedIndex extends Metric {
      static {
        __name(this, "SpeedIndex");
      }
      static get coefficients() {
        return {
          // Note that the optimistic estimate is based on the real observed speed index rather than a
          // real lantern graph (and the final estimate will be Math.max(FCP, Speed Index)).
          intercept: 0,
          optimistic: 1.4,
          pessimistic: 0.4
        };
      }
      static getScaledCoefficients(rttMs) {
        const defaultCoefficients = this.coefficients;
        const defaultRttExcess = mobileSlow4GRtt - 30;
        const multiplier = Math.max((rttMs - 30) / defaultRttExcess, 0);
        return {
          intercept: defaultCoefficients.intercept * multiplier,
          optimistic: 0.5 + (defaultCoefficients.optimistic - 0.5) * multiplier,
          pessimistic: 0.5 + (defaultCoefficients.pessimistic - 0.5) * multiplier
        };
      }
      static getOptimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getPessimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getEstimateFromSimulation(simulationResult, extras) {
        if (!extras.fcpResult) {
          throw new LanternError("missing fcpResult");
        }
        if (extras.observedSpeedIndex === void 0) {
          throw new LanternError("missing observedSpeedIndex");
        }
        const fcpTimeInMs = extras.fcpResult.pessimisticEstimate.timeInMs;
        const estimate = extras.optimistic ? extras.observedSpeedIndex : _SpeedIndex.computeLayoutBasedSpeedIndex(simulationResult.nodeTimings, fcpTimeInMs);
        return {
          timeInMs: estimate,
          nodeTimings: simulationResult.nodeTimings
        };
      }
      static compute(data31, extras) {
        const fcpResult = extras?.fcpResult;
        if (!fcpResult) {
          throw new LanternError("FCP is required to calculate the SpeedIndex metric");
        }
        const metricResult = super.compute(data31, extras);
        metricResult.timing = Math.max(metricResult.timing, fcpResult.timing);
        return metricResult;
      }
      /**
       * Approximate speed index using layout events from the simulated node timings.
       * The layout-based speed index is the weighted average of the endTime of CPU nodes that contained
       * a 'Layout' task. log(duration) is used as the weight to stand for "significance" to the page.
       *
       * If no layout events can be found or the endTime of a CPU task is too early, FCP is used instead.
       *
       * This approach was determined after evaluating the accuracy/complexity tradeoff of many
       * different methods. Read more in the evaluation doc.
       *
       * @see https://docs.google.com/document/d/1qJWXwxoyVLVadezIp_Tgdk867G3tDNkkVRvUJSH3K1E/edit#
       */
      static computeLayoutBasedSpeedIndex(nodeTimings, fcpTimeInMs) {
        const layoutWeights = [];
        for (const [node, timing] of nodeTimings.entries()) {
          if (node.type !== BaseNode.types.CPU) {
            continue;
          }
          if (node.childEvents.some((x) => x.name === "Layout")) {
            const timingWeight = Math.max(Math.log2(timing.endTime - timing.startTime), 0);
            layoutWeights.push({ time: timing.endTime, weight: timingWeight });
          }
        }
        const totalWeightedTime = layoutWeights.map((evt) => evt.weight * Math.max(evt.time, fcpTimeInMs)).reduce((a, b) => a + b, 0);
        const totalWeight = layoutWeights.map((evt) => evt.weight).reduce((a, b) => a + b, 0);
        if (!totalWeight) {
          return fcpTimeInMs;
        }
        return totalWeightedTime / totalWeight;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/TBTUtils.js
var TBTUtils_exports = {};
__export(TBTUtils_exports, {
  BLOCKING_TIME_THRESHOLD: () => BLOCKING_TIME_THRESHOLD,
  calculateSumOfBlockingTime: () => calculateSumOfBlockingTime,
  calculateTbtImpactForEvent: () => calculateTbtImpactForEvent
});
function calculateTbtImpactForEvent(event, startTimeMs, endTimeMs, topLevelEvent) {
  let threshold = BLOCKING_TIME_THRESHOLD;
  if (topLevelEvent) {
    threshold *= event.duration / topLevelEvent.duration;
  }
  if (event.duration < threshold) {
    return 0;
  }
  if (event.end < startTimeMs) {
    return 0;
  }
  if (event.start > endTimeMs) {
    return 0;
  }
  const clippedStart = Math.max(event.start, startTimeMs);
  const clippedEnd = Math.min(event.end, endTimeMs);
  const clippedDuration = clippedEnd - clippedStart;
  if (clippedDuration < threshold) {
    return 0;
  }
  return clippedDuration - threshold;
}
function calculateSumOfBlockingTime(topLevelEvents, startTimeMs, endTimeMs) {
  if (endTimeMs <= startTimeMs) {
    return 0;
  }
  let sumBlockingTime = 0;
  for (const event of topLevelEvents) {
    sumBlockingTime += calculateTbtImpactForEvent(event, startTimeMs, endTimeMs);
  }
  return sumBlockingTime;
}
var BLOCKING_TIME_THRESHOLD;
var init_TBTUtils = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/TBTUtils.js"() {
    init_process_global();
    BLOCKING_TIME_THRESHOLD = 50;
    __name(calculateTbtImpactForEvent, "calculateTbtImpactForEvent");
    __name(calculateSumOfBlockingTime, "calculateSumOfBlockingTime");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/TotalBlockingTime.js
var TotalBlockingTime;
var init_TotalBlockingTime = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/TotalBlockingTime.js"() {
    init_process_global();
    init_core();
    init_graph();
    init_Metric();
    init_TBTUtils();
    TotalBlockingTime = class _TotalBlockingTime extends Metric {
      static {
        __name(this, "TotalBlockingTime");
      }
      static get coefficients() {
        return {
          intercept: 0,
          optimistic: 0.5,
          pessimistic: 0.5
        };
      }
      static getOptimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getPessimisticGraph(dependencyGraph) {
        return dependencyGraph;
      }
      static getEstimateFromSimulation(simulation, extras) {
        if (!extras.fcpResult) {
          throw new LanternError("missing fcpResult");
        }
        if (!extras.interactiveResult) {
          throw new LanternError("missing interactiveResult");
        }
        const fcpTimeInMs = extras.optimistic ? extras.fcpResult.pessimisticEstimate.timeInMs : extras.fcpResult.optimisticEstimate.timeInMs;
        const interactiveTimeMs = extras.optimistic ? extras.interactiveResult.optimisticEstimate.timeInMs : extras.interactiveResult.pessimisticEstimate.timeInMs;
        const minDurationMs = BLOCKING_TIME_THRESHOLD;
        const events = _TotalBlockingTime.getTopLevelEvents(simulation.nodeTimings, minDurationMs);
        return {
          timeInMs: calculateSumOfBlockingTime(events, fcpTimeInMs, interactiveTimeMs),
          nodeTimings: simulation.nodeTimings
        };
      }
      static compute(data31, extras) {
        const fcpResult = extras?.fcpResult;
        if (!fcpResult) {
          throw new LanternError("FCP is required to calculate the TBT metric");
        }
        const interactiveResult = extras?.fcpResult;
        if (!interactiveResult) {
          throw new LanternError("Interactive is required to calculate the TBT metric");
        }
        return super.compute(data31, extras);
      }
      static getTopLevelEvents(nodeTimings, minDurationMs) {
        const events = [];
        for (const [node, timing] of nodeTimings.entries()) {
          if (node.type !== BaseNode.types.CPU) {
            continue;
          }
          if (timing.duration < minDurationMs) {
            continue;
          }
          events.push({
            start: timing.startTime,
            end: timing.endTime,
            duration: timing.duration
          });
        }
        return events;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/metrics.js
var metrics_exports = {};
__export(metrics_exports, {
  FirstContentfulPaint: () => FirstContentfulPaint,
  Interactive: () => Interactive,
  LargestContentfulPaint: () => LargestContentfulPaint,
  MaxPotentialFID: () => MaxPotentialFID,
  Metric: () => Metric,
  SpeedIndex: () => SpeedIndex,
  TBTUtils: () => TBTUtils_exports,
  TotalBlockingTime: () => TotalBlockingTime
});
var init_metrics = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/metrics/metrics.js"() {
    init_process_global();
    init_FirstContentfulPaint();
    init_Interactive();
    init_LargestContentfulPaint();
    init_MaxPotentialFID();
    init_Metric();
    init_SpeedIndex();
    init_TotalBlockingTime();
    init_TBTUtils();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/TCPConnection.js
var INITIAL_CONGESTION_WINDOW, TCP_SEGMENT_SIZE, TCPConnection;
var init_TCPConnection = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/TCPConnection.js"() {
    init_process_global();
    INITIAL_CONGESTION_WINDOW = 10;
    TCP_SEGMENT_SIZE = 1460;
    TCPConnection = class _TCPConnection {
      static {
        __name(this, "TCPConnection");
      }
      warmed;
      ssl;
      h2;
      rtt;
      throughput;
      serverLatency;
      _congestionWindow;
      h2OverflowBytesDownloaded;
      constructor(rtt, throughput, serverLatency = 0, ssl = true, h2 = false) {
        this.warmed = false;
        this.ssl = ssl;
        this.h2 = h2;
        this.rtt = rtt;
        this.throughput = throughput;
        this.serverLatency = serverLatency;
        this._congestionWindow = INITIAL_CONGESTION_WINDOW;
        this.h2OverflowBytesDownloaded = 0;
      }
      static maximumSaturatedConnections(rtt, availableThroughput) {
        const roundTripsPerSecond = 1e3 / rtt;
        const bytesPerRoundTrip = TCP_SEGMENT_SIZE;
        const bytesPerSecond = roundTripsPerSecond * bytesPerRoundTrip;
        const minimumThroughputRequiredPerRequest = bytesPerSecond * 8;
        return Math.floor(availableThroughput / minimumThroughputRequiredPerRequest);
      }
      computeMaximumCongestionWindowInSegments() {
        const bytesPerSecond = this.throughput / 8;
        const secondsPerRoundTrip = this.rtt / 1e3;
        const bytesPerRoundTrip = bytesPerSecond * secondsPerRoundTrip;
        return Math.floor(bytesPerRoundTrip / TCP_SEGMENT_SIZE);
      }
      setThroughput(throughput) {
        this.throughput = throughput;
      }
      setCongestionWindow(congestion) {
        this._congestionWindow = congestion;
      }
      setWarmed(warmed) {
        this.warmed = warmed;
      }
      isH2() {
        return this.h2;
      }
      get congestionWindow() {
        return this._congestionWindow;
      }
      /**
       * Sets the number of excess bytes that are available to this connection on future downloads, only
       * applies to H2 connections.
       */
      setH2OverflowBytesDownloaded(bytes) {
        if (!this.h2) {
          return;
        }
        this.h2OverflowBytesDownloaded = bytes;
      }
      clone() {
        return Object.assign(new _TCPConnection(this.rtt, this.throughput), this);
      }
      /**
       * Simulates a network download of a particular number of bytes over an optional maximum amount of time
       * and returns information about the ending state.
       *
       * See https://hpbn.co/building-blocks-of-tcp/#three-way-handshake and
       *  https://hpbn.co/transport-layer-security-tls/#tls-handshake for details.
       */
      simulateDownloadUntil(bytesToDownload, options) {
        const { timeAlreadyElapsed = 0, maximumTimeToElapse = Infinity, dnsResolutionTime = 0 } = options || {};
        if (this.warmed && this.h2) {
          bytesToDownload -= this.h2OverflowBytesDownloaded;
        }
        const twoWayLatency = this.rtt;
        const oneWayLatency = twoWayLatency / 2;
        const maximumCongestionWindow = this.computeMaximumCongestionWindowInSegments();
        let handshakeAndRequest = oneWayLatency;
        if (!this.warmed) {
          handshakeAndRequest = // DNS lookup
          dnsResolutionTime + // SYN
          oneWayLatency + // SYN ACK
          oneWayLatency + // ACK + initial request
          oneWayLatency + // ClientHello/ServerHello assuming TLS False Start is enabled (https://istlsfastyet.com/#server-performance).
          (this.ssl ? twoWayLatency : 0);
        }
        let roundTrips = Math.ceil(handshakeAndRequest / twoWayLatency);
        let timeToFirstByte = handshakeAndRequest + this.serverLatency + oneWayLatency;
        if (this.warmed && this.h2) {
          timeToFirstByte = 0;
        }
        const timeElapsedForTTFB = Math.max(timeToFirstByte - timeAlreadyElapsed, 0);
        const maximumDownloadTimeToElapse = maximumTimeToElapse - timeElapsedForTTFB;
        let congestionWindow = Math.min(this._congestionWindow, maximumCongestionWindow);
        let totalBytesDownloaded = 0;
        if (timeElapsedForTTFB > 0) {
          totalBytesDownloaded = congestionWindow * TCP_SEGMENT_SIZE;
        } else {
          roundTrips = 0;
        }
        let downloadTimeElapsed = 0;
        let bytesRemaining = bytesToDownload - totalBytesDownloaded;
        while (bytesRemaining > 0 && downloadTimeElapsed <= maximumDownloadTimeToElapse) {
          roundTrips++;
          downloadTimeElapsed += twoWayLatency;
          congestionWindow = Math.max(Math.min(maximumCongestionWindow, congestionWindow * 2), 1);
          const bytesDownloadedInWindow = congestionWindow * TCP_SEGMENT_SIZE;
          totalBytesDownloaded += bytesDownloadedInWindow;
          bytesRemaining -= bytesDownloadedInWindow;
        }
        const timeElapsed = timeElapsedForTTFB + downloadTimeElapsed;
        const extraBytesDownloaded = this.h2 ? Math.max(totalBytesDownloaded - bytesToDownload, 0) : 0;
        const bytesDownloaded = Math.max(Math.min(totalBytesDownloaded, bytesToDownload), 0);
        let connectionTiming;
        if (!this.warmed) {
          connectionTiming = {
            dnsResolutionTime,
            connectionTime: handshakeAndRequest - dnsResolutionTime,
            sslTime: this.ssl ? twoWayLatency : void 0,
            timeToFirstByte
          };
        } else if (this.h2) {
          connectionTiming = {
            timeToFirstByte
          };
        } else {
          connectionTiming = {
            connectionTime: handshakeAndRequest,
            timeToFirstByte
          };
        }
        return {
          roundTrips,
          timeElapsed,
          bytesDownloaded,
          extraBytesDownloaded,
          congestionWindow,
          connectionTiming
        };
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/ConnectionPool.js
var DEFAULT_SERVER_RESPONSE_TIME, TLS_SCHEMES, CONNECTIONS_PER_ORIGIN, ConnectionPool;
var init_ConnectionPool = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/ConnectionPool.js"() {
    init_process_global();
    init_core();
    init_TCPConnection();
    DEFAULT_SERVER_RESPONSE_TIME = 30;
    TLS_SCHEMES = ["https", "wss"];
    CONNECTIONS_PER_ORIGIN = 6;
    ConnectionPool = class {
      static {
        __name(this, "ConnectionPool");
      }
      options;
      records;
      connectionsByOrigin;
      connectionsByRequest;
      _connectionsInUse;
      connectionReusedByRequestId;
      constructor(records, options) {
        this.options = options;
        this.records = records;
        this.connectionsByOrigin = /* @__PURE__ */ new Map();
        this.connectionsByRequest = /* @__PURE__ */ new Map();
        this._connectionsInUse = /* @__PURE__ */ new Set();
        this.connectionReusedByRequestId = NetworkAnalyzer.estimateIfConnectionWasReused(records, {
          forceCoarseEstimates: true
        });
        this.initializeConnections();
      }
      connectionsInUse() {
        return Array.from(this._connectionsInUse);
      }
      initializeConnections() {
        const connectionReused = this.connectionReusedByRequestId;
        const additionalRttByOrigin = this.options.additionalRttByOrigin;
        const serverResponseTimeByOrigin = this.options.serverResponseTimeByOrigin;
        const recordsByOrigin = NetworkAnalyzer.groupByOrigin(this.records);
        for (const [origin, requests] of recordsByOrigin.entries()) {
          const connections = [];
          const additionalRtt = additionalRttByOrigin.get(origin) || 0;
          const responseTime = serverResponseTimeByOrigin.get(origin) || DEFAULT_SERVER_RESPONSE_TIME;
          for (const request of requests) {
            if (connectionReused.get(request.requestId)) {
              continue;
            }
            const isTLS = TLS_SCHEMES.includes(request.parsedURL.scheme);
            const isH2 = request.protocol === "h2";
            const connection = new TCPConnection(this.options.rtt + additionalRtt, this.options.throughput, responseTime, isTLS, isH2);
            connections.push(connection);
          }
          if (!connections.length) {
            throw new LanternError(`Could not find a connection for origin: ${origin}`);
          }
          const minConnections = connections[0].isH2() ? 1 : CONNECTIONS_PER_ORIGIN;
          while (connections.length < minConnections) {
            connections.push(connections[0].clone());
          }
          this.connectionsByOrigin.set(origin, connections);
        }
      }
      findAvailableConnectionWithLargestCongestionWindow(connections) {
        let maxConnection = null;
        for (let i = 0; i < connections.length; i++) {
          const connection = connections[i];
          if (this._connectionsInUse.has(connection)) {
            continue;
          }
          const currentMax = maxConnection?.congestionWindow || -Infinity;
          if (connection.congestionWindow > currentMax) {
            maxConnection = connection;
          }
        }
        return maxConnection;
      }
      /**
       * This method finds an available connection to the origin specified by the network request or null
       * if no connection was available. If returned, connection will not be available for other network
       * records until release is called.
       */
      acquire(request) {
        if (this.connectionsByRequest.has(request)) {
          throw new LanternError("Record already has a connection");
        }
        const origin = request.parsedURL.securityOrigin;
        const connections = this.connectionsByOrigin.get(origin) || [];
        const connectionToUse = this.findAvailableConnectionWithLargestCongestionWindow(connections);
        if (!connectionToUse) {
          return null;
        }
        this._connectionsInUse.add(connectionToUse);
        this.connectionsByRequest.set(request, connectionToUse);
        return connectionToUse;
      }
      /**
       * Return the connection currently being used to fetch a request. If no connection
       * currently being used for this request, an error will be thrown.
       */
      acquireActiveConnectionFromRequest(request) {
        const activeConnection = this.connectionsByRequest.get(request);
        if (!activeConnection) {
          throw new LanternError("Could not find an active connection for request");
        }
        return activeConnection;
      }
      release(request) {
        const connection = this.connectionsByRequest.get(request);
        this.connectionsByRequest.delete(request);
        if (connection) {
          this._connectionsInUse.delete(connection);
        }
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/Constants.js
var DEVTOOLS_RTT_ADJUSTMENT_FACTOR, DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR, throttling, Constants;
var init_Constants = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/Constants.js"() {
    init_process_global();
    DEVTOOLS_RTT_ADJUSTMENT_FACTOR = 3.75;
    DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR = 0.9;
    throttling = {
      DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
      DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
      // These values align with WebPageTest's definition of "Fast 3G"
      // But offer similar characteristics to roughly the 75th percentile of 4G connections.
      mobileSlow4G: {
        rttMs: 150,
        throughputKbps: 1.6 * 1024,
        requestLatencyMs: 150 * DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
        downloadThroughputKbps: 1.6 * 1024 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
        uploadThroughputKbps: 750 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
        cpuSlowdownMultiplier: 4
      },
      // These values partially align with WebPageTest's definition of "Regular 3G".
      // These values are meant to roughly align with Chrome UX report's 3G definition which are based
      // on HTTP RTT of 300-1400ms and downlink throughput of <700kbps.
      mobileRegular3G: {
        rttMs: 300,
        throughputKbps: 700,
        requestLatencyMs: 300 * DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
        downloadThroughputKbps: 700 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
        uploadThroughputKbps: 700 * DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
        cpuSlowdownMultiplier: 4
      },
      // Using a "broadband" connection type
      // Corresponds to "Dense 4G 25th percentile" in https://docs.google.com/document/d/1Ft1Bnq9-t4jK5egLSOc28IL4TvR-Tt0se_1faTA4KTY/edit#heading=h.bb7nfy2x9e5v
      desktopDense4G: {
        rttMs: 40,
        throughputKbps: 10 * 1024,
        cpuSlowdownMultiplier: 1,
        requestLatencyMs: 0,
        // 0 means unset
        downloadThroughputKbps: 0,
        uploadThroughputKbps: 0
      }
    };
    Constants = { throttling };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/DNSCache.js
var DNS_RESOLUTION_RTT_MULTIPLIER, DNSCache;
var init_DNSCache = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/DNSCache.js"() {
    init_process_global();
    DNS_RESOLUTION_RTT_MULTIPLIER = 2;
    DNSCache = class _DNSCache {
      static {
        __name(this, "DNSCache");
      }
      static rttMultiplier = DNS_RESOLUTION_RTT_MULTIPLIER;
      rtt;
      resolvedDomainNames;
      constructor({ rtt }) {
        this.rtt = rtt;
        this.resolvedDomainNames = /* @__PURE__ */ new Map();
      }
      getTimeUntilResolution(request, options) {
        const { requestedAt = 0, shouldUpdateCache = false } = options || {};
        const domain = request.parsedURL.host;
        const cacheEntry = this.resolvedDomainNames.get(domain);
        let timeUntilResolved = this.rtt * _DNSCache.rttMultiplier;
        if (cacheEntry) {
          const timeUntilCachedIsResolved = Math.max(cacheEntry.resolvedAt - requestedAt, 0);
          timeUntilResolved = Math.min(timeUntilCachedIsResolved, timeUntilResolved);
        }
        const resolvedAt = requestedAt + timeUntilResolved;
        if (shouldUpdateCache) {
          this.updateCacheResolvedAtIfNeeded(request, resolvedAt);
        }
        return timeUntilResolved;
      }
      updateCacheResolvedAtIfNeeded(request, resolvedAt) {
        const domain = request.parsedURL.host;
        const cacheEntry = this.resolvedDomainNames.get(domain) || { resolvedAt };
        cacheEntry.resolvedAt = Math.min(cacheEntry.resolvedAt, resolvedAt);
        this.resolvedDomainNames.set(domain, cacheEntry);
      }
      /**
       * Forcefully sets the DNS resolution time for a request.
       * Useful for testing and alternate execution simulations.
       */
      setResolvedAt(domain, resolvedAt) {
        this.resolvedDomainNames.set(domain, { resolvedAt });
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/SimulationTimingMap.js
var SimulatorTimingMap;
var init_SimulationTimingMap = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/SimulationTimingMap.js"() {
    init_process_global();
    init_core();
    init_graph();
    SimulatorTimingMap = class {
      static {
        __name(this, "SimulatorTimingMap");
      }
      nodeTimings;
      constructor() {
        this.nodeTimings = /* @__PURE__ */ new Map();
      }
      getNodes() {
        return Array.from(this.nodeTimings.keys());
      }
      setReadyToStart(node, values) {
        this.nodeTimings.set(node, values);
      }
      setInProgress(node, values) {
        const nodeTiming = {
          ...this.getQueued(node),
          startTime: values.startTime,
          timeElapsed: 0
        };
        this.nodeTimings.set(node, node.type === BaseNode.types.NETWORK ? { ...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0 } : nodeTiming);
      }
      setCompleted(node, values) {
        const nodeTiming = {
          ...this.getInProgress(node),
          endTime: values.endTime,
          connectionTiming: values.connectionTiming
        };
        this.nodeTimings.set(node, nodeTiming);
      }
      setCpu(node, values) {
        const nodeTiming = {
          ...this.getCpuStarted(node),
          timeElapsed: values.timeElapsed
        };
        this.nodeTimings.set(node, nodeTiming);
      }
      setCpuEstimated(node, values) {
        const nodeTiming = {
          ...this.getCpuStarted(node),
          estimatedTimeElapsed: values.estimatedTimeElapsed
        };
        this.nodeTimings.set(node, nodeTiming);
      }
      setNetwork(node, values) {
        const nodeTiming = {
          ...this.getNetworkStarted(node),
          timeElapsed: values.timeElapsed,
          timeElapsedOvershoot: values.timeElapsedOvershoot,
          bytesDownloaded: values.bytesDownloaded
        };
        this.nodeTimings.set(node, nodeTiming);
      }
      setNetworkEstimated(node, values) {
        const nodeTiming = {
          ...this.getNetworkStarted(node),
          estimatedTimeElapsed: values.estimatedTimeElapsed
        };
        this.nodeTimings.set(node, nodeTiming);
      }
      getQueued(node) {
        const timing = this.nodeTimings.get(node);
        if (!timing) {
          throw new LanternError(`Node ${node.id} not yet queued`);
        }
        return timing;
      }
      getCpuStarted(node) {
        const timing = this.nodeTimings.get(node);
        if (!timing) {
          throw new LanternError(`Node ${node.id} not yet queued`);
        }
        if (!("startTime" in timing)) {
          throw new LanternError(`Node ${node.id} not yet started`);
        }
        if ("bytesDownloaded" in timing) {
          throw new LanternError(`Node ${node.id} timing not valid`);
        }
        return timing;
      }
      getNetworkStarted(node) {
        const timing = this.nodeTimings.get(node);
        if (!timing) {
          throw new LanternError(`Node ${node.id} not yet queued`);
        }
        if (!("startTime" in timing)) {
          throw new LanternError(`Node ${node.id} not yet started`);
        }
        if (!("bytesDownloaded" in timing)) {
          throw new LanternError(`Node ${node.id} timing not valid`);
        }
        return timing;
      }
      getInProgress(node) {
        const timing = this.nodeTimings.get(node);
        if (!timing) {
          throw new LanternError(`Node ${node.id} not yet queued`);
        }
        if (!("startTime" in timing)) {
          throw new LanternError(`Node ${node.id} not yet started`);
        }
        if (!("estimatedTimeElapsed" in timing)) {
          throw new LanternError(`Node ${node.id} not yet in progress`);
        }
        return timing;
      }
      getCompleted(node) {
        const timing = this.nodeTimings.get(node);
        if (!timing) {
          throw new LanternError(`Node ${node.id} not yet queued`);
        }
        if (!("startTime" in timing)) {
          throw new LanternError(`Node ${node.id} not yet started`);
        }
        if (!("estimatedTimeElapsed" in timing)) {
          throw new LanternError(`Node ${node.id} not yet in progress`);
        }
        if (!("endTime" in timing)) {
          throw new LanternError(`Node ${node.id} not yet completed`);
        }
        return timing;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/Simulator.js
var defaultThrottling, DEFAULT_MAXIMUM_CONCURRENT_REQUESTS, DEFAULT_LAYOUT_TASK_MULTIPLIER, DEFAULT_MAXIMUM_CPU_TASK_DURATION, NodeState, PriorityStartTimePenalty, ALL_SIMULATION_NODE_TIMINGS, Simulator;
var init_Simulator = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/Simulator.js"() {
    init_process_global();
    init_core();
    init_graph();
    init_ConnectionPool();
    init_Constants();
    init_DNSCache();
    init_SimulationTimingMap();
    init_TCPConnection();
    defaultThrottling = Constants.throttling.mobileSlow4G;
    DEFAULT_MAXIMUM_CONCURRENT_REQUESTS = 10;
    DEFAULT_LAYOUT_TASK_MULTIPLIER = 0.5;
    DEFAULT_MAXIMUM_CPU_TASK_DURATION = 1e4;
    NodeState = {
      NotReadyToStart: 0,
      ReadyToStart: 1,
      InProgress: 2,
      Complete: 3
    };
    PriorityStartTimePenalty = {
      VeryHigh: 0,
      High: 0.25,
      Medium: 0.5,
      Low: 1,
      VeryLow: 2
    };
    ALL_SIMULATION_NODE_TIMINGS = /* @__PURE__ */ new Map();
    Simulator = class _Simulator {
      static {
        __name(this, "Simulator");
      }
      static createSimulator(settings) {
        const { throttlingMethod, throttling: throttling3, precomputedLanternData, networkAnalysis } = settings;
        const options = {
          additionalRttByOrigin: networkAnalysis.additionalRttByOrigin,
          serverResponseTimeByOrigin: networkAnalysis.serverResponseTimeByOrigin,
          observedThroughput: networkAnalysis.throughput
        };
        if (precomputedLanternData) {
          options.additionalRttByOrigin = new Map(Object.entries(precomputedLanternData.additionalRttByOrigin));
          options.serverResponseTimeByOrigin = new Map(Object.entries(precomputedLanternData.serverResponseTimeByOrigin));
        }
        switch (throttlingMethod) {
          case "provided":
            options.rtt = networkAnalysis.rtt;
            options.throughput = networkAnalysis.throughput;
            options.cpuSlowdownMultiplier = 1;
            options.layoutTaskMultiplier = 1;
            break;
          case "devtools":
            if (throttling3) {
              options.rtt = throttling3.requestLatencyMs / Constants.throttling.DEVTOOLS_RTT_ADJUSTMENT_FACTOR;
              options.throughput = throttling3.downloadThroughputKbps * 1024 / Constants.throttling.DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR;
            }
            options.cpuSlowdownMultiplier = 1;
            options.layoutTaskMultiplier = 1;
            break;
          case "simulate":
            if (throttling3) {
              options.rtt = throttling3.rttMs;
              options.throughput = throttling3.throughputKbps * 1024;
              options.cpuSlowdownMultiplier = throttling3.cpuSlowdownMultiplier;
            }
            break;
          default:
            break;
        }
        return new _Simulator(options);
      }
      options;
      _rtt;
      throughput;
      maximumConcurrentRequests;
      cpuSlowdownMultiplier;
      layoutTaskMultiplier;
      cachedNodeListByStartPosition;
      nodeTimings;
      numberInProgressByType;
      nodes;
      dns;
      connectionPool;
      constructor(options) {
        this.options = Object.assign({
          rtt: defaultThrottling.rttMs,
          throughput: defaultThrottling.throughputKbps * 1024,
          maximumConcurrentRequests: DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
          cpuSlowdownMultiplier: defaultThrottling.cpuSlowdownMultiplier,
          layoutTaskMultiplier: DEFAULT_LAYOUT_TASK_MULTIPLIER,
          additionalRttByOrigin: /* @__PURE__ */ new Map(),
          serverResponseTimeByOrigin: /* @__PURE__ */ new Map()
        }, options);
        this._rtt = this.options.rtt;
        this.throughput = this.options.throughput;
        this.maximumConcurrentRequests = Math.max(Math.min(TCPConnection.maximumSaturatedConnections(this._rtt, this.throughput), this.options.maximumConcurrentRequests), 1);
        this.cpuSlowdownMultiplier = this.options.cpuSlowdownMultiplier;
        this.layoutTaskMultiplier = this.cpuSlowdownMultiplier * this.options.layoutTaskMultiplier;
        this.cachedNodeListByStartPosition = [];
        this.nodeTimings = new SimulatorTimingMap();
        this.numberInProgressByType = /* @__PURE__ */ new Map();
        this.nodes = {};
        this.dns = new DNSCache({ rtt: this._rtt });
        this.connectionPool = null;
        if (!Number.isFinite(this._rtt)) {
          throw new LanternError(`Invalid rtt ${this._rtt}`);
        }
        if (!Number.isFinite(this.throughput)) {
          throw new LanternError(`Invalid throughput ${this.throughput}`);
        }
      }
      get rtt() {
        return this._rtt;
      }
      initializeConnectionPool(graph2) {
        const records = [];
        graph2.getRootNode().traverse((node) => {
          if (node.type === BaseNode.types.NETWORK) {
            records.push(node.request);
          }
        });
        this.connectionPool = new ConnectionPool(records, this.options);
      }
      /**
       * Initializes the various state data structures such _nodeTimings and the _node Sets by state.
       */
      initializeAuxiliaryData() {
        this.nodeTimings = new SimulatorTimingMap();
        this.numberInProgressByType = /* @__PURE__ */ new Map();
        this.nodes = {};
        this.cachedNodeListByStartPosition = [];
        for (const state of Object.values(NodeState)) {
          this.nodes[state] = /* @__PURE__ */ new Set();
        }
      }
      numberInProgress(type) {
        return this.numberInProgressByType.get(type) || 0;
      }
      markNodeAsReadyToStart(node, queuedTime) {
        const nodeStartPosition = _Simulator.computeNodeStartPosition(node);
        const firstNodeIndexWithGreaterStartPosition = this.cachedNodeListByStartPosition.findIndex((candidate) => _Simulator.computeNodeStartPosition(candidate) > nodeStartPosition);
        const insertionIndex = firstNodeIndexWithGreaterStartPosition === -1 ? this.cachedNodeListByStartPosition.length : firstNodeIndexWithGreaterStartPosition;
        this.cachedNodeListByStartPosition.splice(insertionIndex, 0, node);
        this.nodes[NodeState.ReadyToStart].add(node);
        this.nodes[NodeState.NotReadyToStart].delete(node);
        this.nodeTimings.setReadyToStart(node, { queuedTime });
      }
      markNodeAsInProgress(node, startTime) {
        const indexOfNodeToStart = this.cachedNodeListByStartPosition.indexOf(node);
        this.cachedNodeListByStartPosition.splice(indexOfNodeToStart, 1);
        this.nodes[NodeState.InProgress].add(node);
        this.nodes[NodeState.ReadyToStart].delete(node);
        this.numberInProgressByType.set(node.type, this.numberInProgress(node.type) + 1);
        this.nodeTimings.setInProgress(node, { startTime });
      }
      markNodeAsComplete(node, endTime, connectionTiming) {
        this.nodes[NodeState.Complete].add(node);
        this.nodes[NodeState.InProgress].delete(node);
        this.numberInProgressByType.set(node.type, this.numberInProgress(node.type) - 1);
        this.nodeTimings.setCompleted(node, { endTime, connectionTiming });
        for (const dependent of node.getDependents()) {
          const dependencies = dependent.getDependencies();
          if (dependencies.some((dep) => !this.nodes[NodeState.Complete].has(dep))) {
            continue;
          }
          this.markNodeAsReadyToStart(dependent, endTime);
        }
      }
      acquireConnection(request) {
        return this.connectionPool.acquire(request);
      }
      getNodesSortedByStartPosition() {
        return Array.from(this.cachedNodeListByStartPosition);
      }
      startNodeIfPossible(node, totalElapsedTime) {
        if (node.type === BaseNode.types.CPU) {
          if (this.numberInProgress(node.type) === 0) {
            this.markNodeAsInProgress(node, totalElapsedTime);
          }
          return;
        }
        if (node.type !== BaseNode.types.NETWORK) {
          throw new LanternError("Unsupported");
        }
        if (!node.isConnectionless) {
          const numberOfActiveRequests = this.numberInProgress(node.type);
          if (numberOfActiveRequests >= this.maximumConcurrentRequests) {
            return;
          }
          const connection = this.acquireConnection(node.request);
          if (!connection) {
            return;
          }
        }
        this.markNodeAsInProgress(node, totalElapsedTime);
      }
      /**
       * Updates each connection in use with the available throughput based on the number of network requests
       * currently in flight.
       */
      updateNetworkCapacity() {
        const inFlight = this.numberInProgress(BaseNode.types.NETWORK);
        if (inFlight === 0) {
          return;
        }
        for (const connection of this.connectionPool.connectionsInUse()) {
          connection.setThroughput(this.throughput / inFlight);
        }
      }
      /**
       * Estimates the number of milliseconds remaining given current conditions before the node is complete.
       */
      estimateTimeRemaining(node) {
        if (node.type === BaseNode.types.CPU) {
          return this.estimateCPUTimeRemaining(node);
        }
        if (node.type === BaseNode.types.NETWORK) {
          return this.estimateNetworkTimeRemaining(node);
        }
        throw new LanternError("Unsupported");
      }
      estimateCPUTimeRemaining(cpuNode) {
        const timingData = this.nodeTimings.getCpuStarted(cpuNode);
        const multiplier = cpuNode.didPerformLayout() ? this.layoutTaskMultiplier : this.cpuSlowdownMultiplier;
        const totalDuration = Math.min(Math.round(cpuNode.duration / 1e3 * multiplier), DEFAULT_MAXIMUM_CPU_TASK_DURATION);
        const estimatedTimeElapsed = totalDuration - timingData.timeElapsed;
        this.nodeTimings.setCpuEstimated(cpuNode, { estimatedTimeElapsed });
        return estimatedTimeElapsed;
      }
      estimateNetworkTimeRemaining(networkNode) {
        const request = networkNode.request;
        const timingData = this.nodeTimings.getNetworkStarted(networkNode);
        let timeElapsed = 0;
        if (networkNode.fromDiskCache) {
          const sizeInMb = (request.resourceSize || 0) / 1024 / 1024;
          timeElapsed = 8 + 20 * sizeInMb - timingData.timeElapsed;
        } else if (networkNode.isNonNetworkProtocol) {
          const sizeInMb = (request.resourceSize || 0) / 1024 / 1024;
          timeElapsed = 2 + 10 * sizeInMb - timingData.timeElapsed;
        } else {
          const connection = this.connectionPool.acquireActiveConnectionFromRequest(request);
          const dnsResolutionTime = this.dns.getTimeUntilResolution(request, {
            requestedAt: timingData.startTime,
            shouldUpdateCache: true
          });
          const timeAlreadyElapsed = timingData.timeElapsed;
          const calculation = connection.simulateDownloadUntil(request.transferSize - timingData.bytesDownloaded, { timeAlreadyElapsed, dnsResolutionTime, maximumTimeToElapse: Infinity });
          timeElapsed = calculation.timeElapsed;
        }
        const estimatedTimeElapsed = timeElapsed + timingData.timeElapsedOvershoot;
        this.nodeTimings.setNetworkEstimated(networkNode, { estimatedTimeElapsed });
        return estimatedTimeElapsed;
      }
      /**
       * Computes and returns the minimum estimated completion time of the nodes currently in progress.
       */
      findNextNodeCompletionTime() {
        let minimumTime = Infinity;
        for (const node of this.nodes[NodeState.InProgress]) {
          minimumTime = Math.min(minimumTime, this.estimateTimeRemaining(node));
        }
        return minimumTime;
      }
      /**
       * Given a time period, computes the progress toward completion that the node made during that time.
       */
      updateProgressMadeInTimePeriod(node, timePeriodLength, totalElapsedTime) {
        const timingData = this.nodeTimings.getInProgress(node);
        const isFinished = timingData.estimatedTimeElapsed === timePeriodLength;
        if (node.type === BaseNode.types.CPU || node.isConnectionless) {
          if (isFinished) {
            this.markNodeAsComplete(node, totalElapsedTime);
          } else {
            timingData.timeElapsed += timePeriodLength;
          }
          return;
        }
        if (node.type !== BaseNode.types.NETWORK) {
          throw new LanternError("Unsupported");
        }
        if (!("bytesDownloaded" in timingData)) {
          throw new LanternError("Invalid timing data");
        }
        const request = node.request;
        const connection = this.connectionPool.acquireActiveConnectionFromRequest(request);
        const dnsResolutionTime = this.dns.getTimeUntilResolution(request, {
          requestedAt: timingData.startTime,
          shouldUpdateCache: true
        });
        const calculation = connection.simulateDownloadUntil(request.transferSize - timingData.bytesDownloaded, {
          dnsResolutionTime,
          timeAlreadyElapsed: timingData.timeElapsed,
          maximumTimeToElapse: timePeriodLength - timingData.timeElapsedOvershoot
        });
        connection.setCongestionWindow(calculation.congestionWindow);
        connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);
        if (isFinished) {
          connection.setWarmed(true);
          this.connectionPool.release(request);
          this.markNodeAsComplete(node, totalElapsedTime, calculation.connectionTiming);
        } else {
          timingData.timeElapsed += calculation.timeElapsed;
          timingData.timeElapsedOvershoot += calculation.timeElapsed - timePeriodLength;
          timingData.bytesDownloaded += calculation.bytesDownloaded;
        }
      }
      computeFinalNodeTimings() {
        const completeNodeTimingEntries = this.nodeTimings.getNodes().map((node) => {
          return [node, this.nodeTimings.getCompleted(node)];
        });
        completeNodeTimingEntries.sort((a, b) => a[1].startTime - b[1].startTime);
        const nodeTimingEntries = completeNodeTimingEntries.map(([node, timing]) => {
          return [
            node,
            {
              startTime: timing.startTime,
              endTime: timing.endTime,
              duration: timing.endTime - timing.startTime
            }
          ];
        });
        return {
          nodeTimings: new Map(nodeTimingEntries),
          completeNodeTimings: new Map(completeNodeTimingEntries)
        };
      }
      getOptions() {
        return this.options;
      }
      /**
       * Estimates the time taken to process all of the graph's nodes, returns the overall time along with
       * each node annotated by start/end times.
       *
       * Simulator/connection pool are allowed to deviate from what was
       * observed in the trace/devtoolsLog and start requests as soon as they are queued (i.e. do not
       * wait around for a warm connection to be available if the original request was fetched on a warm
       * connection).
       */
      simulate(graph2, options) {
        if (BaseNode.findCycle(graph2)) {
          throw new LanternError("Cannot simulate graph with cycle");
        }
        options = Object.assign({
          label: void 0
        }, options);
        this.dns = new DNSCache({ rtt: this._rtt });
        this.initializeConnectionPool(graph2);
        this.initializeAuxiliaryData();
        const nodesNotReadyToStart = this.nodes[NodeState.NotReadyToStart];
        const nodesReadyToStart = this.nodes[NodeState.ReadyToStart];
        const nodesInProgress = this.nodes[NodeState.InProgress];
        const rootNode = graph2.getRootNode();
        rootNode.traverse((node) => nodesNotReadyToStart.add(node));
        let totalElapsedTime = 0;
        let iteration = 0;
        this.markNodeAsReadyToStart(rootNode, totalElapsedTime);
        while (nodesReadyToStart.size || nodesInProgress.size) {
          for (const node of this.getNodesSortedByStartPosition()) {
            this.startNodeIfPossible(node, totalElapsedTime);
          }
          if (!nodesInProgress.size) {
            throw new LanternError("Failed to start a node");
          }
          this.updateNetworkCapacity();
          const minimumTime = this.findNextNodeCompletionTime();
          totalElapsedTime += minimumTime;
          if (!Number.isFinite(minimumTime) || iteration > 1e5) {
            throw new LanternError("Simulation failed, depth exceeded");
          }
          iteration++;
          for (const node of nodesInProgress) {
            this.updateProgressMadeInTimePeriod(node, minimumTime, totalElapsedTime);
          }
        }
        const { nodeTimings, completeNodeTimings } = this.computeFinalNodeTimings();
        ALL_SIMULATION_NODE_TIMINGS.set(options.label || "unlabeled", completeNodeTimings);
        return {
          timeInMs: totalElapsedTime,
          nodeTimings
        };
      }
      computeWastedMsFromWastedBytes(wastedBytes) {
        const { throughput, observedThroughput } = this.options;
        const bitsPerSecond = throughput === 0 ? observedThroughput : throughput;
        if (bitsPerSecond === 0) {
          return 0;
        }
        const wastedBits = wastedBytes * 8;
        const wastedMs = wastedBits / bitsPerSecond * 1e3;
        return Math.round(wastedMs / 10) * 10;
      }
      // Used by Lighthouse asset-saver
      static get allNodeTimings() {
        return ALL_SIMULATION_NODE_TIMINGS;
      }
      /**
       * We attempt to start nodes by their observed start time using the request priority as a tie breaker.
       * When simulating, just because a low priority image started 5ms before a high priority image doesn't mean
       * it would have happened like that when the network was slower.
       */
      static computeNodeStartPosition(node) {
        if (node.type === "cpu") {
          return node.startTime;
        }
        return node.startTime + (PriorityStartTimePenalty[node.request.priority] * 1e3 * 1e3 || 0);
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/simulation.js
var simulation_exports = {};
__export(simulation_exports, {
  ConnectionPool: () => ConnectionPool,
  Constants: () => Constants,
  DNSCache: () => DNSCache,
  Simulator: () => Simulator,
  SimulatorTimingMap: () => SimulatorTimingMap,
  TCPConnection: () => TCPConnection
});
var init_simulation = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/simulation/simulation.js"() {
    init_process_global();
    init_ConnectionPool();
    init_Constants();
    init_DNSCache();
    init_SimulationTimingMap();
    init_Simulator();
    init_TCPConnection();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/types/Lantern.js
var NetworkRequestTypes;
var init_Lantern = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/types/Lantern.js"() {
    init_process_global();
    NetworkRequestTypes = {
      XHR: "XHR",
      Fetch: "Fetch",
      EventSource: "EventSource",
      Script: "Script",
      Stylesheet: "Stylesheet",
      Image: "Image",
      Media: "Media",
      Font: "Font",
      Document: "Document",
      TextTrack: "TextTrack",
      WebSocket: "WebSocket",
      Other: "Other",
      Manifest: "Manifest",
      SignedExchange: "SignedExchange",
      Ping: "Ping",
      Preflight: "Preflight",
      CSPViolationReport: "CSPViolationReport",
      Prefetch: "Prefetch",
      FedCM: "FedCM"
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/types/types.js
var types_exports = {};
__export(types_exports, {
  NetworkRequestTypes: () => NetworkRequestTypes
});
var init_types = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/types/types.js"() {
    init_process_global();
    init_Lantern();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/lantern/lantern.js
var init_lantern = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/lantern/lantern.js"() {
    init_process_global();
    init_core();
    init_graph();
    init_metrics();
    init_simulation();
    init_types();
  }
});

// node_modules/@paulirish/trace_engine/node_modules/third-party-web/lib/create-entity-finder-api.js
var require_create_entity_finder_api = __commonJS({
  "node_modules/@paulirish/trace_engine/node_modules/third-party-web/lib/create-entity-finder-api.js"(exports2, module2) {
    init_process_global();
    var DOMAIN_IN_URL_REGEX = /:\/\/(\S*?)(:\d+)?(\/|$)/;
    var DOMAIN_CHARACTERS = /([a-z0-9.-]+\.[a-z0-9]+|localhost)/i;
    var IP_REGEX = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
    var ROOT_DOMAIN_REGEX = /[^.]+\.([^.]+|(gov|com|co|ne)\.\w{2})$/i;
    function getDomainFromOriginOrURL(originOrURL) {
      if (typeof originOrURL !== "string") return null;
      if (originOrURL.length > 1e4 || originOrURL.startsWith("data:")) return null;
      if (DOMAIN_IN_URL_REGEX.test(originOrURL)) return originOrURL.match(DOMAIN_IN_URL_REGEX)[1];
      if (DOMAIN_CHARACTERS.test(originOrURL)) return originOrURL.match(DOMAIN_CHARACTERS)[0];
      return null;
    }
    __name(getDomainFromOriginOrURL, "getDomainFromOriginOrURL");
    function getRootDomain(originOrURL) {
      const domain = getDomainFromOriginOrURL(originOrURL);
      if (!domain) return null;
      if (IP_REGEX.test(domain)) return domain;
      const match = domain.match(ROOT_DOMAIN_REGEX);
      return match && match[0] || domain;
    }
    __name(getRootDomain, "getRootDomain");
    function sliceSubdomainFromDomain(domain, rootDomain) {
      if (domain.length <= rootDomain.length) return domain;
      return domain.split(".").slice(1).join(".");
    }
    __name(sliceSubdomainFromDomain, "sliceSubdomainFromDomain");
    function getEntityInDataset(entityByDomain, entityBySubDomain, entityByRootDomain, originOrURL) {
      const domain = getDomainFromOriginOrURL(originOrURL);
      const rootDomain = getRootDomain(domain);
      if (!domain || !rootDomain) return void 0;
      if (entityByDomain.has(domain)) return entityByDomain.get(domain);
      for (let subdomain = domain; subdomain.length > rootDomain.length; subdomain = sliceSubdomainFromDomain(subdomain, rootDomain)) {
        if (entityBySubDomain.has(subdomain)) return entityBySubDomain.get(subdomain);
      }
      if (entityByRootDomain.has(rootDomain)) return entityByRootDomain.get(rootDomain);
      return void 0;
    }
    __name(getEntityInDataset, "getEntityInDataset");
    function getProductInDataset(entityByDomain, entityBySubDomain, entityByRootDomain, originOrURL) {
      const entity = getEntityInDataset(
        entityByDomain,
        entityBySubDomain,
        entityByRootDomain,
        originOrURL
      );
      const products = entity && entity.products;
      if (!products) return void 0;
      if (typeof originOrURL !== "string") return void 0;
      for (const product of products) {
        for (const pattern of product.urlPatterns) {
          if (pattern instanceof RegExp && pattern.test(originOrURL)) return product;
          if (typeof pattern === "string" && originOrURL.includes(pattern)) return product;
        }
      }
      return void 0;
    }
    __name(getProductInDataset, "getProductInDataset");
    function cloneEntities(entities) {
      return entities.map((entity_) => {
        const entity = {
          company: entity_.name,
          categories: [entity_.category],
          ...entity_
        };
        const products = (entity_.products || []).map((product) => ({
          company: entity.company,
          category: entity.category,
          categories: [entity.category],
          facades: [],
          ...product,
          urlPatterns: (product.urlPatterns || []).map(
            (s) => s.startsWith("REGEXP:") ? new RegExp(s.slice("REGEXP:".length)) : s
          )
        }));
        entity.products = products;
        return entity;
      });
    }
    __name(cloneEntities, "cloneEntities");
    function createAPIFromDataset(entities_) {
      const entities = cloneEntities(entities_);
      const entityByDomain = /* @__PURE__ */ new Map();
      const entityByRootDomain = /* @__PURE__ */ new Map();
      const entityBySubDomain = /* @__PURE__ */ new Map();
      for (const entity of entities) {
        entity.totalExecutionTime = Number(entity.totalExecutionTime) || 0;
        entity.totalOccurrences = Number(entity.totalOccurrences) || 0;
        entity.averageExecutionTime = entity.totalExecutionTime / entity.totalOccurrences;
        for (const domain of entity.domains) {
          if (entityByDomain.has(domain)) {
            const duplicate = entityByDomain.get(domain);
            throw new Error(`Duplicate domain ${domain} (${entity.name} and ${duplicate.name})`);
          }
          entityByDomain.set(domain, entity);
          const rootDomain = getRootDomain(domain);
          if (domain.startsWith("*.")) {
            const wildcardDomain = domain.slice(2);
            if (wildcardDomain === rootDomain) entityByRootDomain.set(rootDomain, entity);
            else entityBySubDomain.set(wildcardDomain, entity);
          }
        }
      }
      for (const [rootDomain, entity] of entityByRootDomain.entries()) {
        if (!entity) entityByRootDomain.delete(rootDomain);
      }
      const getEntity = getEntityInDataset.bind(
        null,
        entityByDomain,
        entityBySubDomain,
        entityByRootDomain
      );
      const getProduct = getProductInDataset.bind(
        null,
        entityByDomain,
        entityBySubDomain,
        entityByRootDomain
      );
      return { getEntity, getProduct, getRootDomain, entities };
    }
    __name(createAPIFromDataset, "createAPIFromDataset");
    module2.exports = { createAPIFromDataset };
  }
});

// node_modules/@paulirish/trace_engine/node_modules/third-party-web/dist/entities.json
var require_entities = __commonJS({
  "node_modules/@paulirish/trace_engine/node_modules/third-party-web/dist/entities.json"(exports2, module2) {
    module2.exports = [{ name: "Google/Doubleclick Ads", company: "Google", homepage: "https://marketingplatform.google.com/about/enterprise/", category: "ad", domains: ["adservice.google.com", "adservice.google.com.au", "adservice.google.com.sg", "adservice.google.com.br", "adservice.google.com.ua", "adservice.google.co.uk", "adservice.google.co.jp", "adservice.google.co.in", "adservice.google.co.kr", "adservice.google.co.id", "adservice.google.co.nz", "adservice.google.ie", "adservice.google.se", "adservice.google.de", "adservice.google.ca", "adservice.google.be", "adservice.google.es", "adservice.google.ch", "adservice.google.fr", "adservice.google.nl", "*.googleadservices.com", "*.googlesyndication.com", "*.googletagservices.com", "*.2mdn.net", "*.doubleclick.net"], examples: ["pagead2.googlesyndication.com", "tpc.googlesyndication.com", "ade.googlesyndication.com", "googleads.g.doubleclick.net", "googleads4.g.doubleclick.net", "securepubads.g.doubleclick.net", "pubads.g.doubleclic\
k.net", "static.doubleclick.net", "cm.g.doubleclick.net", "bid.g.doubleclick.net", "s0.2mdn.net", "stats.g.doubleclick.net", "survey.g.doubleclick.net", "fls.doubleclick.net", "ad.doubleclick.net", "www.googleadservices.com", "https://www.googletagservices.com/tag/js/gpt.js"], totalExecutionTime: 3224311743, totalOccurrences: 1232210 }, { name: "Facebook", homepage: "https://www.facebook.com", category: "social", domains: ["*.facebook.com", "*.atlassbx.com", "*.fbsbx.com", "fbcdn-photos-e-a.akamaihd.net", "*.facebook.net", "*.fbcdn.net"], examples: ["www.facebook.com", "connect.facebook.net", "staticxx.facebook.com", "static.xx.fbcdn.net", "m.facebook.com", "an.facebook.com", "platform-lookaside.fbsbx.com"], products: [{ name: "Facebook Messenger Customer Chat", urlPatterns: ["REGEXP:connect\\.facebook\\.net\\/.*\\/sdk\\/xfbml\\.customerchat\\.js"], facades: [{ name: "React Live Chat Loader", repo: "https://github.com/calibreapp/react-live-chat-loader" }] }], totalExecutionTime: 1097107210,
    totalOccurrences: 3157799 }, { name: "Instagram", homepage: "https://www.instagram.com", category: "social", domains: ["*.cdninstagram.com", "*.instagram.com"], examples: ["scontent.cdninstagram.com"], totalExecutionTime: 31988464, totalOccurrences: 20376 }, { name: "Google CDN", company: "Google", homepage: "https://developers.google.com/speed/libraries/", category: "cdn", domains: ["ajax.googleapis.com", "commondatastorage.googleapis.com", "www.gstatic.com", "ssl.gstatic.com"], totalExecutionTime: 4805631169, totalOccurrences: 3192326 }, { name: "Google Maps", company: "Google", homepage: "https://www.google.com/maps", category: "utility", domains: ["maps.google.com", "maps-api-ssl.google.com", "maps.googleapis.com", "mts.googleapis.com", "mt.googleapis.com", "mt0.googleapis.com", "mt1.googleapis.com", "mt2.googleapis.com", "mt3.googleapis.com", "khm0.googleapis.com", "khm1.googleapis.com", "khms.googleapis.com", "khms1.googleapis.com", "khms2.googleapis.com", "maps.gstatic.com"],
    totalExecutionTime: 904392768, totalOccurrences: 1195850 }, { name: "Other Google APIs/SDKs", company: "Google", homepage: "https://developers.google.com/apis-explorer/#p/", category: "utility", domains: ["accounts.google.com", "apis.google.com", "calendar.google.com", "clients2.google.com", "cse.google.com", "news.google.com", "pay.google.com", "payments.google.com", "play.google.com", "smartlock.google.com", "www.google.com", "www.google.de", "www.google.co.jp", "www.google.com.au", "www.google.co.uk", "www.google.ie", "www.google.com.sg", "www.google.co.in", "www.google.com.br", "www.google.ca", "www.google.co.kr", "www.google.co.nz", "www.google.co.id", "www.google.fr", "www.google.be", "www.google.com.ua", "www.google.nl", "www.google.ru", "www.google.se", "www.googleapis.com", "imasdk.googleapis.com", "storage.googleapis.com", "translate.googleapis.com", "translate.google.com", "translate-pa.googleapis.com", "lh3.googleusercontent.com", "jnn-pa.googleapis.com", "csi.gstatic.c\
om"], totalExecutionTime: 1158368443, totalOccurrences: 2638940 }, { name: "Firebase", homepage: "https://developers.google.com/apis-explorer/#p/", category: "utility", domains: ["firebasestorage.googleapis.com", "firestore.googleapis.com", "firebaseinstallations.googleapis.com", "firebase.googleapis.com", "firebaseremoteconfig.googleapis.com"], totalExecutionTime: 201194, totalOccurrences: 493 }, { name: "Google Analytics", company: "Google", homepage: "https://marketingplatform.google.com/about/analytics/", category: "analytics", domains: ["*.google-analytics.com", "*.urchin.com", "analytics.google.com"], examples: ["www.google-analytics.com", "ssl.google-analytics.com", "analytics.google.com/g/collect"], totalExecutionTime: 495649535, totalOccurrences: 4231882 }, { name: "Google Optimize", company: "Google", homepage: "https://marketingplatform.google.com/about/optimize/", category: "analytics", domains: ["www.googleoptimize.com"], examples: ["https://www.googleoptimize.com/optimize\
.js?id="], totalExecutionTime: 9330261, totalOccurrences: 38797 }, { name: "Google AMP", company: "Google", homepage: "https://github.com/google/amp-client-id-library", category: "analytics", domains: ["ampcid.google.com"] }, { name: "Google Tag Manager", company: "Google", homepage: "https://marketingplatform.google.com/about/tag-manager/", category: "tag-manager", domains: ["*.googletagmanager.com"], examples: ["www.googletagmanager.com"], totalExecutionTime: 6770912735, totalOccurrences: 8124119 }, { name: "Google Fonts", company: "Google", homepage: "https://fonts.google.com/", category: "cdn", domains: ["fonts.googleapis.com", "fonts.gstatic.com"], totalExecutionTime: 53081, totalOccurrences: 220864 }, { name: "Adobe TypeKit", company: "Adobe", homepage: "https://fonts.adobe.com/", category: "cdn", domains: ["*.typekit.com", "*.typekit.net"], examples: ["use.typekit.net", "p.typekit.net"], totalExecutionTime: 78981507, totalOccurrences: 119621 }, { name: "YouTube", homepage: "http\
s://youtube.com", category: "video", domains: ["*.youtube.com", "*.ggpht.com", "*.youtube-nocookie.com", "*.ytimg.com"], examples: ["www.youtube.com", "s.ytimg.com", "yt3.ggpht.com", "img.youtube.com", "fcmatch.youtube.com"], products: [{ name: "YouTube Embedded Player", urlPatterns: ["youtube.com/embed/"], facades: [{ name: "Lite YouTube", repo: "https://github.com/paulirish/lite-youtube-embed" }, { name: "Ngx Lite Video", repo: "https://github.com/karim-mamdouh/ngx-lite-video" }] }], totalExecutionTime: 6277579675, totalOccurrences: 977311 }, { name: "Twitter", homepage: "https://twitter.com", category: "social", domains: ["*.vine.co", "*.twimg.com", "*.twitpic.com", "platform.twitter.com", "syndication.twitter.com"], examples: ["cdn.syndication.twimg.com", "abs.twimg.com", "pbs.twimg.com"], totalExecutionTime: 804233203, totalOccurrences: 319957 }, { name: "AddThis", homepage: "https://www.addthis.com/", category: "social", domains: ["*.addthis.com", "*.addthiscdn.com", "*.addthised\
ge.com"], examples: ["s7.addthis.com", "r.dlx.addthis.com", "su.addthis.com", "x.dlx.addthis.com"], totalExecutionTime: 23, totalOccurrences: 42 }, { name: "AddToAny", homepage: "https://www.addtoany.com/", category: "social", domains: ["*.addtoany.com"], examples: ["static.addtoany.com"], totalExecutionTime: 10606113, totalOccurrences: 66065 }, { name: "Akamai", homepage: "https://www.akamai.com/", category: "cdn", domains: ["23.62.3.183", "*.akamaitechnologies.com", "*.akamaitechnologies.fr", "*.akamai.net", "*.akamaiedge.net", "*.akamaihd.net", "*.akamaized.net", "*.edgefcs.net", "*.edgekey.net", "edgesuite.net", "*.srip.net"], totalExecutionTime: 4795669, totalOccurrences: 9820 }, { name: "Blogger", homepage: "https://www.blogger.com/", category: "hosting", domains: ["*.blogblog.com", "*.blogger.com", "*.blogspot.com", "images-blogger-opensocial.googleusercontent.com"], examples: ["1.bp.blogspot.com", "www.blogger.com"], totalExecutionTime: 58390438, totalOccurrences: 213326 }, { name: "\
Gravatar", homepage: "https://en.gravatar.com/", category: "social", domains: ["*.gravatar.com"], examples: ["secure.gravatar.com", "www.gravatar.com"], totalExecutionTime: 9235, totalOccurrences: 43 }, { name: "Yandex Metrica", company: "Yandex", homepage: "https://metrica.yandex.com/about?", category: "analytics", domains: ["mc.yandex.ru", "mc.yandex.com", "d31j93rd8oukbv.cloudfront.net"], totalExecutionTime: 1438544698, totalOccurrences: 602136 }, { name: "Hotjar", homepage: "https://www.hotjar.com/", category: "analytics", domains: ["*.hotjar.com", "*.hotjar.io"], examples: ["script.hotjar.com", "static.hotjar.com", "in.hotjar.com", "vc.hotjar.io", "vars.hotjar.com"], totalExecutionTime: 241418055, totalOccurrences: 333356 }, { name: "Baidu Analytics", homepage: "https://tongji.baidu.com/web/welcome/login", category: "analytics", domains: ["hm.baidu.com", "hmcdn.baidu.com"], examples: ["hm.baidu.com", "hmcdn.baidu.com"], totalExecutionTime: 7739347, totalOccurrences: 32612 }, { name: "\
Insider", homepage: "", category: "analytics", domains: ["*.useinsider.com"], examples: ["hit.api.useinsider.com"], totalExecutionTime: 2214966, totalOccurrences: 1861 }, { name: "Adobe Experience Cloud", company: "Adobe", homepage: "", category: "analytics", domains: ["*.2o7.net", "du8783wkf05yr.cloudfront.net", "*.hitbox.com", "*.imageg.net", "*.nedstat.com", "*.omtrdc.net"], examples: ["audiag.112.2o7.net", "du8783wkf05yr.cloudfront.net/NS_mbox.js"], totalExecutionTime: 2369, totalOccurrences: 38 }, { name: "Adobe Tag Manager", company: "Adobe", homepage: "https://www.adobe.com/experience-platform/", category: "tag-manager", domains: ["*.adobedtm.com", "*.demdex.net", "*.everesttech.net", "sstats.adobe.com", "hbrt.adobe.com"], examples: ["assets.adobedtm.com", "sync-tm.everesttech.net", "cm.everesttech.net"], totalExecutionTime: 34937564, totalOccurrences: 200160 }, { name: "jQuery CDN", homepage: "https://code.jquery.com/", category: "cdn", domains: ["*.jquery.com"], examples: ["co\
de.jquery.com"], totalExecutionTime: 302334055, totalOccurrences: 724477 }, { name: "Cloudflare CDN", homepage: "https://cdnjs.com/", category: "cdn", domains: ["cdnjs.cloudflare.com", "amp.cloudflare.com"], totalExecutionTime: 337711119, totalOccurrences: 666628 }, { name: "Cloudflare", homepage: "https://www.cloudflare.com/website-optimization/", category: "utility", domains: ["ajax.cloudflare.com", "*.nel.cloudflare.com", "static.cloudflareinsights.com"], totalExecutionTime: 58723052, totalOccurrences: 467719 }, { name: "WordPress", company: "Automattic", homepage: "https://wp.com/", category: "hosting", domains: ["*.wordpress.com", "s0.wp.com", "s2.wp.com", "*.w.org", "c0.wp.com", "s1.wp.com", "i0.wp.com", "i1.wp.com", "i2.wp.com", "widgets.wp.com"], examples: ["s.w.org"], totalExecutionTime: 220910650, totalOccurrences: 308694 }, { name: "WordPress Site Stats", company: "Automattic", homepage: "https://wp.com/", category: "analytics", domains: ["pixel.wp.com", "stats.wp.com"], totalExecutionTime: 8573549,
    totalOccurrences: 128931 }, { name: "Hatena Blog", homepage: "https://hatenablog.com/", category: "hosting", domains: ["*.st-hatena.com", "*.hatena.ne.jp"], examples: ["cdn.blog.st-hatena.com", "cdn.pool.st-hatena.com", "cdn7.www.st-hatena.com", "s.hatena.ne.jp", "b.st-hatena.com"], totalExecutionTime: 106337940, totalOccurrences: 43183 }, { name: "Shopify", homepage: "https://www.shopify.com/", category: "hosting", domains: ["*.shopify.com", "*.shopifyapps.com", "*.shopifycdn.com", "*.shopifysvc.com"], examples: ["cdn.shopify.com", "productreviews.shopifycdn.com", "monorail-edge.shopifysvc.com"], totalExecutionTime: 287428893, totalOccurrences: 338668 }, { name: "Dealer", homepage: "https://www.dealer.com/", category: "hosting", domains: ["*.dealer.com"], examples: ["static.dealer.com"], totalExecutionTime: 871324, totalOccurrences: 2620 }, { name: "PIXNET", homepage: "https://www.pixnet.net/", category: "social", domains: ["*.pixfs.net", "*.pixnet.net"], examples: ["front.pixfs.n\
et", "falcon-asset.pixfs.net", "pixgame-asset.pixfs.net"], totalExecutionTime: 18541448, totalOccurrences: 13718 }, { name: "Moat", homepage: "https://moat.com/", category: "ad", domains: ["*.moatads.com", "*.moatpixel.com"], examples: ["z.moatads.com", "px.moatads.com", "geo.moatads.com", "sejs.moatads.com", "mb.moatads.com", "v4.moatads.com"] }, { name: "33 Across", homepage: "https://33across.com/", category: "ad", domains: ["*.33across.com"], examples: ["sic.33across.com", "cdn-sic.33across.com"], totalExecutionTime: 10002146, totalOccurrences: 192648 }, { name: "OpenX", homepage: "https://www.openx.com/", category: "ad", domains: ["*.deliverimp.com", "*.openxadexchange.com", "*.servedbyopenx.com", "*.jump-time.net", "*.openx.net", "*.openxcdn.net"], examples: ["uk-ads.openx.net", "us-ads.openx.net", "33across-d.openx.net", "rtb.openx.net", "us-u.openx.net", "eu-u.openx.net", "u.openx.net"], totalExecutionTime: 6274934, totalOccurrences: 76561 }, { name: "Amazon Ads", homepage: "ht\
tps://ad.amazon.com/", category: "ad", domains: ["*.amazon-adsystem.com"], examples: ["s.amazon-adsystem.com", "c.amazon-adsystem.com", "aax.amazon-adsystem.com", "z-na.amazon-adsystem.com", "fls-na.amazon-adsystem.com", "aax-us-east.amazon-adsystem.com", "ir-na.amazon-adsystem.com"], totalExecutionTime: 98703856, totalOccurrences: 240331 }, { name: "Rubicon Project", homepage: "https://rubiconproject.com/", category: "ad", domains: ["*.rubiconproject.com", "*.chango.com", "*.fimserve.com"], examples: ["pixel.rubiconproject.com", "fastlane.rubiconproject.com", "secure-assets.rubiconproject.com", "eus.rubiconproject.com", "pixel-us-east.rubiconproject.com", "token.rubiconproject.com", "ads.rubiconproject.com"], totalExecutionTime: 287111007, totalOccurrences: 270271 }, { name: "The Trade Desk", homepage: "https://www.thetradedesk.com/", category: "ad", domains: ["*.adsrvr.org", "d1eoo1tco6rr5e.cloudfront.net"], examples: ["js.adsrvr.org", "match.adsrvr.org", "insight.adsrvr.org", "usw-l\
ax.adsrvr.org", "data.adsrvr.org", "snap.adsrvr.org"], totalExecutionTime: 2197325, totalOccurrences: 25346 }, { name: "Bidswitch", homepage: "https://www.bidswitch.com/", category: "ad", domains: ["*.bidswitch.net"], examples: ["x.bidswitch.net"], totalExecutionTime: 25660, totalOccurrences: 68217 }, { name: "LiveRamp IdentityLink", homepage: "https://liveramp.com/discover-identitylink/", category: "analytics", domains: ["*.circulate.com", "*.rlcdn.com"], examples: ["idsync.rlcdn.com", "id.rlcdn.com", "api.rlcdn.com", "cdn.rlcdn.com"], totalExecutionTime: 141414, totalOccurrences: 1461 }, { name: "Drawbridge", homepage: "https://www.drawbridge.com/", category: "ad", domains: ["*.adsymptotic.com"] }, { name: "AOL / Oath / Verizon Media", homepage: "https://www.oath.com/", category: "ad", domains: ["*.advertising.com", "*.aol.com", "*.aolcdn.com", "*.blogsmithmedia.com", "*.oath.com", "*.aol.net", "*.tacoda.net", "*.aol.co.uk"], examples: ["pixel.advertising.com", "dtm.advertising.com",
    "tag.sp.advertising.com", "service.sp.advertising.com", "adtech.advertising.com", "adaptv.advertising.com", "mighty.aol.net", "consent.cmp.oath.com"], totalExecutionTime: 165968, totalOccurrences: 278 }, { name: "Xaxis", homepage: "https://www.xaxis.com/", category: "ad", domains: ["*.247realmedia.com", "*.mookie1.com", "*.gmads.net"], examples: ["t.mookie1.com", "odr.mookie1.com"], totalExecutionTime: 28343, totalOccurrences: 209 }, { name: "Freshdesk", company: "Freshworks", homepage: "https://freshdesk.com/", category: "customer-success", domains: ["d36mpcpuzc4ztk.cloudfront.net"], totalExecutionTime: 64296, totalOccurrences: 225 }, { name: "Help Scout", homepage: "https://www.helpscout.net/", category: "customer-success", domains: ["djtflbt20bdde.cloudfront.net", "*.helpscout.net"], examples: ["beacon-v2.helpscout.net"], products: [{ name: "Help Scout Beacon", urlPatterns: ["beacon-v2.helpscout.net"], facades: [{ name: "React Live Chat Loader", repo: "https://github.com/calibre\
app/react-live-chat-loader" }] }], totalExecutionTime: 2186050, totalOccurrences: 4906 }, { name: "Alexa", homepage: "https://www.alexa.com/", category: "analytics", domains: ["*.alexametrics.com", "d31qbv1cthcecs.cloudfront.net"], examples: ["certify.alexametrics.com"] }, { name: "OneSignal", homepage: "https://onesignal.com/", category: "utility", domains: ["*.onesignal.com"], examples: ["cdn.onesignal.com", "https://onesignal.com/api/v1/sync/"], totalExecutionTime: 17761218, totalOccurrences: 68282 }, { name: "Lucky Orange", homepage: "https://www.luckyorange.com/", category: "analytics", domains: ["*.luckyorange.com", "d10lpsik1i8c69.cloudfront.net", "*.luckyorange.net"], totalExecutionTime: 12779009, totalOccurrences: 16442 }, { name: "Crazy Egg", homepage: "https://www.crazyegg.com/", category: "analytics", domains: ["*.cetrk.com", "*.crazyegg.com", "dnn506yrbagrg.cloudfront.net"], totalExecutionTime: 27593244, totalOccurrences: 43822 }, { name: "Hello Bar", homepage: "https://ww\
w.hellobar.com/", category: "marketing", domains: ["*.hellobar.com"], totalExecutionTime: 1533955, totalOccurrences: 4502 }, { name: "Yandex Ads", company: "Yandex", homepage: "https://yandex.com/adv/", category: "ad", domains: ["an.yandex.ru"], totalExecutionTime: 5171537, totalOccurrences: 8488 }, { name: "Salesforce", homepage: "https://www.salesforce.com/products/marketing-cloud/", category: "analytics", domains: ["*.krxd.net"], examples: ["cdn.krxd.net", "beacon.krxd.net", "consumer.krxd.net", "usermatch.krxd.net"] }, { name: "Salesforce Commerce Cloud", homepage: "https://www.salesforce.com/products/commerce-cloud/overview/", category: "hosting", domains: ["*.cquotient.com", "*.demandware.net", "demandware.edgesuite.net"], totalExecutionTime: 2045309, totalOccurrences: 4127 }, { name: "Optimizely", homepage: "https://www.optimizely.com/", category: "analytics", domains: ["*.optimizely.com"], examples: ["cdn.optimizely.com", "cdn-pci.optimizely.com", "logx.optimizely.com", "cdn3.o\
ptimizely.com"], totalExecutionTime: 12599739, totalOccurrences: 15998 }, { name: "LiveChat", homepage: "https://www.livechat.com/", category: "customer-success", domains: ["*.livechatinc.com", "*.livechat.com", "*.livechat-static.com"], examples: ["cdn.livechatinc.com", "secure.livechatinc.com"], totalExecutionTime: 49171416, totalOccurrences: 39034 }, { name: "VK", homepage: "https://vk.com/", category: "social", domains: ["*.vk.com"], totalExecutionTime: 91334176, totalOccurrences: 22377 }, { name: "Tumblr", homepage: "https://tumblr.com/", category: "social", domains: ["*.tumblr.com"], examples: ["assets.tumblr.com", "static.tumblr.com"], totalExecutionTime: 45570825, totalOccurrences: 18114 }, { name: "Wistia", homepage: "https://wistia.com/", category: "video", domains: ["*.wistia.com", "embedwistia-a.akamaihd.net", "*.wistia.net"], examples: ["fast.wistia.com", "fast.wistia.net", "distillery.wistia.com", "pipedream.wistia.com"], totalExecutionTime: 115722112, totalOccurrences: 27059 },
    { name: "Brightcove", homepage: "https://www.brightcove.com/en/", category: "video", domains: ["*.brightcove.com", "*.brightcove.net", "*.zencdn.net"], examples: ["vjs.zencdn.net", "players.brightcove.net"], totalExecutionTime: 15099708, totalOccurrences: 13745 }, { name: "JSDelivr CDN", homepage: "https://www.jsdelivr.com/", category: "cdn", domains: ["*.jsdelivr.net"], examples: ["cdn.jsdelivr.net"], totalExecutionTime: 260364458, totalOccurrences: 399959 }, { name: "Sumo", homepage: "https://sumo.com/", category: "marketing", domains: ["*.sumo.com", "*.sumome.com", "sumo.b-cdn.net"], examples: ["sumo.b-cdn.net", "load.sumo.com", "load.sumome.com"], totalExecutionTime: 16489977, totalOccurrences: 10901 }, { name: "Vimeo", homepage: "https://vimeo.com/", category: "video", domains: ["*.vimeo.com", "*.vimeocdn.com"], examples: ["f.vimeocdn.com", "player.vimeo.com", "i.vimeocdn.com"], products: [{ name: "Vimeo Embedded Player", urlPatterns: ["player.vimeo.com/video/"], facades: [{ name: "\
Lite Vimeo", repo: "https://github.com/slightlyoff/lite-vimeo" }, { name: "Lite Vimeo Embed", repo: "https://github.com/luwes/lite-vimeo-embed" }, { name: "Ngx Lite Video", repo: "https://github.com/karim-mamdouh/ngx-lite-video" }] }], totalExecutionTime: 263943622, totalOccurrences: 120397 }, { name: "Disqus", homepage: "https://disqus.com/", category: "social", domains: ["*.disqus.com", "*.disquscdn.com"], examples: ["c.disquscdn.com"], totalExecutionTime: 3697272, totalOccurrences: 1775 }, { name: "Yandex APIs", company: "Yandex", homepage: "https://yandex.ru/", category: "utility", domains: ["api-maps.yandex.ru", "money.yandex.ru"], totalExecutionTime: 40765111, totalOccurrences: 51601 }, { name: "Yandex CDN", company: "Yandex", homepage: "https://yandex.ru/", category: "cdn", domains: ["*.yandex.st", "*.yastatic.net"], examples: ["https://yastatic.net/share2/share.js", "https://yastatic.net/jquery/2.1.4/jquery.min.js"] }, { name: "Integral Ad Science", homepage: "https://integrala\
ds.com/uk/", category: "ad", domains: ["*.adsafeprotected.com", "*.iasds01.com"], examples: ["pixel.adsafeprotected.com", "static.adsafeprotected.com", "fw.adsafeprotected.com", "cdn.adsafeprotected.com", "dt.adsafeprotected.com"], totalExecutionTime: 88554254, totalOccurrences: 21660 }, { name: "Tealium", homepage: "https://tealium.com/", category: "tag-manager", domains: ["*.aniview.com", "*.delvenetworks.com", "*.limelight.com", "*.tiqcdn.com", "*.llnwd.net", "*.tealiumiq.com"], examples: ["tags.tiqcdn.com", "tealium.hs.llnwd.net", "link.videoplatform.limelight.com", "datacloud.tealiumiq.com"], totalExecutionTime: 20176561, totalOccurrences: 75434 }, { name: "Pubmatic", homepage: "https://pubmatic.com/", category: "ad", domains: ["*.pubmatic.com"], examples: ["image6.pubmatic.com", "ads.pubmatic.com", "image2.pubmatic.com", "simage2.pubmatic.com", "image4.pubmatic.com", "simage4.pubmatic.com", "image5.pubmatic.com", "hbopenbid.pubmatic.com"], totalExecutionTime: 417694368, totalOccurrences: 279418 },
    { name: "Olark", homepage: "https://www.olark.com/", category: "customer-success", domains: ["*.olark.com"], examples: ["static.olark.com"], totalExecutionTime: 9840846, totalOccurrences: 6534 }, { name: "Tawk.to", homepage: "https://www.tawk.to/", category: "customer-success", domains: ["*.tawk.to"], examples: ["embed.tawk.to"], totalExecutionTime: 43074965, totalOccurrences: 111088 }, { name: "OptinMonster", homepage: "https://optinmonster.com/", category: "marketing", domains: ["*.opmnstr.com", "*.optmnstr.com", "*.optmstr.com"], examples: ["a.optmstr.com", "api.opmnstr.com", "a.optmnstr.com"], totalExecutionTime: 1035991, totalOccurrences: 2346 }, { name: "ZenDesk", homepage: "https://zendesk.com/", category: "customer-success", domains: ["*.zdassets.com", "*.zendesk.com", "*.zopim.com"], examples: ["assets.zendesk.com", "static.zdassets.com", "v2.zopim.com"], totalExecutionTime: 106701440, totalOccurrences: 72537 }, { name: "Pusher", homepage: "https://pusher.com/", category: "\
utility", domains: ["*.pusher.com", "*.pusherapp.com"], examples: ["stats.pusher.com"], totalExecutionTime: 152727, totalOccurrences: 1698 }, { name: "Drift", homepage: "https://www.drift.com/", category: "marketing", domains: ["*.drift.com", "*.driftt.com"], examples: ["js.driftt.com", "api.drift.com"], products: [{ name: "Drift Live Chat", urlPatterns: ["REGEXP:js\\.driftt\\.com\\/include\\/.*\\/.*\\.js"], facades: [{ name: "React Live Chat Loader", repo: "https://github.com/calibreapp/react-live-chat-loader" }] }], totalExecutionTime: 30179596, totalOccurrences: 5515 }, { name: "Sentry", homepage: "https://sentry.io/", category: "utility", domains: ["*.getsentry.com", "*.ravenjs.com", "*.sentry-cdn.com", "*.sentry.io"], examples: ["cdn.ravenjs.com", "browser.sentry-cdn.com"], totalExecutionTime: 47937360, totalOccurrences: 85598 }, { name: "Amazon Web Services", homepage: "https://aws.amazon.com/s3/", category: "other", domains: ["*.amazon.com", "*.amazonaws.com", "*.amazonwebapps.c\
om", "*.amazonwebservices.com", "*.elasticbeanstalk.com", "*.images-amazon.com", "*.amazon.co.uk"], examples: ["s3.amazonaws.com", "us-east-1.amazonaws.com", "api-cdn.amazon.com", "ecx.images-amazon.com", "ws.amazon.co.uk"], totalExecutionTime: 51892201, totalOccurrences: 119152 }, { name: "Amazon Pay", homepage: "https://pay.amazon.com", category: "utility", domains: ["payments.amazon.com", "*.payments-amazon.com"], totalExecutionTime: 1234650, totalOccurrences: 6833 }, { name: "Media.net", homepage: "https://www.media.net/", category: "ad", domains: ["*.media.net", "*.mnet-ad.net"], examples: ["contextual.media.net", "cdnwest-xch.media.net", "hbx.media.net", "cs.media.net", "hblg.media.net"], totalExecutionTime: 24973689, totalOccurrences: 97679 }, { name: "Yahoo!", homepage: "https://www.yahoo.com/", category: "ad", domains: ["*.bluelithium.com", "*.hostingprod.com", "*.lexity.com", "*.yahoo.com", "*.yahooapis.com", "*.yimg.com", "*.zenfs.com", "*.yahoo.net"], examples: ["ads.yahoo.\
com", "analytics.yahoo.com", "geo.yahoo.com", "udc.yahoo.com", "ganon.yahoo.com", "ads.yap.yahoo.com"], totalExecutionTime: 2617276, totalOccurrences: 24800 }, { name: "Adroll", homepage: "https://www.adroll.com/", category: "ad", domains: ["*.adroll.com"], examples: ["d.adroll.com", "s.adroll.com"], totalExecutionTime: 11884188, totalOccurrences: 30782 }, { name: "Twitch", homepage: "https://twitch.tv/", category: "video", domains: ["*.twitch.tv"], examples: ["player.twitch.tv"], totalExecutionTime: 18452667, totalOccurrences: 1255 }, { name: "Taboola", homepage: "https://www.taboola.com/", category: "ad", domains: ["*.taboola.com", "*.taboolasyndication.com"], examples: ["cdn.taboola.com", "trc.taboola.com", "vidstat.taboola.com", "images.taboola.com"], totalExecutionTime: 32631891, totalOccurrences: 49191 }, { name: "Sizmek", homepage: "https://www.sizmek.com/", category: "ad", domains: ["*.serving-sys.com", "*.peer39.net"], examples: ["secure-ds.serving-sys.com", "ds.serving-sys.co\
m", "bs.serving-sys.com"], totalExecutionTime: 6679849, totalOccurrences: 4307 }, { name: "Scorecard Research", homepage: "https://www.scorecardresearch.com/", category: "ad", domains: ["*.scorecardresearch.com"], examples: ["sb.scorecardresearch.com", "sa.scorecardresearch.com", "b.scorecardresearch.com"], totalExecutionTime: 4399371, totalOccurrences: 54577 }, { name: "Criteo", homepage: "https://www.criteo.com/", category: "ad", domains: ["*.criteo.com", "*.emailretargeting.com", "*.criteo.net"], examples: ["static.criteo.net", "bidder.criteo.com", "dis.criteo.com", "gum.criteo.com", "sslwidget.criteo.com", "dis.us.criteo.com"], totalExecutionTime: 25625451, totalOccurrences: 213880 }, { name: "Segment", homepage: "https://segment.com/", category: "analytics", domains: ["*.segment.com", "*.segment.io"], examples: ["cdn.segment.com", "api.segment.io"], totalExecutionTime: 11055141, totalOccurrences: 27036 }, { name: "ShareThis", homepage: "https://www.sharethis.com/", category: "soci\
al", domains: ["*.sharethis.com"], examples: ["w.sharethis.com", "ws.sharethis.com", "t.sharethis.com"], totalExecutionTime: 30807804, totalOccurrences: 88829 }, { name: "Distil Networks", homepage: "https://www.distilnetworks.com/", category: "utility", domains: ["*.areyouahuman.com"], examples: ["n-cdn.areyouahuman.com"] }, { name: "Connexity", homepage: "https://connexity.com/", category: "analytics", domains: ["*.connexity.net"] }, { name: "Popads", homepage: "https://www.popads.net/", category: "ad", domains: ["*.popads.net"], examples: ["serve.popads.net", "c1.popads.net"], totalExecutionTime: 756593, totalOccurrences: 427 }, { name: "CreateJS CDN", homepage: "https://code.createjs.com/", category: "cdn", domains: ["*.createjs.com"], examples: ["code.createjs.com"], totalExecutionTime: 13654049, totalOccurrences: 3880 }, { name: "Squarespace", homepage: "https://www.squarespace.com/", category: "hosting", domains: ["*.squarespace.com"], examples: ["static.squarespace.com", "stati\
c1.squarespace.com"], totalExecutionTime: 1106480464, totalOccurrences: 243154 }, { name: "Media Math", homepage: "https://www.mediamath.com/", category: "ad", domains: ["*.mathads.com", "*.mathtag.com"], examples: ["mathid.mathtag.com", "sync.mathtag.com", "pixel.mathtag.com"], totalExecutionTime: 20783, totalOccurrences: 305 }, { name: "Mixpanel", homepage: "https://mixpanel.com/", category: "analytics", domains: ["*.mixpanel.com", "*.mxpnl.com"], examples: ["cdn.mxpnl.com"], totalExecutionTime: 3250547, totalOccurrences: 18817 }, { name: "FontAwesome CDN", homepage: "https://fontawesome.com/", category: "cdn", domains: ["*.fontawesome.com"], examples: ["use.fontawesome.com"], totalExecutionTime: 73007333, totalOccurrences: 291586 }, { name: "Hubspot", homepage: "https://hubspot.com/", category: "marketing", domains: ["*.hs-scripts.com", "*.hubspot.com", "*.leadin.com", "*.hs-analytics.net", "*.hscollectedforms.net", "*.hscta.net", "*.hsforms.net", "*.hsleadflows.net", "*.hsstatic.ne\
t", "*.hubspot.net", "*.hsforms.com", "*.hs-banner.com", "*.hs-embed-reporting.com", "*.hs-growth-metrics.com", "*.hs-data.com", "*.hsadspixel.net", "*.hubapi.com"], examples: ["forms.hubspot.com", "js.hsforms.net", "js.hs-analytics.net", "js.leadin.com"], totalExecutionTime: 92224372, totalOccurrences: 154415 }, { name: "Mailchimp", homepage: "https://mailchimp.com/", category: "marketing", domains: ["*.chimpstatic.com", "*.list-manage.com", "*.mailchimp.com"], examples: ["downloads.mailchimp.com"], totalExecutionTime: 21592375, totalOccurrences: 45506 }, { name: "MGID", homepage: "https://www.mgid.com/", category: "ad", domains: ["*.mgid.com", "*.dt07.net"], examples: ["servicer.mgid.com"], totalExecutionTime: 22074076, totalOccurrences: 10437 }, { name: "Stripe", homepage: "https://stripe.com", category: "utility", domains: ["*.stripe.com", "*.stripecdn.com", "*.stripe.network"], examples: ["m.stripe.network", "js.stripe.com"], totalExecutionTime: 166354648, totalOccurrences: 136440 },
    { name: "PayPal", homepage: "https://paypal.com", category: "utility", domains: ["*.paypal.com", "*.paypalobjects.com"], examples: ["www.paypalobjects.com"], totalExecutionTime: 64408205, totalOccurrences: 62800 }, { name: "Market GID", homepage: "https://www.marketgid.com/", category: "ad", domains: ["*.marketgid.com"], examples: ["jsc.marketgid.com"] }, { name: "Pinterest", homepage: "https://pinterest.com/", category: "social", domains: ["*.pinimg.com", "*.pinterest.com"], examples: ["assets.pinterest.com", "ct.pinterest.com", "log.pinterest.com"], totalExecutionTime: 17602311, totalOccurrences: 131448 }, { name: "New Relic", homepage: "https://newrelic.com/", category: "utility", domains: ["*.newrelic.com", "*.nr-data.net"], examples: ["js-agent.newrelic.com", "bam.nr-data.net"], totalExecutionTime: 64592740, totalOccurrences: 227672 }, { name: "AppDynamics", homepage: "https://www.appdynamics.com/", category: "utility", domains: ["*.appdynamics.com", "*.eum-appdynamics.com", "\
d3tjaysgumg9lf.cloudfront.net"], examples: ["cdn.appdynamics.com"], totalExecutionTime: 2509158, totalOccurrences: 2920 }, { name: "Parking Crew", homepage: "https://parkingcrew.net/", category: "other", domains: ["d1lxhc4jvstzrp.cloudfront.net", "*.parkingcrew.net"], totalExecutionTime: 9, totalOccurrences: 1 }, { name: "WordAds", company: "Automattic", homepage: "https://wordads.co/", category: "ad", domains: ["*.pubmine.com"], examples: ["s.pubmine.com"], totalExecutionTime: 74286347, totalOccurrences: 100449 }, { name: "AppNexus", homepage: "https://www.appnexus.com/", category: "ad", domains: ["*.adnxs.com", "*.ctasnet.com", "*.adrdgt.com"], examples: ["acdn.adnxs.com", "secure.adnxs.com", "ib.adnxs.com", "sharethrough.adnxs.com", "cdn.adnxs.com", "vcdn.adnxs.com"], totalExecutionTime: 5948505, totalOccurrences: 234133 }, { name: "Histats", homepage: "https://www.histats.com/", category: "analytics", domains: ["*.histats.com"], examples: ["s10.histats.com"], totalExecutionTime: 5601,
    totalOccurrences: 92 }, { name: "DoubleVerify", homepage: "https://www.doubleverify.com/", category: "ad", domains: ["*.doubleverify.com", "*.dvtps.com", "*.iqfp1.com"], examples: ["cdn.doubleverify.com", "cdn3.doubleverify.com", "tps.doubleverify.com", "tps712.doubleverify.com", "tps714.doubleverify.com", "tps706.doubleverify.com", "tps700.doubleverify.com", "tps707.doubleverify.com", "rtb2.doubleverify.com", "rtb0.doubleverify.com", "rtbcdn.doubleverify.com", "tps11020.doubleverify.com", "tm.iqfp1.com"], totalExecutionTime: 46891028, totalOccurrences: 19453 }, { name: "Mediavine", homepage: "https://www.mediavine.com/", category: "ad", domains: ["*.mediavine.com"], examples: ["scripts.mediavine.com", "video.mediavine.com"], totalExecutionTime: 59009373, totalOccurrences: 12963 }, { name: "Wix", homepage: "https://www.wix.com/", category: "hosting", domains: ["*.parastorage.com", "*.wix.com", "*.wixstatic.com", "*.wixapps.net"], examples: ["static.parastorage.com", "static.wixstat\
ic.com", "www.wix.com", "instagram.codev.wixapps.net"], totalExecutionTime: 2112268981, totalOccurrences: 458273 }, { name: "Webflow", homepage: "https://webflow.com/", category: "hosting", domains: ["*.uploads-ssl.webflow.com", "*.assets-global.website-files.com", "*.assets.website-files.com"], examples: ["uploads-ssl.webflow.com", "assets-global.website-files.com", "assets.website-files.com"] }, { name: "Weebly", homepage: "https://www.weebly.com/", category: "hosting", domains: ["*.editmysite.com"], totalExecutionTime: 413019e3, totalOccurrences: 67864 }, { name: "LinkedIn", homepage: "https://www.linkedin.com/", category: "social", domains: ["*.bizographics.com", "platform.linkedin.com", "*.slideshare.com", "*.slidesharecdn.com", "*.oribi.io"], totalExecutionTime: 5776577, totalOccurrences: 16507 }, { name: "LinkedIn Ads", category: "ad", domains: ["*.licdn.com", "*.ads.linkedin.com", "ads.linkedin.com", "www.linkedin.com"], examples: ["snap.licdn.com"], totalExecutionTime: 22805542,
    totalOccurrences: 199088 }, { name: "Vox Media", homepage: "https://www.voxmedia.com/", category: "content", domains: ["*.vox-cdn.com", "*.voxmedia.com"], examples: ["cdn.vox-cdn.com"], totalExecutionTime: 910366, totalOccurrences: 320 }, { name: "Hotmart", homepage: "https://www.hotmart.com/", category: "content", domains: ["*.hotmart.com"], examples: ["launchermodule.hotmart.com"], totalExecutionTime: 15363016, totalOccurrences: 4554 }, { name: "SoundCloud", homepage: "https://www.soundcloud.com/", category: "content", domains: ["*.sndcdn.com", "*.soundcloud.com", "*.stratus.sc"], examples: ["widget.sndcdn.com"], totalExecutionTime: 15888610, totalOccurrences: 5859 }, { name: "Spotify", homepage: "https://www.spotify.com/", category: "content", domains: ["*.scdn.co", "*.spotify.com"], examples: ["open.spotify.com", "open.scdn.co", "i.scdn.co"], totalExecutionTime: 99924, totalOccurrences: 10992 }, { name: "AMP", homepage: "https://amp.dev/", category: "content", domains: ["*.ampp\
roject.org"], examples: ["cdn.ampproject.org"], totalExecutionTime: 79590738, totalOccurrences: 66265 }, { name: "Beeketing", homepage: "https://beeketing.com/", category: "marketing", domains: ["*.beeketing.com"], examples: ["sdk-cdn.beeketing.com", "sdk.beeketing.com"], totalExecutionTime: 2163106, totalOccurrences: 1971 }, { name: "Albacross", homepage: "https://albacross.com/", category: "marketing", domains: ["*.albacross.com"], examples: ["serve.albacross.com"], totalExecutionTime: 100459, totalOccurrences: 1503 }, { name: "TrafficJunky", homepage: "https://www.trafficjunky.com/", category: "ad", domains: ["*.contentabc.com", "*.trafficjunky.net"], examples: ["ads2.contentabc.com", "hw-cdn.contentabc.com", "media.trafficjunky.net", "ads.trafficjunky.net", "hw-cdn.trafficjunky.net"], totalExecutionTime: 2936, totalOccurrences: 62 }, { name: "Bootstrap CDN", homepage: "https://www.bootstrapcdn.com/", category: "cdn", domains: ["*.bootstrapcdn.com"], examples: ["maxcdn.bootstrapcdn.\
com", "stackpath.bootstrapcdn.com"], totalExecutionTime: 2075388, totalOccurrences: 38731 }, { name: "Shareaholic", homepage: "https://www.shareaholic.com/", category: "social", domains: ["*.shareaholic.com", "dsms0mj1bbhn4.cloudfront.net"], totalExecutionTime: 122180, totalOccurrences: 1429 }, { name: "Snowplow", homepage: "https://snowplowanalytics.com/", category: "analytics", domains: ["d32hwlnfiv2gyn.cloudfront.net"], totalExecutionTime: 7099041, totalOccurrences: 58566 }, { name: "RD Station", homepage: "https://www.rdstation.com/en/", category: "marketing", domains: ["d335luupugsy2.cloudfront.net"], totalExecutionTime: 7693701, totalOccurrences: 21846 }, { name: "Jivochat", homepage: "https://www.jivochat.com/", category: "customer-success", domains: ["*.jivosite.com"], examples: ["cdn-ca.jivosite.com", "code.jivosite.com"], totalExecutionTime: 36663932, totalOccurrences: 57540 }, { name: "Listrak", homepage: "https://www.listrak.com/", category: "marketing", domains: ["*.listra\
k.com", "*.listrakbi.com"], examples: ["cdn.listrakbi.com", "s1.listrakbi.com"], totalExecutionTime: 458776, totalOccurrences: 1045 }, { name: "Ontame", homepage: "https://www.ontame.io", category: "analytics", domains: ["*.ontame.io"], examples: ["cdn.ontame.io", "collector.ontame.io"], totalExecutionTime: 23620, totalOccurrences: 101 }, { name: "Ipify", homepage: "https://www.ipify.org", category: "utility", domains: ["*.ipify.org"], examples: ["api.ipify.org", "geo.ipify.org"], totalExecutionTime: 365905, totalOccurrences: 2753 }, { name: "Ensighten", homepage: "https://www.ensighten.com/", category: "tag-manager", domains: ["*.ensighten.com"], examples: ["nexus.ensighten.com"], totalExecutionTime: 1774287, totalOccurrences: 3199 }, { name: "EpiServer", homepage: "https://www.episerver.com", category: "content", domains: ["*.episerver.net"], examples: ["dl.episerver.net"], totalExecutionTime: 9010, totalOccurrences: 80 }, { name: "mPulse", homepage: "https://developer.akamai.com/aka\
mai-mpulse", category: "analytics", domains: ["*.akstat.io", "*.go-mpulse.net", "*.mpulse.net", "*.mpstat.us"], examples: ["c.go-mpulse.net", "0211c83c.akstat.io"], totalExecutionTime: 3089821, totalOccurrences: 30624 }, { name: "Pingdom RUM", homepage: "https://www.pingdom.com/product/performance-monitoring/", category: "analytics", domains: ["*.pingdom.net"], examples: ["rum-static.pingdom.net", "rum-collector-2.pingdom.net"], totalExecutionTime: 106679, totalOccurrences: 1825 }, { name: "SpeedCurve RUM", company: "SpeedCurve", homepage: "https://www.speedcurve.com/features/performance-monitoring/", category: "analytics", domains: ["*.speedcurve.com"], examples: ["cdn.speedcurve.com", "lux.speedcurve.com"], totalExecutionTime: 323903, totalOccurrences: 5358 }, { name: "Radar", company: "Cedexis", homepage: "https://www.cedexis.com/radar/", category: "analytics", domains: ["*.cedexis-test.com", "*.cedexis.com", "*.cmdolb.com", "cedexis.leasewebcdn.com", "*.cedexis-radar.net", "*.cedex\
is.net", "cedexis-test01.insnw.net", "cedexisakamaitest.azureedge.net", "cedexispub.cdnetworks.net", "cs600.wac.alphacdn.net", "cs600.wpc.edgecastdns.net", "global2.cmdolb.com", "img-cedexis.mncdn.com", "a-cedexis.msedge.net", "zn3vgszfh.fastestcdn.net"], examples: ["radar.cedexis.com", "rpt.cedexis.com", "2-01-49cd-0002.cdx.cedexis.net", "bench.cedexis-test.com"], totalExecutionTime: 290925, totalOccurrences: 1133 }, { name: "Byside", homepage: "https://byside.com", category: "analytics", domains: ["*.byside.com"], examples: ["byce2.byside.com", "wce2.byside.com"], totalExecutionTime: 45270, totalOccurrences: 87 }, { name: "VWO", homepage: "https://vwo.com", category: "analytics", domains: ["*.vwo.com", "*.visualwebsiteoptimizer.com", "d5phz18u4wuww.cloudfront.net", "*.wingify.com"], examples: ["dev.visualwebsiteoptimizer.com"], totalExecutionTime: 6485310, totalOccurrences: 7903 }, { name: "Bing Ads", homepage: "https://bingads.microsoft.com", category: "ad", domains: ["*.bing.com", "\
*.microsoft.com", "*.msn.com", "*.s-msft.com", "*.s-msn.com", "*.msads.net", "*.msecnd.net"], examples: ["bat.bing.com", "c.bing.com", "bat.r.msn.com", "ajax.microsoft.com"], totalExecutionTime: 14227177, totalOccurrences: 117720 }, { name: "GoSquared", homepage: "https://www.gosquared.com", category: "analytics", domains: ["*.gosquared.com", "d1l6p2sc9645hc.cloudfront.net"], examples: ["data.gosquared.com", "data2.gosquared.com"], totalExecutionTime: 56152, totalOccurrences: 613 }, { name: "Usabilla", homepage: "https://usabilla.com", category: "analytics", domains: ["*.usabilla.com", "d6tizftlrpuof.cloudfront.net"], examples: ["w.usabilla.com"], totalExecutionTime: 240166, totalOccurrences: 1354 }, { name: "Fastly Insights", homepage: "https://insights.fastlylabs.com", category: "analytics", domains: ["*.fastly-insights.com"], examples: ["www.fastly-insights.com"], totalExecutionTime: 541189, totalOccurrences: 4449 }, { name: "Visual IQ", homepage: "https://www.visualiq.com", category: "\
analytics", domains: ["*.myvisualiq.net"], examples: ["t.myvisualiq.net"] }, { name: "Snapchat", homepage: "https://www.snapchat.com", category: "analytics", domains: ["*.snapchat.com", "*.sc-static.net"], examples: ["tr.snapchat.com"], totalExecutionTime: 177890, totalOccurrences: 1978 }, { name: "Atlas Solutions", homepage: "https://atlassolutions.com", category: "analytics", domains: ["*.atdmt.com"], examples: ["ad.atdmt.com", "cx.atdmt.com"] }, { name: "Quantcast", homepage: "https://www.quantcast.com", category: "analytics", domains: ["*.brtstats.com", "*.quantcount.com", "*.quantserve.com", "*.semantictec.com", "*.ntv.io"], examples: ["pixel.quantserve.com", "secure.quantserve.com", "cms.quantserve.com", "rules.quantcount.com"], totalExecutionTime: 12419392, totalOccurrences: 77646 }, { name: "Spiceworks", homepage: "https://www.spiceworks.com", category: "analytics", domains: ["*.spiceworks.com"], examples: ["px.spiceworks.com"] }, { name: "Marketo", homepage: "https://www.marke\
to.com", category: "analytics", domains: ["*.marketo.com", "*.mktoresp.com", "*.marketo.net"], examples: ["munchkin.marketo.net"], totalExecutionTime: 724464, totalOccurrences: 1798 }, { name: "Intercom", homepage: "https://www.intercom.com", category: "customer-success", domains: ["*.intercomcdn.com", "*.intercom.io"], examples: ["js.intercomcdn.com", "api-iam.intercom.io", "widget.intercom.io", "nexus-websocket-a.intercom.io"], products: [{ name: "Intercom Widget", urlPatterns: ["widget.intercom.io", "js.intercomcdn.com/shim.latest.js"], facades: [{ name: "React Live Chat Loader", repo: "https://github.com/calibreapp/react-live-chat-loader" }, { name: "Intercom Facade", repo: "https://github.com/danielbachhuber/intercom-facade/" }] }], totalExecutionTime: 44601345, totalOccurrences: 35197 }, { name: "Unpkg", homepage: "https://unpkg.com", category: "cdn", domains: ["*.unpkg.com", "*.npmcdn.com"], totalExecutionTime: 74666, totalOccurrences: 227 }, { name: "ReadSpeaker", homepage: "ht\
tps://www.readspeaker.com", category: "other", domains: ["*.readspeaker.com"], examples: ["sf1-eu.readspeaker.com"], totalExecutionTime: 727525, totalOccurrences: 6265 }, { name: "Browsealoud", homepage: "https://www.texthelp.com/en-gb/products/browsealoud/", category: "other", domains: ["*.browsealoud.com", "*.texthelp.com"], examples: ["www.browsealoud.com"], totalExecutionTime: 665425, totalOccurrences: 1951 }, { name: "15gifts", category: "customer-success", domains: ["*.15gifts.com", "*.primefuse.com"], examples: ["www.primefuse.com"] }, { name: "1xRUN", category: "utility", domains: ["*.1xrun.com"] }, { name: "2AdPro Media Solutions", category: "ad", domains: ["*.2adpro.com"] }, { name: "301 Digital Media", category: "content", domains: ["*.301ads.com", "*.301network.com"] }, { name: "360 picnic platform", company: "MediaV", category: "ad", domains: ["*.mediav.com"], totalExecutionTime: 4893, totalOccurrences: 78 }, { name: "365 Media Group", category: "content", domains: ["*.365\
dm.com"] }, { name: "365 Tech Services", category: "hosting", domains: ["*.365webservices.co.uk"] }, { name: "3D Issue", category: "utility", domains: ["*.3dissue.com", "*.pressjack.com"], totalExecutionTime: 53823, totalOccurrences: 30 }, { name: "47Line Technologies", category: "other", domains: ["*.pejs.net"] }, { name: "4finance", category: "utility", domains: ["*.4finance.com"] }, { name: "5miles", category: "content", domains: ["*.5milesapp.com"] }, { name: "77Tool", company: "77Agency", category: "analytics", domains: ["*.77tracking.com"] }, { name: "9xb", category: "ad", domains: ["*.9xb.com"] }, { name: "@UK", category: "hosting", domains: ["*.uk-plc.net"] }, { name: "A Perfect Pocket", category: "hosting", domains: ["*.aperfectpocketdata.com"] }, { name: "A-FIS PTE", category: "analytics", domains: ["*.websta.me"] }, { name: "AB Tasty", homepage: "https://www.abtasty.com/", category: "analytics", domains: ["*.abtasty.com", "d1447tq2m68ekg.cloudfront.net"], examples: ["try.abt\
asty.com"], totalExecutionTime: 1720461, totalOccurrences: 3363 }, { name: "ABA RESEARCH", category: "analytics", domains: ["*.abaresearch.uk", "qmodal.azurewebsites.net"] }, { name: "ADMIZED", category: "ad", domains: ["*.admized.com"] }, { name: "ADNOLOGIES", category: "ad", domains: ["*.heias.com"] }, { name: "ADventori", category: "ad", domains: ["*.adventori.com"], totalExecutionTime: 5790, totalOccurrences: 21 }, { name: "AI Media Group", category: "ad", domains: ["*.aimediagroup.com"] }, { name: "AIR.TV", category: "ad", domains: ["*.air.tv"] }, { name: "AKQA", category: "ad", domains: ["*.srtk.net"] }, { name: "AOL ad", company: "AOL", category: "ad", domains: ["*.atwola.com"] }, { name: "AOL On", company: "AOL", category: "content", domains: ["*.5min.com"] }, { name: "AOL Sponsored Listiings", company: "AOL", category: "ad", domains: ["*.adsonar.com"] }, { name: "APSIS Lead", company: "APSIS International AB", category: "ad", domains: ["*.prospecteye.com"] }, { name: "APSIS Pr\
ofile Cloud", company: "APSIS", category: "analytics", domains: ["*.innomdc.com"] }, { name: "APSIS Forms", company: "APSIS", category: "other", domains: ["*.apsisforms.com"], examples: ["forms.apsisforms.com"] }, { name: "ARENA", company: "Altitude", category: "ad", domains: ["*.altitude-arena.com"], totalExecutionTime: 1, totalOccurrences: 1 }, { name: "ARM", category: "analytics", domains: ["*.tag4arm.com"], totalExecutionTime: 5847, totalOccurrences: 83 }, { name: "ASAPP", category: "other", domains: ["*.asapp.com"], totalExecutionTime: 37052, totalOccurrences: 31 }, { name: "ASP", category: "hosting", domains: ["*.goshowoff.com"] }, { name: "AT Internet", category: "analytics", domains: ["*.ati-host.net"] }, { name: "ATTRAQT", category: "utility", domains: ["*.attraqt.com", "*.locayta.com"] }, { name: "AVANSER", category: "analytics", domains: ["*.avanser.com.au"] }, { name: "AVG", company: "AVG Technologies", category: "utility", domains: ["*.avg.com"], examples: ["omni.avg.com"] },
    { name: "AWeber", category: "ad", domains: ["*.aweber.com"], totalExecutionTime: 40945, totalOccurrences: 280 }, { name: "AXS", category: "content", domains: ["*.axs.com"], totalExecutionTime: 49218, totalOccurrences: 8 }, { name: "Accentuate", company: "Accentuate Digital", category: "utility", homepage: "https://www.accentuate.io/", domains: ["*.accentuate.io"], examples: ["cdn.accentuate.io", "original.accentuate.io"], totalExecutionTime: 1772, totalOccurrences: 17 }, { name: "Accenture", category: "analytics", domains: ["*.tmvtp.com"] }, { name: "Accord Holdings", category: "ad", domains: ["*.agcdn.com"] }, { name: "Accordant Media", category: "ad", domains: ["*.a3cloud.net"], examples: ["segment.a3cloud.net"] }, { name: "Account Kit", category: "other", domains: ["*.accountkit.com"] }, { name: "Accuen Media (Omnicom Media Group)", category: "content", domains: ["*.p-td.com"] }, { name: "Accuweather", category: "content", domains: ["*.accuweather.com"], totalExecutionTime: 291762,
    totalOccurrences: 1477 }, { name: "Acquisio", category: "ad", domains: ["*.acq.io"], totalExecutionTime: 1692, totalOccurrences: 32 }, { name: "Act-On Software", category: "marketing", domains: ["*.actonsoftware.com"], totalExecutionTime: 98, totalOccurrences: 2 }, { name: "ActBlue", category: "other", domains: ["*.actblue.com"], totalExecutionTime: 62800, totalOccurrences: 73 }, { name: "Active Agent", category: "ad", domains: ["*.active-agent.com"] }, { name: "ActiveCampaign", category: "ad", domains: ["*.trackcmp.net", "app-us1.com", "*.app-us1.com"], examples: ["trackcmp.net", "prism.app-us1.com", "diffuser-cdn.app-us1.com"], totalExecutionTime: 1605217, totalOccurrences: 19100 }, { name: "AcuityAds", category: "ad", domains: ["*.acuityplatform.com"], totalExecutionTime: 2492, totalOccurrences: 693 }, { name: "Acxiom", category: "ad", domains: ["*.acxiom-online.com", "*.acxiomapac.com", "*.delivery.net"] }, { name: "Ad4Screen", category: "ad", domains: ["*.a4.tl"] }, { name: "A\
d6Media", category: "ad", domains: ["*.ad6media.fr"], totalExecutionTime: 821770, totalOccurrences: 654 }, { name: "AdCurve", category: "ad", domains: ["*.shop2market.com"] }, { name: "AdEasy", category: "ad", domains: ["*.adeasy.ru"] }, { name: "AdExtent", category: "ad", domains: ["*.adextent.com"] }, { name: "AdForge Edge", company: "AdForge", category: "ad", domains: ["*.adforgeinc.com"] }, { name: "AdGear", company: "Samsung Electronics", category: "ad", domains: ["*.adgear.com", "*.adgrx.com"], totalExecutionTime: 19948, totalOccurrences: 42920 }, { name: "AdInMedia", category: "ad", domains: ["*.fastapi.net"] }, { name: "AdJug", category: "ad", domains: ["*.adjug.com"], examples: ["tracking.adjug.com", "uk.view.adjug.com"] }, { name: "AdMatic", category: "ad", domains: ["*.admatic.com.tr"], totalExecutionTime: 1274496, totalOccurrences: 467 }, { name: "AdMedia", category: "ad", domains: ["*.admedia.com"], examples: ["pixel.admedia.com"], totalExecutionTime: 2027, totalOccurrences: 7 },
    { name: "AdRecover", category: "ad", domains: ["*.adrecover.com"], totalExecutionTime: 5117, totalOccurrences: 46 }, { name: "AdRiver", category: "ad", domains: ["*.adriver.ru"], totalExecutionTime: 1374767, totalOccurrences: 4740 }, { name: "AdSniper", category: "ad", domains: ["*.adsniper.ru", "*.sniperlog.ru"], totalExecutionTime: 2366, totalOccurrences: 22 }, { name: "AdSpeed", category: "ad", domains: ["*.adspeed.net"], totalExecutionTime: 4642, totalOccurrences: 16 }, { name: "AdSpruce", category: "ad", domains: ["*.adspruce.com"] }, { name: "AdSupply", category: "ad", domains: ["*.doublepimp.com"], totalExecutionTime: 1436, totalOccurrences: 13 }, { name: "AdTheorent", category: "ad", domains: ["*.adentifi.com"], totalExecutionTime: 108, totalOccurrences: 1 }, { name: "AdThink AudienceInsights", company: "AdThink Media", category: "analytics", domains: ["*.audienceinsights.net"] }, { name: "AdTrue", company: "FPT AdTrue", category: "ad", domains: ["*.adtrue.com"] }, { name: "\
AdYapper", category: "ad", domains: ["*.adyapper.com"] }, { name: "Adacado", category: "ad", domains: ["*.adacado.com"], totalExecutionTime: 1777, totalOccurrences: 18 }, { name: "Adap.tv", category: "ad", domains: ["*.adap.tv"] }, { name: "Adapt Services", category: "hosting", domains: ["*.adcmps.com"] }, { name: "Adaptive Web", category: "hosting", domains: ["*.adaptive.co.uk"] }, { name: "Adara Media", category: "ad", domains: ["*.yieldoptimizer.com"], totalExecutionTime: 1324, totalOccurrences: 23 }, { name: "Adblade", category: "ad", domains: ["*.adblade.com"], totalExecutionTime: 704, totalOccurrences: 7 }, { name: "Adbrain", category: "ad", domains: ["*.adbrn.com"] }, { name: "AddEvent", category: "utility", domains: ["*.addevent.com"], examples: ["www.addevent.com"], totalExecutionTime: 73230, totalOccurrences: 203 }, { name: "AddShoppers", category: "social", domains: ["*.addshoppers.com", "d3rr3d0n31t48m.cloudfront.net", "*.shop.pe"], totalExecutionTime: 31574, totalOccurrences: 451 },
    { name: "AddThisEvent", category: "hosting", domains: ["*.addthisevent.com"] }, { name: "Addoox MetaNetwork", company: "Addoox", category: "ad", domains: ["*.metanetwork.net"] }, { name: "Addvantage Media", category: "ad", domains: ["*.addvantagemedia.com", "*.simplytechnology.net"] }, { name: "AD EBis", category: "analytics", homepage: "https://www.ebis.ne.jp/", domains: ["*.ebis.ne.jp"], examples: ["taj1.ebis.ne.jp"], totalExecutionTime: 55086, totalOccurrences: 608 }, { name: "Adecs", category: "customer-success", domains: ["*.adecs.co.uk"], examples: ["www.adecs.co.uk"] }, { name: "Adelphic", category: "ad", domains: ["*.ipredictive.com"], totalExecutionTime: 8196, totalOccurrences: 112 }, { name: "Adestra", category: "ad", domains: ["*.adestra.com", "*.msgfocus.com"] }, { name: "Adform", category: "ad", domains: ["*.adform.net", "*.adformdsp.net"], totalExecutionTime: 1798751, totalOccurrences: 140125 }, { name: "Adkontekst", category: "ad", domains: ["*.adkontekst.pl"] }, { name: "\
Adlead", category: "ad", domains: ["*.webelapp.com"] }, { name: "Adledge", category: "utility", domains: ["*.adledge.com"] }, { name: "Adloox", category: "ad", domains: ["*.adlooxtracking.com"], totalExecutionTime: 103507, totalOccurrences: 112 }, { name: "Adlux", category: "ad", domains: ["*.adlux.com"] }, { name: "Admedo", category: "ad", domains: ["*.a8723.com", "*.adizio.com", "*.admedo.com"], examples: ["pool.a8723.com"], totalExecutionTime: 9586, totalOccurrences: 695 }, { name: "Admeta", company: "Wideorbit", category: "ad", domains: ["*.atemda.com"] }, { name: "Admetrics", company: "Next Tuesday", category: "analytics", domains: ["*.nt.vc"], examples: ["metrics.nt.vc"] }, { name: "Admiral", category: "ad", domains: ["*.unknowntray.com"] }, { name: "Admitad", category: "ad", domains: ["*.lenmit.com"], totalExecutionTime: 2335, totalOccurrences: 31 }, { name: "Admixer for Publishers", company: "Admixer", category: "ad", domains: ["*.admixer.net"], totalExecutionTime: 1542643, totalOccurrences: 878 },
    { name: "Adnium", category: "ad", domains: ["*.adnium.com"] }, { name: "Adnostic", company: "Dennis Publishing", category: "ad", domains: ["*.adnostic.co.uk"] }, { name: "Adobe Marketing Cloud", company: "Adobe Systems", category: "ad", domains: ["*.adobetag.com"] }, { name: "Adobe Scene7", company: "Adobe Systems", category: "content", domains: ["wwwimages.adobe.com", "*.scene7.com", "*.everestads.net", "*.everestjs.net"], totalExecutionTime: 808424, totalOccurrences: 702 }, { name: "Adobe Systems", category: "content", domains: ["adobe.com", "www.adobe.com"], totalExecutionTime: 38836, totalOccurrences: 179 }, { name: "Adobe Business Catalyst", homepage: "https://www.businesscatalyst.com/", category: "hosting", domains: ["*.businesscatalyst.com"] }, { name: "Adocean", company: "Gemius", category: "ad", domains: ["*.adocean.pl"], totalExecutionTime: 1658274, totalOccurrences: 2151 }, { name: "Adometry", company: "Google", category: "ad", domains: ["*.dmtry.com"] }, { name: "Adomik",
    category: "analytics", domains: ["*.adomik.com"] }, { name: "Adotmob", category: "ad", domains: ["*.adotmob.com"] }, { name: "Adrian Quevedo", category: "hosting", domains: ["*.adrianquevedo.com"] }, { name: "Adroit Digital Solutions", category: "ad", domains: ["*.imiclk.com", "*.abmr.net"] }, { name: "AdsNative", category: "ad", domains: ["*.adsnative.com"] }, { name: "AdsWizz", category: "ad", domains: ["*.adswizz.com"], totalExecutionTime: 479514, totalOccurrences: 1901 }, { name: "Adscale", category: "ad", domains: ["*.adscale.de"], totalExecutionTime: 106237, totalOccurrences: 960 }, { name: "Adschoom", company: "JSWeb Production", category: "ad", domains: ["*.adschoom.com"], totalExecutionTime: 491, totalOccurrences: 2 }, { name: "Adscience", category: "ad", domains: ["*.adscience.nl"] }, { name: "Adsiduous", category: "ad", domains: ["*.adsiduous.com"] }, { name: "Adsty", category: "ad", domains: ["*.adx1.com"], totalExecutionTime: 698, totalOccurrences: 5 }, { name: "Adtech\
 (AOL)", category: "ad", domains: ["*.adtechus.com"], totalExecutionTime: 176, totalOccurrences: 2 }, { name: "Adtegrity", category: "ad", domains: ["*.adtpix.com"], totalExecutionTime: 1735, totalOccurrences: 20 }, { name: "Adthink", company: "Adthink Media", category: "ad", domains: ["*.adxcore.com", "*.dcoengine.com"], examples: ["d.adxcore.com"] }, { name: "AdultWebmasterEmpire.Com", category: "ad", domains: ["*.awempire.com"], totalExecutionTime: 65091, totalOccurrences: 38 }, { name: "Adunity", category: "ad", domains: ["*.adunity.com"] }, { name: "Advance Magazine Group", category: "content", domains: ["*.condenastdigital.com", "*.condenet.com", "*.condenast.co.uk"], totalExecutionTime: 2531, totalOccurrences: 8 }, { name: "Adverline Board", company: "Adverline", category: "ad", domains: ["*.adverline.com", "*.adnext.fr"] }, { name: "AdvertServe", category: "ad", domains: ["*.advertserve.com"], totalExecutionTime: 112685, totalOccurrences: 437 }, { name: "Advolution", category: "\
utility", domains: ["*.advolution.de"] }, { name: "Adwise", category: "ad", domains: ["*.adwise.bg"], totalExecutionTime: 144, totalOccurrences: 2 }, { name: "Adyen", category: "utility", domains: ["*.adyen.com"], totalExecutionTime: 6335144, totalOccurrences: 2363 }, { name: "Adyoulike", category: "ad", domains: ["*.adyoulike.com", "*.omnitagjs.com", "*.adyoulike.net"], totalExecutionTime: 147862, totalOccurrences: 53190 }, { name: "Adzerk", category: "ad", domains: ["*.adzerk.net"], totalExecutionTime: 35184, totalOccurrences: 117 }, { name: "Adzip", company: "Adbox Digital", category: "ad", domains: ["*.adzip.co"] }, { name: "AerServ", category: "ad", domains: ["*.aerserv.com"] }, { name: "Affectv", category: "ad", domains: ["*.affectv.com", "*.affec.tv"], totalExecutionTime: 1187, totalOccurrences: 12 }, { name: "Affiliate Window", company: "Digital Window", category: "ad", domains: ["*.dwin1.com"], totalExecutionTime: 561168, totalOccurrences: 5414 }, { name: "Affiliatly", category: "\
ad", domains: ["*.affiliatly.com"], examples: ["www.affiliatly.com"], totalExecutionTime: 32020, totalOccurrences: 132 }, { name: "Affino", category: "ad", domains: ["affino.com"] }, { name: "Affirm", category: "utility", domains: ["*.affirm.com"], totalExecutionTime: 3997184, totalOccurrences: 6665 }, { name: "Afterpay", company: "Block", category: "utility", homepage: "https://www.afterpay.com/", domains: ["*.afterpay.com"], examples: ["static-us.afterpay.com"], totalExecutionTime: 1270109, totalOccurrences: 8269 }, { name: "Agenda Media", category: "ad", domains: ["*.agendamedia.co.uk"] }, { name: "Aggregate Knowledge", company: "Neustar", category: "ad", domains: ["*.agkn.com"], totalExecutionTime: 14828, totalOccurrences: 344 }, { name: "AgilOne", category: "marketing", domains: ["*.agilone.com"], totalExecutionTime: 4190, totalOccurrences: 53 }, { name: "Agility", category: "hosting", domains: ["*.agilitycms.com"], totalExecutionTime: 3079, totalOccurrences: 4 }, { name: "Ahalogy",
    category: "social", domains: ["*.ahalogy.com"] }, { name: "Aheadworks", category: "utility", domains: ["*.aheadworks.com"] }, { name: "AirPR", category: "analytics", domains: ["*.airpr.com"], totalExecutionTime: 416, totalOccurrences: 5 }, { name: "Aira", category: "ad", domains: ["*.aira.net"], examples: ["www.aira.net"] }, { name: "Airport Parking and Hotels", category: "content", domains: ["*.aph.com"], totalExecutionTime: 277, totalOccurrences: 3 }, { name: "Akanoo", category: "analytics", domains: ["*.akanoo.com"] }, { name: "Alchemy", company: "AndBeyond.Media", category: "ad", domains: ["*.andbeyond.media"], totalExecutionTime: 456340, totalOccurrences: 164 }, { name: "AlephD", company: "AOL", category: "ad", domains: ["*.alephd.com"] }, { name: "AliveChat", company: "AYU Technology Solutions", category: "customer-success", domains: ["*.websitealive.com", "*.websitealive7.com"] }, { name: "All Access", category: "other", domains: ["*.allaccess.com.ph"] }, { name: "Alliance f\
or Audited Media", category: "ad", domains: ["*.aamsitecertifier.com"] }, { name: "Allyde", category: "marketing", domains: ["*.mautic.com"] }, { name: "AlphaSSL", category: "utility", domains: ["*.alphassl.com"], totalExecutionTime: 1146, totalOccurrences: 10 }, { name: "Altitude", category: "ad", domains: ["*.altitudeplatform.com"] }, { name: "Altocloud", category: "analytics", domains: ["*.altocloud.com"] }, { name: "Amadeus", category: "content", domains: ["*.e-travel.com"] }, { name: "Amazon CloudFront", company: "Amazon", category: "utility", domains: ["cloudfront.net"] }, { name: "Ambassador", category: "ad", domains: ["*.getambassador.com"], totalExecutionTime: 21042, totalOccurrences: 89 }, { name: "Ambient", company: "Ericcson", category: "other", domains: ["*.adnetwork.vn", "*.ambientplatform.vn"] }, { name: "Amelia Communication", category: "hosting", domains: ["*.sara.media"] }, { name: "Amobee", category: "marketing", domains: ["*.amgdgt.com", "*.kontera.com"] }, { name: "\
Amplience", category: "marketing", domains: ["*.10cms.com", "*.amplience.com", "*.amplience.net", "*.bigcontent.io", "*.adis.ws"], totalExecutionTime: 4093, totalOccurrences: 17 }, { name: "Amplitude Mobile Analytics", company: "Amplitude", category: "analytics", domains: ["*.amplitude.com", "d24n15hnbwhuhn.cloudfront.net"], totalExecutionTime: 8703641, totalOccurrences: 46524 }, { name: "Anametrix", company: "Ensighten", category: "analytics", domains: ["*.anametrix.com"] }, { name: "Ancora Platform", company: "Ancora Media Solutions", category: "ad", domains: ["*.ancoraplatform.com"] }, { name: "Anedot", category: "other", domains: ["*.anedot.com"], totalExecutionTime: 84655, totalOccurrences: 21 }, { name: "AnimateJS", category: "utility", domains: ["*.animatedjs.com"] }, { name: "AnswerDash", category: "customer-success", domains: ["*.answerdash.com"], examples: ["p1.answerdash.com"] }, { name: "Answers", category: "analytics", domains: ["*.answcdn.com", "*.answers.com", "*.dsply.c\
om"] }, { name: "Apester", category: "analytics", domains: ["*.apester.com", "*.qmerce.com"], totalExecutionTime: 25294, totalOccurrences: 166 }, { name: "Apligraf SmartWeb", company: "Apligraf", category: "utility", domains: ["*.apligraf.com.br"] }, { name: "Appier", category: "ad", domains: ["*.appier.net"], totalExecutionTime: 124524, totalOccurrences: 826 }, { name: "Appsolute", category: "utility", homepage: "https://appsolute.us/", domains: ["dropahint.love"], examples: ["dropahint.love"], totalExecutionTime: 16362, totalOccurrences: 144 }, { name: "Apptus eSales", company: "Apptus", category: "analytics", domains: ["*.apptus.com"] }, { name: "Arbor", company: "LiveRamp", category: "other", domains: ["*.pippio.com"] }, { name: "Ardent Creative", category: "hosting", domains: ["*.ardentcreative.co.uk"] }, { name: "Arnold Clark Automobiles", category: "content", domains: ["*.arnoldclark.com"] }, { name: "Atom Content Marketing", category: "content", domains: ["*.atomvault.net"], examples: [
    "danu.atomvault.net"] }, { name: "Atom Data", category: "other", domains: ["*.atomdata.io"] }, { name: "Attribution", category: "ad", domains: ["*.attributionapp.com"], totalExecutionTime: 44124, totalOccurrences: 124 }, { name: "Audience 360", company: "Datapoint Media", category: "ad", domains: ["*.dpmsrv.com"], totalExecutionTime: 578723, totalOccurrences: 371 }, { name: "Audience Science", category: "ad", domains: ["*.revsci.net"] }, { name: "AudienceSearch", company: "Intimate Merger", category: "ad", domains: ["*.im-apps.net"], totalExecutionTime: 9114981, totalOccurrences: 46726 }, { name: "Auditorius", category: "ad", domains: ["*.audtd.com"] }, { name: "Augur", category: "analytics", domains: ["*.augur.io"] }, { name: "Auto Link Maker", company: "Apple", category: "ad", domains: ["*.apple.com"], examples: ["autolinkmaker.itunes.apple.com"], totalExecutionTime: 657122, totalOccurrences: 2479 }, { name: "Autopilot", category: "ad", domains: ["*.autopilothq.com"], totalExecutionTime: 15490,
    totalOccurrences: 74 }, { name: "Avail", company: "RichRelevance", category: "ad", domains: ["*.avail.net"] }, { name: "AvantLink", category: "ad", domains: ["*.avmws.com"], totalExecutionTime: 417, totalOccurrences: 8 }, { name: "Avco Systems", category: "utility", domains: ["*.avcosystems.com"] }, { name: "Avid Media", category: "customer-success", domains: ["*.adspdbl.com", "*.metadsp.co.uk"], totalExecutionTime: 58, totalOccurrences: 1 }, { name: "Avocet Systems", category: "ad", domains: ["*.avocet.io", "ads.avct.cloud"] }, { name: "Avora", category: "analytics", domains: ["*.truedash.com"], examples: ["truetag.truedash.com"] }, { name: "Azure Traffic Manager", company: "Microsoft", category: "other", domains: ["*.gateway.net", "*.trafficmanager.net"], examples: ["analytics.gateway.net"], totalExecutionTime: 51660, totalOccurrences: 148 }, { name: "Azure Web Services", company: "Microsoft", category: "cdn", domains: ["*.azurewebsites.net", "*.azureedge.net", "*.msedge.net", "*\
.windows.net"], totalExecutionTime: 35665078, totalOccurrences: 51378 }, { name: "BAM", category: "analytics", domains: ["*.bam-x.com"] }, { name: "Baifendian Technology", category: "marketing", domains: ["*.baifendian.com"] }, { name: "Bankrate", category: "utility", domains: ["*.bankrate.com"] }, { name: "BannerFlow", company: "Nordic Factory Solutions", category: "ad", domains: ["*.bannerflow.com"], totalExecutionTime: 50455, totalOccurrences: 42 }, { name: "Barclaycard SmartPay", company: "Barclaycard", category: "utility", domains: ["*.barclaycardsmartpay.com"] }, { name: "Barilliance", category: "analytics", domains: ["*.barilliance.net", "dn3y71tq7jf07.cloudfront.net"], totalExecutionTime: 7250, totalOccurrences: 26 }, { name: "Barnebys", category: "other", domains: ["*.barnebys.com"], totalExecutionTime: 59682, totalOccurrences: 57 }, { name: "Basis", company: "Basis Technologies", category: "ad", homepage: "https://basis.net/", domains: ["*.basis.net"], examples: ["cdn01.basis\
.net"], totalExecutionTime: 215661, totalOccurrences: 2623 }, { name: "Batch Media", category: "ad", domains: ["*.t4ft.de"] }, { name: "Bauer Consumer Media", category: "content", domains: ["*.bauercdn.com", "*.greatmagazines.co.uk"], examples: ["www.greatmagazines.co.uk"] }, { name: "Baynote", category: "analytics", domains: ["*.baynote.net"] }, { name: "Bazaarvoice", category: "analytics", domains: ["*.bazaarvoice.com", "*.feedmagnet.com"], totalExecutionTime: 1664795, totalOccurrences: 3375 }, { name: "Beachfront Media", category: "ad", domains: ["*.bfmio.com"], totalExecutionTime: 7782, totalOccurrences: 771 }, { name: "BeamPulse", category: "analytics", domains: ["*.beampulse.com"] }, { name: "Beeswax", category: "ad", domains: ["*.bidr.io"], totalExecutionTime: 5298, totalOccurrences: 12735 }, { name: "Beetailer", category: "social", domains: ["*.beetailer.com"], examples: ["www.beetailer.com"] }, { name: "Best Of Media S.A.", category: "content", domains: ["*.servebom.com"], totalExecutionTime: 29,
    totalOccurrences: 67 }, { name: "Bet365", category: "ad", domains: ["*.bet365affiliates.com"] }, { name: "Betfair", category: "other", domains: ["*.cdnbf.net"] }, { name: "Betgenius", company: "Genius Sports", category: "content", domains: ["*.connextra.com"], totalExecutionTime: 84739, totalOccurrences: 287 }, { name: "Better Banners", category: "ad", domains: ["*.betterbannerscloud.com"] }, { name: "Better Business Bureau", category: "analytics", domains: ["*.bbb.org"], totalExecutionTime: 10819, totalOccurrences: 78 }, { name: "Between Digital", category: "ad", domains: ["*.betweendigital.com"], totalExecutionTime: 88306, totalOccurrences: 787 }, { name: "BidTheatre", category: "ad", domains: ["*.bidtheatre.com"], totalExecutionTime: 23106, totalOccurrences: 252 }, { name: "Bidtellect", category: "ad", domains: ["*.bttrack.com"], totalExecutionTime: 2834, totalOccurrences: 19 }, { name: "Bigcommerce", category: "marketing", domains: ["*.bigcommerce.com"], totalExecutionTime: 45747978,
    totalOccurrences: 19595 }, { name: "BitGravity", company: "Tata Communications", category: "content", domains: ["*.bitgravity.com"] }, { name: "Bitly", category: "utility", domains: ["*.bitly.com", "*.lemde.fr", "*.bit.ly"], totalExecutionTime: 2977, totalOccurrences: 8 }, { name: "Bizible", category: "ad", domains: ["*.bizible.com", "*.bizibly.com"], totalExecutionTime: 435247, totalOccurrences: 1186 }, { name: "Bizrate", category: "analytics", domains: ["*.bizrate.com"], totalExecutionTime: 11197, totalOccurrences: 57 }, { name: "BlastCasta", category: "social", domains: ["*.poweringnews.com"], examples: ["www.poweringnews.com"] }, { name: "Blindado", category: "utility", domains: ["*.siteblindado.com"], totalExecutionTime: 41, totalOccurrences: 1 }, { name: "Blis", category: "ad", domains: ["*.blismedia.com"] }, { name: "Blogg.se", category: "hosting", domains: ["*.cdnme.se", "*.publishme.se"] }, { name: "BloomReach", category: "ad", domains: ["*.brcdn.com", "*.brsrvr.com", "*.b\
rsvr.com"], totalExecutionTime: 2695, totalOccurrences: 47 }, { name: "Bloomberg", category: "content", domains: ["*.gotraffic.net"] }, { name: "Shop Logic", company: "BloomReach", category: "marketing", domains: ["*.goshoplogic.com"] }, { name: "Blue State Digital", category: "ad", domains: ["*.bsd.net"] }, { name: "Blue Triangle Technologies", category: "analytics", domains: ["*.btttag.com"], totalExecutionTime: 102966, totalOccurrences: 182 }, { name: "BlueCava", category: "ad", domains: ["*.bluecava.com"], totalExecutionTime: 466075, totalOccurrences: 5165 }, { name: "BlueKai", company: "Oracle", category: "ad", domains: ["*.bkrtx.com", "*.bluekai.com"], totalExecutionTime: 4, totalOccurrences: 6 }, { name: "Bluecore", category: "analytics", domains: ["*.bluecore.com"], examples: ["www.bluecore.com"], totalExecutionTime: 83612, totalOccurrences: 225 }, { name: "Bluegg", category: "hosting", domains: ["d1va5oqn59yrvt.cloudfront.net"] }, { name: "Bold Commerce", category: "utility", domains: [
    "*.shappify-cdn.com", "*.shappify.com", "*.boldapps.net"], totalExecutionTime: 5072681, totalOccurrences: 9886 }, { name: "BoldChat", company: "LogMeIn", category: "customer-success", domains: ["*.boldchat.com"] }, { name: "Bombora", category: "ad", domains: ["*.mlno6.com"] }, { name: "Bonnier", category: "content", domains: ["*.bonniercorp.com"] }, { name: "Bookatable", category: "content", domains: ["*.bookatable.com", "*.livebookings.com"] }, { name: "Booking.com", category: "content", domains: ["*.bstatic.com"], totalExecutionTime: 1652677, totalOccurrences: 2448 }, { name: "Boomtrain", category: "ad", domains: ["*.boomtrain.com", "*.boomtrain.net"], totalExecutionTime: 360072, totalOccurrences: 2169 }, { name: "BoostSuite", category: "ad", domains: ["*.poweredbyeden.com"] }, { name: "Boostable", category: "ad", domains: ["*.boostable.com"] }, { name: "Bootstrap Chinese network", category: "cdn", domains: ["*.bootcss.com"], totalExecutionTime: 427117, totalOccurrences: 881 }, {
    name: "Booxscale", category: "ad", domains: ["*.booxscale.com"] }, { name: "Borderfree", company: "pitney bowes", category: "utility", domains: ["*.borderfree.com", "*.fiftyone.com"] }, { name: "BowNow", category: "analytics", homepage: "https://bow-now.jp/", domains: ["*.bownow.jp"], examples: ["contents.bownow.jp"], totalExecutionTime: 1298132, totalOccurrences: 2410 }, { name: "Box", category: "hosting", domains: ["*.box.com"], totalExecutionTime: 15191, totalOccurrences: 223 }, { name: "Boxever", category: "analytics", domains: ["*.boxever.com"] }, { name: "Braintree Payments", company: "Paypal", category: "utility", domains: ["*.braintreegateway.com"], totalExecutionTime: 171291, totalOccurrences: 1141 }, { name: "Branch Metrics", category: "ad", domains: ["*.branch.io", "*.app.link"], totalExecutionTime: 441792, totalOccurrences: 8288 }, { name: "Brand Finance", category: "other", domains: ["*.brandirectory.com"] }, { name: "Brand View", category: "analytics", domains: ["*.br\
andview.com"] }, { name: "Brandscreen", category: "ad", domains: ["*.rtbidder.net"], examples: ["match.rtbidder.net"] }, { name: "BridgeTrack", company: "Sapient", category: "ad", domains: ["*.bridgetrack.com"] }, { name: "BrightRoll", company: "Yahoo!", category: "ad", domains: ["*.btrll.com"] }, { name: "BrightTag / Signal", company: "Signal", homepage: "https://www.signal.co", category: "tag-manager", domains: ["*.btstatic.com", "*.thebrighttag.com"] }, { name: "Brightcove ZenCoder", company: "Brightcove", category: "other", domains: ["*.zencoder.net"] }, { name: "Bronto Software", category: "marketing", domains: ["*.bm23.com", "*.bronto.com", "*.brontops.com"] }, { name: "Browser-Update.org", category: "other", domains: ["*.browser-update.org"] }, { name: "Buffer", category: "social", domains: ["*.bufferapp.com"], totalExecutionTime: 535, totalOccurrences: 7 }, { name: "Bugsnag", category: "utility", domains: ["*.bugsnag.com", "d2wy8f7a9ursnm.cloudfront.net"], examples: ["notify.bu\
gsnag.com"], totalExecutionTime: 6197502, totalOccurrences: 15069 }, { name: "Burst Media", category: "ad", domains: ["*.burstnet.com", "*.1rx.io"], examples: ["usermatch.burstnet.com"], totalExecutionTime: 1618, totalOccurrences: 52 }, { name: "Burt", category: "analytics", domains: ["*.richmetrics.com", "*.burt.io"] }, { name: "Business Message", category: "ad", domains: ["*.message-business.com"], totalExecutionTime: 7310, totalOccurrences: 21 }, { name: "Business Week", company: "Bloomberg", category: "social", domains: ["*.bwbx.io"], totalExecutionTime: 67737, totalOccurrences: 9 }, { name: "Buto", company: "Big Button", category: "ad", domains: ["*.buto.tv"] }, { name: "Button", category: "ad", domains: ["*.btncdn.com"] }, { name: "BuySellAds", category: "ad", domains: ["*.buysellads.com", "*.buysellads.net"], totalExecutionTime: 179225, totalOccurrences: 170 }, { name: "BuySight (AOL)", category: "ad", domains: ["*.pulsemgr.com"] }, { name: "Buyapowa", category: "ad", domains: [
    "*.co-buying.com"], totalExecutionTime: 3038, totalOccurrences: 37 }, { name: "BuzzFeed", category: "social", domains: ["*.buzzfed.com", "*.buzzfeed.com"], totalExecutionTime: 14608, totalOccurrences: 2 }, { name: "C1X", category: "ad", domains: ["*.c1exchange.com"] }, { name: "C3 Metrics", category: "analytics", domains: ["*.c3tag.com"], totalExecutionTime: 18122, totalOccurrences: 153 }, { name: "CANDDi", company: "Campaign and Digital Intelligence", category: "ad", domains: ["*.canddi.com"], totalExecutionTime: 84756, totalOccurrences: 150 }, { name: "CCM benchmark Group", category: "social", domains: ["*.ccm2.net"] }, { name: "CD Networks", category: "utility", domains: ["*.gccdn.net"] }, { name: "CDN Planet", category: "analytics", domains: ["*.cdnplanet.com"] }, { name: "InAuth", category: "utility", homepage: "https://www.inauth.com/", domains: ["*.cdn-net.com"], examples: ["uk.cdn-net.com"], totalExecutionTime: 306346, totalOccurrences: 298 }, { name: "CJ Affiliate", company: "\
Conversant", category: "ad", domains: ["*.cj.com", "*.dpbolvw.net"], totalExecutionTime: 7725, totalOccurrences: 17 }, { name: "CJ Affiliate by Conversant", company: "Conversant", category: "ad", domains: ["*.ftjcfx.com"], totalExecutionTime: 8, totalOccurrences: 4 }, { name: "CNBC", category: "content", domains: ["*.cnbc.com"], totalExecutionTime: 11468, totalOccurrences: 12 }, { name: "CNET Content Solutions", company: "CBS Interactive", category: "content", domains: ["*.cnetcontent.com"], examples: ["cdn.cnetcontent.com", "ws.cnetcontent.com"] }, { name: "CPEx", category: "content", domains: ["*.cpex.cz"], totalExecutionTime: 763356, totalOccurrences: 1104 }, { name: "CPXi", category: "ad", domains: ["*.cpxinteractive.com"] }, { name: "CUBED Attribution", company: "CUBED", category: "ad", domains: ["*.withcubed.com"], examples: ["data.withcubed.com"] }, { name: "Cachefly", category: "utility", domains: ["*.cachefly.net"], totalExecutionTime: 128046, totalOccurrences: 258 }, { name: "\
Calendly", category: "other", domains: ["*.calendly.com"], totalExecutionTime: 8622733, totalOccurrences: 4604 }, { name: "CallRail", category: "analytics", domains: ["*.callrail.com"], totalExecutionTime: 8080185, totalOccurrences: 29537 }, { name: "CallTrackingMetrics", category: "analytics", domains: ["*.tctm.co"], totalExecutionTime: 1981698, totalOccurrences: 7503 }, { name: "Canned Banners", category: "ad", domains: ["*.cannedbanners.com"] }, { name: "Canopy Labs", category: "analytics", domains: ["*.canopylabs.com"] }, { name: "Capita", category: "utility", domains: ["*.crcom.co.uk"], examples: ["emmsrep.crcom.co.uk"] }, { name: "Captify Media", category: "ad", domains: ["*.cpx.to"], totalExecutionTime: 1519, totalOccurrences: 31 }, { name: "Captiify", category: "ad", domains: ["*.captifymedia.com"] }, { name: "Captivate Ai", category: "ad", domains: ["*.captivate.ai"] }, { name: "Captora", category: "marketing", domains: ["*.captora.com"] }, { name: "Carcloud", category: "other",
    domains: ["*.carcloud.co.uk"] }, { name: "Cardlytics", category: "ad", domains: ["*.cardlytics.com"] }, { name: "Cardosa Enterprises", category: "analytics", domains: ["*.y-track.com"], totalExecutionTime: 778, totalOccurrences: 17 }, { name: "Caspian Media", category: "ad", domains: ["*.caspianmedia.com"] }, { name: "Cast", category: "utility", domains: ["*.cast.rocks"] }, { name: "Catch", category: "other", domains: ["*.getcatch.com"], examples: ["app.getcatch.com", "assets.getcatch.com", "js.getcatch.com"], totalExecutionTime: 18282, totalOccurrences: 40 }, { name: "Cavisson", category: "analytics", domains: ["*.cavisson.com"] }, { name: "Cedato", category: "ad", domains: ["*.algovid.com", "*.vdoserv.com"] }, { name: "Celebrus Technologies", category: "analytics", domains: ["*.celebrus.com"] }, { name: "Celtra", category: "ad", domains: ["*.celtra.com"], totalExecutionTime: 369517, totalOccurrences: 427 }, { name: "Centro", category: "ad", domains: ["*.brand-server.com"] }, { name: "\
Ceros", category: "other", domains: ["ceros.com", "view.ceros.com"], totalExecutionTime: 64139, totalOccurrences: 149 }, { name: "Ceros Analytics", company: "Ceros", category: "analytics", domains: ["api.ceros.com"] }, { name: "Certona", category: "analytics", domains: ["*.certona.net"], totalExecutionTime: 376, totalOccurrences: 4 }, { name: "Certum", category: "utility", domains: ["*.ocsp-certum.com", "*.certum.pl"], totalExecutionTime: 8544, totalOccurrences: 3 }, { name: "Cgrdirect", category: "other", domains: ["*.cgrdirect.co.uk"] }, { name: "Channel 5 Media", category: "ad", domains: ["*.five.tv"] }, { name: "Channel.me", category: "customer-success", domains: ["*.channel.me"] }, { name: "ChannelAdvisor", category: "ad", domains: ["*.channeladvisor.com", "*.searchmarketing.com"], totalExecutionTime: 3385, totalOccurrences: 25 }, { name: "ChannelApe", company: "ChannelApe", category: "other", homepage: "https://www.channelape.com/", domains: ["*.channelape.com"], examples: ["call\
backs.channelape.com"] }, { name: "Chargeads Oscar", company: "Chargeads", category: "ad", domains: ["*.chargeads.com"] }, { name: "Charities Aid Foundation", category: "utility", domains: ["*.cafonline.org"], totalExecutionTime: 4368, totalOccurrences: 7 }, { name: "Chartbeat", category: "analytics", domains: ["*.chartbeat.com", "*.chartbeat.net"], totalExecutionTime: 1270560, totalOccurrences: 6246 }, { name: "Cheapflights Media", company: "Momondo", category: "content", domains: ["*.momondo.net"] }, { name: "CheckM8", category: "ad", domains: ["*.checkm8.com"] }, { name: "CheckRate", company: "FreeStart", category: "utility", domains: ["*.checkrate.co.uk"] }, { name: "Checkfront", category: "other", domains: ["*.checkfront.com", "dcg3jth5savst.cloudfront.net"], totalExecutionTime: 279282, totalOccurrences: 152 }, { name: "CheetahMail", company: "Experian", category: "ad", domains: ["*.chtah.com"] }, { name: "Chitika", category: "ad", domains: ["*.chitika.net"] }, { name: "ChoiceStre\
am", category: "ad", domains: ["*.choicestream.com"] }, { name: "Cint", category: "social", domains: ["*.cint.com"], totalExecutionTime: 111659, totalOccurrences: 33 }, { name: "Civic", category: "hosting", domains: ["*.civiccomputing.com"], totalExecutionTime: 2815742, totalOccurrences: 7253 }, { name: "ClearRise", category: "customer-success", domains: ["*.clearrise.com"] }, { name: "Clearstream", category: "ad", domains: ["*.clrstm.com"] }, { name: "Clerk.io ApS", category: "analytics", domains: ["*.clerk.io"], totalExecutionTime: 1196778, totalOccurrences: 1915 }, { name: "CleverDATA", category: "ad", domains: ["*.1dmp.io"] }, { name: "CleverTap", category: "analytics", domains: ["d2r1yp2w7bby2u.cloudfront.net"], totalExecutionTime: 163519, totalOccurrences: 1321 }, { name: "Click Density", category: "analytics", domains: ["*.clickdensity.com"] }, { name: "Click4Assistance", category: "customer-success", domains: ["*.click4assistance.co.uk"], totalExecutionTime: 22710, totalOccurrences: 178 },
    { name: "ClickDesk", category: "customer-success", domains: ["*.clickdesk.com", "d1gwclp1pmzk26.cloudfront.net"], totalExecutionTime: 74975, totalOccurrences: 595 }, { name: "ClickDimensions", category: "ad", domains: ["*.clickdimensions.com"], totalExecutionTime: 125295, totalOccurrences: 262 }, { name: "Clickadu (Winner Solutions)", category: "ad", domains: ["*.clickadu.com"], totalExecutionTime: 10740, totalOccurrences: 4 }, { name: "Clickagy Audience Lab", company: "Clickagy", category: "ad", domains: ["*.clickagy.com"], examples: ["aorta.clickagy.com"], totalExecutionTime: 44558, totalOccurrences: 667 }, { name: "Clickio", category: "ad", domains: [] }, { name: "Clicktale", category: "analytics", domains: ["*.cdngc.net", "*.clicktale.net"], examples: ["clicktalecdn.sslcs.cdngc.net"], totalExecutionTime: 288716, totalOccurrences: 256 }, { name: "Clicktripz", category: "content", domains: ["*.clicktripz.com"], examples: ["static.clicktripz.com", "www.clicktripz.com"], totalExecutionTime: 502041,
    totalOccurrences: 354 }, { name: "Clik.com Websites", category: "content", domains: ["*.clikpic.com"] }, { name: "Cloud Technologies", category: "ad", domains: ["*.behavioralengine.com", "*.behavioralmailing.com"] }, { name: "Cloud-A", category: "other", domains: ["*.bulkstorage.ca"] }, { name: "Cloud.typography", company: "Hoefler &amp; Co", category: "cdn", domains: ["*.typography.com"], totalExecutionTime: 3308, totalOccurrences: 364 }, { name: "CloudSponge", category: "ad", domains: ["*.cloudsponge.com"] }, { name: "CloudVPS", category: "other", domains: ["*.adoftheyear.com", "*.objectstore.eu"] }, { name: "Cloudinary", category: "content", domains: ["*.cloudinary.com"], totalExecutionTime: 1188126, totalOccurrences: 2129 }, { name: "Cloudqp", company: "Cloudwp", category: "other", domains: ["*.cloudwp.io"] }, { name: "Cludo", category: "utility", domains: ["*.cludo.com"], totalExecutionTime: 25376, totalOccurrences: 249 }, { name: "Cognesia", category: "marketing", domains: ["\
*.intelli-direct.com"] }, { name: "CogoCast", company: "Cogo Labs", category: "ad", domains: ["*.cogocast.net"] }, { name: "Colbenson", category: "utility", domains: ["*.colbenson.com"] }, { name: "Collective", category: "ad", domains: ["*.collective-media.net"] }, { name: "Com Laude", category: "other", domains: ["*.gdimg.net"] }, { name: "Comm100", category: "customer-success", domains: ["*.comm100.com"], totalExecutionTime: 469389, totalOccurrences: 1045 }, { name: "CommerceHub", category: "marketing", domains: ["*.mercent.com"] }, { name: "Commission Factory", category: "ad", domains: ["*.cfjump.com"], totalExecutionTime: 961, totalOccurrences: 12 }, { name: "Communicator", category: "ad", domains: ["*.communicatorcorp.com", "*.communicatoremail.com"] }, { name: "Comodo", category: "utility", domains: ["*.comodo.com", "*.trust-provider.com", "*.trustlogo.com", "*.usertrust.com", "*.comodo.net"], examples: ["ocsp.trust-provider.com"], totalExecutionTime: 41752, totalOccurrences: 34 },
    { name: "Comodo Certificate Authority", company: "Comodo", category: "utility", domains: ["crt.comodoca.com", "*.comodoca4.com", "ocsp.comodoca.com", "ocsp.usertrust.com", "crt.usertrust.com"], examples: ["ocsp.comodoca4.com"] }, { name: "Compete", company: "Millwood Brown Digital", category: "analytics", domains: ["*.c-col.com", "*.compete.com"] }, { name: "Compuware", category: "analytics", domains: ["*.axf8.net"] }, { name: "Conductrics", category: "analytics", domains: ["*.conductrics.com"], examples: ["cdn-v3.conductrics.com"], totalExecutionTime: 12705, totalOccurrences: 61 }, { name: "Confirmit", category: "analytics", domains: ["*.confirmit.com"], totalExecutionTime: 32100, totalOccurrences: 195 }, { name: "Connatix", category: "ad", domains: ["*.connatix.com"], totalExecutionTime: 6751327, totalOccurrences: 1195 }, { name: "Connect Events", category: "hosting", domains: ["*.connectevents.com.au"] }, { name: "Constant Contact", category: "ad", domains: ["*.ctctcdn.com"], totalExecutionTime: 604932,
    totalOccurrences: 17528 }, { name: "Constructor.io", category: "utility", domains: ["*.cnstrc.com"] }, { name: "Contabo", category: "hosting", domains: ["185.2.100.179"] }, { name: "Content Media Corporation", category: "content", domains: ["*.contentmedia.eu"] }, { name: "ContentSquare", category: "analytics", domains: ["d1m6l9dfulcyw7.cloudfront.net", "*.content-square.net", "*.contentsquare.net"], totalExecutionTime: 3626830, totalOccurrences: 2948 }, { name: "ContextWeb", category: "ad", domains: ["*.contextweb.com"], totalExecutionTime: 32437, totalOccurrences: 1909 }, { name: "Continental Exchange Solutions", category: "utility", domains: ["*.hifx.com"] }, { name: "Converge-Digital", category: "ad", domains: ["*.converge-digital.com"], examples: ["ads.converge-digital.com"] }, { name: "Conversant", category: "analytics", domains: ["*.dotomi.com", "*.dtmpub.com", "*.emjcd.com", "mediaplex.com", "*.tqlkg.com", "*.fastclick.net"], examples: ["www.tqlkg.com"], totalExecutionTime: 6531550,
    totalOccurrences: 54802 }, { name: "Conversant Ad Server", company: "Conversant", category: "ad", domains: ["adfarm.mediaplex.com", "*.mediaplex.com"] }, { name: "Conversant Tag Manager", company: "Conversant", category: "tag-manager", domains: ["*.mplxtms.com"], totalExecutionTime: 14146, totalOccurrences: 58 }, { name: "Conversio", category: "ad", domains: ["*.conversio.com"] }, { name: "Conversion Labs", category: "ad", domains: ["*.net.pl"], examples: ["conversionlabs.net.pl"], totalExecutionTime: 3243395, totalOccurrences: 1898 }, { name: "Conversion Logic", category: "ad", domains: ["*.conversionlogic.net"] }, { name: "Convert Insights", category: "analytics", domains: ["*.convertexperiments.com"], totalExecutionTime: 2575826, totalOccurrences: 4385 }, { name: "ConvertMedia", category: "ad", domains: ["*.admailtiser.com", "*.basebanner.com", "*.cmbestsrv.com", "*.vidfuture.com", "*.zorosrv.com"], examples: ["www.cmbestsrv.com"] }, { name: "Convertro", category: "ad", domains: [
    "*.convertro.com"] }, { name: "Conviva", category: "content", domains: ["*.conviva.com"], totalExecutionTime: 2955, totalOccurrences: 2 }, { name: "Cookie Reports", category: "utility", domains: ["*.cookiereports.com"], totalExecutionTime: 280810, totalOccurrences: 671 }, { name: "Cookie-Script.com", category: "utility", domains: ["*.cookie-script.com"], totalExecutionTime: 15051619, totalOccurrences: 58095 }, { name: "CookieQ", company: "Baycloud Systems", category: "utility", domains: ["*.cookieq.com"] }, { name: "CoolaData", category: "analytics", domains: ["*.cooladata.com"], totalExecutionTime: 1165, totalOccurrences: 15 }, { name: "CopperEgg", category: "analytics", domains: ["*.copperegg.com", "d2vig74li2resi.cloudfront.net"] }, { name: "Council ad Network", category: "ad", domains: ["*.counciladvertising.net"], totalExecutionTime: 18621, totalOccurrences: 94 }, { name: "Covert Pics", category: "content", domains: ["*.covet.pics"], totalExecutionTime: 4496, totalOccurrences: 55 },
    { name: "Cox Digital Solutions", category: "ad", domains: ["*.afy11.net"] }, { name: "Creafi Online Media", category: "ad", domains: ["*.creafi-online-media.com"] }, { name: "Creators", category: "content", domains: ["*.creators.co"] }, { name: "Crimson Hexagon Analytics", company: "Crimson Hexagon", category: "analytics", domains: ["*.hexagon-analytics.com"] }, { name: "Crimtan", category: "ad", domains: ["*.ctnsnet.com"], totalExecutionTime: 59150, totalOccurrences: 74818 }, { name: "Cross Pixel Media", category: "ad", domains: ["*.crsspxl.com"], totalExecutionTime: 493, totalOccurrences: 8 }, { name: "Crosswise", category: "ad", domains: ["*.univide.com"], examples: ["p.univide.com"] }, { name: "Crowd Control", company: "Lotame", category: "ad", domains: ["*.crwdcntrl.net"], totalExecutionTime: 16298725, totalOccurrences: 101196 }, { name: "Crowd Ignite", category: "ad", domains: ["*.crowdignite.com"] }, { name: "CrowdTwist", category: "ad", domains: ["*.crowdtwist.com"] }, { name: "\
Crowdskout", category: "ad", domains: ["*.crowdskout.com"] }, { name: "Crowdynews", category: "social", domains: ["*.breakingburner.com"] }, { name: "Curalate", category: "marketing", domains: ["*.curalate.com", "d116tqlcqfmz3v.cloudfront.net"], totalExecutionTime: 628884, totalOccurrences: 683 }, { name: "Customer Acquisition Cloud", company: "[24]7", category: "ad", domains: ["*.campanja.com"] }, { name: "Customer.io", category: "ad", domains: ["*.customer.io"], totalExecutionTime: 210609, totalOccurrences: 1268 }, { name: "Custora", category: "analytics", domains: ["*.custora.com"] }, { name: "Cxense", category: "ad", domains: ["*.cxense.com", "*.cxpublic.com", "*.emediate.dk", "*.emediate.eu"], totalExecutionTime: 2218364, totalOccurrences: 3708 }, { name: "CyberKnight", company: "Namogoo", category: "utility", domains: ["*.namogoo.com"] }, { name: "CyberSource (Visa)", category: "utility", domains: ["*.authorize.net"], totalExecutionTime: 339030, totalOccurrences: 2682 }, { name: "\
Cybernet Quest", category: "analytics", domains: ["*.cqcounter.com"] }, { name: "D.A. Consortium", category: "ad", domains: ["*.eff1.net"] }, { name: "D4t4 Solutions", category: "analytics", domains: ["*.u5e.com"] }, { name: "DCSL Software", category: "hosting", domains: ["*.dcslsoftware.com"] }, { name: "DMG Media", category: "content", domains: ["*.mol.im", "*.and.co.uk", "*.anm.co.uk", "*.dailymail.co.uk"], totalExecutionTime: 37855, totalOccurrences: 15 }, { name: "DTSCOUT", category: "ad", domains: ["*.dtscout.com"], totalExecutionTime: 645362, totalOccurrences: 8311 }, { name: "Dailykarma", category: "utility", homepage: "https://www.dailykarma.com/", domains: ["*.dailykarma.io"], examples: ["assets.dailykarma.io"], totalExecutionTime: 122378, totalOccurrences: 477 }, { name: "Dailymotion", category: "content", domains: ["*.dailymotion.com", "*.dmxleo.com", "*.dm.gg", "*.pxlad.io", "*.dmcdn.net", "*.sublimevideo.net"], examples: ["ad.pxlad.io", "www.dailymotion.com"], totalExecutionTime: 56076026,
    totalOccurrences: 5142 }, { name: "Dash Hudson", company: "Dash Hudson", category: "content", domains: ["*.dashhudson.com"], examples: ["cdn.dashhudson.com"], totalExecutionTime: 154963, totalOccurrences: 91 }, { name: "Datacamp", category: "utility", domains: ["*.cdn77.org"], totalExecutionTime: 3303608, totalOccurrences: 1181 }, { name: "Datalicious", category: "tag-manager", domains: ["*.supert.ag", "*.optimahub.com"] }, { name: "Datalogix", category: "ad", domains: ["*.nexac.com"] }, { name: "Datawrapper", category: "utility", domains: ["*.datawrapper.de", "*.dwcdn.net"], examples: ["www.datawrapper.de"], totalExecutionTime: 951486, totalOccurrences: 249 }, { name: "Dataxu", category: "marketing", domains: ["*.w55c.net"], totalExecutionTime: 10, totalOccurrences: 5 }, { name: "DatoCMS", homepage: "https://www.datocms.com/", category: "content", domains: ["*.datocms-assets.com"], examples: ["www.datocms-assets.com"] }, { name: "Datonics", category: "ad", domains: ["*.pro-market.\
net"], examples: ["pbid.pro-market.net"], totalExecutionTime: 16955, totalOccurrences: 254 }, { name: "Dealtime", category: "content", domains: ["*.dealtime.com"] }, { name: "Debenhams Geo Location", company: "Debenhams", category: "utility", domains: ["176.74.183.134"] }, { name: "Decibel Insight", category: "analytics", domains: ["*.decibelinsight.net"], totalExecutionTime: 995190, totalOccurrences: 691 }, { name: "Deep Forest Media", company: "Rakuten", category: "ad", domains: ["*.dpclk.com"] }, { name: "DeepIntent", category: "ad", domains: ["*.deepintent.com"], totalExecutionTime: 3875, totalOccurrences: 206 }, { name: "Delicious Media", category: "social", domains: ["*.delicious.com"] }, { name: "Delineo", category: "ad", domains: ["*.delineo.com"], examples: ["www.delineo.com"] }, { name: "Delta Projects AB", category: "ad", domains: ["*.de17a.com"], totalExecutionTime: 90548, totalOccurrences: 382 }, { name: "Demand Media", category: "content", domains: ["*.dmtracker.com"] }, {
    name: "DemandBase", category: "marketing", domains: ["*.demandbase.com"], totalExecutionTime: 393206, totalOccurrences: 2552 }, { name: "DemandJump", category: "analytics", domains: ["*.demandjump.com"] }, { name: "Dennis Publishing", category: "content", domains: ["*.alphr.com"] }, { name: "Devatics", category: "analytics", domains: ["*.devatics.com", "*.devatics.io"] }, { name: "Developer Media", category: "ad", domains: ["*.developermedia.com"], totalExecutionTime: 4416, totalOccurrences: 17 }, { name: "DialogTech", category: "ad", domains: ["*.dialogtech.com"] }, { name: "DialogTech SourceTrak", company: "DialogTech", category: "ad", domains: ["d31y97ze264gaa.cloudfront.net"] }, { name: "DigiCert", category: "utility", domains: ["*.digicert.com"], examples: ["ocsp.digicert.com"], totalExecutionTime: 26560, totalOccurrences: 83 }, { name: "Digioh", category: "ad", domains: ["*.lightboxcdn.com"], totalExecutionTime: 1347082, totalOccurrences: 1303 }, { name: "Digital Look", category: "\
content", domains: ["*.digitallook.com"] }, { name: "Digital Media Exchange", company: "NDN", category: "content", domains: ["*.newsinc.com"] }, { name: "Digital Millennium Copyright Act Services", category: "utility", domains: ["*.dmca.com"], totalExecutionTime: 8820, totalOccurrences: 70 }, { name: "Digital Ocean", category: "other", domains: ["95.85.62.56"] }, { name: "Digital Remedy", category: "ad", domains: ["*.consumedmedia.com"] }, { name: "Digital Window", category: "ad", domains: ["*.awin1.com", "*.zenaps.com"], totalExecutionTime: 195, totalOccurrences: 4 }, { name: "DigitalScirocco", category: "analytics", domains: ["*.digitalscirocco.net"] }, { name: "Digitial Point", category: "utility", domains: ["*.dpstatic.com"] }, { name: "Diligent (Adnetik)", category: "ad", domains: ["*.wtp101.com"] }, { name: "Directed Edge", category: "social", domains: ["*.directededge.com"], examples: ["shopify.directededge.com"], totalExecutionTime: 8371, totalOccurrences: 81 }, { name: "Distri\
bute Travel", category: "ad", domains: ["*.dtrck.net"] }, { name: "District M", category: "ad", domains: ["*.districtm.io"] }, { name: "DistroScale", category: "ad", domains: ["*.jsrdn.com"], totalExecutionTime: 186009, totalOccurrences: 198 }, { name: "Divido", category: "utility", domains: ["*.divido.com"] }, { name: "Dow Jones", category: "content", domains: ["*.dowjones.com", "*.dowjoneson.com"] }, { name: "Drifty Co", category: "utility", domains: ["*.onicframework.com"] }, { name: "Drip", company: "The Numa Group", category: "ad", domains: ["*.getdrip.com"], totalExecutionTime: 120918, totalOccurrences: 1350 }, { name: "Dropbox", category: "utility", domains: ["*.dropboxusercontent.com"], totalExecutionTime: 142552, totalOccurrences: 145 }, { name: "Dyn Real User Monitoring", company: "Dyn", category: "analytics", domains: ["*.jisusaiche.biz", "*.dynapis.com", "*.jisusaiche.com", "*.dynapis.info"], examples: ["beacon.rum.dynapis.com"] }, { name: "DynAdmic", category: "ad", domains: [
    "*.dyntrk.com"] }, { name: "Dynamic Converter", category: "utility", domains: ["*.dynamicconverter.com"], totalExecutionTime: 58723, totalOccurrences: 96 }, { name: "Dynamic Dummy Image Generator", company: "Open Source", category: "utility", domains: ["*.dummyimage.com"] }, { name: "Dynamic Logic", category: "ad", domains: ["*.dl-rms.com", "*.questionmarket.com"] }, { name: "Dynamic Yield", category: "customer-success", domains: ["*.dynamicyield.com"], totalExecutionTime: 3580074, totalOccurrences: 1843 }, { name: "Dynatrace", category: "analytics", domains: ["*.ruxit.com", "js-cdn.dynatrace.com"], totalExecutionTime: 4106731, totalOccurrences: 3221 }, { name: "ec-concier", homepage: "https://ec-concier.com/", category: "marketing", domains: ["*.ec-concier.com"], examples: ["s.ec-concier.com", "gsync.ec-concier.com"] }, { name: "ECT News Network", category: "content", domains: ["*.ectnews.com"] }, { name: "ELITechGroup", category: "analytics", domains: ["*.elitechnology.com"] }, {
    name: "EMAP", category: "content", domains: ["*.emap.com"] }, { name: "EMedia Solutions", category: "ad", domains: ["*.e-shots.eu"], examples: ["www.e-shots.eu"] }, { name: "EQ works", category: "ad", domains: ["*.eqads.com"] }, { name: "ESV Digital", category: "analytics", domains: ["*.esearchvision.com"] }, { name: "Ebiquity", category: "analytics", domains: ["*.ebiquitymedia.com"] }, { name: "Eco Rebates", category: "ad", domains: ["*.ecorebates.com"] }, { name: "Ecwid", category: "hosting", domains: ["*.ecwid.com", "*.shopsettings.com", "d3fi9i0jj23cau.cloudfront.net", "d3j0zfs7paavns.cloudfront.net"], totalExecutionTime: 3757012, totalOccurrences: 4362 }, { name: "Edge Web Fonts", company: "Adobe Systems", category: "cdn", domains: ["*.edgefonts.net"], examples: ["use.edgefonts.net"] }, { name: "Edition Digital", category: "ad", domains: ["*.editiondigital.com"] }, { name: "Edot Web Technologies", category: "hosting", domains: ["*.edot.co.za"] }, { name: "Effective Measure", category: "\
ad", domains: ["*.effectivemeasure.net"], totalExecutionTime: 17, totalOccurrences: 1 }, { name: "Effiliation sa", category: "ad", domains: ["*.effiliation.com"], totalExecutionTime: 108, totalOccurrences: 3 }, { name: "Ekm Systems", category: "analytics", domains: ["*.ekmsecure.com", "*.ekmpinpoint.co.uk"], examples: ["globalstats.ekmsecure.com"], totalExecutionTime: 67875, totalOccurrences: 789 }, { name: "Elastera", category: "hosting", domains: ["*.elastera.net"] }, { name: "Elastic Ad", category: "ad", domains: ["*.elasticad.net"], totalExecutionTime: 30225, totalOccurrences: 137 }, { name: "Elastic Load Balancing", company: "Amazon Web Services", category: "hosting", domains: ["*.105app.com"], examples: ["rhpury.105app.com", "rhxtd.105app.com"] }, { name: "Elecard StreamEye", company: "Elecard", category: "other", domains: ["*.streameye.net"] }, { name: "Elevate", company: "Elevate Technology Solutions", category: "utility", domains: ["*.elevaate.technology"] }, { name: "Elicit",
    category: "utility", domains: ["*.elicitapp.com"] }, { name: "Elogia", category: "ad", domains: ["*.elogia.net"] }, { name: "Email Attitude", company: "1000mercis", category: "ad", domains: ["*.email-attitude.com"] }, { name: "EmailCenter", category: "ad", domains: ["*.emailcenteruk.com"] }, { name: "Embedly", category: "content", domains: ["*.embedly.com", "*.embed.ly"], totalExecutionTime: 5014487, totalOccurrences: 10836 }, { name: "EmpathyBroker Site Search", company: "EmpathyBroker", category: "utility", domains: ["*.empathybroker.com"] }, { name: "Enfusen", category: "analytics", domains: ["*.enfusen.com"] }, { name: "Engadget", company: "Engadget (AOL)", category: "content", domains: ["*.gdgt.com"], examples: ["media.gdgt.com"] }, { name: "Engagio", category: "marketing", domains: ["*.engagio.com"] }, { name: "Ensighten Manage", company: "Ensighten", category: "tag-manager", domains: ["*.levexis.com"] }, { name: "EntityLink", category: "other", domains: ["*.entitytag.co.uk"] },
    { name: "Entrust Datacard", category: "utility", domains: ["*.entrust.com", "*.entrust.net"], examples: ["ocsp.entrust.com", "ocsp.entrust.net"], totalExecutionTime: 14041, totalOccurrences: 3 }, { name: "Equiniti", category: "utility", domains: ["*.equiniti.com"] }, { name: "Errorception", category: "utility", domains: ["*.errorception.com"] }, { name: "Esri ArcGIS", company: "Esri", category: "utility", domains: ["*.arcgis.com", "*.arcgisonline.com"], totalExecutionTime: 21967746, totalOccurrences: 3432 }, { name: "Ethnio", category: "analytics", domains: ["*.ethn.io"] }, { name: "Eulerian Technologies", category: "ad", domains: ["*.eolcdn.com"] }, { name: "Euroland", category: "utility", domains: ["*.euroland.com"], totalExecutionTime: 1, totalOccurrences: 3 }, { name: "European Interactive Digital ad Alli", category: "utility", domains: ["*.edaa.eu"] }, { name: "Eventbrite", category: "hosting", domains: ["*.evbuc.com", "*.eventbrite.co.uk"], totalExecutionTime: 4667, totalOccurrences: 33 },
    { name: "Everflow", category: "analytics", domains: ["*.tp88trk.com"], examples: ["www.tp88trk.com"], totalExecutionTime: 110842, totalOccurrences: 185 }, { name: "Evergage", category: "analytics", domains: ["*.evergage.com", "*.evgnet.com"], examples: ["cdn.evgnet.com"], totalExecutionTime: 1095634, totalOccurrences: 2491 }, { name: "Everquote", category: "content", domains: ["*.evq1.com"] }, { name: "Everyday Health", category: "ad", domains: ["*.agoramedia.com"] }, { name: "Evidon", category: "analytics", domains: ["*.evidon.com"], totalExecutionTime: 1260409, totalOccurrences: 2482 }, { name: "Evolve Media", category: "content", domains: ["*.evolvemediallc.com"] }, { name: "Exactag", category: "ad", domains: ["*.exactag.com"], totalExecutionTime: 662, totalOccurrences: 6 }, { name: "ExoClick", category: "ad", domains: ["*.exoclick.com"], totalExecutionTime: 69348, totalOccurrences: 568 }, { name: "Expedia", category: "content", domains: ["*.travel-assets.com", "*.trvl-media.com",
    "*.trvl-px.com", "*.uciservice.com"], examples: ["www.trvl-px.com", "www.uciservice.com"], totalExecutionTime: 15443, totalOccurrences: 15 }, { name: "Expedia Australia", company: "Expedia", category: "content", domains: ["*.expedia.com.au"], examples: ["www.expedia.com.au"] }, { name: "Expedia Canada", company: "Expedia", category: "content", domains: ["*.expedia.ca"], examples: ["www.expedia.ca"] }, { name: "Expedia France", company: "Expedia", category: "content", domains: ["*.expedia.fr"], examples: ["www.expedia.fr"] }, { name: "Expedia Germany", company: "Expedia", category: "content", domains: ["*.expedia.de"], examples: ["www.expedia.de"] }, { name: "Expedia Italy", company: "Expedia", category: "content", domains: ["*.expedia.it"], examples: ["www.expedia.it"] }, { name: "Expedia Japan", company: "Expedia", category: "content", domains: ["*.expedia.co.jp"], examples: ["www.expedia.co.jp"] }, { name: "Expedia USA", company: "Expedia", category: "content", domains: ["*.exped\
ia.com"], examples: ["www.expedia.com"], totalExecutionTime: 40062, totalOccurrences: 19 }, { name: "Expedia United Kingdom", company: "Expedia", category: "content", domains: ["*.expedia.co.uk"], examples: ["www.expedia.co.uk"] }, { name: "Experian", category: "utility", domains: ["*.audienceiq.com", "*.experian.com", "*.experianmarketingservices.digital"] }, { name: "Experian Cross-Channel Marketing Platform", company: "Experian", category: "marketing", domains: ["*.eccmp.com", "*.ccmp.eu"], totalExecutionTime: 1268, totalOccurrences: 24 }, { name: "Exponea", category: "analytics", domains: ["*.exponea.com"], totalExecutionTime: 154832, totalOccurrences: 1303 }, { name: "Exponential Interactive", category: "ad", domains: ["*.exponential.com"], totalExecutionTime: 5179, totalOccurrences: 120 }, { name: "Extensis WebInk", category: "cdn", domains: ["*.webink.com"] }, { name: "Extole", category: "ad", domains: ["*.extole.com", "*.extole.io"], examples: ["origin.extole.io"], totalExecutionTime: 21067,
    totalOccurrences: 44 }, { name: "Ey-Seren", category: "analytics", domains: ["*.webabacus.com"] }, { name: "EyeView", category: "ad", domains: ["*.eyeviewads.com"] }, { name: "Eyeota", category: "ad", domains: ["*.eyeota.net"], totalExecutionTime: 152570, totalOccurrences: 1827 }, { name: "Ezakus Pretargeting", company: "Ezakus", category: "ad", domains: ["*.ezakus.net"] }, { name: "Ezoic", category: "analytics", domains: ["*.ezoic.net"], totalExecutionTime: 93024, totalOccurrences: 173 }, { name: "FLXone", company: "Teradata", category: "ad", domains: ["*.pangolin.blue", "*.flx1.com", "d2hlpp31teaww3.cloudfront.net", "*.flxpxl.com"], totalExecutionTime: 25037, totalOccurrences: 67 }, { name: "Fairfax Media", category: "content", domains: ["ads.fairfax.com.au", "resources.fairfax.com.au"] }, { name: "Fairfax Media Analtics", company: "Fairfax Media", category: "analytics", domains: ["analytics.fairfax.com.au"] }, { name: "Falk Technologies", category: "ad", domains: ["*.angsrvr.com"] },
    { name: "Fanplayr", category: "analytics", domains: ["*.fanplayr.com", "d38nbbai6u794i.cloudfront.net"], totalExecutionTime: 69669, totalOccurrences: 154 }, { name: "Fast Thinking", company: "NE Marketing", category: "marketing", domains: ["*.fast-thinking.co.uk"] }, { name: "Fastest Forward", category: "analytics", domains: ["*.gaug.es"], totalExecutionTime: 13583, totalOccurrences: 261 }, { name: "Fastly", category: "utility", domains: ["*.fastly.net"], totalExecutionTime: 21362072, totalOccurrences: 9582 }, { name: "Feedbackify", company: "InsideMetrics", category: "analytics", domains: ["*.feedbackify.com"], totalExecutionTime: 42808, totalOccurrences: 173 }, { name: "Feefo.com", company: "Feefo", category: "analytics", domains: ["*.feefo.com"], totalExecutionTime: 1362284, totalOccurrences: 2025 }, { name: "Fidelity Media", category: "ad", domains: ["*.fidelity-media.com"], examples: ["x.fidelity-media.com"] }, { name: "Filestack", category: "content", domains: ["*.filepicker.\
io"], examples: ["api.filepicker.io", "dialog.filepicker.io", "www.filepicker.io"], totalExecutionTime: 27297, totalOccurrences: 200 }, { name: "Finsbury Media", category: "ad", domains: ["*.finsburymedia.com"], totalExecutionTime: 3470, totalOccurrences: 12 }, { name: "Firepush", category: "utility", domains: ["*.firepush.io"] }, { name: "FirstImpression", category: "ad", domains: ["*.firstimpression.io"], totalExecutionTime: 141056, totalOccurrences: 107 }, { name: "Fit Analytics", category: "other", domains: ["*.fitanalytics.com"], examples: ["integrations.fitanalytics.com", "widget.fitanalytics.com", "metrics.fitanalytics.com"] }, { name: "Fits Me", category: "analytics", domains: ["*.fits.me"] }, { name: "Fivetran", category: "analytics", domains: ["*.fivetran.com"], totalExecutionTime: 2922, totalOccurrences: 3 }, { name: "FlexShopper", category: "utility", domains: ["*.flexshopper.com"] }, { name: "Flickr", category: "content", domains: ["*.flickr.com", "*.staticflickr.com"], totalExecutionTime: 262262,
    totalOccurrences: 524 }, { name: "Flipboard", category: "social", domains: ["*.flipboard.com"], totalExecutionTime: 50049, totalOccurrences: 41 }, { name: "Flipdesk", category: "customer-success", homepage: "https://flipdesk.jp/", domains: ["*.flipdesk.jp"], examples: ["api.flipdesk.jp"], totalExecutionTime: 322297, totalOccurrences: 411 }, { name: "Flipp", category: "analytics", domains: ["*.wishabi.com", "d2e0sxz09bo7k2.cloudfront.net", "*.wishabi.net"] }, { name: "Flite", category: "ad", domains: ["*.flite.com"] }, { name: "Flixmedia", category: "analytics", domains: ["*.flix360.com", "*.flixcar.com", "*.flixfacts.com", "*.flixsyndication.net", "*.flixfacts.co.uk"], totalExecutionTime: 32827, totalOccurrences: 19 }, { name: "Flockler", category: "ad", domains: ["*.flockler.com"], totalExecutionTime: 504051, totalOccurrences: 1297 }, { name: "Flowplayer", category: "content", domains: ["*.flowplayer.org"], totalExecutionTime: 218859, totalOccurrences: 862 }, { name: "Flowzymes Ky",
    category: "cdn", domains: ["*.jquerytools.org"] }, { name: "Fomo", category: "ad", domains: ["*.notifyapp.io"] }, { name: "Fonecall", category: "analytics", domains: ["*.web-call-analytics.com"] }, { name: "Fontdeck", category: "cdn", domains: ["*.fontdeck.com"] }, { name: "Foodity Technologies", category: "ad", domains: ["*.foodity.com"] }, { name: "Force24", category: "ad", domains: ["*.force24.co.uk"], totalExecutionTime: 10225, totalOccurrences: 112 }, { name: "ForeSee", company: "Answers", category: "analytics", domains: ["*.4seeresults.com", "*.answerscloud.com", "*.foresee.com", "*.foreseeresults.com"], totalExecutionTime: 179704, totalOccurrences: 266 }, { name: "Forensiq", category: "utility", domains: ["*.fqtag.com"], totalExecutionTime: 21937, totalOccurrences: 171 }, { name: "Fort Awesome", category: "cdn", domains: ["*.fortawesome.com"], totalExecutionTime: 652365, totalOccurrences: 3635 }, { name: "Forter", category: "utility", domains: ["*.forter.com"], totalExecutionTime: 6578955,
    totalOccurrences: 6930 }, { name: "Forward Internet Group", category: "hosting", domains: ["*.f3d.io"] }, { name: "Forward3D", category: "ad", domains: ["*.forward3d.com"] }, { name: "Fospha", category: "analytics", domains: ["*.fospha.com"], examples: ["router.fospha.com"] }, { name: "Foursixty", category: "customer-success", domains: ["*.foursixty.com"] }, { name: "FoxyCart", category: "utility", domains: ["*.foxycart.com"], totalExecutionTime: 361777, totalOccurrences: 669 }, { name: "Fraudlogix", category: "utility", domains: ["*.yabidos.com"], totalExecutionTime: 47637, totalOccurrences: 357 }, { name: "FreakOut", category: "ad", domains: ["*.fout.jp"], totalExecutionTime: 114328, totalOccurrences: 2036 }, { name: "Freespee", category: "customer-success", domains: ["*.freespee.com"], examples: ["analytics.freespee.com"], totalExecutionTime: 67626, totalOccurrences: 484 }, { name: "Freetobook", category: "content", domains: ["*.freetobook.com"], examples: ["www.freetobook.com"],
    totalExecutionTime: 297146, totalOccurrences: 649 }, { name: "Fresh 8 Gaming", category: "ad", domains: ["*.fresh8.co"], totalExecutionTime: 319849, totalOccurrences: 76 }, { name: "Fresh Relevance", category: "analytics", domains: ["*.freshrelevance.com", "*.cloudfront.ne", "d1y9qtn9cuc3xw.cloudfront.net", "d81mfvml8p5ml.cloudfront.net", "dkpklk99llpj0.cloudfront.net"], examples: ["d1y9qtn9cuc3xw.cloudfront.ne"], totalExecutionTime: 91181, totalOccurrences: 300 }, { name: "Friendbuy", category: "ad", domains: ["*.friendbuy.com", "djnf6e5yyirys.cloudfront.net"], totalExecutionTime: 17783, totalOccurrences: 150 }, { name: "Frienefit", category: "ad", domains: ["*.frienefit.com"] }, { name: "FuelX", category: "ad", domains: ["*.fuelx.com"] }, { name: "Full Circle Studies", category: "analytics", domains: ["*.securestudies.com"] }, { name: "FullStory", category: "analytics", domains: ["*.fullstory.com"], examples: ["rs.fullstory.com"], totalExecutionTime: 11575233, totalOccurrences: 14687 },
    { name: "Fyber", category: "ad", domains: ["*.fyber.com"] }, { name: "G-Forces Web Management", category: "hosting", domains: ["*.gforcesinternal.co.uk"] }, { name: "G4 Native", company: "Gravity4", category: "ad", domains: ["*.triggit.com"] }, { name: "GET ME IN!  (TicketMaster)", category: "content", domains: ["*.getmein.com"] }, { name: "GIPHY", category: "content", domains: ["*.giphy.com"], totalExecutionTime: 4831, totalOccurrences: 6 }, { name: "GainCloud", company: "GainCloud Systems", category: "other", domains: ["*.egaincloud.net"] }, { name: "Gath Adams", category: "content", domains: ["*.iwantthatflight.com.au"] }, { name: "Gecko Tribe", category: "social", domains: ["*.geckotribe.com"] }, { name: "Gemius", category: "ad", domains: ["*.gemius.pl"], totalExecutionTime: 2964756, totalOccurrences: 15596 }, { name: "Genesis Media", category: "ad", domains: ["*.bzgint.com", "*.genesismedia.com", "*.genesismediaus.com"] }, { name: "Genie Ventures", category: "ad", domains: ["*\
.genieventures.co.uk"] }, { name: "Geniee", category: "ad", domains: ["*.href.asia", "*.genieessp.jp", "*.genieesspv.jp", "*.gssprt.jp"], examples: ["cs.gssprt.jp"], totalExecutionTime: 16956055, totalOccurrences: 16354 }, { name: "Geniuslink", category: "analytics", domains: ["*.geni.us"], totalExecutionTime: 897, totalOccurrences: 3 }, { name: "GeoRiot", category: "other", domains: ["*.georiot.com"] }, { name: "GeoTrust", category: "utility", domains: ["*.geotrust.com"], totalExecutionTime: 3300, totalOccurrences: 2 }, { name: "Geoplugin", category: "utility", domains: ["*.geoplugin.com", "*.geoplugin.net"], totalExecutionTime: 119, totalOccurrences: 3 }, { name: "Georeferencer", company: "Klokan Technologies", category: "utility", domains: ["*.georeferencer.com"] }, { name: "GetIntent RTBSuite", company: "GetIntent", category: "ad", domains: ["*.adhigh.net"], totalExecutionTime: 2768, totalOccurrences: 356 }, { name: "GetResponse", category: "ad", domains: ["*.getresponse.com"], totalExecutionTime: 209076,
    totalOccurrences: 1019 }, { name: "GetSiteControl", company: "GetWebCraft", category: "utility", domains: ["*.getsitecontrol.com"], totalExecutionTime: 1739288, totalOccurrences: 3146 }, { name: "GetSocial", category: "social", domains: ["*.getsocial.io"], totalExecutionTime: 1204, totalOccurrences: 11 }, { name: "Getty Images", category: "content", domains: ["*.gettyimages.com", "*.gettyimages.co.uk"], examples: ["www.gettyimages.com"], totalExecutionTime: 17939, totalOccurrences: 65 }, { name: "Gfycat", company: "Gycat", category: "utility", domains: ["*.gfycat.com"] }, { name: "Ghostery Enterprise", company: "Ghostery", category: "marketing", domains: ["*.betrad.com"], totalExecutionTime: 1129, totalOccurrences: 26 }, { name: "Giant Media", category: "ad", domains: ["*.videostat.com"] }, { name: "Gigya", category: "analytics", domains: ["*.gigya.com"], totalExecutionTime: 2692493, totalOccurrences: 1995 }, { name: "GitHub", category: "utility", domains: ["*.github.com", "*.githu\
busercontent.com", "*.github.io", "*.rawgit.com"], examples: ["raw.githubusercontent.com", "cdn.rawgit.com"], totalExecutionTime: 7126491, totalOccurrences: 14675 }, { name: "Gladly", company: "Gladly", homepage: "https://www.gladly.com/", category: "customer-success", domains: ["*.gladly.com"], examples: ["cdn.gladly.com"], totalExecutionTime: 240417, totalOccurrences: 381 }, { name: "Glassdoor", category: "content", domains: ["*.glassdoor.com"], totalExecutionTime: 68877, totalOccurrences: 19 }, { name: "Gleam", category: "marketing", domains: ["*.gleam.io"], totalExecutionTime: 43249, totalOccurrences: 221 }, { name: "Global Digital Markets", category: "ad", domains: ["*.gdmdigital.com"] }, { name: "Global-e", category: "hosting", domains: ["*.global-e.com"], totalExecutionTime: 706185, totalOccurrences: 1314 }, { name: "GlobalSign", category: "utility", domains: ["*.globalsign.com", "*.globalsign.net"], totalExecutionTime: 11228, totalOccurrences: 48 }, { name: "GlobalWebIndex", category: "\
analytics", domains: ["*.globalwebindex.net"] }, { name: "Globase International", category: "ad", domains: ["*.globase.com"] }, { name: "GoDataFeed", category: "other", domains: ["*.godatafeed.com"] }, { name: "Google APIs", company: "Google", category: "utility", domains: ["googleapis.com"] }, { name: "Google Ad Block Detection", company: "Google", category: "ad", domains: ["*.0emn.com", "*.0fmm.com"] }, { name: "Google Analytics Experiments", company: "Google", category: "analytics", domains: ["*.gexperiments1.com"] }, { name: "Google DoubleClick Ad Exchange", company: "Google", category: "ad", domains: ["*.admeld.com"] }, { name: "Google IPV6 Metrics", company: "Google", category: "analytics", domains: ["*.ipv6test.net"] }, { name: "Google Plus", company: "Google", category: "social", domains: ["plus.google.com"], totalExecutionTime: 49945, totalOccurrences: 442 }, { name: "Google Trusted Stores", company: "Google", category: "utility", domains: ["*.googlecommerce.com"], totalExecutionTime: 218,
    totalOccurrences: 5 }, { name: "Google Video", company: "Google", category: "content", domains: ["*.googlevideo.com"], totalExecutionTime: 4, totalOccurrences: 3 }, { name: "Google reCAPTCHA", company: "Google", category: "utility", domains: ["*.recaptcha.net"], examples: ["api.recaptcha.net"], totalExecutionTime: 8694396, totalOccurrences: 25662 }, { name: "GovMetric", company: "ROL Solutions", category: "analytics", domains: ["*.govmetric.com"], totalExecutionTime: 233, totalOccurrences: 6 }, { name: "Granify", category: "analytics", domains: ["*.granify.com"], totalExecutionTime: 19211, totalOccurrences: 24 }, { name: "Grapeshot", category: "ad", domains: ["*.gscontxt.net", "*.grapeshot.co.uk"], totalExecutionTime: 4945, totalOccurrences: 4 }, { name: "Gravity (AOL)", category: "analytics", domains: ["*.grvcdn.com"] }, { name: "Groovy Gecko", category: "content", domains: ["*.ggwebcast.com", "*.groovygecko.net"] }, { name: "GroupM", category: "ad", domains: ["*.qservz.com"] }, {
    name: "Guardian Media", category: "ad", domains: ["*.theguardian.com", "*.guardian.co.uk"], examples: ["oas.theguardian.com"] }, { name: "GumGum", category: "ad", domains: ["*.gumgum.com"], totalExecutionTime: 3440651, totalOccurrences: 167535 }, { name: "Gumtree", category: "content", domains: ["*.gumtree.com"] }, { name: "H264 Codec", company: "Cisco", category: "other", domains: ["*.openh264.org"] }, { name: "HERE", category: "analytics", domains: ["*.medio.com"] }, { name: "HP Optimost", company: "Hewlett-Packard Development Company", category: "marketing", domains: ["*.hp.com", "d2uncb19xzxhzx.cloudfront.net"], examples: ["by.marketinghub.hp.com", "marketinghub.hp.com"], totalExecutionTime: 420577, totalOccurrences: 100 }, { name: "Has Offers", company: "TUNE", category: "ad", domains: ["*.go2cloud.org"], totalExecutionTime: 0, totalOccurrences: 3 }, { name: "Hawk Search", category: "utility", domains: ["*.hawksearch.com"], totalExecutionTime: 15097, totalOccurrences: 132 }, {
    name: "Haymarket Media Group", category: "content", domains: ["*.brandrepublic.com", "*.hbpl.co.uk"] }, { name: "Heap", category: "analytics", domains: ["*.heapanalytics.com"], totalExecutionTime: 5187800, totalOccurrences: 12078 }, { name: "Hearst Communications", category: "content", domains: ["*.h-cdn.co", "*.hearstdigital.com", "*.hearstlabs.com", "*.hearst.io", "*.cdnds.net"] }, { name: "Heatmap", category: "analytics", domains: ["*.heatmap.it"], totalExecutionTime: 7337, totalOccurrences: 141 }, { name: "Heroku", category: "other", domains: ["*.herokuapp.com"], totalExecutionTime: 12602535, totalOccurrences: 14119 }, { name: "Hexton", category: "utility", domains: ["*.hextom.com"], totalExecutionTime: 10806589, totalOccurrences: 24738 }, { name: "Hibernia Networks", category: "utility", domains: ["*.hiberniacdn.com"] }, { name: "High Impact Media", category: "ad", domains: ["*.reactx.com"] }, { name: "Highcharts", category: "utility", domains: ["*.highcharts.com"], totalExecutionTime: 746540,
    totalOccurrences: 3181 }, { name: "Highwinds", category: "utility", domains: ["*.hwcdn.net"] }, { name: "HitsLink", category: "analytics", domains: ["*.hitslink.com"], totalExecutionTime: 1452, totalOccurrences: 29 }, { name: "Hola Networks", category: "other", domains: ["*.h-cdn.com"], totalExecutionTime: 83024, totalOccurrences: 42 }, { name: "Hootsuite", category: "analytics", domains: ["*.hootsuite.com"] }, { name: "HotUKDeals", category: "analytics", domains: ["*.hotukdeals.com"] }, { name: "HotWords", company: "Media Response Group", category: "ad", domains: ["*.hotwords.com.br"] }, { name: "HotelsCombined", category: "content", domains: ["*.datahc.com"], totalExecutionTime: 81, totalOccurrences: 2 }, { name: "Hoverr", category: "ad", domains: ["*.hoverr.media"] }, { name: "Hull.js", category: "utility", domains: ["*.hull.io", "*.hullapp.io"] }, { name: "Hupso Website Analyzer", company: "Hupso", category: "analytics", domains: ["*.hupso.com"], totalExecutionTime: 20892, totalOccurrences: 248 },
    { name: "I-Behavior", company: "WPP", category: "ad", domains: ["*.ib-ibi.com"], totalExecutionTime: 23, totalOccurrences: 35 }, { name: "i-mobile", company: "i-mobile", category: "ad", domains: ["*.i-mobile.co.jp"], examples: ["ssp-sync.i-mobile.co.jp"], totalExecutionTime: 3701005, totalOccurrences: 16595 }, { name: "IBM Digital Analytics", company: "IBM", category: "analytics", domains: ["*.cmcore.com", "coremetrics.com", "data.coremetrics.com", "data.de.coremetrics.com", "libs.de.coremetrics.com", "tmscdn.de.coremetrics.com", "iocdn.coremetrics.com", "libs.coremetrics.com", "tmscdn.coremetrics.com", "*.s81c.com", "*.unica.com", "*.coremetrics.eu"], examples: ["data.coremetrics.eu"], totalExecutionTime: 126790, totalOccurrences: 169 }, { name: "IBM Digital Data Exchange", company: "IBM", category: "tag-manager", domains: ["tagmanager.coremetrics.com"] }, { name: "IBM Tealeaf", company: "IBM", category: "analytics", domains: ["*.ibmcloud.com"], examples: ["uscollector.tealeaf.ibm\
cloud.com"] }, { name: "IBM Acoustic Campaign", company: "IBM", category: "analytics", domains: ["www.sc.pages01.net", "www.sc.pages02.net", "www.sc.pages03.net", "www.sc.pages04.net", "www.sc.pages05.net", "www.sc.pages06.net", "www.sc.pages07.net", "www.sc.pages08.net", "www.sc.pages09.net", "www.sc.pagesA.net"], examples: ["https://www.sc.pages01.net/lp/static/js/iMAWebCookie.js"], totalExecutionTime: 51361, totalOccurrences: 417 }, { name: "ICF Technology", category: "content", domains: ["*.camads.net"] }, { name: "IFDNRG", category: "hosting", domains: ["*.ifdnrg.com"] }, { name: "IMRG", category: "analytics", domains: ["*.peermap.com", "*.imrg.org"], examples: ["benchmarking.imrg.org"] }, { name: "IPONWEB", category: "ad", domains: ["*.company-target.com", "*.liadm.com", "*.iponweb.net", "*.p161.net"], examples: ["pool.udsp.iponweb.net"], totalExecutionTime: 8924906, totalOccurrences: 39154 }, { name: "IQ Mobile", category: "utility", domains: ["*.iqm.cc"] }, { name: "IS Group", category: "\
hosting", domains: ["*.creative-serving.com"], totalExecutionTime: 2127, totalOccurrences: 29 }, { name: "IT Dienstleistungen Tim Prinzkosky", category: "utility", domains: ["*.flaticons.net"] }, { name: "IXI Digital", company: "Equifax", category: "ad", domains: ["*.ixiaa.com"] }, { name: "IcoMoon", category: "cdn", domains: ["d19ayerf5ehaab.cloudfront.net", "d1azc1qln24ryf.cloudfront.net"], totalExecutionTime: 54286, totalOccurrences: 180 }, { name: "IdenTrust", category: "utility", domains: ["*.identrust.com"], totalExecutionTime: 2334, totalOccurrences: 1 }, { name: "Ido", category: "customer-success", domains: ["*.idio.co"], totalExecutionTime: 2222, totalOccurrences: 12 }, { name: "Ignition One", category: "marketing", domains: ["*.searchignite.com"] }, { name: "ImageShack", category: "content", domains: ["*.yfrog.com"] }, { name: "Imagen Studio", category: "utility", domains: ["*.telephonesky.com"] }, { name: "Imagini Holdings", category: "ad", domains: ["*.vdna-assets.com"] }, {
    name: "Img Safe", category: "content", domains: ["*.imgsafe.org"] }, { name: "Imgur", category: "utility", domains: ["*.imgur.com"], totalExecutionTime: 3538, totalOccurrences: 30 }, { name: "Impact Radius", category: "ad", domains: ["*.impactradius-event.com", "*.impactradius-go.com", "*.7eer.net", "d3cxv97fi8q177.cloudfront.net", "*.evyy.net", "*.ojrq.net", "utt.impactcdn.com", "*.sjv.io"], examples: ["a.impactradius-go.com", "microsoft-uk.evyy.net"], totalExecutionTime: 612310, totalOccurrences: 4274 }, { name: "Improve Digital", category: "ad", domains: ["*.360yield.com"], totalExecutionTime: 28784, totalOccurrences: 732 }, { name: "Improvely", category: "analytics", domains: ["*.iljmp.com"], totalExecutionTime: 129, totalOccurrences: 3 }, { name: "InMobi", category: "ad", domains: ["*.inmobi.com"], totalExecutionTime: 24607375, totalOccurrences: 126087 }, { name: "InSkin Media", category: "ad", domains: ["*.inskinad.com", "*.inskinmedia.com"] }, { name: "Inbenta", category: "c\
ustomer-success", domains: ["*.inbenta.com"], totalExecutionTime: 3923, totalOccurrences: 7 }, { name: "Incisive Media", category: "content", domains: ["*.incisivemedia.com"] }, { name: "Indeed", category: "content", domains: ["*.indeed.com"], totalExecutionTime: 81347, totalOccurrences: 55 }, { name: "Index Exchange", company: "WPP", category: "ad", domains: ["*.casalemedia.com", "*.indexww.com"], totalExecutionTime: 892351, totalOccurrences: 32324 }, { name: "Indoona", category: "other", domains: ["*.indoona.com"] }, { name: "Infectious Media", category: "ad", domains: ["*.impdesk.com", "*.impressiondesk.com", "*.inmz.net"] }, { name: "Inference Mobile", category: "ad", domains: ["*.inferencemobile.com"] }, { name: "Infinity Tracking", category: "analytics", domains: ["*.infinity-tracking.net"], totalExecutionTime: 24308, totalOccurrences: 250 }, { name: "Infoline", category: "analytics", domains: ["*.ioam.de"], totalExecutionTime: 8983, totalOccurrences: 95 }, { name: "Infolinks", category: "\
ad", domains: ["*.infolinks.com"], totalExecutionTime: 7995389, totalOccurrences: 5950 }, { name: "Infopark", category: "hosting", domains: ["*.scrvt.com"] }, { name: "Infusionsoft", category: "ad", domains: ["*.infusionsoft.com"], totalExecutionTime: 345182, totalOccurrences: 723 }, { name: "Ink", category: "ad", domains: ["*.inktad.com"] }, { name: "Inktel Contact Center Solutions", company: "Inktel", category: "customer-success", domains: ["*.inktel.com"] }, { name: "Inneractive", category: "ad", domains: ["*.inner-active.mobi"] }, { name: "Innovid", category: "ad", homepage: "https://www.innovid.com/", domains: ["*.innovid.com"], examples: ["ag.innovid.com", "rtr.innovid.com"], totalExecutionTime: 115267, totalOccurrences: 1363 }, { name: "Insight Express", category: "analytics", domains: ["*.insightexpressai.com"], totalExecutionTime: 1, totalOccurrences: 2 }, { name: "Insipio", category: "other", domains: ["*.insipio.com"] }, { name: "Inspectlet", category: "analytics", domains: [
    "*.inspectlet.com"], totalExecutionTime: 7622183, totalOccurrences: 5346 }, { name: "Instansive", category: "utility", domains: ["*.instansive.com"] }, { name: "Instart", homepage: "https://www.instart.com/", category: "utility", domains: ["*.insnw.net"] }, { name: "Instembedder", category: "content", domains: ["*.instaembedder.com"] }, { name: "Instinctive", category: "ad", domains: ["*.instinctiveads.com"] }, { name: "Intelligent Reach", category: "ad", domains: ["*.ist-track.com"] }, { name: "Intent HQ", category: "analytics", domains: ["*.intenthq.com"] }, { name: "Intent IQ", category: "ad", domains: ["*.intentiq.com"], totalExecutionTime: 48447, totalOccurrences: 1146 }, { name: "Intercept Interactive", category: "ad", domains: ["*.undertone.com"], totalExecutionTime: 2293921, totalOccurrences: 21012 }, { name: "Interest Graph", company: "AOL", category: "ad", domains: ["*.gravity.com"] }, { name: "Internet Brands", category: "content", domains: ["*.ibpxl.com"] }, { name: "In\
terpublic Group", category: "ad", domains: ["*.mbww.com"] }, { name: "Interstate", category: "analytics", domains: ["*.interstateanalytics.com"] }, { name: "Interview", category: "analytics", domains: ["*.efm.me"] }, { name: "Intilery", category: "customer-success", domains: ["*.intilery-analytics.com"] }, { name: "Investis", category: "utility", domains: ["*.investis.com"], totalExecutionTime: 244162, totalOccurrences: 282 }, { name: "Investis Flife", category: "hosting", domains: ["*.quartalflife.com"] }, { name: "Invodo", category: "ad", domains: ["*.invodo.com"], examples: ["e.invodo.com"] }, { name: "iSite", category: "analytics", domains: ["*.isitetv.com"], examples: ["static.isitetv.com", "events.isitetv.com"] }, { name: "Issue", category: "content", domains: ["*.issue.by"] }, { name: "J.D. Williams & Co", category: "content", domains: ["*.drct2u.com"] }, { name: "Janrain", category: "analytics", domains: ["*.janrain.com", "*.janrainbackplane.com", "*.rpxnow.com", "d3hmp0045zy3c\
s.cloudfront.net"], totalExecutionTime: 4006, totalOccurrences: 21 }, { name: "Jellyfish", category: "ad", domains: ["*.jellyfish.net"] }, { name: "JetStream", category: "content", domains: ["*.xlcdn.com"] }, { name: "JingDong", category: "content", domains: ["*.3.com", "*.jd.com"], totalExecutionTime: 119043, totalOccurrences: 84 }, { name: "Jivox", category: "ad", domains: ["*.jivox.com"], totalExecutionTime: 31166, totalOccurrences: 65 }, { name: "Jobvite", category: "content", domains: ["*.jobvite.com"], totalExecutionTime: 6667, totalOccurrences: 4 }, { name: "Johnston Press", category: "content", domains: ["*.johnstonpress.co.uk", "*.jpress.co.uk"] }, { name: "Join the Dots (Research)", category: "social", domains: ["*.jtdiscuss.com"] }, { name: "JotForm", category: "utility", domains: ["*.jotformpro.com"] }, { name: "JuicyAds", category: "ad", domains: ["*.juicyads.com"], totalExecutionTime: 543292, totalOccurrences: 2092 }, { name: "JustPremium", category: "ad", domains: ["*.ne\
t.net"], examples: ["d2nvliyzbo36lk.cloudfrontd2nvliyzbo36lk.cloudfront.net.net"] }, { name: "JustPremium Ads", company: "JustPremium", category: "ad", domains: ["*.justpremium.com"], totalExecutionTime: 1061, totalOccurrences: 35 }, { name: "JustUno", category: "ad", domains: ["*.justuno.com", "d2j3qa5nc37287.cloudfront.net"], totalExecutionTime: 773949, totalOccurrences: 1448 }, { name: "KINX (Korea Internet Neutral eXchange)", category: "other", domains: ["*.kinxcdn.com"], totalExecutionTime: 1433, totalOccurrences: 4 }, { name: "KISSmetrics", category: "analytics", domains: ["*.kissmetrics.com", "doug1izaerwt3.cloudfront.net", "dsyszv14g9ymi.cloudfront.net"], totalExecutionTime: 3896, totalOccurrences: 46 }, { name: "Kaizen Platform", category: "analytics", domains: ["*.kaizenplatform.net"], examples: ["cdn.kaizenplatform.net", "log-v4.kaizenplatform.net"], totalExecutionTime: 85284, totalOccurrences: 183 }, { name: "Kakao", category: "social", domains: ["*.daum.net", "*.daumcdn.ne\
t"], totalExecutionTime: 38351047, totalOccurrences: 62730 }, { name: "Kaltura Video Platform", company: "Kaltura", category: "content", domains: ["*.kaltura.com"], examples: ["cdnsecakmi.kaltura.com"], totalExecutionTime: 2164237, totalOccurrences: 1017 }, { name: "Kameleoon", homepage: "https://www.kameleoon.com/", category: "analytics", domains: ["*.kameleoon.com", "*.kameleoon.eu", "*.kameleoon.io"], examples: ["data.kameleoon.io", "kdm3fpv6il.kameleoon.eu"], totalExecutionTime: 2217218, totalOccurrences: 2337 }, { name: "Kampyle", category: "analytics", domains: ["*.kampyle.com"], totalExecutionTime: 413304, totalOccurrences: 702 }, { name: "Kantar", category: "analytics", domains: ["*.sesamestats.com"] }, { name: "Kargo", category: "marketing", domains: ["*.kargo.com"], totalExecutionTime: 48285, totalOccurrences: 1135 }, { name: "KARTE", company: "Plaid", homepage: "https://karte.io/", category: "marketing", domains: ["*.karte.io"], examples: ["static.karte.io", "t.karte.io"], totalExecutionTime: 1712123,
    totalOccurrences: 1729 }, { name: "Kauli", category: "ad", domains: ["*.kau.li"] }, { name: "Keen", company: "Keen", homepage: "https://keen.io/", category: "analytics", domains: ["*.keen.io", "d26b395fwzu5fz.cloudfront.net"], totalExecutionTime: 24210, totalOccurrences: 416 }, { name: "Kelkoo", category: "hosting", domains: ["*.kelkoo.com"] }, { name: "Kenshoo", category: "marketing", domains: ["*.xg4ken.com"], totalExecutionTime: 710, totalOccurrences: 18 }, { name: "Key CDN", category: "utility", domains: ["*.kxcdn.com"], totalExecutionTime: 4814875, totalOccurrences: 10025 }, { name: "Keynote", company: "Dynatrace", category: "analytics", domains: ["*.keynote.com"] }, { name: "Keywee", category: "ad", domains: ["*.keywee.co"], totalExecutionTime: 44984, totalOccurrences: 259 }, { name: "Kiosked", category: "ad", domains: ["*.kiosked.com"], totalExecutionTime: 343355, totalOccurrences: 173 }, { name: "Klarna", category: "utility", domains: ["*.klarna.com"], totalExecutionTime: 1374032,
    totalOccurrences: 10759 }, { name: "Klaviyo", category: "ad", domains: ["*.klaviyo.com"], totalExecutionTime: 113130218, totalOccurrences: 161289 }, { name: "Klevu Search", company: "Klevu", category: "utility", domains: ["*.klevu.com"], totalExecutionTime: 1124647, totalOccurrences: 1463 }, { name: "Klick2Contact", category: "customer-success", domains: ["*.klick2contact.com"] }, { name: "Knight Lab", company: "Northwestern University", category: "utility", domains: ["*.knightlab.com"], totalExecutionTime: 350550, totalOccurrences: 448 }, { name: "Kodajo", category: "other", domains: ["*.kodajo.com"] }, { name: "Komoona", category: "ad", domains: ["*.komoona.com"] }, { name: "Korrelate", company: "JD Power", category: "analytics", domains: ["*.korrelate.net"] }, { name: "LKQD", category: "ad", domains: ["*.lkqd.net"] }, { name: "Layer0", category: "cdn", domains: ["*.layer0.co"], examples: ["rum.layer0.co"] }, { name: "Layershift", category: "hosting", domains: ["109.109.138.174"] },
    { name: "Lead Forensics", category: "ad", domains: ["*.200summit.com", "*.baw5tracker.com", "*.business-path-55.com", "*.bux1le001.com", "*.central-core-7.com", "*.direct-azr-78.com", "*.explore-123.com", "*.forensics1000.com", "*.gldsta-02-or.com", "*.green-bloc9.com", "*.lansrv040.com", "*.lead-123.com", "*.leadforensics.com", "*.mavic852.com", "*.mon-com-net.com", "*.peak-ip-54.com", "*.snta0034.com", "*.svr-prc-01.com", "*.syntace-094.com", "*.tghbn12.com", "*.trail-web.com", "*.web-01-gbl.com", "*.web-cntr-07.com", "*.trackdiscovery.net"], examples: ["www.baw5tracker.com", "www.lansrv040.com", "www.mon-com-net.com", "www.peak-ip-54.com", "www.tghbn12.com", "www.web-01-gbl.com"], totalExecutionTime: 45938, totalOccurrences: 307 }, { name: "Lead Intelligence", company: "Magnetise Solutions", category: "ad", domains: ["*.leadintelligence.co.uk"] }, { name: "LeadLander", category: "analytics", domains: ["*.formalyzer.com", "*.trackalyzer.com"] }, { name: "Leaflet", category: "util\
ity", domains: ["*.leafletjs.com"], totalExecutionTime: 3668, totalOccurrences: 69 }, { name: "LeasdBoxer", company: "LeadBoxer", category: "ad", domains: ["*.leadboxer.com"], totalExecutionTime: 15328, totalOccurrences: 118 }, { name: "LeaseWeb", homepage: "https://www.leaseweb.com/", category: "cdn", domains: ["*.lswcdn.net", "*.leasewebcdn.com"] }, { name: "Leboncoin", category: "content", domains: ["*.leboncoin.fr"] }, { name: "Lengow", category: "hosting", domains: ["*.lengow.com"] }, { name: "Lessbuttons", category: "social", domains: ["*.lessbuttons.com"] }, { name: "Letter Press", category: "ad", domains: ["*.getletterpress.com"] }, { name: "Level 3 Communications", category: "utility", domains: ["footprint.net"] }, { name: "Level3", category: "other", domains: ["secure.footprint.net"] }, { name: "Lifestreet Media", category: "social", domains: ["*.lfstmedia.com"] }, { name: "LiftSuggest", category: "analytics", domains: ["d2blwevgjs7yom.cloudfront.net"] }, { name: "Ligatus", category: "\
ad", domains: ["*.ligadx.com"] }, { name: "LightStep", category: "analytics", domains: ["*.lightstep.com"] }, { name: "LightWidget", category: "utility", domains: ["*.lightwidget.com"], totalExecutionTime: 1825559, totalOccurrences: 9383 }, { name: "Likelihood", company: "LIkeihood", category: "hosting", domains: ["*.likelihood.com"], examples: ["client.likelihood.com"] }, { name: "LikeShop", company: "Dash Hudson", category: "content", domains: ["likeshop.me"], examples: ["likeshop.me"] }, { name: "LINE Corporation", category: "ad", domains: ["*.line-scdn.net", "*.line.me"], examples: ["d.line-scdn.net", "tr.line.me"], totalExecutionTime: 3858282, totalOccurrences: 26881 }, { name: "Linkcious", category: "analytics", domains: ["*.linkcious.com"] }, { name: "Linking Mobile", category: "ad", domains: ["*.linkingmobile.com"] }, { name: "LittleData", category: "analytics", homepage: "https://www.littledata.io/", domains: ["*.littledata.io"], examples: ["transactions.littledata.io"], totalExecutionTime: 832,
    totalOccurrences: 1 }, { name: "LiveBurst", category: "ad", domains: ["*.liveburst.com"] }, { name: "LiveClicker", category: "ad", domains: ["*.liveclicker.net"] }, { name: "LiveHelpNow", category: "customer-success", domains: ["*.livehelpnow.net"], totalExecutionTime: 284671, totalOccurrences: 819 }, { name: "LiveInternet", category: "analytics", domains: ["*.yadro.ru"] }, { name: "LiveJournal", category: "social", domains: ["*.livejournal.com", "*.livejournal.net"], totalExecutionTime: 63532309, totalOccurrences: 9109 }, { name: "LivePerson", category: "customer-success", homepage: "https://www.liveperson.com/", domains: ["*.liveperson.com", "*.look.io", "*.liveperson.net", "*.lpsnmedia.net"], totalExecutionTime: 1930619, totalOccurrences: 2544 }, { name: "LiveRail", company: "Facebook", category: "ad", domains: ["*.liverail.com", "*.lrcdn.net"], examples: ["scontent.lrcdn.net"] }, { name: "LiveTex", category: "customer-success", domains: ["*.livetex.ru"], totalExecutionTime: 476954,
    totalOccurrences: 1911 }, { name: "Livefyre", category: "content", domains: ["*.fyre.co", "*.livefyre.com"] }, { name: "Living Map Company", category: "utility", domains: ["*.livingmap.com"] }, { name: "Local World", category: "content", domains: ["*.thelocalpeople.co.uk"] }, { name: "LockerDome", category: "analytics", domains: ["*.lockerdome.com"], totalExecutionTime: 244, totalOccurrences: 3 }, { name: "Logentries", company: "Rapid", category: "utility", domains: ["*.logentries.com"], examples: ["js.logentries.com"] }, { name: "Logicalis", category: "analytics", domains: ["*.trovus.co.uk"] }, { name: "LoginRadius", company: "LoginRadius", homepage: "https://www.loginradius.com/", category: "ad", domains: ["*.loginradius.com", "*.lrcontent.com"], examples: ["config.lrcontent.com"], totalExecutionTime: 15746, totalOccurrences: 131 }, { name: "LongTail Ad Solutions", category: "ad", domains: ["*.jwpcdn.com", "*.jwplatform.com", "*.jwplayer.com", "*.jwpltx.com", "*.jwpsrv.com", "*.l\
ongtailvideo.com"], totalExecutionTime: 4531393, totalOccurrences: 5572 }, { name: "Loop Commerce", category: "other", domains: ["*.loopassets.net"] }, { name: "Loop11", category: "analytics", domains: ["*.loop11.com"], totalExecutionTime: 22278, totalOccurrences: 28 }, { name: "LoopMe", category: "ad", domains: ["*.loopme.biz", "*.loopme.com", "*.vntsm.com", "*.loopme.me"], totalExecutionTime: 2112781, totalOccurrences: 11752 }, { name: "Looper", category: "content", domains: ["*.looper.com"] }, { name: "Loyalty Point", category: "ad", domains: ["*.loyaltypoint.pl"] }, { name: "LoyaltyLion", category: "ad", domains: ["*.loyaltylion.com", "*.loyaltylion.net", "dg1f2pfrgjxdq.cloudfront.net"], totalExecutionTime: 2971522, totalOccurrences: 4114 }, { name: "Luma Tag", category: "analytics", domains: ["*.lumatag.co.uk"] }, { name: "Lumesse", category: "content", domains: ["*.recruitmentplatform.com"] }, { name: "Luminate", category: "ad", domains: ["*.luminate.com"] }, { name: "Lynchpin An\
alytics", category: "analytics", domains: ["*.lypn.net"] }, { name: "Lyris", category: "ad", domains: ["*.clicktracks.com"] }, { name: "Lytics", category: "ad", domains: ["*.lytics.io"], totalExecutionTime: 272463, totalOccurrences: 857 }, { name: "MEC WebTrack", company: "MEC", category: "ad", domains: ["*.e-webtrack.net"] }, { name: "MECLABS Institute", category: "analytics", domains: ["*.meclabs.com", "*.meclabsdata.com"] }, { name: "MLveda", category: "utility", domains: ["*.mlveda.com"], examples: ["www.mlveda.com"], totalExecutionTime: 109345, totalOccurrences: 229 }, { name: "Macromill", company: "Macromill", category: "analytics", homepage: "https://group.macromill.com/", domains: ["*.macromill.com"], examples: ["img.macromill.com/js/us000131vfg/4000000570-56/lognos.js"], totalExecutionTime: 5731, totalOccurrences: 9 }, { name: "Macropod BugHerd", company: "Macropod", category: "utility", domains: ["*.bugherd.com"], examples: ["www.bugherd.com"], totalExecutionTime: 512091, totalOccurrences: 3523 },
    { name: "Madison Logic", category: "marketing", domains: ["*.ml314.com"], totalExecutionTime: 101, totalOccurrences: 3 }, { name: "Madmetrics", company: "Keyade", category: "analytics", domains: ["*.keyade.com"] }, { name: "Magnetic", category: "ad", domains: ["*.domdex.com", "d3ezl4ajpp2zy8.cloudfront.net"] }, { name: "Magnetic Platform", company: "Magnetic", category: "ad", domains: ["*.magnetic.is"] }, { name: "MailMunch", category: "ad", domains: ["*.mailmunch.co"], totalExecutionTime: 1414543, totalOccurrences: 19969 }, { name: "MailPlus", category: "ad", domains: ["*.mailplus.nl"], totalExecutionTime: 83524, totalOccurrences: 304 }, { name: "Mapbox", category: "utility", domains: ["*.mapbox.com"], totalExecutionTime: 13815633, totalOccurrences: 19555 }, { name: "Maptive", category: "utility", domains: ["*.maptive.com"] }, { name: "Marcaria.com", category: "other", domains: ["*.gooo.al"] }, { name: "Marchex", category: "analytics", domains: ["*.voicestar.com", "*.marchex.io"],
    totalExecutionTime: 1378181, totalOccurrences: 7390 }, { name: "Mark and Mini", category: "ad", domains: ["*.markandmini.com"], examples: ["www.markandmini.com"] }, { name: "Marker", category: "utility", domains: ["*.marker.io"], examples: ["edge.marker.io"], totalExecutionTime: 2331726, totalOccurrences: 1722 }, { name: "Marketing Dashboards", company: "GroupM", category: "analytics", domains: ["*.m-decision.com"] }, { name: "Marketizator", category: "analytics", domains: ["*.marketizator.com"] }, { name: "Marketplace Web Service", company: "Amazon", category: "other", domains: ["*.ssl-images-amazon.com"], totalExecutionTime: 234709, totalOccurrences: 451 }, { name: "Mashable", category: "social", domains: ["*.mshcdn.com"] }, { name: "MatchWork", category: "utility", domains: ["*.matchwork.com"] }, { name: "MathJax", category: "utility", domains: ["*.mathjax.org"], totalExecutionTime: 84751, totalOccurrences: 743 }, { name: "Mather Economics", category: "analytics", domains: ["*.m\
atheranalytics.com"], totalExecutionTime: 262501, totalOccurrences: 507 }, { name: "MaxCDN Enterprise", company: "MaxCDN", category: "utility", domains: ["*.netdna-cdn.com", "*.netdna-ssl.com"] }, { name: "MaxMind", category: "utility", domains: ["*.maxmind.com"], totalExecutionTime: 855332, totalOccurrences: 831 }, { name: "MaxPoint Interactive", category: "ad", domains: ["*.mxptint.net"], totalExecutionTime: 20140, totalOccurrences: 23834 }, { name: "Maxsi", category: "analytics", domains: ["*.evisitanalyst.com"] }, { name: "Maxymiser", category: "analytics", domains: ["*.maxymiser.net, maxymiser.hs.llnwd.net"] }, { name: "McAffee", category: "utility", domains: ["*.mcafeesecure.com", "*.scanalert.com"] }, { name: "Measured", category: "analytics", domains: ["*.measured.com"], examples: ["tag.measured.com"], homepage: "https://www.measured.com/" }, { name: "Media IQ", category: "analytics", domains: ["*.mediaiqdigital.com"] }, { name: "Media Management Technologies", category: "ad", domains: [
    "*.speedshiftmedia.com"], totalExecutionTime: 27147, totalOccurrences: 161 }, { name: "Media Temple", category: "hosting", domains: ["*.goodlayers2.com"] }, { name: "Mediabong", category: "ad", domains: ["*.mediabong.net"] }, { name: "Mediahawk", category: "analytics", domains: ["*.mediahawk.co.uk"], totalExecutionTime: 51393, totalOccurrences: 239 }, { name: "Mediahub", category: "ad", domains: ["*.hubverifyandoptimize.com", "*.projectwatchtower.com"] }, { name: "Mediasyndicator", category: "ad", domains: ["*.creativesyndicator.com"] }, { name: "Medium", category: "content", domains: ["*.medium.com"], totalExecutionTime: 216923262, totalOccurrences: 17027 }, { name: "Meetrics", category: "ad", domains: ["*.de.com", "*.meetrics.net", "*.mxcdn.net"], examples: ["research.de.com"], totalExecutionTime: 102809, totalOccurrences: 63 }, { name: "Mega", company: "Mega Information Technology", category: "other", domains: ["*.mgcdn.com"] }, { name: "Melt", category: "ad", domains: ["*.meltd\
sp.com", "*.mesp.com"] }, { name: "Meltwater Group", category: "customer-success", domains: ["*.meltwaternews.com"] }, { name: "Meme", category: "ad", domains: ["*.viewwonder.com"] }, { name: "MentAd", category: "ad", domains: ["*.mentad.com"] }, { name: "Mention Me", category: "ad", domains: ["*.mention-me.com"], examples: ["tag.mention-me.com"], totalExecutionTime: 15233, totalOccurrences: 44 }, { name: "Merchant Equipment Store", category: "utility", domains: ["*.merchantequip.com"], totalExecutionTime: 268, totalOccurrences: 1 }, { name: "Merchenta", category: "customer-success", domains: ["*.merchenta.com"] }, { name: "Merkle Digital Data Exchange", company: "Merkle", category: "ad", domains: ["*.brilig.com"] }, { name: "Merkle Paid Search", company: "Merkle", category: "ad", domains: ["*.rkdms.com"], totalExecutionTime: 69291, totalOccurrences: 407 }, { name: "Met Office", category: "content", domains: ["*.metoffice.gov.uk"], totalExecutionTime: 15029, totalOccurrences: 19 }, { name: "\
Meta Broadcast", category: "social", domains: ["*.metabroadcast.com"], examples: ["voila.metabroadcast.com"] }, { name: "Michael Associates", category: "ad", domains: ["*.checktestsite.com"], examples: ["www.checktestsite.com"] }, { name: "Michelin", category: "content", domains: ["*.viamichelin.com"], totalExecutionTime: 8087, totalOccurrences: 7 }, { name: "Microad", category: "ad", domains: ["*.microad.jp"], totalExecutionTime: 14626755, totalOccurrences: 23909 }, { name: "Microsoft Certificate Services", company: "Microsoft", category: "utility", domains: ["*.msocsp.com"] }, { name: "Microsoft Hosted Libs", company: "Microsoft", category: "cdn", domains: ["*.aspnetcdn.com"], examples: ["ajax.aspnetcdn.com"], totalExecutionTime: 4562478, totalOccurrences: 20042 }, { name: "Microsoft XBox Live", company: "Microsoft", category: "marketing", domains: ["*.xboxlive.com"] }, { name: "Mightypop", category: "ad", domains: ["*.mightypop.ca"] }, { name: "Mika Tuupola", category: "utility", domains: [
    "*.appelsiini.net"] }, { name: "Millennial Media", category: "ad", domains: ["*.jumptap.com"] }, { name: "Mirror Image Internet", category: "utility", domains: ["*.miisolutions.net"] }, { name: "Mobify", category: "utility", domains: ["*.mobify.com", "*.mobify.net"] }, { name: "Mobile Nations", category: "social", domains: ["*.mobilenations.com"] }, { name: "Mobivate", category: "ad", domains: ["*.mobivatebulksms.com"] }, { name: "Momondo", category: "content", domains: ["*.momondo.dk"] }, { name: "Momondo Group", category: "content", domains: ["*.momondogrouo.com", "*.momondogroup.com"] }, { name: "Monarch Ads", category: "ad", domains: ["*.monarchads.com"] }, { name: "Monetate", category: "analytics", domains: ["*.monetate.net"], totalExecutionTime: 260345, totalOccurrences: 599 }, { name: "MonetizeMore", category: "ad", domains: ["*.m2.ai"], totalExecutionTime: 8896, totalOccurrences: 47 }, { name: "Monitor", company: "Econda", category: "analytics", domains: ["*.econda-monitor.\
de"], examples: ["www.econda-monitor.de"] }, { name: "Monkey Frog Media", category: "content", domains: ["*.monkeyfrogmedia.com"] }, { name: "Monotype", category: "cdn", domains: ["*.fonts.com", "*.fonts.net"], totalExecutionTime: 729465, totalOccurrences: 3185 }, { name: "Moore-Wilson", category: "ad", domains: ["*.mwdev.co.uk"] }, { name: "Moovweb", category: "utility", domains: ["*.moovweb.net"] }, { name: "Mopinion", category: "analytics", domains: ["*.mopinion.com"], totalExecutionTime: 171681, totalOccurrences: 177 }, { name: "MotionPoint", category: "other", domains: ["*.convertlanguage.com"], totalExecutionTime: 1843, totalOccurrences: 35 }, { name: "Mouse3K", category: "analytics", domains: ["*.mouse3k.com"] }, { name: "MouseStats", category: "analytics", domains: ["*.mousestats.com"] }, { name: "Mouseflow", homepage: "https://mouseflow.com/", category: "analytics", domains: ["*.mouseflow.com"], totalExecutionTime: 331345, totalOccurrences: 6786 }, { name: "Movable Ink", category: "\
analytics", domains: ["*.micpn.com"], totalExecutionTime: 439979, totalOccurrences: 4949 }, { name: "MovingIMAGE24", category: "content", domains: ["*.edge-cdn.net"] }, { name: "Moxielinks", category: "ad", domains: ["*.moxielinks.com"] }, { name: "Moz Recommended Companies", company: "Moz", category: "analytics", domains: ["d2eeipcrcdle6.cloudfront.net"] }, { name: "Mozilla", category: "utility", domains: ["*.mozilla.org"], examples: ["aus5.mozilla.org"], totalExecutionTime: 21085, totalOccurrences: 32 }, { name: "Multiview", category: "content", domains: ["*.multiview.com", "*.track-mv.com"], totalExecutionTime: 8831, totalOccurrences: 58 }, { name: "Mux", category: "analytics", domains: ["*.litix.io"], totalExecutionTime: 91580, totalOccurrences: 249 }, { name: "MyAds", company: "MyBuys", category: "analytics", domains: ["*.veruta.com"] }, { name: "MyBuys", category: "analytics", domains: ["*.mybuys.com"] }, { name: "MyFonts", category: "cdn", domains: ["*.myfonts.net"], totalExecutionTime: 78,
    totalOccurrences: 4 }, { name: "MyRegistry", category: "other", domains: ["*.myregistry.com"], totalExecutionTime: 164086, totalOccurrences: 621 }, { name: "MySpace", company: "Specific Media", category: "social", domains: ["*.myspace.com"] }, { name: "Mynewsdesk", category: "utility", domains: ["*.mynewsdesk.com"], totalExecutionTime: 564, totalOccurrences: 31 }, { name: "NAVIS", category: "content", domains: ["*.navistechnologies.info"] }, { name: "NCC Group Real User Monitoring", company: "NCC Group", category: "analytics", domains: ["*.nccgroup-webperf.com"], examples: ["beacon-rumlive.rum.nccgroup-webperf.com", "config-rumlive.rum.nccgroup-webperf.com", "script-rumlive.rum.nccgroup-webperf.com"] }, { name: "NEORY Marketing Cloud", company: "NEORY", category: "marketing", domains: ["*.ad-srv.net"], totalExecutionTime: 10976, totalOccurrences: 240 }, { name: "Nanigans", category: "ad", domains: ["*.nanigans.com"] }, { name: "Nano Interactive", category: "ad", domains: ["*.audien\
cemanager.de"], totalExecutionTime: 780, totalOccurrences: 10 }, { name: "Nanorep", company: "Nanorep Technologies", category: "customer-success", domains: ["*.nanorep.com"] }, { name: "Narrative", category: "ad", domains: ["*.narrative.io"], totalExecutionTime: 1228, totalOccurrences: 2 }, { name: "Native Ads", category: "ad", domains: ["*.nativeads.com"] }, { name: "Nativo", category: "ad", domains: ["*.postrelease.com"], totalExecutionTime: 28260, totalOccurrences: 35852 }, { name: "Navegg", category: "ad", domains: ["*.navdmp.com"], totalExecutionTime: 51915, totalOccurrences: 805 }, { name: "NaviStone", category: "ad", domains: ["*.murdoog.com"] }, { name: "Naytev", category: "analytics", domains: ["*.naytev.com"] }, { name: "Needle", category: "analytics", domains: ["*.needle.com"] }, { name: "Neiman Marcus", category: "content", domains: ["*.ctscdn.com"] }, { name: "Nend", category: "ad", domains: ["*.nend.net"] }, { name: "Neodata", category: "ad", domains: ["*.neodatagroup.com"],
    totalExecutionTime: 12827, totalOccurrences: 86 }, { name: "Net Applications", category: "analytics", domains: ["*.hitsprocessor.com"] }, { name: "Net Reviews", category: "analytics", domains: ["*.avis-verifies.com"], examples: ["www.avis-verifies.com"], totalExecutionTime: 1143140, totalOccurrences: 2442 }, { name: "NetAffiliation", company: "Kwanco", category: "ad", domains: ["*.metaffiliation.com"], totalExecutionTime: 18519, totalOccurrences: 127 }, { name: "NetDirector", company: "G-Forces Web Management", category: "other", domains: ["*.netdirector.co.uk"], totalExecutionTime: 3931, totalOccurrences: 1 }, { name: "NetFlix", category: "content", domains: ["*.nflxext.com", "*.nflximg.net"], totalExecutionTime: 4364, totalOccurrences: 5 }, { name: "Nielsen NetRatings SiteCensus", company: "The Nielsen Company", homepage: "http://www.nielsen-online.com/intlpage.html", category: "analytics", domains: ["*.imrworldwide.com"], totalExecutionTime: 6840006, totalOccurrences: 19525 }, {
    name: "NetSeer", category: "ad", domains: ["*.netseer.com", "*.ns-cdn.com"] }, { name: "NetShelter", company: "Ziff Davis Tech", category: "ad", domains: ["*.netshelter.net"] }, { name: "Netmining", company: "Ignition One", category: "ad", domains: ["*.netmng.com"], totalExecutionTime: 7746, totalOccurrences: 92 }, { name: "Netop", category: "customer-success", domains: ["*.netop.com"] }, { name: "Network Solutions", category: "utility", domains: ["*.netsolssl.com", "*.networksolutions.com"], examples: ["ocsp.netsolssl.com"], totalExecutionTime: 2415, totalOccurrences: 2 }, { name: "Neustar AdAdvisor", company: "Neustar", category: "ad", domains: ["*.adadvisor.net"] }, { name: "New Approach Media", category: "ad", domains: ["*.newapproachmedia.co.uk"] }, { name: "NewShareCounts", category: "social", domains: ["*.newsharecounts.com"] }, { name: "News", category: "social", domains: ["*.news.com.au", "*.newsanalytics.com.au", "*.newsapi.com.au", "*.newscdn.com.au", "*.newsdata.com.au",
    "*.newsdiscover.com.au", "*.news-static.com"], totalExecutionTime: 69261, totalOccurrences: 46 }, { name: "Newsquest", category: "content", domains: ["*.newsquestdigital.co.uk"] }, { name: "Newzulu", category: "content", domains: ["*.filemobile.com", "*.projects.fm"] }, { name: "Nexcess.Net", category: "hosting", domains: ["*.nexcesscdn.net"] }, { name: "Nexstar Media Group", category: "ad", domains: ["*.yashi.com"] }, { name: "NextPerf", company: "Rakuten Marketing", category: "ad", domains: ["*.nxtck.com"] }, { name: "Nine.com.au", company: "Nine Digital", category: "content", domains: ["*.9msn.com.au"] }, { name: "NitroSell", category: "hosting", domains: ["*.nitrosell.com"] }, { name: "Nochex", category: "utility", domains: ["*.nochex.com"] }, { name: "Northern &amp; Shell Media Group", category: "content", domains: ["*.northernandshell.co.uk"] }, { name: "Nosto", category: "analytics", domains: ["*.nosto.com"], totalExecutionTime: 703736, totalOccurrences: 1189 }, { name: "Now\
 Interact", category: "analytics", domains: ["*.nowinteract.com"] }, { name: "Numberly", company: "1000mercis", category: "ad", domains: ["*.mmtro.com", "*.nzaza.com"], totalExecutionTime: 1827, totalOccurrences: 19 }, { name: "NyaConcepts", category: "analytics", domains: ["*.xclusive.ly"] }, { name: "O2", category: "other", domains: ["*.o2.co.uk"], examples: ["servedby.o2.co.uk"] }, { name: "GoDaddy", homepage: "https://www.godaddy.com/", category: "utility", domains: ["*.godaddy.com", "*.wsimg.com"], examples: ["ocsp.godaddy.com", "seal.godaddy.com"], totalExecutionTime: 94698135, totalOccurrences: 110342 }, { name: "ObjectPlanet", category: "analytics", domains: ["*.easypolls.net"], totalExecutionTime: 28470, totalOccurrences: 70 }, { name: "OhMyAd", category: "ad", domains: ["*.ohmyad.co"], examples: ["pr.ohmyad.co"] }, { name: "Okas Concepts", category: "utility", domains: ["*.okasconcepts.com"], totalExecutionTime: 1483515, totalOccurrences: 661 }, { name: "Okta", category: "ana\
lytics", domains: ["*.okta.com"], totalExecutionTime: 1464920, totalOccurrences: 3542 }, { name: "Olapic", category: "content", domains: ["*.photorank.me"], totalExecutionTime: 115, totalOccurrences: 2 }, { name: "Ometria", category: "analytics", domains: ["*.ometria.com"], totalExecutionTime: 16630, totalOccurrences: 204 }, { name: "Omniconvert", category: "analytics", domains: ["*.omniconvert.com", "d2tgfbvjf3q6hn.cloudfront.net", "d3vbj265bmdenw.cloudfront.net"], totalExecutionTime: 85855, totalOccurrences: 381 }, { name: "Omniroot", company: "Verizon", category: "utility", domains: ["*.omniroot.com"], examples: ["ocsp.omniroot.com", "vassg142.ocsp.omniroot.com"] }, { name: "OnAudience", company: "Cloud Technologies", category: "ad", domains: ["*.onaudience.com"] }, { name: "OnScroll", category: "ad", domains: ["*.onscroll.com"] }, { name: "OnState", category: "ad", domains: ["*.onstate.co.uk"] }, { name: "OnYourMap", category: "utility", domains: ["*.onyourmap.com"] }, { name: "One\
 by AOL", company: "AOL", category: "ad", domains: ["*.adtechjp.com", "*.adtech.de"], totalExecutionTime: 1140, totalOccurrences: 17 }, { name: "One by AOL:Mobile", company: "AOL", category: "ad", domains: ["*.nexage.com"], examples: ["ads.nexage.com", "hb.nexage.com"] }, { name: "OneAll", category: "analytics", domains: ["*.oneall.com"], totalExecutionTime: 104501, totalOccurrences: 623 }, { name: "OneSoon", category: "analytics", domains: ["*.adalyser.com"], totalExecutionTime: 33037, totalOccurrences: 437 }, { name: "OneTag", category: "ad", domains: ["*.onetag-sys.com"] }, { name: "Onet", category: "ad", domains: ["*.onet.pl"], totalExecutionTime: 531334, totalOccurrences: 760 }, { name: "Online Rewards", company: "Mastercard", category: "ad", domains: ["*.loyaltygateway.com"] }, { name: "Online republic", category: "content", domains: ["*.imallcdn.net"], totalExecutionTime: 67122, totalOccurrences: 58 }, { name: "Ooyala", category: "ad", domains: ["*.ooyala.com"] }, { name: "OpenT\
able", company: "Priceline Group", category: "content", domains: ["*.opentable.com", "*.opentable.co.uk", "*.toptable.co.uk"], examples: ["www.toptable.co.uk"], totalExecutionTime: 412090, totalOccurrences: 4314 }, { name: "OpenX Ad Exchange", company: "OpenX Technologies", category: "ad", domains: ["*.liftdna.com"] }, { name: "Opinion Stage", category: "analytics", domains: ["*.opinionstage.com"], examples: ["www.opinionstage.com"], totalExecutionTime: 113206, totalOccurrences: 145 }, { name: "OpinionBar", category: "analytics", domains: ["*.opinionbar.com"] }, { name: "Opta", company: "Perform Group", category: "content", domains: ["*.opta.net"], totalExecutionTime: 302785, totalOccurrences: 272 }, { name: "OptiMonk", category: "ad", domains: ["*.optimonk.com"], totalExecutionTime: 10318415, totalOccurrences: 10615 }, { name: "Optilead", category: "analytics", domains: ["*.dyn-img.com", "*.leadcall.co.uk", "*.optilead.co.uk"] }, { name: "Optimatic", category: "ad", domains: ["*.optim\
atic.com"], examples: ["synch.optimatic.com"] }, { name: "Optimise Media Group", category: "utility", domains: ["*.omguk.com"], totalExecutionTime: 6691, totalOccurrences: 41 }, { name: "Optimost", company: "OpenText", category: "ad", domains: ["*.optimost.com"] }, { name: "Optimove", company: "Mobius Solutions", category: "analytics", domains: ["*.optimove.net"], totalExecutionTime: 22679, totalOccurrences: 293 }, { name: "Optorb", category: "ad", domains: ["*.optorb.com"] }, { name: "Oracle", category: "marketing", domains: ["*.custhelp.com", "*.eloqua.com", "*.en25.com", "*.estara.com", "*.instantservice.com"], totalExecutionTime: 684920, totalOccurrences: 569 }, { name: "Oracle Recommendations On Demand", company: "Oracle", category: "analytics", domains: ["*.atgsvcs.com"], totalExecutionTime: 8696, totalOccurrences: 96 }, { name: "Oracle Responsys", company: "Oracle", category: "marketing", domains: ["*.adrsp.net", "*.responsys.net"] }, { name: "Order Security-VOID", company: "Ord\
er Security", category: "analytics", domains: ["*.order-security.com"] }, { name: "Oriel", category: "ad", domains: ["*.oriel.io"] }, { name: "Outbrain", homepage: "https://www.outbrain.com/", category: "ad", domains: ["*.outbrain.com", "*.outbrainimg.com", "*.visualrevenue.com"], totalExecutionTime: 3373858, totalOccurrences: 13287 }, { name: "OverStream", company: "Coull", category: "ad", domains: ["*.coull.com"], examples: ["ex1.coull.com"] }, { name: "Overdrive", category: "content", domains: ["*.contentreserve.com"] }, { name: "Overstock", category: "utility", domains: ["*.ostkcdn.com"] }, { name: "OwnerIQ", category: "ad", domains: ["*.owneriq.net"], totalExecutionTime: 305561, totalOccurrences: 2173 }, { name: "OzCart", category: "utility", domains: ["*.ozcart.com.au"] }, { name: "Ozone Media", category: "ad", domains: ["*.adadyn.com"] }, { name: "Loqate", company: "Loqate", category: "other", domains: ["*.pcapredict.com", "*.postcodeanywhere.co.uk"], totalExecutionTime: 136866,
    totalOccurrences: 777 }, { name: "PEER 1 Hosting", category: "hosting", domains: ["*.peer1.com"] }, { name: "PERFORM", category: "content", domains: ["*.performgroup.com"] }, { name: "PICnet", category: "hosting", domains: ["*.nonprofitsoapbox.com"] }, { name: "Pacnet", company: "Telstra", category: "other", domains: ["*.cdndelivery.net"], examples: ["682968324.r.cdndelivery.net"] }, { name: "Pagefair", category: "ad", domains: ["*.pagefair.com", "*.pagefair.net"] }, { name: "Pagely", category: "other", domains: ["*.optnmstr.com"], totalExecutionTime: 99314, totalOccurrences: 487 }, { name: "Pagesuite", category: "ad", domains: ["*.pagesuite-professional.co.uk"], totalExecutionTime: 12, totalOccurrences: 1 }, { name: "Pardot", category: "marketing", domains: ["*.pardot.com"], totalExecutionTime: 73880, totalOccurrences: 550 }, { name: "Parse.ly", category: "analytics", domains: ["*.parsely.com", "d1z2jf7jlzjs58.cloudfront.net"], totalExecutionTime: 1122662, totalOccurrences: 5204 },
    { name: "Pay per Click", company: "Eysys", category: "ad", domains: ["*.eysys.com"], examples: ["pla27.eysys.com"] }, { name: "PayPal Ads", category: "ad", domains: ["*.where.com"] }, { name: "Peaks & Pies", category: "analytics", domains: ["*.bunchbox.co"] }, { name: "PebblePost", category: "ad", domains: ["*.pbbl.co"], totalExecutionTime: 147945, totalOccurrences: 725 }, { name: "Peerius", category: "analytics", domains: ["*.peerius.com"] }, { name: "Peermap", company: "IMRG", category: "analytics", domains: ["peermapcontent.affino.com"] }, { name: "Penske Media", category: "content", domains: ["*.pmc.com"] }, { name: "Penton", category: "utility", domains: ["*.pisces-penton.com"] }, { name: "Pepper", category: "ad", domains: ["*.peppercorp.com"] }, { name: "Perfect Audience", company: "Marin Software", category: "ad", domains: ["*.prfct.co", "*.marinsm.com", "*.perfectaudience.com"], totalExecutionTime: 405, totalOccurrences: 7 }, { name: "Perfect Market", category: "ad", domains: [
    "*.perfectmarket.com"] }, { name: "Perfect Privacy", category: "other", domains: ["*.suitesmart.com"] }, { name: "Perform Group", category: "content", domains: ["*.performfeeds.com", "*.premiumtv.co.uk"] }, { name: "Performio", category: "ad", domains: ["*.performax.cz"], examples: ["ut.performax.cz"], totalExecutionTime: 117591, totalOccurrences: 337 }, { name: "PerimeterX Bot Defender", company: "PerimeterX", category: "utility", domains: ["*.perimeterx.net", "*.pxi.pub"], totalExecutionTime: 172605, totalOccurrences: 68 }, { name: "Periscope", category: "content", domains: ["*.periscope.tv"] }, { name: "Permutive", category: "ad", domains: ["*.permutive.com", "d3alqb8vzo7fun.cloudfront.net"], totalExecutionTime: 1406714, totalOccurrences: 1124 }, { name: "Petametrics", category: "analytics", domains: ["*.petametrics.com"] }, { name: "PhotoBucket", category: "content", domains: ["*.photobucket.com"], totalExecutionTime: 2383529, totalOccurrences: 338 }, { name: "Picreel", category: "\
analytics", domains: ["*.pcrl.co", "*.picreel.com"], totalExecutionTime: 45437, totalOccurrences: 300 }, { name: "Pictela (AOL)", category: "analytics", domains: ["*.pictela.net"] }, { name: "PistonHeads", category: "social", domains: ["*.pistonheads.com"] }, { name: "Piwik", category: "analytics", domains: ["*.drtvtracker.com", "*.piwikpro.com", "*.raac33.net"], totalExecutionTime: 2813, totalOccurrences: 32 }, { name: "Pixalate", category: "utility", domains: ["*.adrta.com"], totalExecutionTime: 4187, totalOccurrences: 13 }, { name: "Pixlee", category: "social", domains: ["*.pixlee.com"], totalExecutionTime: 137281, totalOccurrences: 341 }, { name: "Placed", category: "analytics", domains: ["*.placed.com"], totalExecutionTime: 691, totalOccurrences: 1 }, { name: "Planning-inc", category: "analytics", domains: ["*.planning-inc.co.uk"] }, { name: "PlayAd Media Group", category: "ad", domains: ["*.youplay.se"] }, { name: "Playbuzz", category: "hosting", domains: ["*.playbuzz.com"], totalExecutionTime: 58184,
    totalOccurrences: 89 }, { name: "Pleenq", category: "ad", domains: ["*.pleenq.com"] }, { name: "Plentific", category: "content", domains: ["*.plentific.com"] }, { name: "PluginDetect", category: "other", domains: ["dtlilztwypawv.cloudfront.net"] }, { name: "Po.st", company: "RadiumOne", category: "utility", domains: ["*.po.st"], totalExecutionTime: 178, totalOccurrences: 3 }, { name: "Pointpin", category: "utility", domains: ["*.pointp.in"] }, { name: "Pointroll (Garnett)", category: "ad", domains: ["*.pointroll.com"] }, { name: "Polar", homepage: "https://polar.me/", category: "ad", domains: ["*.polarmobile.ca", "*.mediaeverywhere.com", "*.mediavoice.com", "*.plrsrvcs.com", "*.polarcdn-engine.com", "*.polarcdn-meraxes.com", "*.polarcdn-pentos.com", "*.polarcdn-static.com", "*.polarcdn-terrax.com", "*.polarcdn.com", "*.polarmobile.com", "*.poweredbypolar.com", "*.mediaconductor.me", "*.polaracademy.me"], totalExecutionTime: 66280, totalOccurrences: 223 }, { name: "PollDaddy (Automa\
ttic)", category: "ad", domains: ["static.polldaddy.com", "*.poll.fm"], totalExecutionTime: 4752, totalOccurrences: 37 }, { name: "Polldaddy", company: "Automattic", category: "analytics", domains: ["polldaddy.com", "*.polldaddy.com"], totalExecutionTime: 294207, totalOccurrences: 2715 }, { name: "Polyfill service", company: "Polyfill.io", category: "other", domains: ["*.polyfill.io"] }, { name: "MegaPopAds", category: "ad", domains: ["*.megapopads.com"] }, { name: "Populis", category: "ad", domains: ["*.populisengage.com"] }, { name: "Postimage.org", category: "content", domains: ["*.postimg.org"] }, { name: "PowerFront", category: "hosting", domains: ["*.inside-graph.com"], totalExecutionTime: 220331, totalOccurrences: 370 }, { name: "PowerReviews", category: "analytics", domains: ["*.powerreviews.com"], totalExecutionTime: 1208993, totalOccurrences: 1324 }, { name: "Powerlinks.com", category: "ad", domains: ["*.powerlinks.com"] }, { name: "Press+", category: "ad", domains: ["*.pipol\
.com", "*.ppjol.com", "*.ppjol.net"] }, { name: "PressArea", category: "utility", domains: ["*.pressarea.com"], examples: ["www.pressarea.com"] }, { name: "Pretio Interactive", category: "ad", domains: ["*.pretio.in"] }, { name: "Prezi", category: "utility", domains: ["*.prezi.com"], totalExecutionTime: 72394, totalOccurrences: 79 }, { name: "PriceGrabber", category: "content", domains: ["*.pgcdn.com", "*.pricegrabber.com"] }, { name: "PriceRunner", category: "content", domains: ["*.pricerunner.com"], totalExecutionTime: 200, totalOccurrences: 6 }, { name: "PrintFriendly", category: "utility", domains: ["*.printfriendly.com"], totalExecutionTime: 39464, totalOccurrences: 381 }, { name: "Privy", category: "ad", domains: ["*.privy.com", "*.privymktg.com"], totalExecutionTime: 14992809, totalOccurrences: 18961 }, { name: "Proclivity Media", category: "analytics", domains: ["*.pswec.com"] }, { name: "Profitshare", category: "ad", domains: ["*.profitshare.ro"], totalExecutionTime: 60087, totalOccurrences: 194 },
    { name: "Programattik", category: "ad", domains: ["*.programattik.com"], totalExecutionTime: 95, totalOccurrences: 9 }, { name: "Proper Media", category: "content", domains: ["*.proper.io"], totalExecutionTime: 253672, totalOccurrences: 109 }, { name: "Property Week", category: "content", domains: ["*.propertyweek.com"], examples: ["www.propertyweek.com"] }, { name: "Provide Support", category: "customer-success", domains: ["*.providesupport.com"], totalExecutionTime: 79281, totalOccurrences: 989 }, { name: "Proweb Uk", category: "hosting", domains: ["*.proweb.net"] }, { name: "Proximic (ComScore)", category: "ad", domains: ["*.proximic.com"] }, { name: "Psyma", category: "ad", domains: ["*.psyma.com"], totalExecutionTime: 2496, totalOccurrences: 5 }, { name: "PubFactory", company: "Safari Books Online", category: "content", domains: ["*.pubfactory.com"] }, { name: "PubNation", category: "ad", domains: ["*.pubnation.com"], totalExecutionTime: 625439, totalOccurrences: 132 }, { name: "\
Publicidad.net", category: "ad", domains: ["*.publicidad.tv"] }, { name: "PublishThis", company: "Ultra Unlimited", category: "ad", domains: ["*.publishthis.com"] }, { name: "Pulse Insights", category: "analytics", domains: ["*.pulseinsights.com"], totalExecutionTime: 5757, totalOccurrences: 53 }, { name: "Pulsepoint", category: "marketing", domains: ["*.displaymarketplace.com"] }, { name: "Purch", category: "ad", domains: ["*.bestofmedia.com", "*.purch.com"], examples: ["ramp.purch.com"] }, { name: "Pure Chat", category: "customer-success", domains: ["*.purechat.com"], totalExecutionTime: 1129392, totalOccurrences: 3105 }, { name: "PushCrew", category: "ad", domains: ["*.pushcrew.com"], totalExecutionTime: 170011, totalOccurrences: 823 }, { name: "Q1Media", category: "ad", domains: ["*.q1media.com", "*.q1mediahydraplatform.com"] }, { name: "Qbase Software Development", category: "hosting", domains: ["*.smartwebportal.co.uk"] }, { name: "Qeryz", category: "analytics", domains: ["*.qery\
z.com"] }, { name: "Qode Interactive", category: "hosting", domains: ["*.qodeinteractive.com"], totalExecutionTime: 2503828, totalOccurrences: 147 }, { name: "Qrius", category: "social", domains: ["*.qrius.me"] }, { name: "Qualaroo", category: "analytics", domains: ["*.qualaroo.com"], totalExecutionTime: 54960, totalOccurrences: 347 }, { name: "Qualtrics", category: "analytics", domains: ["*.qualtrics.com"], totalExecutionTime: 4907219, totalOccurrences: 7134 }, { name: "Qubit", company: "Qubit", category: "analytics", domains: ["*.qubit.com", "*.qutics.com", "d3c3cq33003psk.cloudfront.net", "*.goqubit.com", "*.qubitproducts.com"], totalExecutionTime: 50060, totalOccurrences: 43 }, { name: "Qubit Deliver", company: "Qubit", category: "analytics", domains: ["d1m54pdnjzjnhe.cloudfront.net", "d22rutvoghj3db.cloudfront.net", "dd6zx4ibq538k.cloudfront.net"] }, { name: "QuestionPro", category: "analytics", domains: ["*.questionpro.com"], totalExecutionTime: 60868, totalOccurrences: 152 }, { name: "\
Queue-it", category: "other", domains: ["*.queue-it.net"], totalExecutionTime: 60031, totalOccurrences: 143 }, { name: "QuinStreet", category: "ad", domains: ["*.Quinstreet.com", "*.b2btechleadform.com", "*.qnsr.com", "*.qsstats.com"], examples: ["www.qsstats.com"] }, { name: "QuoVadis", category: "utility", domains: ["*.quovadisglobal.com"] }, { name: "Qzzr", category: "analytics", domains: ["*.movementventures.com", "*.qzzr.com"], examples: ["www.qzzr.com"] }, { name: "RapidAPI", category: "utility", domains: ["*.rapidapi.com"], examples: ["telize-v1.p.rapidapi.com"], totalExecutionTime: 4218, totalOccurrences: 2 }, { name: "RCS Media Group", category: "ad", domains: ["*.rcsadv.it"] }, { name: "REVIVVE", category: "ad", domains: ["*.revivve.com"] }, { name: "RSSinclude", category: "social", domains: ["*.rssinclude.com"] }, { name: "RTB House AdPilot", company: "RTB House", category: "ad", domains: ["*.erne.co", "*.creativecdn.com"], totalExecutionTime: 1677125, totalOccurrences: 13287 },
    { name: "RTB Media", category: "ad", domains: ["*.rtb-media.me"] }, { name: "RUN", category: "ad", domains: ["*.runadtag.com", "*.rundsp.com"] }, { name: "Rackspace", category: "hosting", domains: ["*.rackcdn.com", "*.rackspacecloud.com", "*.raxcdn.com", "*.websitetestlink.com"], totalExecutionTime: 3573460, totalOccurrences: 2624 }, { name: "RadiumOne", category: "ad", domains: ["*.gwallet.com", "*.r1-cdn.net"] }, { name: "Rakuten DC Storm", company: "Rakuten", category: "analytics", domains: ["*.dc-storm.com", "*.h4k5.com", "*.stormiq.com"] }, { name: "Rakuten LinkShare", company: "Rakuten", category: "ad", domains: ["*.linksynergy.com"], totalExecutionTime: 23285, totalOccurrences: 151 }, { name: "Rakuten Marketing", company: "Rakuten", category: "ad", domains: ["*.rakuten-static.com", "*.rmtag.com", "tag.rmp.rakuten.com"], totalExecutionTime: 462276, totalOccurrences: 3399 }, { name: "Rakuten MediaForge", company: "Rakuten", category: "ad", domains: ["*.mediaforge.com"], totalExecutionTime: 1650,
    totalOccurrences: 20 }, { name: "Rambler", company: "Rambler & Co", category: "utility", domains: ["*.rambler.ru"], totalExecutionTime: 54521084, totalOccurrences: 15831 }, { name: "Ranker", category: "content", domains: ["*.ranker.com", "*.rnkr-static.com"] }, { name: "Ravelin", category: "utility", domains: ["*.ravelin.com"] }, { name: "Raygun", category: "utility", domains: ["*.raygun.io", "*.rapidzebra.io"], totalExecutionTime: 245714, totalOccurrences: 2539 }, { name: "ReCollect", category: "utility", domains: ["*.recollect.net"], totalExecutionTime: 229879, totalOccurrences: 135 }, { name: "ReSRC", category: "utility", domains: ["*.resrc.it"] }, { name: "ReTargeter", category: "ad", domains: ["*.retargeter.com"] }, { name: "Reach Group", category: "ad", domains: ["*.redintelligence.net"], totalExecutionTime: 1449, totalOccurrences: 199 }, { name: "ReachDynamics", category: "ad", domains: ["*.rdcdn.com"] }, { name: "ReachForce", category: "ad", domains: ["*.reachforce.com"] },
    { name: "ReachLocal", category: "ad", domains: ["*.rtrk.co.nz"], examples: ["rtsys.rtrk.co.nz"] }, { name: "ReachMee", category: "content", domains: ["*.reachmee.com"], totalExecutionTime: 133135, totalOccurrences: 40 }, { name: "Reactful", category: "analytics", domains: ["*.reactful.com"], totalExecutionTime: 12497, totalOccurrences: 42 }, { name: "Realtime", company: "internet business technologies", category: "utility", domains: ["*.realtime.co"] }, { name: "Realtime Media (Brian Communications)", category: "ad", domains: ["*.rtm.com"] }, { name: "Realtime Targeting", category: "ad", domains: ["*.idtargeting.com"] }, { name: "Realytics", category: "analytics", domains: ["dcniko1cv0rz.cloudfront.net", "*.realytics.net"], totalExecutionTime: 38343, totalOccurrences: 276 }, { name: "RebelMouse", category: "ad", domains: ["*.rebelmouse.com", "*.rbl.ms"], examples: ["www.rebelmouse.com"], totalExecutionTime: 3876, totalOccurrences: 22 }, { name: "Receiptful", category: "utility", domains: [
    "*.receiptful.com"], totalExecutionTime: 58254, totalOccurrences: 361 }, { name: "Recite Me", category: "other", domains: ["*.reciteme.com"], totalExecutionTime: 22320, totalOccurrences: 142 }, { name: "RecoBell", category: "analytics", domains: ["*.recobell.io"] }, { name: "Recommend", category: "analytics", domains: ["*.recommend.pro"] }, { name: "Red Eye International", category: "ad", domains: ["*.pajmc.com"] }, { name: "Redfish Group", category: "ad", domains: ["*.wmps.com"] }, { name: "Reevoo", category: "analytics", domains: ["*.reevoo.com"], totalExecutionTime: 87323, totalOccurrences: 133 }, { name: "Refersion", category: "ad", domains: ["*.refersion.com"], totalExecutionTime: 564360, totalOccurrences: 2170 }, { name: "Refined Ads", category: "ad", domains: ["*.refinedads.com"] }, { name: "Reflektion", category: "analytics", domains: ["*.reflektion.com", "d26opx5dl8t69i.cloudfront.net"] }, { name: "Reflow", company: "Scenestealer", category: "ad", domains: ["*.reflow.tv"] },
    { name: "Reklama", category: "ad", domains: ["*.o2.pl", "*.wp.pl"], examples: ["dot.wp.pl", "px.o2.pl", "px.wp.pl"], totalExecutionTime: 846563, totalOccurrences: 1054 }, { name: "Relevad ReleStar", company: "Relevad", category: "ad", domains: ["*.relestar.com"] }, { name: "Remarketing Pixel", company: "Adsterra Network", category: "ad", domains: ["*.datadbs.com", "*.remarketingpixel.com"] }, { name: "Remintrex", company: "SmartUp Venture", category: "ad", domains: ["*.remintrex.com"] }, { name: "Republer", category: "ad", domains: ["*.republer.com"], examples: ["sync.republer.com"] }, { name: "Research Now", category: "analytics", domains: ["*.researchgnow.com", "*.researchnow.com"], examples: ["tag.researchgnow.com"] }, { name: "Research Online", company: "Skills Development Scotland", category: "content", domains: ["*.researchonline.org.uk"], examples: ["www.researchonline.org.uk"] }, { name: "Resonance Insights", category: "analytics", domains: ["*.res-x.com"], totalExecutionTime: 2277,
    totalOccurrences: 20 }, { name: "Resonate Networks", category: "analytics", domains: ["*.reson8.com"], totalExecutionTime: 1739, totalOccurrences: 1 }, { name: "Response Team", category: "ad", domains: ["*.i-transactads.com"] }, { name: "ResponseTap", category: "analytics", domains: ["*.adinsight.com", "*.responsetap.com"], totalExecutionTime: 84074, totalOccurrences: 274 }, { name: "ResponsiveVoice", category: "other", domains: ["*.responsivevoice.org"], totalExecutionTime: 851397, totalOccurrences: 6863 }, { name: "Retention Science", category: "ad", domains: ["*.retentionscience.com", "d1stxfv94hrhia.cloudfront.net"], totalExecutionTime: 17276, totalOccurrences: 209 }, { name: "Revcontent", category: "content", domains: ["*.revcontent.com"], totalExecutionTime: 1153469, totalOccurrences: 1251 }, { name: "Revee", category: "ad", domains: ["*.revee.com"] }, { name: "Revenue Conduit", category: "utility", domains: ["*.revenueconduit.com"] }, { name: "RevenueMantra", category: "ad",
    domains: ["*.revenuemantra.com"] }, { name: "Reviews.co.uk", category: "analytics", domains: ["*.reviews.co.uk"], totalExecutionTime: 425151, totalOccurrences: 1883 }, { name: "Reviews.io", category: "analytics", domains: ["*.reviews.io"], totalExecutionTime: 1713955, totalOccurrences: 4516 }, { name: "Revolver Maps", category: "analytics", domains: ["*.revolvermaps.com"], totalExecutionTime: 2132297, totalOccurrences: 2305 }, { name: "Revv", category: "utility", domains: ["*.revv.co"], totalExecutionTime: 26667, totalOccurrences: 11 }, { name: "RichRelevance", category: "analytics", domains: ["*.richrelevance.com"], totalExecutionTime: 3496, totalOccurrences: 19 }, { name: "RightNow Service Cloud", company: "Oracle", category: "customer-success", domains: ["*.rightnowtech.com", "*.rnengage.com"], totalExecutionTime: 8970, totalOccurrences: 122 }, { name: "Rightster", category: "ad", domains: ["*.ads-creativesyndicator.com"] }, { name: "Riskified", category: "utility", domains: ["*\
.riskified.com"], totalExecutionTime: 373865, totalOccurrences: 1643 }, { name: "Rockerbox", category: "analytics", homepage: "https://www.rockerbox.com/", domains: ["getrockerbox.com"], examples: ["getrockerbox.com"], totalExecutionTime: 19742, totalOccurrences: 162 }, { name: "Rocket Fuel", category: "ad", domains: ["*.rfihub.com", "*.ru4.com", "*.rfihub.net", "*.ad1x.com"], totalExecutionTime: 356189, totalOccurrences: 3247 }, { name: "Rollbar", category: "utility", domains: ["*.rollbar.com", "d37gvrvc0wt4s1.cloudfront.net"], examples: ["api.rollbar.com"], totalExecutionTime: 190180, totalOccurrences: 2349 }, { name: "RomanCart", category: "utility", domains: ["*.romancart.com"], totalExecutionTime: 510, totalOccurrences: 5 }, { name: "Rondavu", category: "ad", domains: ["*.rondavu.com"] }, { name: "Roomkey", category: "content", domains: ["*.roomkey.com"], examples: ["www.roomkey.com"] }, { name: "Roost", category: "utility", domains: ["*.goroost.com"] }, { name: "Roxot", category: "\
ad", domains: ["*.rxthdr.com"] }, { name: "Roxr Software", category: "analytics", domains: ["*.getclicky.com"], totalExecutionTime: 851573, totalOccurrences: 12877 }, { name: "Rtoaster", company: "Brainpad", homepage: "https://www.brainpad.co.jp/rtoaster/", category: "marketing", domains: ["*.rtoaster.jp"], examples: ["rt.rtoaster.jp"], totalExecutionTime: 15065, totalOccurrences: 91 }, { name: "Rubikloud.com", category: "analytics", domains: ["*.rubikloud.com"] }, { name: "Ruler Analytics", company: "Ruler", category: "analytics", domains: ["*.nyltx.com", "*.ruleranalytics.com"], examples: ["www.ruleranalytics.com"], totalExecutionTime: 41074, totalOccurrences: 436 }, { name: "Runner", company: "Rambler & Co", category: "content", domains: ["*.begun.ru"], totalExecutionTime: 26, totalOccurrences: 1 }, { name: "S4M", category: "ad", domains: ["*.sam4m.com"] }, { name: "SAP Hybris Marketing Convert", company: "SAP", category: "ad", domains: ["*.seewhy.com"] }, { name: "SAS Institute", category: "\
ad", domains: ["*.aimatch.com", "*.sas.com"], totalExecutionTime: 59419, totalOccurrences: 29 }, { name: "SATORI", homepage: "https://satori.marketing/", category: "marketing", domains: ["satori.segs.jp"], examples: ["satori.segs.jp/s.js"], totalExecutionTime: 62202, totalOccurrences: 816 }, { name: "SC ShopMania Net SRL", category: "content", domains: ["*.shopmania.com"] }, { name: "SDL Media Manager", company: "SDL", category: "other", domains: ["*.sdlmedia.com"] }, { name: "SFR", category: "other", domains: ["*.sfr.fr"], examples: ["elr.sfr.fr"], totalExecutionTime: 22751, totalOccurrences: 22 }, { name: "SLI Systems", category: "utility", domains: ["*.resultslist.com", "*.resultspage.com", "*.sli-spark.com"], totalExecutionTime: 2909, totalOccurrences: 33 }, { name: "SMARTASSISTANT", company: "Smart Information Systems", category: "customer-success", domains: ["*.smartassistant.com"] }, { name: "SMARTSTREAM.TV", category: "ad", domains: ["*.smartstream.tv"] }, { name: "SPX", company: "\
Smaato", category: "ad", domains: ["*.smaato.net"], totalExecutionTime: 519, totalOccurrences: 13 }, { name: "Sabio", category: "customer-success", domains: ["*.sabio.co.uk"], examples: ["www.sabio.co.uk"] }, { name: "Sailthru", category: "analytics", domains: ["*.sail-horizon.com", "*.sail-personalize.com", "*.sail-track.com"], totalExecutionTime: 59245, totalOccurrences: 678 }, { name: "Sailthru Sightlines", company: "Sailthru", category: "marketing", domains: ["*.sailthru.com"], totalExecutionTime: 6772, totalOccurrences: 18 }, { name: "Sajari Pty", category: "utility", domains: ["*.sajari.com"], totalExecutionTime: 70019, totalOccurrences: 197 }, { name: "SaleCycle", category: "ad", domains: ["*.salecycle.com", "d16fk4ms6rqz1v.cloudfront.net", "d22j4fzzszoii2.cloudfront.net", "d30ke5tqu2tkyx.cloudfront.net", "dn1i8v75r669j.cloudfront.net"], totalExecutionTime: 146399, totalOccurrences: 641 }, { name: "Salesforce Live Agent", company: "Salesforce.com", category: "customer-success", domains: [
    "*.salesforceliveagent.com"], totalExecutionTime: 100033, totalOccurrences: 675 }, { name: "Salesforce.com", category: "ad", domains: ["*.force.com", "*.salesforce.com"], examples: ["secure.force.com"], totalExecutionTime: 1614051, totalOccurrences: 4970 }, { name: "Samba TV", company: "Samba", category: "content", domains: ["*.samba.tv"], totalExecutionTime: 1690, totalOccurrences: 7 }, { name: "Samplicio.us", category: "analytics", domains: ["*.samplicio.us"], totalExecutionTime: 1727, totalOccurrences: 5 }, { name: "Say Media", category: "ad", domains: ["*.saymedia.com"] }, { name: "Scenario", category: "analytics", domains: ["*.getscenario.com"] }, { name: "Schuh (image shard)", company: "Schuh", category: "other", domains: ["d2ob0iztsaxy5v.cloudfront.net"] }, { name: "Science Rockstars", category: "analytics", domains: ["*.persuasionapi.com"] }, { name: "ScientiaMobile", category: "analytics", domains: ["*.wurflcloud.com", "*.wurfl.io"], totalExecutionTime: 627, totalOccurrences: 3 },
    { name: "Scoota", category: "ad", domains: ["*.rockabox.co", "*.scoota.co", "d31i2625d5nv27.cloudfront.net", "dyjnzf8evxrp2.cloudfront.net"] }, { name: "ScribbleLive", category: "ad", domains: ["*.scribblelive.com"] }, { name: "SearchForce", category: "ad", domains: ["*.searchforce.net"], totalExecutionTime: 118, totalOccurrences: 3 }, { name: "SearchSpring", category: "utility", domains: ["*.searchspring.net"], totalExecutionTime: 1175588, totalOccurrences: 309 }, { name: "Searchanise", category: "analytics", domains: ["*.searchanise.com"], examples: ["www.searchanise.com"], totalExecutionTime: 63519, totalOccurrences: 420 }, { name: "Sears Holdings", category: "content", domains: ["*.shld.net"] }, { name: "Secomapp", category: "utility", domains: ["*.secomapp.com"], totalExecutionTime: 2151952, totalOccurrences: 2137 }, { name: "SecuredVisit", company: "4Cite Marketing", category: "ad", domains: ["*.securedvisit.com"], totalExecutionTime: 41054, totalOccurrences: 369 }, { name: "\
SecurityMetrics", category: "utility", domains: ["*.securitymetrics.com"], totalExecutionTime: 8413, totalOccurrences: 2 }, { name: "Segmento", category: "ad", domains: ["*.rutarget.ru"], totalExecutionTime: 17111, totalOccurrences: 226 }, { name: "Segmint", category: "analytics", domains: ["*.segmint.net"], totalExecutionTime: 14122, totalOccurrences: 109 }, { name: "Sekindo", category: "content", domains: ["*.sekindo.com"], totalExecutionTime: 376, totalOccurrences: 4 }, { name: "Seldon", category: "analytics", domains: ["*.rummblelabs.com"] }, { name: "SelectMedia International", category: "content", domains: ["*.selectmedia.asia"], totalExecutionTime: 186574, totalOccurrences: 68 }, { name: "Selligent", category: "ad", domains: ["*.emsecure.net", "*.slgnt.eu", "targetemsecure.blob.core.windows.net"], totalExecutionTime: 163886, totalOccurrences: 506 }, { name: "Sellpoints", category: "analytics", domains: ["*.sellpoints.com"] }, { name: "Semantics3", category: "analytics", domains: [
    "*.hits.io"] }, { name: "Semasio", category: "analytics", domains: ["*.semasio.net"] }, { name: "Semcasting Site Visitor Attribution", company: "Semcasting", category: "ad", domains: ["*.smartzonessva.com"] }, { name: "Sentifi", category: "social", domains: ["*.sentifi.com"] }, { name: "ServMetric", category: "analytics", domains: ["*.servmetric.com"] }, { name: "ServiceSource International", category: "marketing", domains: ["*.scoutanalytics.net"], examples: ["scout.scoutanalytics.net"] }, { name: "ServiceTick", category: "analytics", domains: ["*.servicetick.com"] }, { name: "Servo", company: "Xervo", category: "hosting", domains: ["*.onmodulus.net"] }, { name: "SessionCam", company: "ServiceTick", category: "analytics", domains: ["*.sessioncam.com", "d2oh4tlt9mrke9.cloudfront.net"] }, { name: "Seznam", category: "utility", domains: ["*.imedia.cz"], totalExecutionTime: 1323711, totalOccurrences: 6863 }, { name: "Sharethrough", category: "ad", domains: ["*.sharethrough.com"], totalExecutionTime: 46730,
    totalOccurrences: 833 }, { name: "SharpSpring", category: "marketing", domains: ["*.sharpspring.com", "*.marketingautomation.services"], totalExecutionTime: 632191, totalOccurrences: 2080 }, { name: "ShopRunner", category: "content", domains: ["*.shoprunner.com", "*.s-9.us"], totalExecutionTime: 35573, totalOccurrences: 32 }, { name: "ShopStorm", category: "utility", domains: ["*.shopstorm.com"] }, { name: "Shopatron", category: "hosting", domains: ["*.shopatron.com"] }, { name: "Shopgate", category: "utility", domains: ["*.shopgate.com"], totalExecutionTime: 15293, totalOccurrences: 25 }, { name: "ShopiMind", company: "ShopIMind", category: "ad", domains: ["*.shopimind.com"] }, { name: "Shopkeeper Tools", category: "utility", domains: ["*.shopkeepertools.com"], totalExecutionTime: 500, totalOccurrences: 6 }, { name: "Sidecar", category: "other", domains: ["*.getsidecar.com", "d3v27wwd40f0xu.cloudfront.net"] }, { name: "Sidereel", category: "analytics", domains: ["*.sidereel.com"] },
    { name: "Sift Science", category: "utility", domains: ["*.siftscience.com"], totalExecutionTime: 90167, totalOccurrences: 355 }, { name: "Signal", category: "tag-manager", domains: ["*.sitetagger.co.uk"] }, { name: "Signyfyd", category: "utility", domains: ["*.signifyd.com"], totalExecutionTime: 4752892, totalOccurrences: 2608 }, { name: "Silktide", category: "hosting", domains: ["*.silktide.com"], totalExecutionTime: 132707, totalOccurrences: 390 }, { name: "Silverpop", company: "IBM", category: "ad", domains: ["*.mkt912.com", "*.mkt922.com", "*.mkt932.com", "*.mkt941.com", "*.mkt51.net", "*.mkt61.net", "*.pages01.net", "*.pages02.net", "*.pages03.net", "*.pages04.net", "*.pages05.net"], totalExecutionTime: 4144, totalOccurrences: 58 }, { name: "Simplaex", category: "marketing", domains: ["*.simplaex.net"] }, { name: "SimpleReach", category: "analytics", domains: ["*.simplereach.com", "d8rk54i4mohrb.cloudfront.net"] }, { name: "Simplestream", category: "content", domains: ["*.simp\
lestream.com"], examples: ["player.simplestream.com"] }, { name: "Simpli.fi", category: "ad", domains: ["*.simpli.fi"], totalExecutionTime: 974218, totalOccurrences: 16378 }, { name: "Simplicity Marketing", category: "ad", domains: ["*.flashtalking.com"], totalExecutionTime: 579126, totalOccurrences: 2927 }, { name: "SinnerSchrader Deutschland", category: "ad", domains: ["*.s2Betrieb.de"] }, { name: "Sirv", category: "other", domains: ["*.sirv.com"], totalExecutionTime: 604262, totalOccurrences: 1034 }, { name: "Site Meter", category: "analytics", domains: ["*.sitemeter.com"] }, { name: "Site24x7 Real User Monitoring", company: "Site24x7", category: "analytics", domains: ["*.site24x7rum.com"], totalExecutionTime: 124283, totalOccurrences: 1007 }, { name: "SiteGainer", category: "analytics", domains: ["*.sitegainer.com", "d191y0yd6d0jy4.cloudfront.net"] }, { name: "SiteScout", company: "Centro", category: "ad", domains: ["*.pixel.ad", "*.sitescout.com"], totalExecutionTime: 256082, totalOccurrences: 3401 },
    { name: "Siteimprove", category: "utility", domains: ["*.siteimprove.com", "*.siteimproveanalytics.com"], totalExecutionTime: 28494, totalOccurrences: 361 }, { name: "Six Degrees Group", category: "hosting", domains: ["*.fstech.co.uk"] }, { name: "Skimbit", category: "ad", domains: ["*.redirectingat.com", "*.skimresources.com", "*.skimresources.net"], totalExecutionTime: 32940093, totalOccurrences: 86270 }, { name: "Skimlinks", category: "ad", domains: ["*.skimlinks.com"] }, { name: "SkyGlue Technology", category: "analytics", domains: ["*.skyglue.com"], totalExecutionTime: 2567, totalOccurrences: 24 }, { name: "SkyScanner", category: "content", domains: ["*.skyscanner.net"], examples: ["api.skyscanner.net"], totalExecutionTime: 98147, totalOccurrences: 370 }, { name: "Skybet", company: "Bonne Terre t/a Sky Vegas (Sky)", category: "other", domains: ["*.skybet.com"] }, { name: "Skype", category: "other", domains: ["*.skype.com"], totalExecutionTime: 121901, totalOccurrences: 625 }, {
    name: "Slate Group", category: "content", domains: ["*.cdnslate.com"] }, { name: "SlimCut Media Outstream", company: "SlimCut Media", category: "ad", domains: ["*.freeskreen.com"] }, { name: "Smart Insight Tracking", company: "Emarsys", category: "analytics", domains: ["*.scarabresearch.com"], totalExecutionTime: 361811, totalOccurrences: 1779 }, { name: "Smart AdServer", category: "ad", domains: ["*.01net.com", "*.sascdn.com", "*.sasqos.com", "*.smartadserver.com"], examples: ["securite.01net.com"], totalExecutionTime: 22356737, totalOccurrences: 107812 }, { name: "SmartFocus", category: "analytics", domains: ["*.emv2.com", "*.emv3.com", "*.predictiveintent.com", "*.smartfocus.com", "*.themessagecloud.com"] }, { name: "Smarter Click", category: "ad", domains: ["*.smct.co", "*.smarterclick.co.uk"], totalExecutionTime: 761, totalOccurrences: 11 }, { name: "SmarterHQ", category: "analytics", domains: ["*.smarterhq.io", "d1n00d49gkbray.cloudfront.net", "*.smarterremarketer.net"], totalExecutionTime: 2636,
    totalOccurrences: 28 }, { name: "Smarttools", category: "customer-success", domains: ["*.smartertrack.com"] }, { name: "Smartzer", category: "ad", domains: ["*.smartzer.com"] }, { name: "Snack Media", category: "content", domains: ["*.snack-media.com"], totalExecutionTime: 575613, totalOccurrences: 423 }, { name: "Snacktools", category: "ad", domains: ["*.bannersnack.com"], totalExecutionTime: 162327, totalOccurrences: 303 }, { name: "SnapEngage", category: "customer-success", domains: ["*.snapengage.com"], totalExecutionTime: 147012, totalOccurrences: 1038 }, { name: "SnapWidget", category: "content", domains: ["*.snapwidget.com"] }, { name: "Soasta", category: "analytics", domains: ["*.lognormal.net"] }, { name: "SociableLabs", category: "ad", domains: ["*.sociablelabs.net", "*.sociablelabs.com"] }, { name: "Social Annex", category: "customer-success", domains: ["*.socialannex.com"] }, { name: "SocialShopWave", category: "social", domains: ["*.socialshopwave.com"], totalExecutionTime: 4962079,
    totalOccurrences: 3720 }, { name: "Socialphotos", category: "social", domains: ["*.slpht.com"], totalExecutionTime: 12590, totalOccurrences: 120 }, { name: "Sociomantic Labs", company: "DunnHumby", category: "ad", domains: ["*.sociomantic.com"] }, { name: "SodaHead", category: "analytics", domains: ["*.sodahead.com"], examples: ["pollware-cdn.sodahead.com"] }, { name: "Softwebzone", category: "hosting", domains: ["*.softwebzone.com"], examples: ["www.softwebzone.com"] }, { name: "Sojern", category: "marketing", domains: ["*.sojern.com"], totalExecutionTime: 2086952, totalOccurrences: 4422 }, { name: "Sokrati", category: "marketing", domains: ["*.sokrati.com"] }, { name: "Sonobi", category: "ad", domains: ["*.sonobi.com"], totalExecutionTime: 4682222, totalOccurrences: 81682 }, { name: "Sooqr Search", company: "Sooqr", category: "utility", domains: ["*.sooqr.com"], totalExecutionTime: 176199, totalOccurrences: 396 }, { name: "Sophus3", category: "analytics", domains: ["*.s3ae.com", "\
*.sophus3.com"], totalExecutionTime: 5605, totalOccurrences: 11 }, { name: "Sorenson Media", category: "content", domains: ["*.sorensonmedia.com"] }, { name: "Sortable", category: "ad", domains: ["*.deployads.com"] }, { name: "Sotic", category: "hosting", domains: ["*.sotic.net", "*.soticservers.net"] }, { name: "Soundest", category: "ad", domains: ["*.soundestlink.com", "*.soundest.net"], totalExecutionTime: 835, totalOccurrences: 102 }, { name: "Sourcepoint", category: "ad", domains: ["*.decenthat.com", "*.fallingfalcon.com", "*.summerhamster.com", "d2lv4zbk7v5f93.cloudfront.net", "d3qxwzhswv93jk.cloudfront.net"], examples: ["www.decenthat.com", "www.fallingfalcon.com", "www.summerhamster.com"] }, { name: "SourceKnowledge", homepage: "https://www.sourceknowledge.com", category: "ad", domains: ["*.provenpixel.com"], totalExecutionTime: 505, totalOccurrences: 8 }, { name: "SpaceNet", category: "hosting", domains: ["*.nmm.de"] }, { name: "Sparkflow", company: "Intercept Interactive", category: "\
ad", domains: ["*.sparkflow.net"] }, { name: "Specific Media", category: "ad", domains: ["*.specificmedia.com", "*.adviva.net", "*.specificclick.net"] }, { name: "Spicy", company: "Data-Centric Alliance", category: "ad", domains: ["*.sspicy.ru"] }, { name: "Spoke", category: "customer-success", domains: ["*.121d8.com"] }, { name: "Spongecell", category: "ad", domains: ["*.spongecell.com"] }, { name: "Spot.IM", category: "social", domains: ["*.spot.im", "*.spotim.market"], totalExecutionTime: 192547, totalOccurrences: 342 }, { name: "SpotXchange", category: "ad", domains: ["*.spotxcdn.com", "*.spotxchange.com", "*.spotx.tv"] }, { name: "SpringServer", category: "ad", domains: ["*.springserve.com"], totalExecutionTime: 1192823, totalOccurrences: 1432 }, { name: "Spylight", category: "other", domains: ["*.spylight.com"] }, { name: "SreamAMG", company: "StreamAMG", category: "other", domains: ["*.streamamg.com"], totalExecutionTime: 85506, totalOccurrences: 62 }, { name: "StackAdapt", category: "\
ad", domains: ["*.stackadapt.com"], totalExecutionTime: 1338506, totalOccurrences: 14912 }, { name: "StackExchange", category: "social", domains: ["*.sstatic.net"], totalExecutionTime: 187262, totalOccurrences: 217 }, { name: "Stackla PTY", category: "social", domains: ["*.stackla.com"], totalExecutionTime: 271026, totalOccurrences: 175 }, { name: "Stailamedia", category: "ad", domains: ["*.stailamedia.com"] }, { name: "Stamped.io", category: "analytics", domains: ["*.stamped.io"], totalExecutionTime: 1665115, totalOccurrences: 12460 }, { name: "Starfield Services Root Certificate Authority", company: "Starfield Technologies", category: "utility", domains: ["*.starfieldtech.com", "ss2.us", "*.ss2.us"], examples: ["ocsp.starfieldtech.com"], totalExecutionTime: 18156, totalOccurrences: 39 }, { name: "Starfield Technologies", category: "utility", domains: ["*.websiteprotection.com"], examples: ["seals.websiteprotection.com"] }, { name: "StatCounter", category: "analytics", domains: ["*.st\
atcounter.com"], totalExecutionTime: 5427381, totalOccurrences: 50769 }, { name: "Statful", category: "analytics", domains: ["*.statful.com"] }, { name: "Steelhouse", category: "ad", domains: ["*.steelhousemedia.com"], totalExecutionTime: 66172, totalOccurrences: 452 }, { name: "Steepto", category: "ad", domains: ["*.steepto.com"], totalExecutionTime: 170, totalOccurrences: 1 }, { name: "StellaService", category: "analytics", domains: ["*.stellaservice.com"] }, { name: "StickyADS.tv", category: "ad", domains: ["*.stickyadstv.com"], totalExecutionTime: 2198555, totalOccurrences: 1462 }, { name: "STINGRAY", company: "FlexOne", category: "ad", domains: ["*.impact-ad.jp"], examples: ["y.one.impact-ad.jp"], totalExecutionTime: 1261721, totalOccurrences: 9742 }, { name: "Storify", company: "Adobe Systems", category: "social", domains: ["*.storify.com"] }, { name: "Storm Tag Manager", company: "Rakuten", category: "tag-manager", domains: ["*.stormcontainertag.com"] }, { name: "Storygize", category: "\
ad", domains: ["*.storygize.net"], examples: ["www.storygize.net"], totalExecutionTime: 60468, totalOccurrences: 154 }, { name: "Strands", category: "utility", domains: ["*.strands.com"] }, { name: "StreamRail", category: "ad", domains: ["*.streamrail.com", "*.streamrail.net"] }, { name: "StrikeAd", category: "ad", domains: ["*.strikead.com"] }, { name: "Struq", company: "Quantcast", category: "ad", domains: ["*.struq.com"] }, { name: "StrÃ¶er Digital Media", category: "ad", domains: ["*.stroeerdigitalmedia.de"] }, { name: "StumbleUpon", category: "content", domains: ["*.stumble-upon.com", "*.stumbleupon.com"], totalExecutionTime: 18653, totalOccurrences: 17 }, { name: "Sub2 Technologies", category: "analytics", domains: ["*.sub2tech.com"], totalExecutionTime: 6667, totalOccurrences: 31 }, { name: "SublimeSkinz", category: "ad", domains: ["*.ayads.co"], totalExecutionTime: 339456, totalOccurrences: 772 }, { name: "Sumo Logic", category: "utility", domains: ["*.sumologic.com"], totalExecutionTime: 19322,
    totalOccurrences: 9 }, { name: "Sunday Times Driving", category: "content", domains: ["*.driving.co.uk"] }, { name: "SundaySky", category: "ad", domains: ["*.sundaysky.com", "dds6m601du5ji.cloudfront.net"], totalExecutionTime: 7435, totalOccurrences: 10 }, { name: "Sunrise Integration", category: "utility", domains: ["*.sunriseintegration.com"] }, { name: "Supertool Network Technology", category: "analytics", domains: ["*.miaozhen.com"], totalExecutionTime: 6166, totalOccurrences: 49 }, { name: "Survata", category: "analytics", domains: ["*.survata.com"] }, { name: "SurveyGizmo", category: "analytics", domains: ["*.surveygizmo.eu"], examples: ["www.surveygizmo.eu"] }, { name: "SurveyMonkey", category: "analytics", domains: ["*.surveymonkey.com"], totalExecutionTime: 28632, totalOccurrences: 250 }, { name: "Survicate", category: "analytics", domains: ["*.survicate.com"], totalExecutionTime: 933283, totalOccurrences: 3008 }, { name: "Sweet Tooth", category: "ad", domains: ["*.sweetto\
oth.io"], totalExecutionTime: 2673, totalOccurrences: 41 }, { name: "Swiftype", category: "utility", domains: ["*.swiftype.com", "*.swiftypecdn.com"], totalExecutionTime: 383638, totalOccurrences: 982 }, { name: "Switch Concepts", category: "ad", domains: ["*.switchadhub.com"] }, { name: "SwitchAds", company: "Switch Concepts", category: "ad", domains: ["*.switchads.com"] }, { name: "Swogo", category: "analytics", domains: ["*.xsellapp.com"] }, { name: "Swoop", category: "ad", domains: ["*.swoop.com"], totalExecutionTime: 13511, totalOccurrences: 75 }, { name: "Symantec", category: "utility", domains: ["*.norton.com", "*.symantec.com", "*.symcb.com", "*.symcd.com"], examples: ["extended-validation-ssl.websecurity.symantec.com"], totalExecutionTime: 184600, totalOccurrences: 363 }, { name: "Syncapse", category: "social", domains: ["*.clickable.net"] }, { name: "Synergetic", category: "ad", domains: ["*.synergetic.ag"] }, { name: "Synthetix", category: "customer-success", domains: ["*.sy\
n-finity.com", "*.synthetix-ec1.com", "*.synthetix.com"], examples: ["www.synthetix-ec1.com"], totalExecutionTime: 6284, totalOccurrences: 27 }, { name: "Syte", category: "other", domains: ["*.syteapi.com"], examples: ["cdn.syteapi.com"], totalExecutionTime: 109749, totalOccurrences: 106 }, { name: "TINT", category: "content", domains: ["*.71n7.com", "d33w9bm0n1egwm.cloudfront.net", "d36hc0p18k1aoc.cloudfront.net", "d3l7tj34e9fc43.cloudfront.net"], examples: ["www.71n7.com"] }, { name: "TNS (Kantar Group)", category: "analytics", domains: ["*.tns-counter.ru"] }, { name: "TRUSTe", category: "utility", domains: ["*.truste.com"], totalExecutionTime: 123425, totalOccurrences: 613 }, { name: "TV Genius", company: "Ericcson Media Services", category: "content", domains: ["*.tvgenius.net"] }, { name: "TVSquared", category: "ad", domains: ["*.tvsquared.com"], totalExecutionTime: 548667, totalOccurrences: 4082 }, { name: "TVTY", category: "ad", domains: ["*.distribeo.com", "*.ogigl.com"] }, { name: "\
Tactics bvba", category: "hosting", domains: ["*.influid.co"] }, { name: "Tag Inspector", company: "InfoTrust", category: "analytics", domains: ["d22xmn10vbouk4.cloudfront.net"], totalExecutionTime: 51386, totalOccurrences: 171 }, { name: "TagCommander", category: "tag-manager", domains: ["*.commander1.com", "*.tagcommander.com"], totalExecutionTime: 448164, totalOccurrences: 1509 }, { name: "Tagboard", category: "social", domains: ["*.tagboard.com"], totalExecutionTime: 106499, totalOccurrences: 49 }, { name: "Taggstar", company: "Taggstar UK", category: "ad", domains: ["*.taggstar.com"], totalExecutionTime: 16168, totalOccurrences: 68 }, { name: "Tail Target", company: "Tail", category: "ad", domains: ["*.tailtarget.com"], totalExecutionTime: 176612, totalOccurrences: 873 }, { name: "Tailored", category: "other", domains: ["d24qm7bu56swjs.cloudfront.net", "dw3vahmen1rfy.cloudfront.net", "*.tailored.to"] }, { name: "Taleo Enterprise Cloud Service", company: "Oracle", category: "conten\
t", domains: ["*.taleo.net"], totalExecutionTime: 4178, totalOccurrences: 68 }, { name: "Talkable", category: "ad", domains: ["*.talkable.com", "d2jjzw81hqbuqv.cloudfront.net"], examples: ["www.talkable.com"], totalExecutionTime: 154019, totalOccurrences: 601 }, { name: "TapSense", category: "ad", domains: ["*.tapsense.com"] }, { name: "Tapad", category: "ad", domains: ["*.tapad.com"], totalExecutionTime: 976, totalOccurrences: 54 }, { name: "Teads", category: "ad", domains: ["*.teads.tv"], totalExecutionTime: 2295585, totalOccurrences: 7565 }, { name: "Team Internet Tonic", company: "Team Internet", category: "ad", domains: ["*.dntrax.com"] }, { name: "TechTarget", category: "content", domains: ["*.techtarget.com", "*.ttgtmedia.com"], totalExecutionTime: 11857, totalOccurrences: 24 }, { name: "Technorati", company: "Synacor", category: "ad", domains: ["*.technoratimedia.com"], totalExecutionTime: 5382653, totalOccurrences: 27186 }, { name: "Teedhaze", category: "content", domains: ["*\
.fuel451.com"] }, { name: "Tell Apart", category: "analytics", domains: ["*.tellapart.com", "*.tellaparts.com"] }, { name: "Tencent", category: "content", domains: ["*.qq.com", "*.ywxi.net"], totalExecutionTime: 2265040, totalOccurrences: 8726 }, { name: "Thanx Media", category: "utility", domains: ["*.hawksearch.info"] }, { name: "Thawte", category: "utility", domains: ["*.thawte.com"], examples: ["ocsp.thawte.com", "seal.thawte.com"], totalExecutionTime: 307, totalOccurrences: 1 }, { name: "Thesis", category: "analytics", homepage: "https://www.thesistesting.com/", domains: ["*.ttsep.com"], examples: ["thix.ttsep.com"] }, { name: "The AA", category: "ad", domains: ["*.adstheaa.com"] }, { name: "The ADEX", category: "ad", domains: ["*.theadex.com"], totalExecutionTime: 13554, totalOccurrences: 129 }, { name: "The Best Day", category: "social", domains: ["*.thebestday.com"] }, { name: "The Filter", company: "Exabre", category: "analytics", domains: ["*.thefilter.com"] }, { name: "The G\
uardian", category: "analytics", domains: ["*.ophan.co.uk"] }, { name: "The Hut Group", category: "content", domains: ["*.thcdn.com"], totalExecutionTime: 497181, totalOccurrences: 281 }, { name: "The Numa Group", category: "other", domains: ["*.hittail.com"] }, { name: "The Publisher Desk", category: "ad", domains: ["*.206ads.com", "*.publisherdesk.com"] }, { name: "The Sydney Morning Herald", company: "Fairfax Media", category: "content", domains: ["*.smh.com.au"] }, { name: "The Wall Street Jounal", category: "content", domains: ["*.wsj.net"], totalExecutionTime: 3036, totalOccurrences: 5 }, { name: "The Wall Street Journal", category: "content", domains: ["*.marketwatch.com"] }, { name: "TheFind", category: "content", domains: ["*.thefind.com"] }, { name: "Thinglink", category: "utility", domains: ["*.thinglink.com"], totalExecutionTime: 2987, totalOccurrences: 53 }, { name: "Thirdpresence", category: "ad", domains: ["*.thirdpresence.com"] }, { name: "ThreatMetrix", category: "util\
ity", domains: ["*.online-metrix.net"], totalExecutionTime: 1901757, totalOccurrences: 3530 }, { name: "Throtle", homepage: "https://throtle.io/", category: "analytics", domains: ["*.thrtle.com", "*.v12group.com"] }, { name: "TicketMaster", category: "content", domains: ["*.t-x.io", "*.tmcs.net"] }, { name: "TikTok", company: "ByteDance Ltd", homepage: "https://www.tiktok.com/en/", category: "social", domains: ["*.tiktok.com", "*.ipstatp.com"], examples: ["analytics.tiktok.com", "https://s0.ipstatp.com/ad/business/track-log.js"], totalExecutionTime: 111182189, totalOccurrences: 256224 }, { name: "Tidio Live Chat", company: "Tidio", homepage: "https://www.tidiochat.com/en/", category: "customer-success", domains: ["*.tidiochat.com"], totalExecutionTime: 26584634, totalOccurrences: 24598 }, { name: "Tiledesk Live Chat", company: "Tiledesk SRL", homepage: "https://www.tiledesk.com/", category: "customer-success", domains: ["*.tiledesk.com"], examples: ["widget.tiledesk.com"], totalExecutionTime: 253744,
    totalOccurrences: 103 }, { name: "Time", category: "content", domains: ["*.timeinc.net"] }, { name: "Time2Perf", category: "ad", domains: ["*.time2perf.com"] }, { name: "TinyURL", category: "utility", domains: ["*.tinyurl.com"] }, { name: "Tivo", category: "analytics", domains: ["*.rovicorp.com"] }, { name: "Tom&Co", category: "hosting", domains: ["*.tomandco.uk"] }, { name: "Toms Native Ads", company: "Purch", category: "ad", domains: ["*.natoms.com"] }, { name: "ToneMedia", category: "ad", domains: ["*.clickfuse.com"] }, { name: "Tonic", company: "Team Internet", category: "ad", domains: ["*.dntx.com"] }, { name: "Touch Commerce", category: "customer-success", domains: ["*.inq.com", "*.touchcommerce.com"], totalExecutionTime: 12673, totalOccurrences: 74 }, { name: "ToutApp", category: "ad", domains: ["*.toutapp.com"] }, { name: "TraceView", company: "Solarwinds", category: "analytics", domains: ["*.tracelytics.com", "d2gfdmu30u15x7.cloudfront.net"] }, { name: "TrackJS", category: "\
analytics", domains: ["*.trackjs.com", "d2zah9y47r7bi2.cloudfront.net"], examples: ["usage.trackjs.com"], totalExecutionTime: 2112335, totalOccurrences: 2268 }, { name: "Tradedoubler", category: "ad", domains: ["*.pvnsolutions.com", "*.tradedoubler.com"], totalExecutionTime: 31870, totalOccurrences: 165 }, { name: "Tradelab", category: "ad", domains: ["*.tradelab.fr"], totalExecutionTime: 5013, totalOccurrences: 44 }, { name: "TrafficFactory", category: "ad", domains: ["*.trafficfactory.biz"] }, { name: "TrafficHunt", category: "ad", domains: ["*.traffichunt.com"] }, { name: "TrafficStars", category: "ad", domains: ["*.trafficstars.com", "*.tsyndicate.com"], totalExecutionTime: 3435101, totalOccurrences: 7430 }, { name: "Transifex", category: "utility", domains: ["*.transifex.com"], totalExecutionTime: 193259, totalOccurrences: 546 }, { name: "Travelex", category: "utility", domains: ["*.travelex.net", "*.travelex.co.uk"], examples: ["api.travelex.net", "travelmoney.travelex.co.uk"] },
    { name: "Travelocity Canada", company: "Travelocity", category: "content", domains: ["*.travelocity.ca"], examples: ["www.travelocity.ca"] }, { name: "Travelocity USA", company: "Travelocity", category: "content", domains: ["*.travelocity.com"], examples: ["www.travelocity.com"] }, { name: "Travelzoo", category: "content", domains: ["*.travelzoo.com"] }, { name: "Treasure Data", category: "analytics", domains: ["*.treasuredata.com"], totalExecutionTime: 1404314, totalOccurrences: 14403 }, { name: "Tremor Video", category: "ad", domains: ["*.tremorhub.com", "*.videohub.tv"] }, { name: "Trialfire", category: "analytics", domains: ["*.trialfire.com"], totalExecutionTime: 44579, totalOccurrences: 198 }, { name: "Tribal Fusion", company: "Exponential Interactive", category: "ad", domains: ["*.tribalfusion.com"], totalExecutionTime: 96569, totalOccurrences: 158016 }, { name: "Triblio", category: "marketing", domains: ["*.tribl.io"] }, { name: "Triggered Messaging", company: "Fresh Releva\
nce", category: "ad", domains: ["*.triggeredmessaging.com"] }, { name: "Trinity Mirror", category: "content", domains: ["*.mirror.co.uk"], totalExecutionTime: 13841, totalOccurrences: 41 }, { name: "Trinity Mirror Digital Media", category: "social", domains: ["*.tm-aws.com", "*.icnetwork.co.uk"] }, { name: "TripAdvisor", category: "content", domains: ["*.jscache.com", "*.tacdn.com", "*.tamgrt.com", "*.tripadvisor.com", "*.viator.com", "*.tripadvisor.co.uk"], examples: ["www.jscache.com", "www.tamgrt.com"], totalExecutionTime: 749303, totalOccurrences: 2354 }, { name: "TripleLift", category: "ad", domains: ["*.3lift.com"], totalExecutionTime: 8396, totalOccurrences: 4812 }, { name: "Tru Optik", category: "ad", domains: ["*.truoptik.com"] }, { name: "TruConversion", category: "analytics", domains: ["*.truconversion.com"], totalExecutionTime: 487670, totalOccurrences: 1008 }, { name: "Trueffect", category: "marketing", domains: ["*.adlegend.com"] }, { name: "Truefit", category: "analytics",
    domains: ["*.truefitcorp.com"], examples: ["cdn.truefitcorp.com", "fitrec.truefitcorp.com", "sch-cdn.truefitcorp.com"], totalExecutionTime: 4647, totalOccurrences: 20 }, { name: "Trust Guard", category: "utility", domains: ["*.trust-guard.com"], totalExecutionTime: 3346, totalOccurrences: 35 }, { name: "Trust Pilot", category: "analytics", domains: ["*.trustpilot.com"], totalExecutionTime: 14795265, totalOccurrences: 54942 }, { name: "Amazon Trust Services", company: "Amazon", category: "utility", domains: ["*.amazontrust.com", "o.ss2.us"], examples: ["ocsp.rootca1.amazontrust.com"], totalExecutionTime: 107, totalOccurrences: 1 }, { name: "Google Trust Services", company: "Google", category: "utility", domains: ["*.pki.goog"], examples: ["ocsp.pki.goog"], totalExecutionTime: 18, totalOccurrences: 1 }, { name: "Let's Encrypt", homepage: "https://letsencrypt.org/", category: "utility", domains: ["*.letsencrypt.org"], examples: ["ocsp.int-x3.letsencrypt.org"], totalExecutionTime: 76, totalOccurrences: 3 },
    { name: "TrustX", category: "ad", domains: ["*.trustx.org"] }, { name: "Trusted Shops", category: "utility", domains: ["*.trustedshops.com"], totalExecutionTime: 7373870, totalOccurrences: 17267 }, { name: "Trustev", company: "TransUnion", category: "utility", domains: ["*.trustev.com"], totalExecutionTime: 3272, totalOccurrences: 22 }, { name: "Trustwave", category: "utility", domains: ["*.trustwave.com"], totalExecutionTime: 4600, totalOccurrences: 7 }, { name: "Tryzens TradeState", company: "Tryzens", category: "analytics", domains: ["*.tryzens-analytics.com"], totalExecutionTime: 969, totalOccurrences: 9 }, { name: "TubeMogul", category: "ad", domains: ["*.tubemogul.com"], totalExecutionTime: 24151, totalOccurrences: 51 }, { name: "Turn", category: "ad", domains: ["*.turn.com"], totalExecutionTime: 4802, totalOccurrences: 72 }, { name: "Tutorialize", category: "customer-success", domains: ["*.tutorialize.me"] }, { name: "Twenga", category: "content", domains: ["*.twenga.fr", "*\
.c4tw.net", "*.twenga.co.uk"], examples: ["tracker.twenga.co.uk"] }, { name: "Twitframe", company: "Superblock", category: "utility", domains: ["*.twitframe.com"] }, { name: "Twitter Online Conversion Tracking", company: "Twitter", category: "ad", domains: ["*.ads-twitter.com", "analytics.twitter.com"], examples: ["static.ads-twitter.com"], totalExecutionTime: 6170585, totalOccurrences: 73452 }, { name: "Twitter Short URL", company: "Twitter", category: "social", domains: ["*.t.co"] }, { name: "Twyn Group", category: "ad", domains: ["*.twyn.com"] }, { name: "Tynt", company: "33 Across", category: "ad", domains: ["*.tynt.com"], totalExecutionTime: 41643525, totalOccurrences: 212415 }, { name: "Typepad", category: "hosting", domains: ["*.typepad.com"], totalExecutionTime: 834082, totalOccurrences: 813 }, { name: "TyrbooBytes", category: "utility", domains: ["*.turbobytes.net"] }, { name: "UPS i-parcel", company: "UPS", category: "other", domains: ["*.i-parcel.com"] }, { name: "US Media C\
onsulting", category: "ad", domains: ["*.mediade.sk"] }, { name: "Ubertags", category: "tag-manager", domains: ["*.ubertags.com"] }, { name: "Umbel", category: "analytics", domains: ["*.umbel.com"] }, { name: "Unanimis", company: "Switch", category: "ad", domains: ["*.unanimis.co.uk"] }, { name: "Unbounce", category: "ad", domains: ["*.ubembed.com", "*.unbounce.com", "d2xxq4ijfwetlm.cloudfront.net", "d9hhrg4mnvzow.cloudfront.net"], totalExecutionTime: 2902422, totalOccurrences: 8808 }, { name: "Underdog Media", category: "ad", domains: ["*.underdog.media", "*.udmserve.net"], totalExecutionTime: 524141, totalOccurrences: 289 }, { name: "Understand Digital", category: "ad", domains: ["*.redirecting2.net"] }, { name: "Undertone", company: "Perion", category: "ad", domains: ["*.legolas-media.com"], examples: ["rt.legolas-media.com"] }, { name: "Unidays", category: "ad", domains: ["*.myunidays.com", "*.unidays.world"] }, { name: "Uniqodo", category: "ad", domains: ["*.uniqodo.com"] }, { name: "\
Unite", category: "ad", domains: ["*.uadx.com"] }, { name: "United Card Services", category: "utility", domains: ["*.ucs.su"] }, { name: "United Internet", category: "hosting", domains: ["*.uicdn.com"], totalExecutionTime: 14225, totalOccurrences: 75 }, { name: "United Internet Media", category: "ad", domains: ["*.ui-portal.de"], totalExecutionTime: 20307, totalOccurrences: 59 }, { name: "United Internet Media AG", category: "hosting", domains: ["*.tifbs.net", "*.uicdn.net", "*.uimserv.net"], totalExecutionTime: 1737, totalOccurrences: 48 }, { name: "Unknown", category: "other", domains: [] }, { name: "Unruly Media", category: "ad", domains: ["*.unrulymedia.com"], totalExecutionTime: 679, totalOccurrences: 1789 }, { name: "UpBuild", category: "ad", domains: ["*.upbuild.io"], examples: ["www.upbuild.io"] }, { name: "UpSellit", category: "analytics", domains: ["*.upsellit.com"], examples: ["www.upsellit.com"], totalExecutionTime: 289920, totalOccurrences: 1013 }, { name: "Upland Software",
    category: "hosting", domains: ["*.clickability.com"] }, { name: "Airship", category: "marketing", domains: ["*.urbanairship.com", "*.aswpsdkus.com"], totalExecutionTime: 4666, totalOccurrences: 37 }, { name: "UsabilityTools", category: "analytics", domains: ["*.usabilitytools.com"] }, { name: "Usablenet.net", category: "utility", domains: ["*.usablenet.net"] }, { name: "Use It Better", category: "analytics", domains: ["*.useitbetter.com"] }, { name: "User Replay", category: "analytics", domains: ["*.userreplay.net"] }, { name: "UserReport", category: "analytics", domains: ["*.userreport.com"], totalExecutionTime: 133479, totalOccurrences: 476 }, { name: "Userneeds", category: "analytics", domains: ["*.userneeds.dk"] }, { name: "Userzoom", category: "analytics", domains: ["*.userzoom.com"], totalExecutionTime: 5093, totalOccurrences: 4 }, { name: "V12 Retail Finance", category: "utility", domains: ["*.v12finance.com"] }, { name: "Vacaciones eDreams", category: "content", domains: ["\
*.odistatic.net"] }, { name: "Varick Media Management", category: "ad", domains: ["*.vmmpxl.com"] }, { name: "Vdopia Chocolate", company: "Vdopia", category: "ad", domains: ["*.vdopia.com"] }, { name: "Ve", company: "Ve", homepage: "https://www.ve.com/", category: "marketing", domains: ["*.veinteractive.com", "*.ve.com"] }, { name: "Ve Interactive", company: "Ve", category: "ad", domains: ["*.vepxl1.net", "*.adgenie.co.uk"] }, { name: "Vee24", category: "customer-success", domains: ["*.vee24.com"], totalExecutionTime: 20941, totalOccurrences: 38 }, { name: "Veeseo", category: "content", domains: ["*.veeseo.com"] }, { name: "Venatus Media", category: "marketing", domains: ["*.alcvid.com", "*.venatusmedia.com"] }, { name: "Veoxa", category: "ad", domains: ["*.veoxa.com"] }, { name: "Vergic AB", category: "customer-success", domains: ["*.psplugin.com"], totalExecutionTime: 48232, totalOccurrences: 71 }, { name: "Vergic Engage Platform", company: "Vergic", category: "customer-success", domains: [
    "*.vergic.com"], totalExecutionTime: 41524, totalOccurrences: 57 }, { name: "Verisign (Symantec)", category: "utility", domains: ["*.verisign.com"] }, { name: "Verizon", category: "utility", domains: ["*.public-trust.com"], examples: ["www.public-trust.com"] }, { name: "Verizon Digital Media CDN", homepage: "https://www.verizondigitalmedia.com/", category: "cdn", domains: ["*.edgecastcdn.net", "*.edgecastdns.net"], totalExecutionTime: 98698, totalOccurrences: 108 }, { name: "Verizon Uplynk", company: "Verizon", category: "content", domains: ["*.uplynk.com"], totalExecutionTime: 572, totalOccurrences: 4 }, { name: "Vero", company: "Semblance", category: "ad", domains: ["*.getvero.com", "d3qxef4rp70elm.cloudfront.net"], totalExecutionTime: 613, totalOccurrences: 10 }, { name: "VertaMedia", category: "ad", domains: ["*.vertamedia.com"] }, { name: "Vertical Mass", category: "ad", domains: ["*.vmweb.net"] }, { name: "Vestorly", category: "ad", domains: ["*.oodalab.com"] }, { name: "Vext\
ras", category: "other", domains: ["*.vextras.com"], totalExecutionTime: 4484, totalOccurrences: 42 }, { name: "Viacom", category: "content", domains: ["*.mtvnservices.com"], totalExecutionTime: 15501, totalOccurrences: 44 }, { name: "Vibrant Media", category: "ad", domains: ["*.intellitxt.com", "*.picadmedia.com"] }, { name: "VidPulse", category: "analytics", domains: ["*.vidpulse.com"] }, { name: "Video Media Groep", category: "ad", domains: ["*.vmg.host", "*.inpagevideo.nl"] }, { name: "VideoHub", company: "Tremor Video", category: "ad", domains: ["*.scanscout.com"], examples: ["dt.scanscout.com"] }, { name: "Videology", category: "ad", domains: ["*.tidaltv.com"] }, { name: "Vidible", category: "ad", domains: ["*.vidible.tv"] }, { name: "VigLink", category: "ad", domains: ["*.viglink.com"], totalExecutionTime: 3670311, totalOccurrences: 6219 }, { name: "Vindico", company: "Viant", category: "ad", domains: ["*.vindicosuite.com"] }, { name: "Viocorp International", category: "content",
    domains: ["*.vioapi.com"] }, { name: "ViralNinjas", category: "ad", domains: ["*.viralninjas.com"] }, { name: "Virool", category: "ad", domains: ["*.virool.com"] }, { name: "Virtual Earth", company: "Microsoft", category: "utility", domains: ["*.virtualearth.net"], totalExecutionTime: 54315, totalOccurrences: 312 }, { name: "Visely", company: "Visely", category: "other", homepage: "https://visely.io/", domains: ["*.visely.io"] }, { name: "VisScore", category: "analytics", domains: ["*.visscore.com", "d2hkbi3gan6yg6.cloudfront.net"] }, { name: "Visible Measures", category: "ad", domains: ["*.visiblemeasures.com"], totalExecutionTime: 11, totalOccurrences: 13 }, { name: "Visual Studio", company: "Microsoft", category: "utility", domains: ["*.visualstudio.com"], totalExecutionTime: 3464, totalOccurrences: 3 }, { name: "VisualDNA", category: "ad", domains: ["*.visualdna.com"] }, { name: "VisualVisitor", category: "ad", domains: ["*.id-visitors.com"], examples: ["frontend.id-visitors.co\
m"], totalExecutionTime: 871, totalOccurrences: 14 }, { name: "Vivocha S.p.A", category: "customer-success", domains: ["*.vivocha.com"], totalExecutionTime: 65471, totalOccurrences: 38 }, { name: "Vizu (Nielsen)", category: "analytics", domains: ["*.vizu.com"] }, { name: "Vizury", category: "ad", domains: ["*.vizury.com"], totalExecutionTime: 1296, totalOccurrences: 20 }, { name: "VoiceFive", category: "analytics", domains: ["*.voicefive.com"] }, { name: "Volvelle", company: "Optomaton", category: "ad", domains: ["*.volvelle.tech"] }, { name: "VouchedFor", category: "analytics", domains: ["*.vouchedfor.co.uk"], totalExecutionTime: 30557, totalOccurrences: 18 }, { name: "WARPCACHE", category: "utility", domains: ["*.warpcache.net"] }, { name: "WISHLIST", company: "Shopapps", category: "social", domains: ["*.shopapps.in"] }, { name: "WP Engine", category: "hosting", domains: ["*.wpengine.com"], totalExecutionTime: 651034, totalOccurrences: 341 }, { name: "WalkMe", category: "customer-suc\
cess", domains: ["*.walkme.com"], totalExecutionTime: 636459, totalOccurrences: 495 }, { name: "Watching That", category: "other", domains: ["*.watchingthat.com"] }, { name: "Wayfair", category: "analytics", domains: ["*.wayfair.com"], examples: ["t.wayfair.com"] }, { name: "Web CEO", category: "other", domains: ["*.websiteceo.com"], examples: ["www.websiteceo.com"] }, { name: "Web Dissector", company: "Beijing Gridsum Technologies", category: "analytics", domains: ["*.gridsumdissector.com", "*.webdissector.com"], examples: ["www.webdissector.com"] }, { name: "Web Forensics", category: "analytics", domains: ["*.webforensics.co.uk"] }, { name: "Web Security and Performance", company: "NCC Group", category: "utility", domains: ["*.nccgroup.trust"] }, { name: "WebEngage", category: "customer-success", domains: ["*.webengage.co", "*.webengage.com", "d23nd6ymopvz52.cloudfront.net", "d3701cc9l7v9a6.cloudfront.net"], totalExecutionTime: 789975, totalOccurrences: 2283 }, { name: "WebInsight", company: "\
dotMailer", category: "analytics", domains: ["*.trackedlink.net", "*.trackedweb.net"], totalExecutionTime: 21241, totalOccurrences: 277 }, { name: "WebPageOne Solutions", category: "other", domains: ["*.webpageone.com"] }, { name: "WebSpectator", category: "ad", domains: ["*.webspectator.com"] }, { name: "WebTuna", company: "Application Performance", category: "analytics", domains: ["*.webtuna.com"] }, { name: "WebVideoCore", company: "StreamingVideoProvider", category: "content", domains: ["*.webvideocore.net"], totalExecutionTime: 74152, totalOccurrences: 38 }, { name: "WebWombat", category: "utility", domains: ["*.ic.com.au"] }, { name: "Webcollage", category: "customer-success", domains: ["*.webcollage.net"] }, { name: "Webcore", category: "ad", domains: ["*.onefeed.co.uk"] }, { name: "Webkul", company: "Webkul Software", category: "utility", domains: ["*.webkul.com"], totalExecutionTime: 172788, totalOccurrences: 490 }, { name: "Webmarked", category: "utility", domains: ["*.webmar\
ked.net"], totalExecutionTime: 72467, totalOccurrences: 1077 }, { name: "Weborama", category: "ad", domains: ["*.weborama.com", "*.weborama.fr"], totalExecutionTime: 45883, totalOccurrences: 372 }, { name: "WebpageFX", category: "ad", domains: ["*.leadmanagerfx.com"], totalExecutionTime: 241118, totalOccurrences: 946 }, { name: "Webphone", company: "IP WEB SERVICES", category: "customer-success", domains: ["*.webphone.net"], totalExecutionTime: 4605, totalOccurrences: 20 }, { name: "Webselect selectcommerce", company: "Webselect Internet", category: "hosting", domains: ["*.webselect.net"] }, { name: "Webthinking", category: "hosting", domains: ["*.webthinking.co.uk"] }, { name: "Webtrekk", category: "analytics", domains: ["*.wbtrk.net", "*.webtrekk-asia.net", "*.webtrekk.net", "*.wt-eu02.net", "*.wt-safetag.com"], totalExecutionTime: 85572, totalOccurrences: 428 }, { name: "Webtrends", category: "analytics", domains: ["*.webtrends.com", "*.webtrendslive.com", "d1q62gfb8siqnm.cloudfront\
.net"], totalExecutionTime: 1437, totalOccurrences: 6 }, { name: "Webtype", category: "cdn", domains: ["*.webtype.com"], totalExecutionTime: 0, totalOccurrences: 1 }, { name: "White Ops", category: "utility", domains: ["*.acexedge.com", "*.tagsrvcs.com"] }, { name: "Whitespace", category: "ad", domains: ["*.whitespacers.com"] }, { name: "WhosOn Live Chat Software", category: "customer-success", domains: ["*.whoson.com"], totalExecutionTime: 20753, totalOccurrences: 112 }, { name: "Wibbitz", category: "other", domains: ["*.wibbitz.com"] }, { name: "Wide Area Communications", category: "hosting", domains: ["*.widearea.co.uk"] }, { name: "WideOrbit", category: "marketing", domains: ["*.admaym.com"] }, { name: "William Reed", category: "content", domains: ["*.wrbm.com"], totalExecutionTime: 50, totalOccurrences: 1 }, { name: "WillyFogg.com", category: "content", domains: ["*.willyfogg.com"] }, { name: "Windows", company: "Microsoft", category: "utility", domains: ["*.windowsupdate.com"], examples: [
    "ctldl.windowsupdate.com"] }, { name: "WisePops", category: "utility", domains: ["*.wisepops.com"], totalExecutionTime: 2631328, totalOccurrences: 1950 }, { name: "Wishlist King", company: "Appmate", category: "other", homepage: "https://appmate.io/", domains: ["*.appmate.io"], examples: ["api.appmate.io"], totalExecutionTime: 130543, totalOccurrences: 235 }, { name: "Wishpond Technologies", category: "marketing", domains: ["*.wishpond.com", "*.wishpond.net"], totalExecutionTime: 771888, totalOccurrences: 1691 }, { name: "WizRocket Technologies", category: "analytics", domains: ["*.wzrkt.com"], totalExecutionTime: 138, totalOccurrences: 2 }, { name: "Woopra", category: "analytics", domains: ["*.woopra.com"], totalExecutionTime: 120767, totalOccurrences: 1366 }, { name: "Woosmap", category: "utility", domains: ["*.woosmap.com"], totalExecutionTime: 58710, totalOccurrences: 139 }, { name: "WorkCast", category: "hosting", domains: ["*.workcast.net"] }, { name: "World News Media", category: "\
content", domains: ["*.wnmedia.co.uk"] }, { name: "Worldpay", category: "utility", domains: ["*.worldpay.com"], totalExecutionTime: 25852, totalOccurrences: 18 }, { name: "Wow Analytics", category: "analytics", domains: ["*.wowanalytics.co.uk"], totalExecutionTime: 11162, totalOccurrences: 73 }, { name: "Wowcher", category: "ad", domains: ["*.wowcher.co.uk"] }, { name: "Wufoo", category: "utility", domains: ["*.wufoo.com"], totalExecutionTime: 381206, totalOccurrences: 1507 }, { name: "Wunderkind", category: "marketing", homepage: "https://www.wunderkind.co/", domains: ["*.bounceexchange.com", "*.bouncex.net", "*.wknd.ai", "*.cdnbasket.net", "*.cdnwidget.com"], examples: ["events.bouncex.net", "tag.wknd.ai", "data.cdnbasket.net", "pix.cdnwidget.com"], totalExecutionTime: 2016506, totalOccurrences: 1278 }, { name: "Wyng", category: "ad", domains: ["*.offerpop.com"] }, { name: "XMLSHOP", category: "hosting", domains: ["*.xmlshop.biz"] }, { name: "XiTi", company: "AT Internet", category: "\
analytics", domains: ["*.xiti.com", "*.aticdn.net"], homepage: "https://www.atinternet.com/en/", examples: ["tag.aticdn.net/123456789/smarttag.js"], totalExecutionTime: 918257, totalOccurrences: 8483 }, { name: "YUDU", category: "content", domains: ["*.yudu.com"] }, { name: "Yahoo! Ad Exchange", company: "Yahoo!", category: "ad", domains: ["*.yieldmanager.com", "*.browsiprod.com"], examples: ["yield-manager.browsiprod.com"], totalExecutionTime: 12720569, totalOccurrences: 4994 }, { name: "Yahoo! JAPAN Ads", company: "Yahoo! JAPAN", category: "ad", homepage: "https://marketing.yahoo.co.jp/service/yahooads/", domains: ["yads.c.yimg.jp", "s.yimg.jp", "b92.yahoo.co.jp"], examples: ["yads.c.yimg.jp/js/yads-async.js", "s.yimg.jp/images/listing/tool/yads/ydn/creative/video/ytop_video_timeline_sp.min.js", "b92.yahoo.co.jp/js/s_retargeting.js"], totalExecutionTime: 6236624, totalOccurrences: 37464 }, { name: "Yahoo! Tag Manager", company: "Yahoo! JAPAN", category: "tag-manager", homepage: "http\
s://marketing.yahoo.co.jp/service/tagmanager/", domains: ["*.yjtag.jp"], examples: ["s.yjtag.jp/tag.js"] }, { name: "Yahoo! Small Business", company: "Yahoo!", category: "hosting", domains: ["*.aabacosmallbusiness.com"] }, { name: "Yellow Robot", category: "ad", domains: ["*.backinstock.org"], totalExecutionTime: 15268, totalOccurrences: 508 }, { name: "YieldPartners", category: "ad", domains: ["*.yieldpartners.com"] }, { name: "Yieldbot", category: "ad", domains: ["*.yldbt.com"] }, { name: "Yieldify", category: "ad", domains: ["*.yieldify.com", "*.yieldifylabs.com", "d33wq5gej88ld6.cloudfront.net", "dwmvwp56lzq5t.cloudfront.net"], examples: ["geo.yieldifylabs.com"], totalExecutionTime: 513761, totalOccurrences: 168 }, { name: "Yieldlab", category: "ad", domains: ["*.yieldlab.net"], totalExecutionTime: 54, totalOccurrences: 8 }, { name: "Yieldmo", category: "ad", domains: ["*.yieldmo.com"], totalExecutionTime: 51128, totalOccurrences: 2375 }, { name: "Yieldr", category: "ad", domains: [
    "*.254a.com"] }, { name: "Yo", category: "utility", domains: ["*.yopify.com"] }, { name: "YoYo", category: "utility", domains: ["*.goadservices.com"] }, { name: "Yotpo", homepage: "https://www.yotpo.com/", category: "marketing", domains: ["*.yotpo.com", "*.swellrewards.com"], totalExecutionTime: 16919447, totalOccurrences: 26094 }, { name: "Yottaa", category: "hosting", domains: ["*.yottaa.com", "*.yottaa.net"], totalExecutionTime: 798791, totalOccurrences: 753 }, { name: "YourAmigo", category: "utility", domains: ["*.youramigo.com"] }, { name: "YuMe", category: "ad", domains: ["*.yume.com", "*.yumenetworks.com"], examples: ["cks.yumenetworks.com"] }, { name: "Yummley", category: "other", domains: ["*.yummly.com"], totalExecutionTime: 14163, totalOccurrences: 6 }, { name: "ZEDO", category: "ad", domains: ["*.zedo.com"] }, { name: "Zafu", category: "analytics", domains: ["*.zafu.com"] }, { name: "Zaius", category: "ad", domains: ["*.zaius.com"] }, { name: "Zamplus ad", category: "ad",
    domains: ["*.zampda.net"] }, { name: "Zanox", category: "ad", domains: ["*.zanox.com", "*.zanox.ws"] }, { name: "Zapper", category: "utility", domains: ["*.zapper.com"] }, { name: "Zarget", category: "analytics", domains: ["*.zarget.com"] }, { name: "Zemanta", category: "ad", domains: ["*.zemanta.com"], totalExecutionTime: 2735, totalOccurrences: 28 }, { name: "Zen Internet", category: "other", domains: ["*.zyen.com"] }, { name: "Zenovia Digital Exchange", category: "ad", domains: ["*.rhythmxchange.com", "*.zenoviaexchange.com"] }, { name: "ZergNet", category: "content", domains: ["*.zergnet.com"], totalExecutionTime: 186, totalOccurrences: 4 }, { name: "Zerogrey", category: "hosting", domains: ["*.zerogrey.com"] }, { name: "Ziff Davis Tech", category: "ad", domains: ["*.adziff.com", "*.zdbb.net"], totalExecutionTime: 30706, totalOccurrences: 93 }, { name: "Zmags", category: "marketing", domains: ["*.zmags.com"], totalExecutionTime: 262514, totalOccurrences: 119 }, { name: "Zolando",
    category: "content", domains: ["*.ztat.net"], totalExecutionTime: 229623, totalOccurrences: 48 }, { name: "Zoover", category: "analytics", domains: ["*.zoover.nl", "*.zoover.co.uk"], totalExecutionTime: 9173, totalOccurrences: 2 }, { name: "Zopim", category: "customer-success", domains: ["*.zopim.io"] }, { name: "[24]7", category: "customer-success", domains: ["*.247-inc.net", "*.247inc.net", "d1af033869koo7.cloudfront.net"], totalExecutionTime: 24965, totalOccurrences: 20 }, { name: "adKernel", category: "ad", domains: ["*.adkernel.com"], totalExecutionTime: 19140, totalOccurrences: 9621 }, { name: "adMarketplace", company: "AMPexchange", category: "ad", domains: ["*.ampxchange.com", "*.admarketplace.net"] }, { name: "addtocalendar", category: "utility", domains: ["*.addtocalendar.com"] }, { name: "adnanny", category: "ad", domains: ["*.adserver01.de"], totalExecutionTime: 2, totalOccurrences: 6 }, { name: "affilinet", category: "ad", domains: ["*.reussissonsensemble.fr", "*.succe\
ssfultogether.co.uk"] }, { name: "audioBoom", category: "social", domains: ["*.audioboom.com", "*.audioboo.fm"], totalExecutionTime: 136729, totalOccurrences: 57 }, { name: "bPay by Barclaycard", company: "Barclays Bank", category: "utility", domains: ["*.bpay.co.uk"] }, { name: "bRealTime", category: "ad", domains: ["*.brealtime.com"], totalExecutionTime: 4479, totalOccurrences: 76 }, { name: "bd4travel", category: "analytics", domains: ["*.bd4travel.com"] }, { name: "bizinformation-VOID", company: "bizinformation", category: "analytics", domains: ["*.bizinformation.org"] }, { name: "carrot", category: "social", domains: ["*.sharebutton.co"] }, { name: "cloudIQ", category: "analytics", domains: ["*.cloud-iq.com"] }, { name: "comScore", category: "analytics", domains: ["*.adxpose.com", "*.comscore.com", "*.sitestat.com", "*.zqtk.net"], totalExecutionTime: 4938, totalOccurrences: 3 }, { name: "content.ad", category: "ad", domains: ["*.content.ad"] }, { name: "d3 Media", company: "d3 Tec\
hnologies", category: "other", domains: ["*.d3sv.net"] }, { name: "dexiMEDIA", category: "ad", domains: ["*.deximedia.com"] }, { name: "dianomi", category: "ad", domains: ["*.dianomi.com", "*.dianomioffers.co.uk"], totalExecutionTime: 52461, totalOccurrences: 86 }, { name: "donReach", category: "social", domains: ["*.donreach.com"] }, { name: "dotMailer", category: "ad", domains: ["*.dmtrk.com", "*.dotmailer.com", "*.emlfiles.com"] }, { name: "dotMailer Surveys", company: "dotMailer", category: "analytics", domains: ["*.dotmailer-surveys.com"] }, { name: "dstillery", category: "ad", domains: ["*.dstillery.com", "*.media6degrees.com"], totalExecutionTime: 1160, totalOccurrences: 12 }, { name: "eBay", category: "ad", domains: ["*.ebay.com", "*.ebayimg.com", "*.fetchback.com"], totalExecutionTime: 600826, totalOccurrences: 1026 }, { name: "eBay Enterprise", category: "hosting", domains: ["*.csdata1.com", "*.gsipartners.com"] }, { name: "eBuzzing", company: "Teads Managed Services", category: "\
ad", domains: ["*.ebz.io"] }, { name: "eDigital Research", category: "customer-success", domains: ["*.edigitalresearch.com", "*.edigitalsurvey.com", "*.edrcdn.com", "*.ecustomeropinions.com"] }, { name: "eGain", category: "analytics", domains: ["*.analytics-egain.com", "*.egain.com"], totalExecutionTime: 8418, totalOccurrences: 74 }, { name: "eHost", category: "hosting", domains: ["*.ehosts.net"] }, { name: "eKomi", category: "analytics", domains: ["*.ekomi.com", "*.ekomi.de"], totalExecutionTime: 51192, totalOccurrences: 17 }, { name: "eWAY", company: "Web Active Pty", category: "utility", domains: ["*.eway.com.au"], examples: ["www.eway.com.au"], totalExecutionTime: 11094, totalOccurrences: 1 }, { name: "eXTReMe digital", category: "analytics", domains: ["*.extreme-dm.com"], totalExecutionTime: 3491, totalOccurrences: 78 }, { name: "eXelate", category: "ad", domains: ["*.exelator.com"], totalExecutionTime: 17905, totalOccurrences: 246 }, { name: "ecommercefeed.net", category: "market\
ing", domains: ["*.ecommercefeed.net"] }, { name: "engage:BDR", category: "ad", domains: ["*.bnmla.com", "*.ebdr3.com"] }, { name: "epago", category: "ad", domains: ["*.adaos-ads.net"] }, { name: "epoq internet services", category: "analytics", domains: ["*.epoq.de"], totalExecutionTime: 84260, totalOccurrences: 122 }, { name: "etouches", category: "hosting", domains: ["*.etouches.com"], examples: ["www.etouches.com"] }, { name: "etracker", category: "analytics", domains: ["*.etracker.com", "*.etracker.de"], examples: ["www.etracker.com"], totalExecutionTime: 2076262, totalOccurrences: 5626 }, { name: "everestads.com", category: "content", domains: ["*.verestads.net"] }, { name: "exebid.DCA", company: "Data-Centric Alliance", category: "ad", domains: ["*.exe.bid"] }, { name: "eyeReturn Marketing", category: "marketing", domains: ["*.eyereturn.com"] }, { name: "feedoptimise", category: "hosting", domains: ["*.feedoptimise.com", "d1w78njrm56n7g.cloudfront.net"], totalExecutionTime: 126, totalOccurrences: 2 },
    { name: "fifty-five", category: "ad", domains: ["*.55labs.com"] }, { name: "fluct", category: "ad", domains: ["*.adingo.jp"], totalExecutionTime: 5114249, totalOccurrences: 12890 }, { name: "freegeoip.net", company: "(community-funded)", category: "utility", domains: ["*.freegeoip.net"] }, { name: "freewheel.tv", category: "content", domains: ["*.fwmrm.net"], totalExecutionTime: 3847, totalOccurrences: 42 }, { name: "gnatta", category: "customer-success", domains: ["*.gnatta.com"] }, { name: "home.pl", category: "hosting", domains: ["*.nscontext.eu"] }, { name: "hyfn", category: "ad", domains: ["*.hyfn.com"] }, { name: "iAdvize SAS", category: "customer-success", domains: ["*.iadvize.com"], totalExecutionTime: 286995, totalOccurrences: 844 }, { name: "iBillboard", category: "ad", domains: ["*.ibillboard.com"], totalExecutionTime: 303, totalOccurrences: 2 }, { name: "iCrossing", category: "ad", domains: ["*.ic-live.com"] }, { name: "iFactory", company: "RDW Group", category: "hostin\
g", domains: ["*.ifactory.com"] }, { name: "iGoDigital", category: "analytics", domains: ["*.igodigital.com"], totalExecutionTime: 1800, totalOccurrences: 21 }, { name: "iJento", company: "Fopsha", category: "ad", domains: ["*.ijento.com"] }, { name: "iPage", category: "hosting", domains: ["*.ipage.com"], examples: ["www.ipage.com"], totalExecutionTime: 490, totalOccurrences: 6 }, { name: "iPerceptions", category: "customer-success", domains: ["*.iperceptions.com"], totalExecutionTime: 626044, totalOccurrences: 4662 }, { name: "iTunes", company: "Apple", category: "content", domains: ["*.mzstatic.com"] }, { name: "imgix", company: "Zebrafish Labs", category: "utility", domains: ["*.imgix.net"], totalExecutionTime: 40073, totalOccurrences: 98 }, { name: "infogr.am", category: "utility", domains: ["*.infogr.am", "*.jifo.co"], totalExecutionTime: 2008949, totalOccurrences: 233 }, { name: "iotec", category: "analytics", domains: ["*.dsp.io"] }, { name: "iovation", category: "utility", domains: [
    "*.iesnare.com"], totalExecutionTime: 270232, totalOccurrences: 2159 }, { name: "ipinfo.io", category: "utility", domains: ["*.ipinfo.io"] }, { name: "issuu", category: "content", domains: ["*.issuu.com", "*.isu.pub"], totalExecutionTime: 5607951, totalOccurrences: 2714 }, { name: "iubenda", category: "utility", domains: ["*.iubenda.com"], examples: ["www.iubenda.com"], totalExecutionTime: 69911073, totalOccurrences: 97074 }, { name: "j2 Cloud Services", category: "ad", domains: ["*.campaigner.com"], totalExecutionTime: 12708, totalOccurrences: 28 }, { name: "jsonip.com", category: "analytics", domains: ["*.jsonip.com"] }, { name: "linkpulse", category: "analytics", domains: ["*.lp4.io"] }, { name: "loGo_net", category: "analytics", domains: ["*.logo-net.co.uk"] }, { name: "mainADV", category: "ad", domains: ["*.httptrack.com", "*.solocpm.com"] }, { name: "mbr targeting", category: "ad", domains: ["*.m6r.eu"], totalExecutionTime: 17, totalOccurrences: 1 }, { name: "media.ventive", category: "\
ad", domains: ["*.contentspread.net"] }, { name: "metrigo", category: "ad", domains: ["*.metrigo.com"] }, { name: "minicabit.com", category: "content", domains: ["*.minicabit.com"] }, { name: "mobiManage", category: "hosting", domains: ["*.mobimanage.com"] }, { name: "moving-pictures", category: "other", domains: ["*.moving-pictures.biz", "*.v6-moving-pictures.com", "*.vtstat.com", "*.moving-pictures.de"] }, { name: "my6sense", category: "ad", domains: ["*.mynativeplatform.com"] }, { name: "myThings", category: "ad", domains: ["*.mythings.com", "*.mythingsmedia.net"] }, { name: "mymovies", category: "content", domains: ["*.mymovies.net"] }, { name: "nRelate-VOID", company: "nRelate", category: "content", domains: ["*.nrelate.com"] }, { name: "nToklo", category: "analytics", domains: ["*.ntoklo.com"] }, { name: "neXeps", category: "ad", domains: ["*.nexeps.com"] }, { name: "ninemsn Pty.", category: "utility", domains: ["*.ninemsn.com.au"] }, { name: "nugg.ad", category: "ad", domains: [
    "*.nuggad.net"] }, { name: "numero interactive", company: "numero", category: "ad", domains: ["*.numerointeractive.com"] }, { name: "optMD", company: "Optimax Media Delivery", category: "ad", domains: ["*.optmd.com"] }, { name: "otracking.com", category: "analytics", domains: ["*.otracking.com"] }, { name: "paysafecard", company: "Paysafe Group", category: "utility", domains: ["*.paysafecard.com"] }, { name: "piano", category: "ad", domains: ["*.npttech.com", "*.tinypass.com"], examples: ["www.npttech.com"], totalExecutionTime: 1016108, totalOccurrences: 1146 }, { name: "piclike", category: "ad", domains: ["*.piclike.us"] }, { name: "placehold.it", category: "utility", domains: ["*.placehold.it"] }, { name: "plista", category: "ad", domains: ["*.plista.com"] }, { name: "prebid.org", category: "utility", domains: ["*.prebid.org"], totalExecutionTime: 462, totalOccurrences: 1 }, { name: "reEmbed", category: "other", domains: ["*.reembed.com"] }, { name: "reddit", category: "social", domains: [
    "*.reddit.com", "*.redditstatic.com"], examples: ["www.redditstatic.com"], totalExecutionTime: 4113522, totalOccurrences: 18483 }, { name: "rewardStyle.com", category: "ad", domains: ["*.rewardstyle.com"], totalExecutionTime: 280999, totalOccurrences: 1491 }, { name: "rss2json", category: "utility", domains: ["*.rss2json.com"], totalExecutionTime: 1380, totalOccurrences: 18 }, { name: "sage Pay", company: "Sage Pay Europe", category: "utility", domains: ["*.sagepay.com"], totalExecutionTime: 4481, totalOccurrences: 40 }, { name: "section.io", category: "utility", domains: ["*.squixa.net"], examples: ["beacon.squixa.net", "s.squixa.net"] }, { name: "smartclip", category: "ad", domains: ["*.smartclip.net"], totalExecutionTime: 41051, totalOccurrences: 21 }, { name: "sovrn", category: "ad", domains: ["*.lijit.com"], totalExecutionTime: 2389059, totalOccurrences: 27306 }, { name: "stackpile.io", company: "StackPile", category: "tag-manager", domains: ["*.stackpile.io"] }, { name: "temp\
late-help.com", category: "hosting", domains: ["*.template-help.com"], totalExecutionTime: 16016, totalOccurrences: 13 }, { name: "test", company: "test only", category: "other", domains: ["*.testtesttest.com"] }, { name: "trueAnthem", category: "social", domains: ["*.tru.am"] }, { name: "tweetmeme-VOID", company: "tweetmeme", category: "analytics", domains: ["*.tweetmeme.com"] }, { name: "uLogin", category: "other", domains: ["*.ulogin.ru"] }, { name: "uLogix", category: "ad", domains: ["*.ulogix.ru"] }, { name: "ucfunnel ucX", company: "ucfunnel", category: "ad", domains: ["*.aralego.com"], totalExecutionTime: 1469345, totalOccurrences: 7945 }, { name: "up-value", category: "ad", domains: ["*.up-value.de"] }, { name: "wywy", category: "ad", domains: ["*.wywy.com", "*.wywyuserservice.com"] }, { name: "CDK Dealer Management", company: "CDK Global", homepage: "https://www.cdkglobal.com/us", category: "hosting", domains: ["*.assets-cdk.com"], examples: ["media-cf.assets-cdk.com"], totalExecutionTime: 1052,
    totalOccurrences: 4 }, { name: "fam", company: "Fing Co Ltd.", homepage: "http://admin.fam-ad.com/report/", category: "ad", domains: ["*.fam-ad.com"], examples: ["img.fam-ad.com"], totalExecutionTime: 1816, totalOccurrences: 10 }, { name: "zypmedia", category: "ad", domains: ["*.extend.tv"] }, { name: "codigo", homepage: "https://www.codigo.se", category: "analytics", domains: ["*.codigo.se"], examples: ["analytics.codigo.se"], totalExecutionTime: 469, totalOccurrences: 10 }, { name: "Playground", homepage: "https://playground.xyz", category: "ad", domains: ["*.playground.xyz"], examples: ["ads.playground.xyz"], totalExecutionTime: 2767, totalOccurrences: 26 }, { name: "RAM", homepage: "https://www2.rampanel.com/", category: "analytics", domains: ["*.rampanel.com"], examples: ["inviso.rampanel.com"], totalExecutionTime: 15413, totalOccurrences: 1 }, { name: "Adition", homepage: "https://www.adition.com", category: "ad", domains: ["*.adition.com"], examples: ["dsp.adfarm1.adition.co\
m"], totalExecutionTime: 74399, totalOccurrences: 491 }, { name: "Widespace", homepage: "https://www.widespace.com", category: "ad", domains: ["*.widespace.com"], examples: ["sync.widespace.com"] }, { name: "Colpirio", homepage: "https://www.widespace.com", category: "analytics", domains: ["*.colpirio.com"], examples: ["proxy-tracker.colpirio.com"] }, { name: "Brandmetrics", homepage: "https://www.brandmetrics.com", category: "analytics", domains: ["*.brandmetrics.com"], examples: ["collector.brandmetrics.com", "cdn.brandmetrics.com"], totalExecutionTime: 3689914, totalOccurrences: 30850 }, { name: "EasyAd", homepage: "https://web.easy-ads.com/", category: "ad", domains: ["*.easy-ads.com"], examples: ["ads.easy-ads.com"] }, { name: "Glimr", homepage: "https://glimr.io/", category: "analytics", domains: ["*.glimr.io"], examples: ["pixel.glimr.io"] }, { name: "Webtreck", homepage: "https://www.webtrekk.com/en/home/", category: "analytics", domains: ["*.wcfbc.net"], examples: ["fbc.wcfbc.\
net"] }, { name: "DigiTrust", homepage: "http://www.digitru.st/", category: "analytics", domains: ["*.digitru.st"], examples: ["cdn.digitru.st"] }, { name: "Kantar Sifo", homepage: "https://www.kantarsifo.se", category: "analytics", domains: ["*.research-int.se"], examples: ["trafficgateway.research-int.se"], totalExecutionTime: 375, totalOccurrences: 1 }, { name: "Concert", homepage: "https://concert.io/", category: "ad", domains: ["*.concert.io"], examples: ["cdn.concert.io"], totalExecutionTime: 317481, totalOccurrences: 336 }, { name: "Emerse", homepage: "https://www.emerse.com/", category: "ad", domains: ["*.emerse.com"], examples: ["tracking.emerse.com"], totalExecutionTime: 2872, totalOccurrences: 13 }, { name: "Iterate", homepage: "https://iteratehq.com/", category: "analytics", domains: ["*.iteratehq.com"], totalExecutionTime: 8751, totalOccurrences: 72 }, { name: "Cookiebot", homepage: "https://www.cookiebot.com/", category: "utility", domains: ["*.cookiebot.com"], examples: [
    "consent.cookiebot.com"], totalExecutionTime: 64865019, totalOccurrences: 187732 }, { name: "Netlify", homepage: "https://www.netlify.com/", category: "utility", domains: ["*.netlify.com", "*.netlifyusercontent.com"], examples: ["cloud.netlifyusercontent.com"], totalExecutionTime: 299527, totalOccurrences: 1323 }, { name: "Scroll", homepage: "https://scroll.com/", category: "utility", domains: ["*.scroll.com"], examples: ["static.scroll.com", "connect.scroll.com"] }, { name: "Consumable", homepage: "https://consumable.com/", category: "ad", domains: ["*.serverbid.com"], totalExecutionTime: 15203, totalOccurrences: 266 }, { name: "DMD Marketing", homepage: "https://www.dmdconnects.com/", category: "ad", domains: ["*.medtargetsystem.com"], totalExecutionTime: 257224, totalOccurrences: 846 }, { name: "Catchpoint", homepage: "https://www.catchpoint.com/", category: "analytics", domains: ["*.3gl.net", "*.3genlabs.net"], totalExecutionTime: 14822, totalOccurrences: 160 }, { name: "Termin\
us", homepage: "https://terminus.com/", category: "ad", domains: ["*.terminus.services"], totalExecutionTime: 28077, totalOccurrences: 207 }, { name: "Acceptable Ads", homepage: "https://acceptableads.com/", category: "ad", domains: ["*.aaxads.com", "*.aaxdetect.com"], totalExecutionTime: 2200, totalOccurrences: 34 }, { name: "ClearBrain", homepage: "https://www.clearbrain.com/", category: "analytics", domains: ["*.clearbrain.com"], examples: ["api.clearbrain.com"] }, { name: "Optanon", homepage: "https://www.cookielaw.org/", category: "consent-provider", domains: ["*.onetrust.com", "*.cookielaw.org"], examples: ["cdn.cookielaw.org", "geolocation.onetrust.com"], totalExecutionTime: 55293468, totalOccurrences: 113700 }, { name: "TrustArc", homepage: "https://www.trustarc.com/", category: "utility", domains: ["*.trustarc.com"], examples: ["choices.trustarc.com", "consent.trustarc.com"], totalExecutionTime: 2429376, totalOccurrences: 5941 }, { name: "iSpot.tv", homepage: "https://www.ispo\
t.tv/", category: "ad", domains: ["*.ispot.tv"], examples: ["pt.ispot.tv"], totalExecutionTime: 2947, totalOccurrences: 10 }, { name: "RevJet", homepage: "https://www.revjet.com/", category: "ad", domains: ["*.revjet.com"], examples: ["pix.revjet.com", "ads.revjet.com"], totalExecutionTime: 54608, totalOccurrences: 36 }, { name: "atlasRTX", homepage: "https://www.atlasrtx.com/", category: "customer-success", domains: ["*.atlasrtx.com"], examples: ["app.atlasrtx.com", "cdn.atlasrtx.com", "dev.atlasrtx.com"], totalExecutionTime: 52386, totalOccurrences: 46 }, { name: "ContactAtOnce", homepage: "https://www.contactatonce.com/", category: "customer-success", domains: ["*.contactatonce.com"], examples: ["tag.contactatonce.com", "agentpresence.contactatonce.com"] }, { name: "Algolia", homepage: "https://www.algolia.com/", category: "utility", domains: ["*.algolianet.com", "*.algolia.net", "*.algolia.io"], totalExecutionTime: 5603, totalOccurrences: 20 }, { name: "EMX Digital", homepage: "htt\
ps://emxdigital.com", category: "ad", domains: ["*.emxdgt.com"], totalExecutionTime: 9160, totalOccurrences: 166 }, { name: "Moxie", homepage: "https://www.gomoxie.com/", category: "utility", domains: ["*.gomoxie.solutions"], totalExecutionTime: 24183, totalOccurrences: 28 }, { name: "Scripps Network Digital", homepage: "https://www.scrippsnetworksdigital.com/", category: "ad", domains: ["*.snidigital.com"] }, { name: "TurnTo", homepage: "https://www.turntonetworks.com/", category: "utility", domains: ["*.turnto.com"], totalExecutionTime: 4666, totalOccurrences: 32 }, { name: "Quantum Metric", homepage: "https://www.quantummetric.com/", category: "analytics", domains: ["*.quantummetric.com"], totalExecutionTime: 1699724, totalOccurrences: 1140 }, { name: "Carbon Ads", homepage: "https://www.carbonads.net/", category: "ad", domains: ["*.carbonads.net", "*.carbonads.com"], totalExecutionTime: 12059, totalOccurrences: 224 }, { name: "Ably", homepage: "https://www.ably.io/", category: "uti\
lity", domains: ["*.ably.io"], totalExecutionTime: 17031, totalOccurrences: 125 }, { name: "Sectigo", homepage: "https://sectigo.com/", category: "utility", domains: ["*.sectigo.com"], totalExecutionTime: 4576, totalOccurrences: 3 }, { name: "Specless", homepage: "https://gospecless.com/", category: "ad", domains: ["*.specless.tech"] }, { name: "Loggly", homepage: "https://www.loggly.com/", category: "analytics", domains: ["*.loggly.com", "d9jmv9u00p0mv.cloudfront.net"], examples: ["logs-01.loggly.com"], totalExecutionTime: 943, totalOccurrences: 5 }, { name: "Intent Media", homepage: "https://intent.com/", category: "ad", domains: ["*.intentmedia.net"] }, { name: "Supership", homepage: "https://supership.jp/", category: "ad", domains: ["*.socdm.com"], totalExecutionTime: 10809246, totalOccurrences: 17934 }, { name: "F@N Communications", homepage: "https://www.fancs.com/", category: "ad", domains: ["*.ladsp.com"], examples: ["px.ladsp.com"], totalExecutionTime: 258835, totalOccurrences: 1768 },
    { name: "Vidyard", homepage: "https://www.vidyard.com/", category: "utility", domains: ["*.vidyard.com"], totalExecutionTime: 1165600, totalOccurrences: 1097 }, { name: "RapidSSL", homepage: "https://www.rapidssl.com/", category: "utility", domains: ["*.rapidssl.com"], totalExecutionTime: 845, totalOccurrences: 2 }, { name: "Coherent Path", homepage: "https://coherentpath.com/", category: "utility", domains: ["*.coherentpath.com"] }, { name: "Attentive", homepage: "https://attentivemobile.com/", category: "ad", domains: ["*.attn.tv", "*.attentivemobile.com"], totalExecutionTime: 5554871, totalOccurrences: 9099 }, { name: "emetriq", homepage: "https://www.emetriq.com/", category: "ad", domains: ["*.emetriq.de", "*.xplosion.de"], totalExecutionTime: 1917, totalOccurrences: 24 }, { name: "Bonzai", homepage: "https://www.bonzai.co/", category: "ad", domains: ["*.bonzai.co"] }, { name: "Freshchat", homepage: "https://www.freshworks.com/live-chat-software/", category: "customer-success",
    domains: ["*.freshchat.com", "*.freshworksapi.com"], products: [{ name: "Freshdesk Messaging", urlPatterns: ["wchat.freshchat.com"], facades: [{ name: "Freshdesk Messaging (formerly Freshchat) Facade", repo: "https://github.com/coliff/freshdesk-messaging-facade/" }] }], totalExecutionTime: 23350324, totalOccurrences: 7081 }, { name: "Contentful", homepage: "https://www.contentful.com/", category: "utility", domains: ["*.contentful.com"], examples: ["cdn.contentful.com"], totalExecutionTime: 4826, totalOccurrences: 2 }, { name: "PureCars", homepage: "https://www.purecars.com/", category: "marketing", domains: ["*.purecars.com"], examples: ["cdn.purecars.com"], totalExecutionTime: 969442, totalOccurrences: 1292 }, { name: "Tray Commerce", homepage: "https://www.tray.com.br/", category: "marketing", domains: ["*.tcdn.com.br"], examples: ["images.tcdn.com.br"], totalExecutionTime: 68362173, totalOccurrences: 14071 }, { name: "AdScore", homepage: "https://www.adscore.com/", category: "a\
d", domains: ["*.adsco.re"], examples: ["c.adsco.re"], totalExecutionTime: 2812771, totalOccurrences: 4394 }, { name: "WebsiteBuilder.com", homepage: "https://www.websitebuilder.com", category: "hosting", domains: ["*.mywebsitebuilder.com"], totalExecutionTime: 19568135, totalOccurrences: 4688 }, { name: "mParticle", homepage: "https://www.mparticle.com/", category: "utility", domains: ["*.mparticle.com"], examples: ["jssdks.mparticle.com", "identity.mparticle.com"], totalExecutionTime: 403503, totalOccurrences: 1029 }, { name: "Ada", homepage: "https://www.ada.support/", category: "customer-success", domains: ["*.ada.support"], examples: ["static.ada.support"], totalExecutionTime: 695777, totalOccurrences: 985 }, { name: "Quora Ads", homepage: "https://www.quora.com/business/", category: "ad", domains: ["*.quora.com"], examples: ["q.quora.com"], totalExecutionTime: 1338719, totalOccurrences: 10614 }, { name: "Auth0", homepage: "https://auth0.com/", category: "utility", domains: ["*.au\
th0.com"], examples: ["cdn.auth0.com"], totalExecutionTime: 245638, totalOccurrences: 816 }, { name: "Bridgewell DSP", homepage: "https://www.bridgewell.com/", category: "ad", domains: ["*.scupio.com"], examples: ["img.scupio.com"], totalExecutionTime: 63728, totalOccurrences: 354 }, { name: "Wicked Reports", homepage: "https://www.wickedreports.com/", category: "marketing", domains: ["*.wickedreports.com"], examples: ["widget.wickedreports.com"], totalExecutionTime: 148754, totalOccurrences: 483 }, { name: "Jaywing", homepage: "https://jaywing.com/", category: "marketing", domains: ["*.jaywing.com"], examples: ["amazon.almanac.jaywing.com"] }, { name: "Holimetrix", homepage: "https://u360.d-bi.fr/", category: "marketing", domains: ["*.d-bi.fr"], examples: ["u360.d-bi.fr"] }, { name: "iZooto", homepage: "https://www.izooto.com", category: "marketing", domains: ["*.izooto.com"], examples: ["cdn.izooto.com"], totalExecutionTime: 1111125, totalOccurrences: 2022 }, { name: "Ordergroove", homepage: "\
https://www.ordergroove.com/", category: "marketing", domains: ["*.ordergroove.com"], examples: ["static.ordergroove.com"], totalExecutionTime: 99990, totalOccurrences: 274 }, { name: "PageSense", homepage: "https://www.zoho.com/pagesense/", category: "analytics", domains: ["*.pagesense.io"], examples: ["cdn.pagesense.io"], totalExecutionTime: 1996537, totalOccurrences: 6219 }, { name: "Vizzit", homepage: "https://www.vizzit.se", category: "analytics", domains: ["*.vizzit.se"], examples: ["www.vizzit.se", "tag.vizzit.se"], totalExecutionTime: 739, totalOccurrences: 7 }, { name: "Click Guardian", homepage: "https://www.clickguardian.co.uk/", category: "ad", domains: ["*.clickguardian.app", "*.clickguardian.co.uk"], examples: ["v2.clickguardian.app", "protection.clickguardian.co.uk"], totalExecutionTime: 202620, totalOccurrences: 1101 }, { name: "Smartsupp", company: "Smartsupp.com", homepage: "https://www.smartsupp.com", category: "customer-success", domains: ["*.smartsuppchat.com", "*.\
smartsupp.com", "smartsupp-widget-161959.c.cdn77.org", "*.smartsuppcdn.com"], examples: ["widget-v1.smartsuppcdn.com"], totalExecutionTime: 9998165, totalOccurrences: 21505 }, { name: "Smartlook", company: "Smartsupp.com", homepage: "https://www.smartlook.com/", category: "analytics", domains: ["*.smartlook.com"], totalExecutionTime: 1386251, totalOccurrences: 16221 }, { name: "Luigis Box", company: "Luigis Box", homepage: "https://www.luigisbox.com/", category: "utility", domains: ["*.luigisbox.com"], totalExecutionTime: 2975273, totalOccurrences: 2356 }, { name: "Targito", company: "VIVmail.cz", homepage: "https://www.targito.com", category: "marketing", domains: ["*.targito.com"], totalExecutionTime: 3145, totalOccurrences: 29 }, { name: "Foxentry", company: "AVANTRO", homepage: "https://foxentry.cz/", category: "utility", domains: ["*.foxentry.cz"], totalExecutionTime: 758854, totalOccurrences: 2313 }, { name: "Pendo", homepage: "https://www.pendo.io", category: "analytics", domains: [
    "*.pendo.io"], examples: ["app.pendo.io"], totalExecutionTime: 4935190, totalOccurrences: 12203 }, { name: "Braze", homepage: "https://www.braze.com", category: "analytics", domains: ["*.appboycdn.com"], examples: ["js.appboycdn.com"], totalExecutionTime: 399216, totalOccurrences: 2014 }, { name: "Usersnap", homepage: "https://usersnap.com", category: "customer-success", domains: ["*.usersnap.com"], examples: ["api.usersnap.com", "cdn.usersnap.com"], totalExecutionTime: 334324, totalOccurrences: 437 }, { name: "Rewardful", homepage: "https://www.getrewardful.com", category: "analytics", domains: ["*.wdfl.co"], examples: ["r.wdfl.co"], totalExecutionTime: 9094, totalOccurrences: 161 }, { name: "Launch Darkly", homepage: "https://launchdarkly.com", category: "utility", domains: ["*.launchdarkly.com"], examples: ["app.launchdarkly.com", "events.launchdarkly.com"], totalExecutionTime: 10547, totalOccurrences: 6 }, { name: "Statuspage", company: "Atlassian", homepage: "https://www.statu\
spage.io", category: "utility", domains: ["*.statuspage.io"], examples: ["1k6wzpspjf99.statuspage.io"], totalExecutionTime: 43124, totalOccurrences: 1212 }, { name: "HyperInzerce", homepage: "https://hyperinzerce.cz", category: "ad", domains: ["*.hyperinzerce.cz"], examples: ["motorky.hyperinzerce.cz"], totalExecutionTime: 1035, totalOccurrences: 39 }, { name: "POWr", homepage: "https://www.powr.io", category: "utility", domains: ["*.powr.io"], examples: ["www.powr.io"], totalExecutionTime: 191534674, totalOccurrences: 39716 }, { name: "Coral", company: "Coral", homepage: "https://coralproject.net", category: "content", domains: ["*.coral.coralproject.net"], examples: ["company.coral.coralproject.net"], totalExecutionTime: 61135, totalOccurrences: 250 }, { name: "Bolt", homepage: "https://www.bolt.com/", category: "utility", domains: ["*.bolt.com"], examples: ["connect.bolt.com"], totalExecutionTime: 513689, totalOccurrences: 217 }, { name: "Judge.me", homepage: "https://judge.me/", category: "\
marketing", domains: ["*.judge.me"], examples: ["cdn.judge.me"], totalExecutionTime: 31886982, totalOccurrences: 27483 }, { name: "Tilda", homepage: "https://tilda.cc/", category: "hosting", domains: ["*.tildacdn.com"], examples: ["stat.tildacdn.com", "static.tildacdn.com", "upwidget.tildacdn.com"], totalExecutionTime: 94734169, totalOccurrences: 70321 }, { name: "SalesLoft", homepage: "https://salesloft.com/", category: "marketing", domains: ["*.salesloft.com"], examples: ["scout-cdn.salesloft.com"], totalExecutionTime: 42987, totalOccurrences: 705 }, { name: "Accessibe Accessibility Overlay", company: "Accessibe", homepage: "https://accessibe.com/", category: "utility", domains: ["*.accessibe.com", "*.acsbapp.com", "*.acsbap.com"], examples: ["accessibe.com", "acsbapp.com"], totalExecutionTime: 285765, totalOccurrences: 808 }, { name: "Builder", homepage: "https://www.builder.io/", category: "hosting", domains: ["*.builder.io"], examples: ["cdn.builder.io"], totalExecutionTime: 412358,
    totalOccurrences: 261 }, { name: "Pepperjam", homepage: "https://www.pepperjam.com/", category: "marketing", domains: ["*.pepperjam.com", "*.affiliatetechnology.com"], examples: ["container.pepperjam.com"], totalExecutionTime: 2308, totalOccurrences: 35 }, { name: "Reach", homepage: "https://withreach.com/", category: "utility", domains: ["*.gointerpay.net"], examples: ["checkout.gointerpay.net"] }, { name: "Chameleon", homepage: "https://www.trychameleon.com/", category: "marketing", domains: ["*.trychameleon.com"], examples: ["fast.trychameleon.com"], totalExecutionTime: 24218, totalOccurrences: 8 }, { name: "Matomo", company: "InnoCraft", homepage: "https://matomo.org/", category: "analytics", domains: ["*.matomo.cloud"], totalExecutionTime: 3115176, totalOccurrences: 14345 }, { name: "Segmanta", homepage: "https://segmanta.com/", category: "marketing", domains: ["*.segmanta.com"], examples: ["clientName.segmanta.com"] }, { name: "Podsights", homepage: "https://podsights.com/", category: "\
marketing", domains: ["*.pdst.fm", "us-central1-adaptive-growth.cloudfunctions.net"], examples: ["cdn.pdst.fm", "sink.pdst.fm"], totalExecutionTime: 71990, totalOccurrences: 1140 }, { name: "Chatwoot", homepage: "https://www.chatwoot.com/", category: "customer-success", domains: ["*.chatwoot.com"], examples: ["cdn.chatwoot.com", "app.chatwoot.com"], totalExecutionTime: 31973, totalOccurrences: 444 }, { name: "Crisp", homepage: "https://crisp.chat/", category: "customer-success", domains: ["*.crisp.chat"], examples: ["client.crisp.chat", "client.relay.crisp.chat"], totalExecutionTime: 33757, totalOccurrences: 1052 }, { name: "Admiral CMP", homepage: "https://www.getadmiral.com", category: "consent-provider", domains: ["admiral.mgr.consensu.org", "*.admiral.mgr.consensu.org"] }, { name: "Adnuntius CMP", homepage: "https://adnuntius.com", category: "consent-provider", domains: ["adnuntiusconsent.mgr.consensu.org", "*.adnuntiusconsent.mgr.consensu.org"] }, { name: "Clickio CMP", homepage: "\
https://clickio.com", category: "consent-provider", domains: ["clickio.mgr.consensu.org", "*.clickio.mgr.consensu.org"] }, { name: "AppConsent CMP", homepage: "https://appconsent.io/en", category: "consent-provider", domains: ["appconsent.mgr.consensu.org", "*.appconsent.mgr.consensu.org"] }, { name: "DMG Media CMP", homepage: "https://www.dmgmedia.co.uk", category: "consent-provider", domains: ["dmgmedia.mgr.consensu.org", "*.dmgmedia.mgr.consensu.org"] }, { name: "Axel Springer CMP", homepage: "https://www.axelspringer.com", category: "consent-provider", domains: ["axelspringer.mgr.consensu.org", "*.axelspringer.mgr.consensu.org"] }, { name: "Bedrock CMP", homepage: "https://www.bedrockstreaming.com", category: "consent-provider", domains: ["bedrock.mgr.consensu.org", "*.bedrock.mgr.consensu.org"] }, { name: "BMIND CMP", homepage: "https://www.bmind.es", category: "consent-provider", domains: ["bmind.mgr.consensu.org", "*.bmind.mgr.consensu.org"] }, { name: "Borlabs CMP", homepage: "\
https://borlabs.io", category: "consent-provider", domains: ["borlabs.mgr.consensu.org", "*.borlabs.mgr.consensu.org"] }, { name: "Civic CMP", homepage: "https://www.civicuk.com", category: "consent-provider", domains: ["cookiecontrol.mgr.consensu.org", "*.cookiecontrol.mgr.consensu.org"] }, { name: "Commanders Act CMP", homepage: "https://www.commandersact.com", category: "consent-provider", domains: ["commandersact.mgr.consensu.org", "*.commandersact.mgr.consensu.org"] }, { name: "Complianz CMP", homepage: "https://complianz.io/", category: "consent-provider", domains: ["complianz.mgr.consensu.org", "*.complianz.mgr.consensu.org"] }, { name: "Consent Desk CMP", homepage: "https://www.consentdesk.com/", category: "consent-provider", domains: ["consentdesk.mgr.consensu.org", "*.consentdesk.mgr.consensu.org"] }, { name: "Consent Manager CMP", homepage: "https://consentmanager.net", category: "consent-provider", domains: ["consentmanager.mgr.consensu.org", "*.consentmanager.mgr.consensu.\
org"] }, { name: "Conversant CMP", homepage: "https://www.conversantmedia.eu/", category: "consent-provider", domains: ["conversant.mgr.consensu.org", "*.conversant.mgr.consensu.org"] }, { name: "Cookie Information CMP", homepage: "https://www.cookieinformation.com/", category: "consent-provider", domains: ["cookieinformation.mgr.consensu.org", "*.cookieinformation.mgr.consensu.org"] }, { name: "Cookiebot CMP", homepage: "https://www.cookiebot.com", category: "consent-provider", domains: ["cookiebot.mgr.consensu.org", "*.cookiebot.mgr.consensu.org"] }, { name: "Truendo CMP", homepage: "https://truendo.com/", category: "consent-provider", domains: ["truendo.mgr.consensu.org", "*.truendo.mgr.consensu.org"] }, { name: "Dentsu CMP", homepage: "https://www.dentsuaegisnetwork.de/", category: "consent-provider", domains: ["dan.mgr.consensu.org", "*.dan.mgr.consensu.org"] }, { name: "Didomi CMP", homepage: "https://www.didomi.io/en/", category: "consent-provider", domains: ["didomi.mgr.consens\
u.org", "*.didomi.mgr.consensu.org"] }, { name: "Ensighten CMP", homepage: "https://www.ensighten.com/", category: "consent-provider", domains: ["ensighten.mgr.consensu.org", "*.ensighten.mgr.consensu.org"] }, { name: "Evidon CMP", homepage: "https://evidon.com", category: "consent-provider", domains: ["evidon.mgr.consensu.org", "*.evidon.mgr.consensu.org"] }, { name: "Ezoic CMP", homepage: "https://www.ezoic.com/", category: "consent-provider", domains: ["ezoic.mgr.consensu.org", "*.ezoic.mgr.consensu.org"] }, { name: "Gemius CMP", homepage: "https://www.gemius.com", category: "consent-provider", domains: ["gemius.mgr.consensu.org", "*.gemius.mgr.consensu.org"] }, { name: "NitroPay CMP", homepage: "https://nitropay.com/", category: "consent-provider", domains: ["nitropay.mgr.consensu.org", "*.nitropay.mgr.consensu.org"] }, { name: "Google FundingChoices", homepage: "https://fundingchoices.google.com/start/", category: "consent-provider", domains: ["fundingchoices.mgr.consensu.org", "*\
.fundingchoices.mgr.consensu.org", "fundingchoicesmessages.google.com", "*.fundingchoicesmessages.google.com"], totalExecutionTime: 257806056, totalOccurrences: 400016 }, { name: "Gravito CMP", homepage: "https://www.gravito.net/", category: "consent-provider", domains: ["gravito.mgr.consensu.org", "*.gravito.mgr.consensu.org"] }, { name: "ID Ward CMP", homepage: "https://id-ward.com/enterprise", category: "consent-provider", domains: ["idward.mgr.consensu.org", "*.idward.mgr.consensu.org"] }, { name: "iubenda CMP", homepage: "https://www.iubenda.com", category: "consent-provider", domains: ["iubenda.mgr.consensu.org", "*.iubenda.mgr.consensu.org"] }, { name: "Jump CMP", homepage: "https://jumpgroup.it/", category: "consent-provider", domains: ["avacy.mgr.consensu.org", "*.avacy.mgr.consensu.org"] }, { name: "LiveRamp CMP", homepage: "https://liveramp.com/", category: "consent-provider", domains: ["faktor.mgr.consensu.org", "*.faktor.mgr.consensu.org"] }, { name: "Madvertise CMP", homepage: "\
https://madvertise.com/en/", category: "consent-provider", domains: ["madvertise.mgr.consensu.org", "*.madvertise.mgr.consensu.org"] }, { name: "Mairdumont Netletic CMP", homepage: "https://www.mairdumont-netletix.com/", category: "consent-provider", domains: ["mdnxmp.mgr.consensu.org", "*.mdnxmp.mgr.consensu.org"] }, { name: "Marfeel CMP", homepage: "https://www.marfeel.com/", category: "consent-provider", domains: ["marfeel.mgr.consensu.org", "*.marfeel.mgr.consensu.org"] }, { name: "Mediavine CMP", homepage: "https://www.mediavine.com/", category: "consent-provider", domains: ["mediavine.mgr.consensu.org", "*.mediavine.mgr.consensu.org"] }, { name: "ConsentServe CMP", homepage: "https://www.consentserve.com/", category: "consent-provider", domains: ["consentserve.mgr.consensu.org", "*.consentserve.mgr.consensu.org"] }, { name: "Next14 CMP", homepage: "https://www.next14.com/", category: "consent-provider", domains: ["next14.mgr.consensu.org", "*.next14.mgr.consensu.org"] }, { name: "\
AdRoll CMP", homepage: "https://www.adroll.com/", category: "consent-provider", domains: ["adroll.mgr.consensu.org", "*.adroll.mgr.consensu.org"] }, { name: "Ogury CMP", homepage: "https://www.ogury.com/", category: "consent-provider", domains: ["ogury.mgr.consensu.org", "*.ogury.mgr.consensu.org"] }, { name: "OneTag CMP", homepage: "https://onetag.net", category: "consent-provider", domains: ["onetag.mgr.consensu.org", "*.onetag.mgr.consensu.org"] }, { name: "OneTrust CMP", homepage: "https://onetrust.com", category: "consent-provider", domains: ["onetrust.mgr.consensu.org", "*.onetrust.mgr.consensu.org"] }, { name: "optAd360 CMP", homepage: "https://www.optad360.com/", category: "consent-provider", domains: ["optad360.mgr.consensu.org", "*.optad360.mgr.consensu.org"] }, { name: "Osano CMP", homepage: "https://www.osano.com", category: "consent-provider", domains: ["osano.mgr.consensu.org", "*.osano.mgr.consensu.org"] }, { name: "Playwire CMP", homepage: "https://www.playwire.com", category: "\
consent-provider", domains: ["playwire.mgr.consensu.org", "*.playwire.mgr.consensu.org"] }, { name: "Pulselive CMP", homepage: "https://www.pulselive.com", category: "consent-provider", domains: ["pulselive.mgr.consensu.org", "*.pulselive.mgr.consensu.org"] }, { name: "Quantcast Choice", homepage: "https://quantcast.com", category: "consent-provider", domains: ["quantcast.mgr.consensu.org", "*.quantcast.mgr.consensu.org"] }, { name: "RCS Pubblicita CMP", homepage: "http://www.rcspubblicita.it/site/home.html", category: "consent-provider", domains: ["rcsmediagroup.mgr.consensu.org", "*.rcsmediagroup.mgr.consensu.org"] }, { name: "Rich Audience CMP", homepage: "https://richaudience.com", category: "consent-provider", domains: ["richaudience.mgr.consensu.org", "*.richaudience.mgr.consensu.org"] }, { name: "Ringier Axel Springer CMP", homepage: "https://www.ringieraxelspringer.pl/en/home/", category: "consent-provider", domains: ["rasp.mgr.consensu.org", "*.rasp.mgr.consensu.org"] }, { name: "\
Secure Privacy CMP", homepage: "https://secureprivacy.ai/", category: "consent-provider", domains: ["secureprivacy.mgr.consensu.org", "*.secureprivacy.mgr.consensu.org"] }, { name: "Securiti CMP", homepage: "https://securiti.ai/", category: "consent-provider", domains: ["securiti.mgr.consensu.org", "*.securiti.mgr.consensu.org"] }, { name: "Seznam.cz CMP", homepage: "https://www.seznam.cz/", category: "consent-provider", domains: ["seznam.mgr.consensu.org", "*.seznam.mgr.consensu.org"] }, { name: "ShareThis CMP", homepage: "https://sharethis.com", category: "consent-provider", domains: ["sharethis.mgr.consensu.org", "*.sharethis.mgr.consensu.org"] }, { name: "ShinyStat CMP", homepage: "https://www.shinystat.com", category: "consent-provider", domains: ["shinystat.mgr.consensu.org", "*.shinystat.mgr.consensu.org"] }, { name: "Sibbo CMP", homepage: "https://sibboventures.com/en/", category: "consent-provider", domains: ["sibboventures.mgr.consensu.org", "*.sibboventures.mgr.consensu.org"] },
    { name: "Singlespot CMP", homepage: "https://www.singlespot.com/en", category: "consent-provider", domains: ["singlespot.mgr.consensu.org", "*.singlespot.mgr.consensu.org"] }, { name: "Sirdata CMP", homepage: "https://www.sirdata.com", category: "consent-provider", domains: ["sddan.mgr.consensu.org", "*.sddan.mgr.consensu.org"] }, { name: "Snigel CMP", homepage: "https://snigel.com", category: "consent-provider", domains: ["snigelweb.mgr.consensu.org", "*.snigelweb.mgr.consensu.org"] }, { name: "Sourcepoint CMP", homepage: "https://sourcepoint.com", category: "consent-provider", domains: ["sourcepoint.mgr.consensu.org", "*.sourcepoint.mgr.consensu.org"] }, { name: "Pubtech CMP", homepage: "https://www.pubtech.ai/", category: "consent-provider", domains: ["pubtech.mgr.consensu.org", "*.pubtech.mgr.consensu.org"] }, { name: "AdMetrics Pro CMP", homepage: "https://admetricspro.com", category: "consent-provider", domains: ["cmp.mgr.consensu.org", "*.cmp.mgr.consensu.org"] }, { name: "T\
raffective CMP", homepage: "https://traffective.com", category: "consent-provider", domains: ["traffective.mgr.consensu.org", "*.traffective.mgr.consensu.org"] }, { name: "UniConsent CMP", homepage: "https://www.uniconsent.com", category: "consent-provider", domains: ["uniconsent.mgr.consensu.org", "*.uniconsent.mgr.consensu.org", "cmp.uniconsent.com", "*.uniconsent.com"], totalExecutionTime: 829870, totalOccurrences: 1336 }, { name: "TrustArc CMP", homepage: "https://trustarc.com/", category: "consent-provider", domains: ["trustarc.mgr.consensu.org", "*.trustarc.mgr.consensu.org"] }, { name: "Usercentrics CMP", homepage: "https://usercentrics.com", category: "consent-provider", domains: ["usercentrics.mgr.consensu.org", "*.usercentrics.mgr.consensu.org", "*.usercentrics.eu", "*.services.usercentrics.eu"], totalExecutionTime: 53008518, totalOccurrences: 49602 }, { name: "WebAds CMP", homepage: "https://www.webads.nl/", category: "consent-provider", domains: ["webads.mgr.consensu.org", "\
*.webads.mgr.consensu.org"] }, { name: "Trustcommander", company: "Commandersact", homepage: "https://www.commandersact.com", category: "consent-provider", domains: ["*.trustcommander.net"], examples: ["cdn.trustcommander.net", "privacy.trustcommander.net"], totalExecutionTime: 324770, totalOccurrences: 1713 }, { name: "Hubvisor", homepage: "https://www.hubvisor.io", category: "ad", domains: ["*.hubvisor.io"], examples: ["cdn.hubvisor.io", "stream.hubvisor.io"], totalExecutionTime: 404737, totalOccurrences: 492 }, { name: "Castle", homepage: "https://castle.io", category: "utility", domains: ["*.castle.io", "d2t77mnxyo7adj.cloudfront.net"], examples: ["t.castle.io"] }, { name: "Wigzo", homepage: "https://www.wigzo.com/", category: "marketing", domains: ["*.wigzo.com", "*.wigzopush.com"], examples: ["app.wigzo.com", "tracker.wigzopush.com"], totalExecutionTime: 215280, totalOccurrences: 762 }, { name: "Convertful", homepage: "https://convertful.com/", category: "marketing", domains: ["*\
.convertful.com"], examples: ["app.convertful.com"], totalExecutionTime: 215317, totalOccurrences: 1534 }, { name: "OpenLink", company: "MediaWallah", homepage: "https://www.mediawallah.com/", category: "ad", domains: ["*.mediawallahscript.com"], examples: ["partner.mediawallahscript.com"] }, { name: "TPMN", company: "TPMN", homepage: "http://tpmn.io/", category: "ad", domains: ["*.tpmn.co.kr"], examples: ["ad.tpmn.co.kr"], totalExecutionTime: 354, totalOccurrences: 10 }, { name: "HERO", company: "Klarna", homepage: "https://www.usehero.com/", category: "customer-success", domains: ["*.usehero.com"], examples: ["api.usehero.com", "cdn.usehero.com"], totalExecutionTime: 32092, totalOccurrences: 42 }, { name: "Zync", company: "Zeta Global", homepage: "https://zetaglobal.com/", category: "marketing", domains: ["*.rezync.com"], examples: ["live.rezync.com"], totalExecutionTime: 25978, totalOccurrences: 246 }, { name: "AdFuel Video", company: "AdFuel", homepage: "https://goadfuel.com/", category: "\
ad", domains: ["*.videoplayerhub.com"], examples: ["customer.videoplayerhub.com"], totalExecutionTime: 82951, totalOccurrences: 1407 }, { name: "Prefix Box AI Search", company: "Prefix Box", homepage: "https://www.prefixbox.com/", category: "utility", domains: ["*.prefixbox.com"], examples: ["cdn.prefixbox.com"], totalExecutionTime: 51608, totalOccurrences: 58 }, { name: "SpeedSize Service Worker", company: "SpeedSize", homepage: "https://speedsize.com/", category: "utility", domains: ["di6367dava8ow.cloudfront.net", "d2d22nphq0yz8t.cloudfront.net"], examples: ["di6367dava8ow.cloudfront.net"] }, { name: "Vonage Video API", company: "Vonage", homepage: "https://www.vonage.com/communications-apis/video/", category: "video", domains: ["*.opentok.com"], examples: ["static.opentok.com"], totalExecutionTime: 220760, totalOccurrences: 304 }, { name: "Checkout.com", company: "Checkout.com", homepage: "https://www.checkout.com", category: "utility", domains: ["*.checkout.com"], examples: ["cdn.\
checkout.com"], totalExecutionTime: 184372, totalOccurrences: 1367 }, { name: "Noibu", company: "Noibu", homepage: "https://www.noibu.com", category: "utility", domains: ["*.noibu.com"], examples: ["input.noibu.com"], totalExecutionTime: 1453903, totalOccurrences: 613 }, { name: "Clarity", company: "Microsoft", homepage: "https://clarity.microsoft.com/", category: "utility", domains: ["*.clarity.ms"], examples: ["c.clarity.ms"], totalExecutionTime: 208824616, totalOccurrences: 456309 }, { name: "goinstore", company: "Emplifi", homepage: "https://goinstore.com/", category: "customer-success", domains: ["*.goinstore.com"], examples: ["gis.goinstore.com"] }, { name: "SegmentStream", company: "SegmentStream", homepage: "https://segmentstream.com/", category: "marketing", domains: ["*.segmentstream.com"], examples: ["track.segmentstream.com"], totalExecutionTime: 8628, totalOccurrences: 13 }, { name: "Amazon Associates", company: "Amazon", homepage: "https://affiliate-program.amazon.co.uk/",
    category: "marketing", domains: ["*.associates-amazon.com"], examples: ["assoc-na.associates-amazon.com"], totalExecutionTime: 50, totalOccurrences: 1 }, { name: "DotMetrics", company: "Ipsos", homepage: "https://www.dotmetrics.net/", category: "analytics", domains: ["*.dotmetrics.net"], examples: ["uk-script.dotmetrics.net"], totalExecutionTime: 159255, totalOccurrences: 817 }, { name: "Truffle Bid", company: "Truffle", homepage: "https://truffle.bid/", category: "ad", domains: ["*.truffle.bid"], examples: ["matching.truffle.bid"], totalExecutionTime: 24026, totalOccurrences: 39 }, { name: "Hybrid", company: "Hybrid", homepage: "https://hybrid.ai/", category: "ad", domains: ["*.hybrid.ai"], examples: ["dm-eu.hybrid.ai"], totalExecutionTime: 219740, totalOccurrences: 2326 }, { name: "AdMan Media", company: "AdMan", homepage: "https://admanmedia.com/", category: "video", domains: ["*.admanmedia.com"], examples: ["cs.admanmedia.com"], totalExecutionTime: 1924, totalOccurrences: 202 },
    { name: "ID5 Identity Cloud", company: "ID5", homepage: "https://id5.io/", category: "ad", domains: ["id5-sync.com", "*.id5-sync.com"], examples: ["id5-sync.com"], totalExecutionTime: 26134069, totalOccurrences: 119336 }, { name: "Audience Rate", company: "Audience Rate Limited", homepage: "https://www.audiencerate.com/", category: "ad", domains: ["*.audrte.com"], examples: ["a.audrte.com"] }, { name: "Seedtag", company: "Seedtag Advertising", homepage: "https://www.seedtag.com/", category: "ad", domains: ["*.seedtag.com"], examples: ["s.seedtag.com"], totalExecutionTime: 3342567, totalOccurrences: 1503 }, { name: "IVI", company: "IVI Technologies", homepage: "http://ivitechnologies.com/", category: "ad", domains: ["*.ivitrack.com"], examples: ["matching.ivitrack.com"], totalExecutionTime: 3746, totalOccurrences: 34 }, { name: "Sportradar", company: "Sportradar", homepage: "https://www.sportradar.com/", category: "ad", domains: ["*.sportradarserving.com"], examples: ["a.sportradars\
erving.com"], totalExecutionTime: 520, totalOccurrences: 11 }, { name: "ZEOTAP", company: "ZEOTAP", homepage: "https://zeotap.com/", category: "ad", domains: ["*.zeotap.com"], examples: ["spl.zeotap.com"], totalExecutionTime: 14368, totalOccurrences: 96 }, { name: "Web Content Assessor", company: "TMT Digital", homepage: "https://mediatrust.com/", category: "ad", domains: ["*.webcontentassessor.com"], examples: ["scripts.webcontentassessor.com"], totalExecutionTime: 314249, totalOccurrences: 633 }, { name: "Genie", company: "Media Force", homepage: "https://hellogenie.com/", category: "ad", domains: ["*.mfadsrvr.com"], examples: ["rtb.mfadsrvr.com"], totalExecutionTime: 37, totalOccurrences: 2 }, { name: "mediarithmics", company: "mediarithmics", homepage: "https://www.mediarithmics.com/", category: "ad", domains: ["*.mediarithmics.com"], examples: ["cookie-matching.mediarithmics.com"], totalExecutionTime: 25799, totalOccurrences: 144 }, { name: "Ozone Project", company: "The Ozone Pro\
ject", homepage: "https://www.ozoneproject.com/", category: "ad", domains: ["*.the-ozone-project.com"], examples: ["elb.the-ozone-project.com"], totalExecutionTime: 152768, totalOccurrences: 910 }, { name: "FiftyAurora", company: "Fifty", homepage: "https://fifty.io/", category: "ad", domains: ["*.fiftyt.com"], examples: ["visitor.fiftyt.com"] }, { name: "smadex", company: "entravision", homepage: "https://smadex.com/", category: "ad", domains: ["*.smadex.com"], examples: ["cm.smadex.com"], totalExecutionTime: 5, totalOccurrences: 1 }, { name: "AWX", company: "Trinity Mirror", category: "ad", domains: ["*.tm-awx.com"], examples: ["felix.data.tm-awx.com"], totalExecutionTime: 68744, totalOccurrences: 54 }, { name: "XPO", company: "Knorex", category: "ad", homepage: "https://www.knorex.com/", domains: ["*.brand-display.com"], examples: ["dmp.brand-display.com"], totalExecutionTime: 388629, totalOccurrences: 477 }, { name: "Viafoura", company: "Viafoura", category: "ad", homepage: "https:\
//viafoura.com/", domains: ["*.viafoura.co", "*.viafoura.net"], examples: ["api.viafoura.co", "cdn.viafoura.net"], totalExecutionTime: 307404, totalOccurrences: 446 }, { name: "Adnami", company: "Adnami", category: "ad", homepage: "https://www.adnami.io/", domains: ["*.adnami.io"], examples: ["macro.adnami.io"], totalExecutionTime: 272668, totalOccurrences: 1639 }, { name: "LiveRamp Privacy Manager", company: "LiveRamp", category: "ad", homepage: "https://liveramp.com/privacy-legal-compliance/", domains: ["*.privacymanager.io"], examples: ["geo.privacymanager.io"], totalExecutionTime: 6546055, totalOccurrences: 22295 }, { name: "Onfocus", company: "Onfocus SAS", category: "ad", domains: ["*.4dex.io"], examples: ["script.4dex.io"], totalExecutionTime: 4240761, totalOccurrences: 8836 }, { name: "viewTag", company: "Advanced Store", category: "ad", domains: ["*.ad4m.at"], examples: ["ad4m.at", "as.ad4m.at"], totalExecutionTime: 458, totalOccurrences: 21 }, { name: "MRP Prelytics", company: "\
Market Resource Partners", category: "ad", homepage: "https://www.mrpfd.com/", domains: ["*.mrpdata.net"], examples: ["j.mrpdata.net"] }, { name: "iPROM", company: "iPROM", category: "ad", homepage: "https://iprom.eu/", domains: ["*.iprom.net"], examples: ["core.iprom.net"], totalExecutionTime: 114801, totalOccurrences: 72099 }, { name: "Plausible", company: "Plausible", homepage: "https://plausible.io/", category: "analytics", domains: ["*.plausible.io"] }, { name: "Micro Analytics", company: "Micro Analytics", homepage: "https://microanalytics.io/", category: "analytics", domains: ["padmin.microanalytics.io", "www.microanalytics.io", "dev.microanalytics.io", "status.microanalytics.io"] }, { name: "Scale8", company: "Scale8", homepage: "https://scale8.com/", category: "analytics", domains: ["www.scale8.com", "api-dev.scale8.com", "cdn.scale8.com", "ui.scale8.com"] }, { name: "Cabin", company: "Cabin", homepage: "https://withcabin.com/", category: "analytics", domains: ["*.withcabin.co\
m"], totalExecutionTime: 3843, totalOccurrences: 100 }, { name: "Appcues", company: "Appcues", homepage: "https://www.appcues.com/", category: "analytics", domains: ["*.appcues.com"], totalExecutionTime: 2154145, totalOccurrences: 2831 }, { name: "Fathom Analytics", company: "Fathom", homepage: "https://usefathom.com/", category: "analytics", domains: ["*.usefathom.com"], totalExecutionTime: 145389, totalOccurrences: 1141 }, { name: "Clearbit", company: "Clearbit", homepage: "https://clearbit.com/", category: "analytics", domains: ["*.clearbitjs.com", "*.clearbitscripts.com", "*.clearbit.com"], totalExecutionTime: 967253, totalOccurrences: 4171 }, { name: "G2", company: "G2", homepage: "https://www.g2.com/", category: "utility", domains: ["*.g2.com", "*.g2crowd.com"], totalExecutionTime: 195752, totalOccurrences: 406 }, { name: "Navu", company: "Navu", homepage: "https://navu.co/", category: "ad", domains: ["*.navu.co"] }, { name: "InZynk", company: "InZynk", homepage: "https://inzynk.\
com/", category: "ad", domains: ["*.inzynk.com", "*.inzynk.io"], totalExecutionTime: 541, totalOccurrences: 8 }, { name: "Integrate", company: "Integrate", homepage: "https://www.integrate.com/", category: "ad", domains: ["*.integrate.com", "*.listenloop.com"], totalExecutionTime: 14260, totalOccurrences: 39 }, { name: "Ad Lightning", company: "Boltive", homepage: "https://www.adlightning.com/", category: "ad", domains: ["*.adlightning.com"], totalExecutionTime: 6879067, totalOccurrences: 3795 }, { name: "GeoEdge", company: "GeoEdge", homepage: "https://www.geoedge.com/", category: "ad", domains: ["*.geoedge.com", "*.geoedge.be"], totalExecutionTime: 1039615, totalOccurrences: 1796 }, { name: "Doofinder", company: "Doofinder", homepage: "https://www.doofinder.com/", category: "utility", domains: ["cdn.doofinder.com"], totalExecutionTime: 1750777, totalOccurrences: 12550 }, { name: "Revlifter", company: "Revlifter", homepage: "https://www.revlifter.com/", category: "utility", domains: [
    "assets.revlifter.com"] }, { name: "Didomi", company: "Didomi", homepage: "https://www.didomi.io/", category: "consent-provider", domains: ["sdk.privacy-center.org", "api.privacy-center.org"], totalExecutionTime: 85132161, totalOccurrences: 84206 }, { name: "Pubperf Analytics", company: "Pubperf", homepage: "https://www.pubperf.com/", category: "analytics", domains: ["*.pubperf.com"], totalExecutionTime: 51392, totalOccurrences: 400 }];
  }
});

// node_modules/@paulirish/trace_engine/node_modules/third-party-web/lib/index.js
var require_lib = __commonJS({
  "node_modules/@paulirish/trace_engine/node_modules/third-party-web/lib/index.js"(exports2, module2) {
    init_process_global();
    var { createAPIFromDataset } = require_create_entity_finder_api();
    var entities = require_entities();
    module2.exports = createAPIFromDataset(entities);
  }
});

// node_modules/@paulirish/trace_engine/third_party/third-party-web/third-party-web.js
var import_third_party_web;
var init_third_party_web = __esm({
  "node_modules/@paulirish/trace_engine/third_party/third-party-web/third-party-web.js"() {
    init_process_global();
    import_third_party_web = __toESM(require_lib(), 1);
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/Configuration.js
var Configuration_exports = {};
__export(Configuration_exports, {
  configToCacheKey: () => configToCacheKey,
  defaults: () => defaults
});
function configToCacheKey(config5) {
  return JSON.stringify(config5);
}
var defaults;
var init_Configuration = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/Configuration.js"() {
    init_process_global();
    defaults = /* @__PURE__ */ __name(() => ({
      showAllEvents: false,
      debugMode: false,
      maxInvalidationEventsPerEvent: 20,
      enableAnimationsFrameHandler: false
    }), "defaults");
    __name(configToCacheKey, "configToCacheKey");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/Extensions.js
var Extensions_exports = {};
__export(Extensions_exports, {
  extensionPalette: () => extensionPalette,
  isConsoleTimestampPayloadTrackEntry: () => isConsoleTimestampPayloadTrackEntry,
  isExtensionEntryObj: () => isExtensionEntryObj,
  isExtensionPayloadMarker: () => isExtensionPayloadMarker,
  isSyntheticExtensionEntry: () => isSyntheticExtensionEntry,
  isValidExtensionPayload: () => isValidExtensionPayload
});
function isExtensionPayloadMarker(payload) {
  return payload.dataType === "marker";
}
function isExtensionEntryObj(payload) {
  const hasTrack = "track" in payload && Boolean(payload.track);
  const validEntryType = payload.dataType === "track-entry" || payload.dataType === void 0;
  return validEntryType && hasTrack;
}
function isConsoleTimestampPayloadTrackEntry(payload) {
  return payload.url !== void 0 && payload.description !== void 0;
}
function isValidExtensionPayload(payload) {
  return isExtensionPayloadMarker(payload) || isExtensionEntryObj(payload) || isConsoleTimestampPayloadTrackEntry(payload);
}
function isSyntheticExtensionEntry(entry) {
  return entry.cat === "devtools.extension";
}
var extensionPalette;
var init_Extensions = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/Extensions.js"() {
    init_process_global();
    extensionPalette = [
      "primary",
      "primary-light",
      "primary-dark",
      "secondary",
      "secondary-light",
      "secondary-dark",
      "tertiary",
      "tertiary-light",
      "tertiary-dark",
      "error",
      "warning"
    ];
    __name(isExtensionPayloadMarker, "isExtensionPayloadMarker");
    __name(isExtensionEntryObj, "isExtensionEntryObj");
    __name(isConsoleTimestampPayloadTrackEntry, "isConsoleTimestampPayloadTrackEntry");
    __name(isValidExtensionPayload, "isValidExtensionPayload");
    __name(isSyntheticExtensionEntry, "isSyntheticExtensionEntry");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/File.js
var File_exports = {};
__export(File_exports, {
  DataOrigin: () => DataOrigin,
  EntriesLinkState: () => EntriesLinkState,
  EventKeyType: () => EventKeyType,
  isEntriesLinkAnnotation: () => isEntriesLinkAnnotation,
  isEntryLabelAnnotation: () => isEntryLabelAnnotation,
  isTimeRangeAnnotation: () => isTimeRangeAnnotation,
  traceEventKeyToValues: () => traceEventKeyToValues
});
function isTimeRangeAnnotation(annotation) {
  return annotation.type === "TIME_RANGE";
}
function isEntryLabelAnnotation(annotation) {
  return annotation.type === "ENTRY_LABEL";
}
function isEntriesLinkAnnotation(annotation) {
  return annotation.type === "ENTRIES_LINK";
}
function traceEventKeyToValues(key) {
  const parts = key.split("-");
  const type = parts[0];
  switch (type) {
    case EventKeyType.PROFILE_CALL:
      if (parts.length !== 5 || !parts.every((part, i) => i === 0 || typeof part === "number" || !isNaN(parseInt(part, 10)))) {
        throw new Error(`Invalid ProfileCallKey: ${key}`);
      }
      return {
        type: parts[0],
        processID: parseInt(parts[1], 10),
        threadID: parseInt(parts[2], 10),
        sampleIndex: parseInt(parts[3], 10),
        protocol: parseInt(parts[4], 10)
      };
    case EventKeyType.RAW_EVENT:
      if (parts.length !== 2 || !(typeof parts[1] === "number" || !isNaN(parseInt(parts[1], 10)))) {
        throw new Error(`Invalid RawEvent Key: ${key}`);
      }
      return {
        type: parts[0],
        rawIndex: parseInt(parts[1], 10)
      };
    case EventKeyType.SYNTHETIC_EVENT:
      if (parts.length !== 2 || !(typeof parts[1] === "number" || !isNaN(parseInt(parts[1], 10)))) {
        throw new Error(`Invalid SyntheticEvent Key: ${key}`);
      }
      return {
        type: parts[0],
        rawIndex: parseInt(parts[1], 10)
      };
    case EventKeyType.LEGACY_TIMELINE_FRAME: {
      if (parts.length !== 2 || Number.isNaN(parseInt(parts[1], 10))) {
        throw new Error(`Invalid LegacyTimelineFrame Key: ${key}`);
      }
      return {
        type,
        rawIndex: parseInt(parts[1], 10)
      };
    }
    default:
      throw new Error(`Unknown trace event key: ${key}`);
  }
}
var DataOrigin, EntriesLinkState, EventKeyType;
var init_File = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/File.js"() {
    init_process_global();
    (function(DataOrigin2) {
      DataOrigin2["CPU_PROFILE"] = "CPUProfile";
      DataOrigin2["TRACE_EVENTS"] = "TraceEvents";
    })(DataOrigin || (DataOrigin = {}));
    (function(EntriesLinkState2) {
      EntriesLinkState2["CREATION_NOT_STARTED"] = "creation_not_started";
      EntriesLinkState2["PENDING_TO_EVENT"] = "pending_to_event";
      EntriesLinkState2["CONNECTED"] = "connected";
    })(EntriesLinkState || (EntriesLinkState = {}));
    (function(EventKeyType2) {
      EventKeyType2["RAW_EVENT"] = "r";
      EventKeyType2["SYNTHETIC_EVENT"] = "s";
      EventKeyType2["PROFILE_CALL"] = "p";
      EventKeyType2["LEGACY_TIMELINE_FRAME"] = "l";
    })(EventKeyType || (EventKeyType = {}));
    __name(isTimeRangeAnnotation, "isTimeRangeAnnotation");
    __name(isEntryLabelAnnotation, "isEntryLabelAnnotation");
    __name(isEntriesLinkAnnotation, "isEntriesLinkAnnotation");
    __name(traceEventKeyToValues, "traceEventKeyToValues");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/Overlays.js
var init_Overlays = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/Overlays.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/Timing.js
var Timing_exports = {};
__export(Timing_exports, {
  Micro: () => Micro,
  Milli: () => Milli,
  Seconds: () => Seconds
});
function Micro(value) {
  return value;
}
function Milli(value) {
  return value;
}
function Seconds(value) {
  return value;
}
var init_Timing = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/Timing.js"() {
    init_process_global();
    __name(Micro, "Micro");
    __name(Milli, "Milli");
    __name(Seconds, "Seconds");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/TraceEvents.js
var TraceEvents_exports = {};
__export(TraceEvents_exports, {
  AuctionWorkletType: () => AuctionWorkletType,
  CallFrameID: () => CallFrameID,
  Categories: () => Categories,
  InvalidationEventType: () => InvalidationEventType,
  LayoutInvalidationReason: () => LayoutInvalidationReason,
  MarkerName: () => MarkerName,
  NO_NAVIGATION: () => NO_NAVIGATION,
  Name: () => Name,
  Phase: () => Phase,
  ProcessID: () => ProcessID,
  ProfileID: () => ProfileID,
  SampleIndex: () => SampleIndex,
  Scope: () => Scope,
  SelectorTimingsKey: () => SelectorTimingsKey,
  StyleRecalcInvalidationReason: () => StyleRecalcInvalidationReason,
  ThreadID: () => ThreadID,
  VALID_PROFILE_SOURCES: () => VALID_PROFILE_SOURCES,
  WorkerId: () => WorkerId,
  eventIsPageLoadEvent: () => eventIsPageLoadEvent,
  isAbortPostTaskCallback: () => isAbortPostTaskCallback,
  isActivateLayerTree: () => isActivateLayerTree,
  isAnimation: () => isAnimation,
  isAnimationFrameAsyncEnd: () => isAnimationFrameAsyncEnd,
  isAnimationFrameAsyncStart: () => isAnimationFrameAsyncStart,
  isAnimationFramePresentation: () => isAnimationFramePresentation,
  isAnyLargestContentfulPaintCandidate: () => isAnyLargestContentfulPaintCandidate,
  isAnyScriptSourceEvent: () => isAnyScriptSourceEvent,
  isAuctionWorkletDoneWithProcess: () => isAuctionWorkletDoneWithProcess,
  isAuctionWorkletRunningInProcess: () => isAuctionWorkletRunningInProcess,
  isBegin: () => isBegin,
  isBeginCommitCompositorFrame: () => isBeginCommitCompositorFrame,
  isBeginFrame: () => isBeginFrame,
  isBeginMainThreadFrame: () => isBeginMainThreadFrame,
  isBeginRemoteFontLoad: () => isBeginRemoteFontLoad,
  isCommit: () => isCommit,
  isCommitLoad: () => isCommitLoad,
  isComplete: () => isComplete,
  isCompositeLayers: () => isCompositeLayers,
  isConsoleRunTask: () => isConsoleRunTask,
  isConsoleTime: () => isConsoleTime,
  isConsoleTimeStamp: () => isConsoleTimeStamp,
  isDOMStats: () => isDOMStats,
  isDebuggerAsyncTaskRun: () => isDebuggerAsyncTaskRun,
  isDebuggerAsyncTaskScheduled: () => isDebuggerAsyncTaskScheduled,
  isDecodeImage: () => isDecodeImage,
  isDecodeLazyPixelRef: () => isDecodeLazyPixelRef,
  isDidCommitSameDocumentNavigation: () => isDidCommitSameDocumentNavigation,
  isDispatch: () => isDispatch,
  isDisplayListItemListSnapshot: () => isDisplayListItemListSnapshot,
  isDomLoading: () => isDomLoading,
  isDrawFrame: () => isDrawFrame,
  isDrawLazyPixelRef: () => isDrawLazyPixelRef,
  isDroppedFrame: () => isDroppedFrame,
  isEnd: () => isEnd,
  isEventTiming: () => isEventTiming,
  isEventTimingEnd: () => isEventTimingEnd,
  isEventTimingStart: () => isEventTimingStart,
  isFireAnimationFrame: () => isFireAnimationFrame,
  isFireIdleCallback: () => isFireIdleCallback,
  isFirstContentfulPaint: () => isFirstContentfulPaint,
  isFirstPaint: () => isFirstPaint,
  isFlowPhase: () => isFlowPhase,
  isFlowPhaseEvent: () => isFlowPhaseEvent,
  isFrameCommittedInBrowser: () => isFrameCommittedInBrowser,
  isFunctionCall: () => isFunctionCall,
  isGPUTask: () => isGPUTask,
  isHandlePostMessage: () => isHandlePostMessage,
  isInstant: () => isInstant,
  isInteractiveTime: () => isInteractiveTime,
  isInvalidateLayout: () => isInvalidateLayout,
  isInvalidationTracking: () => isInvalidationTracking,
  isJSInvocationEvent: () => isJSInvocationEvent,
  isJSSample: () => isJSSample,
  isLargestImagePaintCandidate: () => isLargestImagePaintCandidate,
  isLargestTextPaintCandidate: () => isLargestTextPaintCandidate,
  isLayerTreeHostImplSnapshot: () => isLayerTreeHostImplSnapshot,
  isLayout: () => isLayout,
  isLayoutImageUnsized: () => isLayoutImageUnsized,
  isLayoutInvalidationTracking: () => isLayoutInvalidationTracking,
  isLayoutShift: () => isLayoutShift,
  isLegacyScreenshot: () => isLegacyScreenshot,
  isLegacySyntheticScreenshot: () => isLegacySyntheticScreenshot,
  isLegacyTimelineFrame: () => isLegacyTimelineFrame,
  isLinkPreconnect: () => isLinkPreconnect,
  isMainFrameViewport: () => isMainFrameViewport,
  isMarkDOMContent: () => isMarkDOMContent,
  isMarkLoad: () => isMarkLoad,
  isMarkerEvent: () => isMarkerEvent,
  isMetaCharsetCheck: () => isMetaCharsetCheck,
  isNavigationStart: () => isNavigationStart,
  isNeedsBeginFrameChanged: () => isNeedsBeginFrameChanged,
  isNestableAsyncPhase: () => isNestableAsyncPhase,
  isNetworkTrackEntry: () => isNetworkTrackEntry,
  isPaint: () => isPaint,
  isPaintImage: () => isPaintImage,
  isPairableAsyncBegin: () => isPairableAsyncBegin,
  isPairableAsyncEnd: () => isPairableAsyncEnd,
  isPairableAsyncInstant: () => isPairableAsyncInstant,
  isParseAuthorStyleSheetEvent: () => isParseAuthorStyleSheetEvent,
  isParseHTML: () => isParseHTML,
  isParseMetaViewport: () => isParseMetaViewport,
  isPerformanceMark: () => isPerformanceMark,
  isPerformanceMeasure: () => isPerformanceMeasure,
  isPerformanceMeasureBegin: () => isPerformanceMeasureBegin,
  isPhaseAsync: () => isPhaseAsync,
  isPipelineReporter: () => isPipelineReporter,
  isPrePaint: () => isPrePaint,
  isPreloadRenderBlockingStatusChangeEvent: () => isPreloadRenderBlockingStatusChangeEvent,
  isProcessName: () => isProcessName,
  isProfile: () => isProfile,
  isProfileCall: () => isProfileCall,
  isProfileChunk: () => isProfileChunk,
  isRasterTask: () => isRasterTask,
  isRecalcStyle: () => isRecalcStyle,
  isReceivedDataEvent: () => isReceivedDataEvent,
  isRemoteFontLoaded: () => isRemoteFontLoaded,
  isRenderFrameImplCreateChildFrame: () => isRenderFrameImplCreateChildFrame,
  isRendererEvent: () => isRendererEvent,
  isRequestIdleCallback: () => isRequestIdleCallback,
  isRequestMainThreadFrame: () => isRequestMainThreadFrame,
  isResourceChangePriority: () => isResourceChangePriority,
  isResourceFinish: () => isResourceFinish,
  isResourceMarkAsCached: () => isResourceMarkAsCached,
  isResourceReceiveResponse: () => isResourceReceiveResponse,
  isResourceReceivedData: () => isResourceReceivedData,
  isResourceSendRequest: () => isResourceSendRequest,
  isResourceWillSendRequest: () => isResourceWillSendRequest,
  isRunPostTaskCallback: () => isRunPostTaskCallback,
  isRunTask: () => isRunTask,
  isRundownScript: () => isRundownScript,
  isRundownScriptCompiled: () => isRundownScriptCompiled,
  isRundownScriptSource: () => isRundownScriptSource,
  isRundownScriptSourceLarge: () => isRundownScriptSourceLarge,
  isSchedulePostMessage: () => isSchedulePostMessage,
  isSchedulePostTaskCallback: () => isSchedulePostTaskCallback,
  isScheduleStyleInvalidationTracking: () => isScheduleStyleInvalidationTracking,
  isScheduleStyleRecalculation: () => isScheduleStyleRecalculation,
  isScreenshot: () => isScreenshot,
  isScrollLayer: () => isScrollLayer,
  isSelectorStats: () => isSelectorStats,
  isSetLayerId: () => isSetLayerId,
  isSoftLargestContentfulPaintCandidate: () => isSoftLargestContentfulPaintCandidate,
  isSoftNavigationStart: () => isSoftNavigationStart,
  isStyleInvalidatorInvalidationTracking: () => isStyleInvalidatorInvalidationTracking,
  isStyleRecalcInvalidationTracking: () => isStyleRecalcInvalidationTracking,
  isSyntheticAnimation: () => isSyntheticAnimation,
  isSyntheticBased: () => isSyntheticBased,
  isSyntheticConsoleTiming: () => isSyntheticConsoleTiming,
  isSyntheticCpuProfile: () => isSyntheticCpuProfile,
  isSyntheticInteraction: () => isSyntheticInteraction,
  isSyntheticLayoutShift: () => isSyntheticLayoutShift,
  isSyntheticLayoutShiftCluster: () => isSyntheticLayoutShiftCluster,
  isSyntheticNetworkRequest: () => isSyntheticNetworkRequest,
  isSyntheticUserTiming: () => isSyntheticUserTiming,
  isSyntheticWebSocketConnection: () => isSyntheticWebSocketConnection,
  isThreadName: () => isThreadName,
  isTimerFire: () => isTimerFire,
  isTimerInstall: () => isTimerInstall,
  isTracingSessionIdForWorker: () => isTracingSessionIdForWorker,
  isTracingStartedInBrowser: () => isTracingStartedInBrowser,
  isUpdateCounters: () => isUpdateCounters,
  isUpdateLayer: () => isUpdateLayer,
  isUserTiming: () => isUserTiming,
  isUserTimingMeasure: () => isUserTimingMeasure,
  isV8Compile: () => isV8Compile,
  isWebSocketCreate: () => isWebSocketCreate,
  isWebSocketDestroy: () => isWebSocketDestroy,
  isWebSocketEvent: () => isWebSocketEvent,
  isWebSocketInfo: () => isWebSocketInfo,
  isWebSocketReceiveHandshakeResponse: () => isWebSocketReceiveHandshakeResponse,
  isWebSocketSendHandshakeRequest: () => isWebSocketSendHandshakeRequest,
  isWebSocketTraceEvent: () => isWebSocketTraceEvent,
  isWebSocketTransfer: () => isWebSocketTransfer,
  objectIsCallFrame: () => objectIsCallFrame,
  objectIsEvent: () => objectIsEvent
});
function isNestableAsyncPhase(phase) {
  return phase === Phase.ASYNC_NESTABLE_START || phase === Phase.ASYNC_NESTABLE_END || phase === Phase.ASYNC_NESTABLE_INSTANT;
}
function isPhaseAsync(phase) {
  return isNestableAsyncPhase(phase) || phase === Phase.ASYNC_BEGIN || phase === Phase.ASYNC_STEP_INTO || phase === Phase.ASYNC_END || phase === Phase.ASYNC_STEP_PAST;
}
function isFlowPhase(phase) {
  return phase === Phase.FLOW_START || phase === Phase.FLOW_STEP || phase === Phase.FLOW_END;
}
function objectIsEvent(obj) {
  return "cat" in obj && "name" in obj && "ts" in obj;
}
function objectIsCallFrame(object) {
  return "functionName" in object && typeof object.functionName === "string" && ("scriptId" in object && (typeof object.scriptId === "string" || typeof object.scriptId === "number")) && ("columnNumber" in object && typeof object.columnNumber === "number") && ("lineNumber" in object && typeof object.lineNumber === "number") && ("url" in object && typeof object.url === "string");
}
function isRunTask(event) {
  return event.name === Name.RUN_TASK && event.ph === Phase.COMPLETE;
}
function isAuctionWorkletRunningInProcess(event) {
  return event.name === "AuctionWorkletRunningInProcess";
}
function isAuctionWorkletDoneWithProcess(event) {
  return event.name === "AuctionWorkletDoneWithProcess";
}
function isLegacyScreenshot(event) {
  return event.name === Name.SCREENSHOT && "id" in event;
}
function isLegacySyntheticScreenshot(event) {
  return event.name === Name.SCREENSHOT && "dataUri" in (event.args ?? {});
}
function isScreenshot(event) {
  return event.name === Name.SCREENSHOT && "source_id" in (event.args ?? {});
}
function isSoftNavigationStart(event) {
  return event.name === Name.SOFT_NAVIGATION_START;
}
function isMarkerEvent(event) {
  if (event.ph === Phase.INSTANT || Phase.ASYNC_NESTABLE_INSTANT || event.ph === Phase.MARK) {
    return markerTypeGuards.some((fn) => fn(event));
  }
  return false;
}
function eventIsPageLoadEvent(event) {
  if (event.ph === Phase.INSTANT || Phase.ASYNC_NESTABLE_INSTANT || event.ph === Phase.MARK) {
    return pageLoadEventTypeGuards.some((fn) => fn(event));
  }
  return false;
}
function isTracingSessionIdForWorker(event) {
  return event.name === "TracingSessionIdForWorker";
}
function isScheduleStyleInvalidationTracking(event) {
  return event.name === Name.SCHEDULE_STYLE_INVALIDATION_TRACKING;
}
function isStyleRecalcInvalidationTracking(event) {
  return event.name === Name.STYLE_RECALC_INVALIDATION_TRACKING;
}
function isStyleInvalidatorInvalidationTracking(event) {
  return event.name === Name.STYLE_INVALIDATOR_INVALIDATION_TRACKING;
}
function isBeginCommitCompositorFrame(event) {
  return event.name === Name.BEGIN_COMMIT_COMPOSITOR_FRAME;
}
function isParseMetaViewport(event) {
  return event.name === Name.PARSE_META_VIEWPORT;
}
function isMetaCharsetCheck(event) {
  return event.name === Name.META_CHARSET_CHECK;
}
function isLinkPreconnect(event) {
  return event.name === Name.LINK_PRECONNECT;
}
function isScheduleStyleRecalculation(event) {
  return event.name === Name.SCHEDULE_STYLE_RECALCULATION;
}
function isRenderFrameImplCreateChildFrame(event) {
  return event.name === Name.RENDER_FRAME_IMPL_CREATE_CHILD_FRAME;
}
function isLayoutImageUnsized(event) {
  return event.name === Name.LAYOUT_IMAGE_UNSIZED;
}
function isPairableAsyncBegin(e) {
  return e.ph === Phase.ASYNC_NESTABLE_START;
}
function isPairableAsyncEnd(e) {
  return e.ph === Phase.ASYNC_NESTABLE_END;
}
function isPairableAsyncInstant(e) {
  return e.ph === Phase.ASYNC_NESTABLE_INSTANT;
}
function isAnimationFrameAsyncStart(data31) {
  return data31.name === Name.ANIMATION_FRAME && data31.ph === Phase.ASYNC_NESTABLE_START;
}
function isAnimationFrameAsyncEnd(data31) {
  return data31.name === Name.ANIMATION_FRAME && data31.ph === Phase.ASYNC_NESTABLE_END;
}
function isAnimationFramePresentation(data31) {
  return data31.name === Name.ANIMATION_FRAME_PRESENTATION;
}
function isPipelineReporter(event) {
  return event.name === Name.PIPELINE_REPORTER;
}
function isSyntheticBased(event) {
  return "rawSourceEvent" in event;
}
function isJSSample(event) {
  return event.name === Name.JS_SAMPLE;
}
function isSyntheticInteraction(event) {
  return Boolean("interactionId" in event && event.args?.data && "beginEvent" in event.args.data && "endEvent" in event.args.data);
}
function isDrawFrame(event) {
  return event.name === Name.DRAW_FRAME && event.ph === Phase.INSTANT;
}
function isBeginFrame(event) {
  return Boolean(event.name === Name.BEGIN_FRAME && event.args && "frameSeqId" in event.args);
}
function isDroppedFrame(event) {
  return Boolean(event.name === Name.DROPPED_FRAME && event.args && "frameSeqId" in event.args);
}
function isRequestMainThreadFrame(event) {
  return event.name === Name.REQUEST_MAIN_THREAD_FRAME;
}
function isBeginMainThreadFrame(event) {
  return event.name === Name.BEGIN_MAIN_THREAD_FRAME;
}
function isNeedsBeginFrameChanged(event) {
  return event.name === Name.NEEDS_BEGIN_FRAME_CHANGED;
}
function isCommit(event) {
  return Boolean(event.name === Name.COMMIT && event.args && "frameSeqId" in event.args);
}
function isRasterTask(event) {
  return event.name === Name.RASTER_TASK;
}
function isCompositeLayers(event) {
  return event.name === Name.COMPOSITE_LAYERS;
}
function isActivateLayerTree(event) {
  return event.name === Name.ACTIVATE_LAYER_TREE;
}
function isInvalidationTracking(event) {
  return isScheduleStyleInvalidationTracking(event) || isStyleRecalcInvalidationTracking(event) || isStyleInvalidatorInvalidationTracking(event) || isLayoutInvalidationTracking(event);
}
function isDrawLazyPixelRef(event) {
  return event.name === Name.DRAW_LAZY_PIXEL_REF;
}
function isDecodeLazyPixelRef(event) {
  return event.name === Name.DECODE_LAZY_PIXEL_REF;
}
function isDecodeImage(event) {
  return event.name === Name.DECODE_IMAGE;
}
function isSelectorStats(event) {
  return event.name === Name.SELECTOR_STATS;
}
function isRecalcStyle(event) {
  return event.name === Name.RECALC_STYLE;
}
function isLayout(event) {
  return event.name === Name.LAYOUT && Boolean(event.args && "beginData" in event.args);
}
function isInvalidateLayout(event) {
  return event.name === Name.INVALIDATE_LAYOUT;
}
function isDebuggerAsyncTaskScheduled(event) {
  return event.name === Name.DEBUGGER_ASYNC_TASK_SCHEDULED;
}
function isDebuggerAsyncTaskRun(event) {
  return event.name === Name.DEBUGGER_ASYNC_TASK_RUN;
}
function ProfileID(value) {
  return value;
}
function CallFrameID(value) {
  return value;
}
function SampleIndex(value) {
  return value;
}
function ProcessID(value) {
  return value;
}
function ThreadID(value) {
  return value;
}
function WorkerId(value) {
  return value;
}
function isComplete(event) {
  return event.ph === Phase.COMPLETE;
}
function isBegin(event) {
  return event.ph === Phase.BEGIN;
}
function isEnd(event) {
  return event.ph === Phase.END;
}
function isDispatch(event) {
  return event.name === "EventDispatch" && event.ph === Phase.COMPLETE;
}
function isInstant(event) {
  return event.ph === Phase.INSTANT;
}
function isRendererEvent(event) {
  return isInstant(event) || isComplete(event);
}
function isFireIdleCallback(event) {
  return event.name === "FireIdleCallback" && event.ph === Phase.COMPLETE;
}
function isSchedulePostMessage(event) {
  return event.name === Name.SCHEDULE_POST_MESSAGE;
}
function isHandlePostMessage(event) {
  return event.name === Name.HANDLE_POST_MESSAGE && event.ph === Phase.COMPLETE;
}
function isUpdateCounters(event) {
  return event.name === "UpdateCounters";
}
function isDOMStats(event) {
  return event.name === "DOMStats";
}
function isThreadName(event) {
  return event.name === Name.THREAD_NAME;
}
function isProcessName(event) {
  return event.name === "process_name";
}
function isTracingStartedInBrowser(event) {
  return event.name === Name.TRACING_STARTED_IN_BROWSER;
}
function isFrameCommittedInBrowser(event) {
  return event.name === "FrameCommittedInBrowser";
}
function isCommitLoad(event) {
  return event.name === "CommitLoad";
}
function isAnimation(event) {
  return event.name === "Animation" && event.cat.includes("devtools.timeline");
}
function isSyntheticAnimation(event) {
  if (event.name !== "Animation" || !event.cat.includes("devtools.timeline")) {
    return false;
  }
  const data31 = event.args?.data;
  if (!data31) {
    return false;
  }
  return "beginEvent" in data31 && "endEvent" in data31;
}
function isLayoutShift(event) {
  return event.name === Name.LAYOUT_SHIFT;
}
function isLayoutInvalidationTracking(event) {
  return event.name === Name.LAYOUT_INVALIDATION_TRACKING;
}
function isFirstContentfulPaint(event) {
  return event.name === Name.MARK_FCP;
}
function isAnyLargestContentfulPaintCandidate(event) {
  return event.name === Name.MARK_LCP_CANDIDATE || event.name === Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION;
}
function isSoftLargestContentfulPaintCandidate(event) {
  return event.name === Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION;
}
function isLargestImagePaintCandidate(event) {
  return event.name === "LargestImagePaint::Candidate";
}
function isLargestTextPaintCandidate(event) {
  return event.name === "LargestTextPaint::Candidate";
}
function isMarkLoad(event) {
  return event.name === Name.MARK_LOAD;
}
function isFirstPaint(event) {
  return event.name === Name.MARK_FIRST_PAINT;
}
function isMarkDOMContent(event) {
  return event.name === Name.MARK_DOM_CONTENT;
}
function isInteractiveTime(event) {
  return event.name === "InteractiveTime";
}
function isEventTiming(event) {
  return event.name === Name.EVENT_TIMING;
}
function isEventTimingEnd(event) {
  return isEventTiming(event) && event.ph === Phase.ASYNC_NESTABLE_END;
}
function isEventTimingStart(event) {
  return isEventTiming(event) && event.ph === Phase.ASYNC_NESTABLE_START;
}
function isGPUTask(event) {
  return event.name === "GPUTask";
}
function isProfile(event) {
  return event.name === Name.PROFILE;
}
function isSyntheticCpuProfile(event) {
  return event.name === Name.CPU_PROFILE && event.ph === Phase.COMPLETE;
}
function isProfileChunk(event) {
  return event.name === Name.PROFILE_CHUNK;
}
function isResourceChangePriority(event) {
  return event.name === "ResourceChangePriority";
}
function isResourceSendRequest(event) {
  return event.name === "ResourceSendRequest";
}
function isResourceReceiveResponse(event) {
  return event.name === "ResourceReceiveResponse";
}
function isResourceMarkAsCached(event) {
  return event.name === "ResourceMarkAsCached";
}
function isResourceFinish(event) {
  return event.name === "ResourceFinish";
}
function isResourceWillSendRequest(event) {
  return event.name === "ResourceWillSendRequest";
}
function isResourceReceivedData(event) {
  return event.name === "ResourceReceivedData";
}
function isReceivedDataEvent(event) {
  return event.name === "ResourceReceivedData" || event.name === "ResourceFinish" || event.name === "ResourceReceiveResponse";
}
function isSyntheticNetworkRequest(event) {
  return event.name === Name.SYNTHETIC_NETWORK_REQUEST;
}
function isSyntheticWebSocketConnection(event) {
  return event.name === "SyntheticWebSocketConnection";
}
function isNetworkTrackEntry(event) {
  return isSyntheticNetworkRequest(event) || isSyntheticWebSocketConnection(event) || isWebSocketTraceEvent(event);
}
function isPrePaint(event) {
  return event.name === "PrePaint";
}
function isNavigationStart(event) {
  return event.name === Name.NAVIGATION_START && event.args?.data?.documentLoaderURL !== "";
}
function isDidCommitSameDocumentNavigation(event) {
  return event.name === "RenderFrameHostImpl::DidCommitSameDocumentNavigation" && event.ph === Phase.COMPLETE;
}
function isMainFrameViewport(event) {
  return event.name === "PaintTimingVisualizer::Viewport";
}
function isSyntheticUserTiming(event) {
  if (event.cat !== "blink.user_timing") {
    return false;
  }
  const data31 = event.args?.data;
  if (!data31) {
    return false;
  }
  return "beginEvent" in data31 && "endEvent" in data31;
}
function isSyntheticConsoleTiming(event) {
  if (event.cat !== "blink.console") {
    return false;
  }
  const data31 = event.args?.data;
  if (!data31) {
    return false;
  }
  return "beginEvent" in data31 && "endEvent" in data31;
}
function isUserTiming(event) {
  return event.cat === "blink.user_timing";
}
function isDomLoading(event) {
  return event.name === Name.DOM_LOADING;
}
function isBeginRemoteFontLoad(event) {
  return event.name === Name.BEGIN_REMOTE_FONT_LOAD;
}
function isRemoteFontLoaded(event) {
  return event.name === Name.REMOTE_FONT_LOADED;
}
function isPerformanceMeasure(event) {
  return isUserTiming(event) && isPhaseAsync(event.ph);
}
function isPerformanceMeasureBegin(event) {
  return isPerformanceMeasure(event) && event.ph === Phase.ASYNC_NESTABLE_START;
}
function isPerformanceMark(event) {
  return isUserTiming(event) && (event.ph === Phase.MARK || event.ph === Phase.INSTANT);
}
function isConsoleTime(event) {
  return event.cat === "blink.console" && isPhaseAsync(event.ph);
}
function isConsoleTimeStamp(event) {
  return event.ph === Phase.INSTANT && event.name === Name.TIME_STAMP;
}
function isUserTimingMeasure(event) {
  return event.name === Name.USER_TIMING_MEASURE;
}
function isParseHTML(event) {
  return event.name === "ParseHTML";
}
function isSyntheticLayoutShift(event) {
  return event.name === Name.SYNTHETIC_LAYOUT_SHIFT;
}
function isSyntheticLayoutShiftCluster(event) {
  return event.name === Name.SYNTHETIC_LAYOUT_SHIFT_CLUSTER;
}
function isProfileCall(event) {
  return "callFrame" in event;
}
function isPaint(event) {
  return event.name === Name.PAINT;
}
function isPaintImage(event) {
  return event.name === Name.PAINT_IMAGE && event.ph === Phase.COMPLETE;
}
function isScrollLayer(event) {
  return event.name === Name.SCROLL_LAYER && event.ph === Phase.COMPLETE;
}
function isSetLayerId(event) {
  return event.name === Name.SET_LAYER_TREE_ID;
}
function isUpdateLayer(event) {
  return event.name === Name.UPDATE_LAYER;
}
function isDisplayListItemListSnapshot(event) {
  return event.name === Name.DISPLAY_ITEM_LIST_SNAPSHOT;
}
function isLayerTreeHostImplSnapshot(event) {
  return event.name === Name.LAYER_TREE_HOST_IMPL_SNAPSHOT;
}
function isFireAnimationFrame(event) {
  return event.name === Name.FIRE_ANIMATION_FRAME && event.ph === Phase.COMPLETE;
}
function isTimerInstall(event) {
  return event.name === Name.TIMER_INSTALL;
}
function isTimerFire(event) {
  return event.name === Name.TIMER_FIRE && event.ph === Phase.COMPLETE;
}
function isRequestIdleCallback(event) {
  return event.name === Name.REQUEST_IDLE_CALLBACK;
}
function isWebSocketCreate(event) {
  return event.name === Name.WEB_SOCKET_CREATE;
}
function isWebSocketInfo(event) {
  return event.name === Name.WEB_SOCKET_SEND_HANDSHAKE_REQUEST || event.name === Name.WEB_SOCKET_RECEIVE_HANDSHAKE_REQUEST || event.name === Name.WEB_SOCKET_DESTROY;
}
function isWebSocketTransfer(event) {
  return event.name === Name.WEB_SOCKET_SEND || event.name === Name.WEB_SOCKET_RECEIVE;
}
function isWebSocketSendHandshakeRequest(event) {
  return event.name === Name.WEB_SOCKET_SEND_HANDSHAKE_REQUEST;
}
function isWebSocketReceiveHandshakeResponse(event) {
  return event.name === Name.WEB_SOCKET_RECEIVE_HANDSHAKE_REQUEST;
}
function isWebSocketDestroy(event) {
  return event.name === Name.WEB_SOCKET_DESTROY;
}
function isWebSocketTraceEvent(event) {
  return isWebSocketCreate(event) || isWebSocketInfo(event) || isWebSocketTransfer(event);
}
function isWebSocketEvent(event) {
  return isWebSocketTraceEvent(event) || isSyntheticWebSocketConnection(event);
}
function isV8Compile(event) {
  return event.name === Name.COMPILE && event.ph === Phase.COMPLETE;
}
function isFunctionCall(event) {
  return event.name === Name.FUNCTION_CALL && event.ph === Phase.COMPLETE;
}
function isSchedulePostTaskCallback(event) {
  return event.name === Name.SCHEDULE_POST_TASK_CALLBACK;
}
function isRunPostTaskCallback(event) {
  return event.name === Name.RUN_POST_TASK_CALLBACK && event.ph === Phase.COMPLETE;
}
function isAbortPostTaskCallback(event) {
  return event.name === Name.ABORT_POST_TASK_CALLBACK && event.ph === Phase.COMPLETE;
}
function isJSInvocationEvent(event) {
  switch (event.name) {
    case Name.RUN_MICROTASKS:
    case Name.FUNCTION_CALL:
    // TODO(paulirish): Define types for these Evaluate* events
    case Name.EVALUATE_SCRIPT:
    case Name.EVALUATE_MODULE:
    case Name.EVENT_DISPATCH:
    case Name.V8_EXECUTE:
    case Name.V8_CONSOLE_RUN_TASK:
      return true;
  }
  if (event.name.startsWith("v8") || event.name.startsWith("V8")) {
    return true;
  }
  if (isConsoleRunTask(event)) {
    return true;
  }
  return false;
}
function isConsoleRunTask(event) {
  return event.name === Name.V8_CONSOLE_RUN_TASK;
}
function isFlowPhaseEvent(event) {
  return event.ph === Phase.FLOW_START || event.ph === Phase.FLOW_STEP || event.ph === Phase.FLOW_END;
}
function isParseAuthorStyleSheetEvent(event) {
  return event.name === Name.PARSE_AUTHOR_STYLE_SHEET && event.ph === Phase.COMPLETE;
}
function isLegacyTimelineFrame(data31) {
  return "idle" in data31 && typeof data31.idle === "boolean";
}
function isRundownScriptCompiled(event) {
  return event.cat === "disabled-by-default-devtools.target-rundown";
}
function isRundownScript(event) {
  return event.cat === "disabled-by-default-devtools.v8-source-rundown" && event.name === "ScriptCatchup";
}
function isRundownScriptSource(event) {
  return event.cat === "disabled-by-default-devtools.v8-source-rundown-sources" && event.name === "ScriptCatchup";
}
function isRundownScriptSourceLarge(event) {
  return event.cat === "disabled-by-default-devtools.v8-source-rundown-sources" && event.name === "LargeScriptCatchup";
}
function isAnyScriptSourceEvent(event) {
  return event.cat === "disabled-by-default-devtools.v8-source-rundown-sources";
}
function isPreloadRenderBlockingStatusChangeEvent(event) {
  return event.name === Name.PRELOAD_RENDER_BLOCKING_STATUS_CHANGE;
}
var Phase, Scope, VALID_PROFILE_SOURCES, AuctionWorkletType, markerTypeGuards, pageLoadEventTypeGuards, NO_NAVIGATION, LayoutInvalidationReason, StyleRecalcInvalidationReason, InvalidationEventType, SelectorTimingsKey, Name, MarkerName, Categories;
var init_TraceEvents = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/TraceEvents.js"() {
    init_process_global();
    (function(Phase2) {
      Phase2["BEGIN"] = "B";
      Phase2["END"] = "E";
      Phase2["COMPLETE"] = "X";
      Phase2["INSTANT"] = "I";
      Phase2["COUNTER"] = "C";
      Phase2["ASYNC_NESTABLE_START"] = "b";
      Phase2["ASYNC_NESTABLE_INSTANT"] = "n";
      Phase2["ASYNC_NESTABLE_END"] = "e";
      Phase2["ASYNC_STEP_INTO"] = "T";
      Phase2["ASYNC_BEGIN"] = "S";
      Phase2["ASYNC_END"] = "F";
      Phase2["ASYNC_STEP_PAST"] = "p";
      Phase2["FLOW_START"] = "s";
      Phase2["FLOW_STEP"] = "t";
      Phase2["FLOW_END"] = "f";
      Phase2["SAMPLE"] = "P";
      Phase2["OBJECT_CREATED"] = "N";
      Phase2["OBJECT_SNAPSHOT"] = "O";
      Phase2["OBJECT_DESTROYED"] = "D";
      Phase2["METADATA"] = "M";
      Phase2["MEMORY_DUMP_GLOBAL"] = "V";
      Phase2["MEMORY_DUMP_PROCESS"] = "v";
      Phase2["MARK"] = "R";
      Phase2["CLOCK_SYNC"] = "c";
    })(Phase || (Phase = {}));
    __name(isNestableAsyncPhase, "isNestableAsyncPhase");
    __name(isPhaseAsync, "isPhaseAsync");
    __name(isFlowPhase, "isFlowPhase");
    (function(Scope2) {
      Scope2["THREAD"] = "t";
      Scope2["PROCESS"] = "p";
      Scope2["GLOBAL"] = "g";
    })(Scope || (Scope = {}));
    __name(objectIsEvent, "objectIsEvent");
    __name(objectIsCallFrame, "objectIsCallFrame");
    VALID_PROFILE_SOURCES = ["Inspector", "SelfProfiling", "Internal"];
    __name(isRunTask, "isRunTask");
    (function(AuctionWorkletType2) {
      AuctionWorkletType2["BIDDER"] = "bidder";
      AuctionWorkletType2["SELLER"] = "seller";
      AuctionWorkletType2["UNKNOWN"] = "unknown";
    })(AuctionWorkletType || (AuctionWorkletType = {}));
    __name(isAuctionWorkletRunningInProcess, "isAuctionWorkletRunningInProcess");
    __name(isAuctionWorkletDoneWithProcess, "isAuctionWorkletDoneWithProcess");
    __name(isLegacyScreenshot, "isLegacyScreenshot");
    __name(isLegacySyntheticScreenshot, "isLegacySyntheticScreenshot");
    __name(isScreenshot, "isScreenshot");
    __name(isSoftNavigationStart, "isSoftNavigationStart");
    markerTypeGuards = [
      isMarkDOMContent,
      isMarkLoad,
      isFirstPaint,
      isFirstContentfulPaint,
      isAnyLargestContentfulPaintCandidate,
      isNavigationStart,
      isSoftNavigationStart
    ];
    __name(isMarkerEvent, "isMarkerEvent");
    pageLoadEventTypeGuards = [
      ...markerTypeGuards,
      isInteractiveTime
    ];
    __name(eventIsPageLoadEvent, "eventIsPageLoadEvent");
    __name(isTracingSessionIdForWorker, "isTracingSessionIdForWorker");
    NO_NAVIGATION = "NO_NAVIGATION";
    (function(LayoutInvalidationReason2) {
      LayoutInvalidationReason2["SIZE_CHANGED"] = "Size changed";
      LayoutInvalidationReason2["ATTRIBUTE"] = "Attribute";
      LayoutInvalidationReason2["ADDED_TO_LAYOUT"] = "Added to layout";
      LayoutInvalidationReason2["SCROLLBAR_CHANGED"] = "Scrollbar changed";
      LayoutInvalidationReason2["REMOVED_FROM_LAYOUT"] = "Removed from layout";
      LayoutInvalidationReason2["STYLE_CHANGED"] = "Style changed";
      LayoutInvalidationReason2["FONTS_CHANGED"] = "Fonts changed";
      LayoutInvalidationReason2["UNKNOWN"] = "Unknown";
    })(LayoutInvalidationReason || (LayoutInvalidationReason = {}));
    __name(isScheduleStyleInvalidationTracking, "isScheduleStyleInvalidationTracking");
    (function(StyleRecalcInvalidationReason2) {
      StyleRecalcInvalidationReason2["ANIMATION"] = "Animation";
      StyleRecalcInvalidationReason2["RELATED_STYLE_RULE"] = "Related style rule";
    })(StyleRecalcInvalidationReason || (StyleRecalcInvalidationReason = {}));
    __name(isStyleRecalcInvalidationTracking, "isStyleRecalcInvalidationTracking");
    __name(isStyleInvalidatorInvalidationTracking, "isStyleInvalidatorInvalidationTracking");
    __name(isBeginCommitCompositorFrame, "isBeginCommitCompositorFrame");
    __name(isParseMetaViewport, "isParseMetaViewport");
    __name(isMetaCharsetCheck, "isMetaCharsetCheck");
    __name(isLinkPreconnect, "isLinkPreconnect");
    __name(isScheduleStyleRecalculation, "isScheduleStyleRecalculation");
    __name(isRenderFrameImplCreateChildFrame, "isRenderFrameImplCreateChildFrame");
    __name(isLayoutImageUnsized, "isLayoutImageUnsized");
    __name(isPairableAsyncBegin, "isPairableAsyncBegin");
    __name(isPairableAsyncEnd, "isPairableAsyncEnd");
    __name(isPairableAsyncInstant, "isPairableAsyncInstant");
    __name(isAnimationFrameAsyncStart, "isAnimationFrameAsyncStart");
    __name(isAnimationFrameAsyncEnd, "isAnimationFrameAsyncEnd");
    __name(isAnimationFramePresentation, "isAnimationFramePresentation");
    __name(isPipelineReporter, "isPipelineReporter");
    __name(isSyntheticBased, "isSyntheticBased");
    __name(isJSSample, "isJSSample");
    __name(isSyntheticInteraction, "isSyntheticInteraction");
    __name(isDrawFrame, "isDrawFrame");
    __name(isBeginFrame, "isBeginFrame");
    __name(isDroppedFrame, "isDroppedFrame");
    __name(isRequestMainThreadFrame, "isRequestMainThreadFrame");
    __name(isBeginMainThreadFrame, "isBeginMainThreadFrame");
    __name(isNeedsBeginFrameChanged, "isNeedsBeginFrameChanged");
    __name(isCommit, "isCommit");
    __name(isRasterTask, "isRasterTask");
    __name(isCompositeLayers, "isCompositeLayers");
    __name(isActivateLayerTree, "isActivateLayerTree");
    __name(isInvalidationTracking, "isInvalidationTracking");
    __name(isDrawLazyPixelRef, "isDrawLazyPixelRef");
    __name(isDecodeLazyPixelRef, "isDecodeLazyPixelRef");
    __name(isDecodeImage, "isDecodeImage");
    (function(InvalidationEventType2) {
      InvalidationEventType2["StyleInvalidatorInvalidationTracking"] = "StyleInvalidatorInvalidationTracking";
      InvalidationEventType2["StyleRecalcInvalidationTracking"] = "StyleRecalcInvalidationTracking";
    })(InvalidationEventType || (InvalidationEventType = {}));
    (function(SelectorTimingsKey2) {
      SelectorTimingsKey2["Elapsed"] = "elapsed (us)";
      SelectorTimingsKey2["RejectPercentage"] = "reject_percentage";
      SelectorTimingsKey2["FastRejectCount"] = "fast_reject_count";
      SelectorTimingsKey2["MatchAttempts"] = "match_attempts";
      SelectorTimingsKey2["MatchCount"] = "match_count";
      SelectorTimingsKey2["Selector"] = "selector";
      SelectorTimingsKey2["StyleSheetId"] = "style_sheet_id";
      SelectorTimingsKey2["InvalidationCount"] = "invalidation_count";
    })(SelectorTimingsKey || (SelectorTimingsKey = {}));
    __name(isSelectorStats, "isSelectorStats");
    __name(isRecalcStyle, "isRecalcStyle");
    __name(isLayout, "isLayout");
    __name(isInvalidateLayout, "isInvalidateLayout");
    __name(isDebuggerAsyncTaskScheduled, "isDebuggerAsyncTaskScheduled");
    __name(isDebuggerAsyncTaskRun, "isDebuggerAsyncTaskRun");
    __name(ProfileID, "ProfileID");
    __name(CallFrameID, "CallFrameID");
    __name(SampleIndex, "SampleIndex");
    __name(ProcessID, "ProcessID");
    __name(ThreadID, "ThreadID");
    __name(WorkerId, "WorkerId");
    __name(isComplete, "isComplete");
    __name(isBegin, "isBegin");
    __name(isEnd, "isEnd");
    __name(isDispatch, "isDispatch");
    __name(isInstant, "isInstant");
    __name(isRendererEvent, "isRendererEvent");
    __name(isFireIdleCallback, "isFireIdleCallback");
    __name(isSchedulePostMessage, "isSchedulePostMessage");
    __name(isHandlePostMessage, "isHandlePostMessage");
    __name(isUpdateCounters, "isUpdateCounters");
    __name(isDOMStats, "isDOMStats");
    __name(isThreadName, "isThreadName");
    __name(isProcessName, "isProcessName");
    __name(isTracingStartedInBrowser, "isTracingStartedInBrowser");
    __name(isFrameCommittedInBrowser, "isFrameCommittedInBrowser");
    __name(isCommitLoad, "isCommitLoad");
    __name(isAnimation, "isAnimation");
    __name(isSyntheticAnimation, "isSyntheticAnimation");
    __name(isLayoutShift, "isLayoutShift");
    __name(isLayoutInvalidationTracking, "isLayoutInvalidationTracking");
    __name(isFirstContentfulPaint, "isFirstContentfulPaint");
    __name(isAnyLargestContentfulPaintCandidate, "isAnyLargestContentfulPaintCandidate");
    __name(isSoftLargestContentfulPaintCandidate, "isSoftLargestContentfulPaintCandidate");
    __name(isLargestImagePaintCandidate, "isLargestImagePaintCandidate");
    __name(isLargestTextPaintCandidate, "isLargestTextPaintCandidate");
    __name(isMarkLoad, "isMarkLoad");
    __name(isFirstPaint, "isFirstPaint");
    __name(isMarkDOMContent, "isMarkDOMContent");
    __name(isInteractiveTime, "isInteractiveTime");
    __name(isEventTiming, "isEventTiming");
    __name(isEventTimingEnd, "isEventTimingEnd");
    __name(isEventTimingStart, "isEventTimingStart");
    __name(isGPUTask, "isGPUTask");
    __name(isProfile, "isProfile");
    __name(isSyntheticCpuProfile, "isSyntheticCpuProfile");
    __name(isProfileChunk, "isProfileChunk");
    __name(isResourceChangePriority, "isResourceChangePriority");
    __name(isResourceSendRequest, "isResourceSendRequest");
    __name(isResourceReceiveResponse, "isResourceReceiveResponse");
    __name(isResourceMarkAsCached, "isResourceMarkAsCached");
    __name(isResourceFinish, "isResourceFinish");
    __name(isResourceWillSendRequest, "isResourceWillSendRequest");
    __name(isResourceReceivedData, "isResourceReceivedData");
    __name(isReceivedDataEvent, "isReceivedDataEvent");
    __name(isSyntheticNetworkRequest, "isSyntheticNetworkRequest");
    __name(isSyntheticWebSocketConnection, "isSyntheticWebSocketConnection");
    __name(isNetworkTrackEntry, "isNetworkTrackEntry");
    __name(isPrePaint, "isPrePaint");
    __name(isNavigationStart, "isNavigationStart");
    __name(isDidCommitSameDocumentNavigation, "isDidCommitSameDocumentNavigation");
    __name(isMainFrameViewport, "isMainFrameViewport");
    __name(isSyntheticUserTiming, "isSyntheticUserTiming");
    __name(isSyntheticConsoleTiming, "isSyntheticConsoleTiming");
    __name(isUserTiming, "isUserTiming");
    __name(isDomLoading, "isDomLoading");
    __name(isBeginRemoteFontLoad, "isBeginRemoteFontLoad");
    __name(isRemoteFontLoaded, "isRemoteFontLoaded");
    __name(isPerformanceMeasure, "isPerformanceMeasure");
    __name(isPerformanceMeasureBegin, "isPerformanceMeasureBegin");
    __name(isPerformanceMark, "isPerformanceMark");
    __name(isConsoleTime, "isConsoleTime");
    __name(isConsoleTimeStamp, "isConsoleTimeStamp");
    __name(isUserTimingMeasure, "isUserTimingMeasure");
    __name(isParseHTML, "isParseHTML");
    __name(isSyntheticLayoutShift, "isSyntheticLayoutShift");
    __name(isSyntheticLayoutShiftCluster, "isSyntheticLayoutShiftCluster");
    __name(isProfileCall, "isProfileCall");
    __name(isPaint, "isPaint");
    __name(isPaintImage, "isPaintImage");
    __name(isScrollLayer, "isScrollLayer");
    __name(isSetLayerId, "isSetLayerId");
    __name(isUpdateLayer, "isUpdateLayer");
    __name(isDisplayListItemListSnapshot, "isDisplayListItemListSnapshot");
    __name(isLayerTreeHostImplSnapshot, "isLayerTreeHostImplSnapshot");
    __name(isFireAnimationFrame, "isFireAnimationFrame");
    __name(isTimerInstall, "isTimerInstall");
    __name(isTimerFire, "isTimerFire");
    __name(isRequestIdleCallback, "isRequestIdleCallback");
    __name(isWebSocketCreate, "isWebSocketCreate");
    __name(isWebSocketInfo, "isWebSocketInfo");
    __name(isWebSocketTransfer, "isWebSocketTransfer");
    __name(isWebSocketSendHandshakeRequest, "isWebSocketSendHandshakeRequest");
    __name(isWebSocketReceiveHandshakeResponse, "isWebSocketReceiveHandshakeResponse");
    __name(isWebSocketDestroy, "isWebSocketDestroy");
    __name(isWebSocketTraceEvent, "isWebSocketTraceEvent");
    __name(isWebSocketEvent, "isWebSocketEvent");
    __name(isV8Compile, "isV8Compile");
    __name(isFunctionCall, "isFunctionCall");
    __name(isSchedulePostTaskCallback, "isSchedulePostTaskCallback");
    __name(isRunPostTaskCallback, "isRunPostTaskCallback");
    __name(isAbortPostTaskCallback, "isAbortPostTaskCallback");
    __name(isJSInvocationEvent, "isJSInvocationEvent");
    __name(isConsoleRunTask, "isConsoleRunTask");
    __name(isFlowPhaseEvent, "isFlowPhaseEvent");
    __name(isParseAuthorStyleSheetEvent, "isParseAuthorStyleSheetEvent");
    (function(Name2) {
      Name2["THREAD_NAME"] = "thread_name";
      Name2["PROGRAM"] = "Program";
      Name2["RUN_TASK"] = "RunTask";
      Name2["ASYNC_TASK"] = "AsyncTask";
      Name2["RUN_MICROTASKS"] = "RunMicrotasks";
      Name2["XHR_LOAD"] = "XHRLoad";
      Name2["XHR_READY_STATE_CHANGED"] = "XHRReadyStateChange";
      Name2["PARSE_HTML"] = "ParseHTML";
      Name2["PARSE_CSS"] = "ParseAuthorStyleSheet";
      Name2["COMPILE_CODE"] = "V8.CompileCode";
      Name2["COMPILE_MODULE"] = "V8.CompileModule";
      Name2["COMPILE"] = "v8.compile";
      Name2["COMPILE_SCRIPT"] = "V8.CompileScript";
      Name2["OPTIMIZE"] = "V8.OptimizeCode";
      Name2["WASM_STREAM_FROM_RESPONSE_CALLBACK"] = "v8.wasm.streamFromResponseCallback";
      Name2["WASM_COMPILED_MODULE"] = "v8.wasm.compiledModule";
      Name2["WASM_CACHED_MODULE"] = "v8.wasm.cachedModule";
      Name2["WASM_MODULE_CACHE_HIT"] = "v8.wasm.moduleCacheHit";
      Name2["WASM_MODULE_CACHE_INVALID"] = "v8.wasm.moduleCacheInvalid";
      Name2["PROFILE_CALL"] = "ProfileCall";
      Name2["EVALUATE_SCRIPT"] = "EvaluateScript";
      Name2["FUNCTION_CALL"] = "FunctionCall";
      Name2["EVENT_DISPATCH"] = "EventDispatch";
      Name2["EVALUATE_MODULE"] = "v8.evaluateModule";
      Name2["REQUEST_MAIN_THREAD_FRAME"] = "RequestMainThreadFrame";
      Name2["REQUEST_ANIMATION_FRAME"] = "RequestAnimationFrame";
      Name2["CANCEL_ANIMATION_FRAME"] = "CancelAnimationFrame";
      Name2["FIRE_ANIMATION_FRAME"] = "FireAnimationFrame";
      Name2["REQUEST_IDLE_CALLBACK"] = "RequestIdleCallback";
      Name2["CANCEL_IDLE_CALLBACK"] = "CancelIdleCallback";
      Name2["FIRE_IDLE_CALLBACK"] = "FireIdleCallback";
      Name2["TIMER_INSTALL"] = "TimerInstall";
      Name2["TIMER_REMOVE"] = "TimerRemove";
      Name2["TIMER_FIRE"] = "TimerFire";
      Name2["WEB_SOCKET_CREATE"] = "WebSocketCreate";
      Name2["WEB_SOCKET_SEND_HANDSHAKE"] = "WebSocketSendHandshakeRequest";
      Name2["WEB_SOCKET_RECEIVE_HANDSHAKE"] = "WebSocketReceiveHandshakeResponse";
      Name2["WEB_SOCKET_DESTROY"] = "WebSocketDestroy";
      Name2["WEB_SOCKET_SEND"] = "WebSocketSend";
      Name2["WEB_SOCKET_RECEIVE"] = "WebSocketReceive";
      Name2["CRYPTO_DO_ENCRYPT"] = "DoEncrypt";
      Name2["CRYPTO_DO_ENCRYPT_REPLY"] = "DoEncryptReply";
      Name2["CRYPTO_DO_DECRYPT"] = "DoDecrypt";
      Name2["CRYPTO_DO_DECRYPT_REPLY"] = "DoDecryptReply";
      Name2["CRYPTO_DO_DIGEST"] = "DoDigest";
      Name2["CRYPTO_DO_DIGEST_REPLY"] = "DoDigestReply";
      Name2["CRYPTO_DO_SIGN"] = "DoSign";
      Name2["CRYPTO_DO_SIGN_REPLY"] = "DoSignReply";
      Name2["CRYPTO_DO_VERIFY"] = "DoVerify";
      Name2["CRYPTO_DO_VERIFY_REPLY"] = "DoVerifyReply";
      Name2["V8_EXECUTE"] = "V8.Execute";
      Name2["V8_CONSOLE_RUN_TASK"] = "V8Console::runTask";
      Name2["SCHEDULE_POST_TASK_CALLBACK"] = "SchedulePostTaskCallback";
      Name2["RUN_POST_TASK_CALLBACK"] = "RunPostTaskCallback";
      Name2["ABORT_POST_TASK_CALLBACK"] = "AbortPostTaskCallback";
      Name2["DEBUGGER_ASYNC_TASK_RUN"] = "v8::Debugger::AsyncTaskRun";
      Name2["DEBUGGER_ASYNC_TASK_SCHEDULED"] = "v8::Debugger::AsyncTaskScheduled";
      Name2["GC"] = "GCEvent";
      Name2["DOMGC"] = "BlinkGC.AtomicPhase";
      Name2["MAJOR_GC"] = "MajorGC";
      Name2["MINOR_GC"] = "MinorGC";
      Name2["GC_COLLECT_GARBARGE"] = "BlinkGC.AtomicPhase";
      Name2["CPPGC_SWEEP"] = "CppGC.IncrementalSweep";
      Name2["SCHEDULE_STYLE_RECALCULATION"] = "ScheduleStyleRecalculation";
      Name2["LAYOUT"] = "Layout";
      Name2["RECALC_STYLE"] = "UpdateLayoutTree";
      Name2["INVALIDATE_LAYOUT"] = "InvalidateLayout";
      Name2["LAYOUT_INVALIDATION_TRACKING"] = "LayoutInvalidationTracking";
      Name2["COMPUTE_INTERSECTION"] = "ComputeIntersections";
      Name2["HIT_TEST"] = "HitTest";
      Name2["PRE_PAINT"] = "PrePaint";
      Name2["LAYERIZE"] = "Layerize";
      Name2["LAYOUT_SHIFT"] = "LayoutShift";
      Name2["SYNTHETIC_LAYOUT_SHIFT"] = "SyntheticLayoutShift";
      Name2["SYNTHETIC_LAYOUT_SHIFT_CLUSTER"] = "SyntheticLayoutShiftCluster";
      Name2["UPDATE_LAYER_TREE"] = "UpdateLayerTree";
      Name2["SCHEDULE_STYLE_INVALIDATION_TRACKING"] = "ScheduleStyleInvalidationTracking";
      Name2["STYLE_RECALC_INVALIDATION_TRACKING"] = "StyleRecalcInvalidationTracking";
      Name2["STYLE_INVALIDATOR_INVALIDATION_TRACKING"] = "StyleInvalidatorInvalidationTracking";
      Name2["SELECTOR_STATS"] = "SelectorStats";
      Name2["BEGIN_COMMIT_COMPOSITOR_FRAME"] = "BeginCommitCompositorFrame";
      Name2["PARSE_META_VIEWPORT"] = "ParseMetaViewport";
      Name2["META_CHARSET_CHECK"] = "MetaCharsetCheck";
      Name2["SCROLL_LAYER"] = "ScrollLayer";
      Name2["UPDATE_LAYER"] = "UpdateLayer";
      Name2["PAINT_SETUP"] = "PaintSetup";
      Name2["PAINT"] = "Paint";
      Name2["PAINT_IMAGE"] = "PaintImage";
      Name2["COMMIT"] = "Commit";
      Name2["COMPOSITE_LAYERS"] = "CompositeLayers";
      Name2["RASTER_TASK"] = "RasterTask";
      Name2["IMAGE_DECODE_TASK"] = "ImageDecodeTask";
      Name2["IMAGE_UPLOAD_TASK"] = "ImageUploadTask";
      Name2["DECODE_IMAGE"] = "Decode Image";
      Name2["DRAW_LAZY_PIXEL_REF"] = "Draw LazyPixelRef";
      Name2["DECODE_LAZY_PIXEL_REF"] = "Decode LazyPixelRef";
      Name2["GPU_TASK"] = "GPUTask";
      Name2["RASTERIZE"] = "Rasterize";
      Name2["EVENT_TIMING"] = "EventTiming";
      Name2["OPTIMIZE_CODE"] = "V8.OptimizeCode";
      Name2["CACHE_SCRIPT"] = "v8.produceCache";
      Name2["CACHE_MODULE"] = "v8.produceModuleCache";
      Name2["V8_SAMPLE"] = "V8Sample";
      Name2["JIT_CODE_ADDED"] = "JitCodeAdded";
      Name2["JIT_CODE_MOVED"] = "JitCodeMoved";
      Name2["STREAMING_COMPILE_SCRIPT"] = "v8.parseOnBackground";
      Name2["STREAMING_COMPILE_SCRIPT_WAITING"] = "v8.parseOnBackgroundWaiting";
      Name2["STREAMING_COMPILE_SCRIPT_PARSING"] = "v8.parseOnBackgroundParsing";
      Name2["BACKGROUND_DESERIALIZE"] = "v8.deserializeOnBackground";
      Name2["FINALIZE_DESERIALIZATION"] = "V8.FinalizeDeserialization";
      Name2["COMMIT_LOAD"] = "CommitLoad";
      Name2["MARK_LOAD"] = "MarkLoad";
      Name2["MARK_DOM_CONTENT"] = "MarkDOMContent";
      Name2["MARK_FIRST_PAINT"] = "firstPaint";
      Name2["MARK_FCP"] = "firstContentfulPaint";
      Name2["MARK_LCP_CANDIDATE"] = "largestContentfulPaint::Candidate";
      Name2["MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION"] = "largestContentfulPaint::CandidateForSoftNavigation";
      Name2["MARK_LCP_INVALIDATE"] = "largestContentfulPaint::Invalidate";
      Name2["NAVIGATION_START"] = "navigationStart";
      Name2["SOFT_NAVIGATION_START"] = "SoftNavigationStart";
      Name2["CONSOLE_TIME"] = "ConsoleTime";
      Name2["USER_TIMING"] = "UserTiming";
      Name2["INTERACTIVE_TIME"] = "InteractiveTime";
      Name2["TIME_STAMP"] = "TimeStamp";
      Name2["BEGIN_FRAME"] = "BeginFrame";
      Name2["NEEDS_BEGIN_FRAME_CHANGED"] = "NeedsBeginFrameChanged";
      Name2["BEGIN_MAIN_THREAD_FRAME"] = "BeginMainThreadFrame";
      Name2["ACTIVATE_LAYER_TREE"] = "ActivateLayerTree";
      Name2["DRAW_FRAME"] = "DrawFrame";
      Name2["DROPPED_FRAME"] = "DroppedFrame";
      Name2["FRAME_STARTED_LOADING"] = "FrameStartedLoading";
      Name2["PIPELINE_REPORTER"] = "PipelineReporter";
      Name2["SCREENSHOT"] = "Screenshot";
      Name2["RESOURCE_WILL_SEND_REQUEST"] = "ResourceWillSendRequest";
      Name2["RESOURCE_SEND_REQUEST"] = "ResourceSendRequest";
      Name2["RESOURCE_RECEIVE_RESPONSE"] = "ResourceReceiveResponse";
      Name2["RESOURCE_RECEIVE_DATA"] = "ResourceReceivedData";
      Name2["RESOURCE_FINISH"] = "ResourceFinish";
      Name2["RESOURCE_MARK_AS_CACHED"] = "ResourceMarkAsCached";
      Name2["WEB_SOCKET_SEND_HANDSHAKE_REQUEST"] = "WebSocketSendHandshakeRequest";
      Name2["WEB_SOCKET_RECEIVE_HANDSHAKE_REQUEST"] = "WebSocketReceiveHandshakeResponse";
      Name2["CPU_PROFILE"] = "CpuProfile";
      Name2["PROFILE"] = "Profile";
      Name2["START_PROFILING"] = "CpuProfiler::StartProfiling";
      Name2["PROFILE_CHUNK"] = "ProfileChunk";
      Name2["UPDATE_COUNTERS"] = "UpdateCounters";
      Name2["JS_SAMPLE"] = "JSSample";
      Name2["ANIMATION"] = "Animation";
      Name2["PARSE_AUTHOR_STYLE_SHEET"] = "ParseAuthorStyleSheet";
      Name2["EMBEDDER_CALLBACK"] = "EmbedderCallback";
      Name2["SET_LAYER_TREE_ID"] = "SetLayerTreeId";
      Name2["TRACING_STARTED_IN_PAGE"] = "TracingStartedInPage";
      Name2["TRACING_STARTED_IN_BROWSER"] = "TracingStartedInBrowser";
      Name2["TRACING_SESSION_ID_FOR_WORKER"] = "TracingSessionIdForWorker";
      Name2["LAZY_PIXEL_REF"] = "LazyPixelRef";
      Name2["LAYER_TREE_HOST_IMPL_SNAPSHOT"] = "cc::LayerTreeHostImpl";
      Name2["PICTURE_SNAPSHOT"] = "cc::Picture";
      Name2["DISPLAY_ITEM_LIST_SNAPSHOT"] = "cc::DisplayItemList";
      Name2["INPUT_LATENCY_MOUSE_MOVE"] = "InputLatency::MouseMove";
      Name2["INPUT_LATENCY_MOUSE_WHEEL"] = "InputLatency::MouseWheel";
      Name2["IMPL_SIDE_FLING"] = "InputHandlerProxy::HandleGestureFling::started";
      Name2["SCHEDULE_POST_MESSAGE"] = "SchedulePostMessage";
      Name2["HANDLE_POST_MESSAGE"] = "HandlePostMessage";
      Name2["RENDER_FRAME_IMPL_CREATE_CHILD_FRAME"] = "RenderFrameImpl::createChildFrame";
      Name2["LAYOUT_IMAGE_UNSIZED"] = "LayoutImageUnsized";
      Name2["DOM_LOADING"] = "domLoading";
      Name2["BEGIN_REMOTE_FONT_LOAD"] = "BeginRemoteFontLoad";
      Name2["REMOTE_FONT_LOADED"] = "RemoteFontLoaded";
      Name2["ANIMATION_FRAME"] = "AnimationFrame";
      Name2["ANIMATION_FRAME_PRESENTATION"] = "AnimationFrame::Presentation";
      Name2["SYNTHETIC_NETWORK_REQUEST"] = "SyntheticNetworkRequest";
      Name2["USER_TIMING_MEASURE"] = "UserTiming::Measure";
      Name2["LINK_PRECONNECT"] = "LinkPreconnect";
      Name2["PRELOAD_RENDER_BLOCKING_STATUS_CHANGE"] = "PreloadRenderBlockingStatusChange";
    })(Name || (Name = {}));
    MarkerName = [
      Name.MARK_DOM_CONTENT,
      Name.MARK_LOAD,
      Name.MARK_FIRST_PAINT,
      Name.MARK_FCP,
      Name.MARK_LCP_CANDIDATE,
      Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION,
      Name.NAVIGATION_START,
      Name.SOFT_NAVIGATION_START
    ];
    Categories = {
      Console: "blink.console",
      UserTiming: "blink.user_timing",
      Loading: "loading"
    };
    __name(isLegacyTimelineFrame, "isLegacyTimelineFrame");
    __name(isRundownScriptCompiled, "isRundownScriptCompiled");
    __name(isRundownScript, "isRundownScript");
    __name(isRundownScriptSource, "isRundownScriptSource");
    __name(isRundownScriptSourceLarge, "isRundownScriptSourceLarge");
    __name(isAnyScriptSourceEvent, "isAnyScriptSourceEvent");
    __name(isPreloadRenderBlockingStatusChangeEvent, "isPreloadRenderBlockingStatusChangeEvent");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/types/types.js
var init_types2 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/types/types.js"() {
    init_process_global();
    init_Configuration();
    init_Extensions();
    init_File();
    init_Overlays();
    init_Timing();
    init_TraceEvents();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/helpers.js
var helpers_exports = {};
__export(helpers_exports, {
  addEventToEntityMapping: () => addEventToEntityMapping,
  addNetworkRequestToEntityMapping: () => addNetworkRequestToEntityMapping,
  getEntityForEvent: () => getEntityForEvent,
  getEntityForUrl: () => getEntityForUrl,
  getNonResolvedURL: () => getNonResolvedURL,
  makeUpEntity: () => makeUpEntity
});
function getEntityForEvent(event, entityMappings3) {
  const url = getNonResolvedURL(event);
  if (!url) {
    return;
  }
  return getEntityForUrl(url, entityMappings3);
}
function getEntityForUrl(url, entityMappings3) {
  const cachedByUrl = entityMappings3.entityByUrlCache.get(url);
  if (cachedByUrl) {
    return cachedByUrl;
  }
  const entity = import_third_party_web.default.getEntity(url) ?? makeUpEntity(entityMappings3.createdEntityCache, url);
  if (entity) {
    entityMappings3.entityByUrlCache.set(url, entity);
  }
  return entity;
}
function getNonResolvedURL(entry, handlerData) {
  if (TraceEvents_exports.isProfileCall(entry)) {
    return entry.callFrame.url;
  }
  if (TraceEvents_exports.isSyntheticNetworkRequest(entry)) {
    return entry.args.data.url;
  }
  if (TraceEvents_exports.isParseAuthorStyleSheetEvent(entry) && entry.args) {
    return entry.args.data.stylesheetUrl;
  }
  if (entry.args?.data?.stackTrace && entry.args.data.stackTrace.length > 0) {
    return entry.args.data.stackTrace[0].url;
  }
  if (TraceEvents_exports.isParseHTML(entry)) {
    return entry.args.beginData.url;
  }
  if (handlerData) {
    if (TraceEvents_exports.isDecodeImage(entry)) {
      const paintEvent = handlerData.ImagePainting.paintImageForEvent.get(entry);
      return paintEvent ? getNonResolvedURL(paintEvent, handlerData) : null;
    }
    if (TraceEvents_exports.isDrawLazyPixelRef(entry) && entry.args?.LazyPixelRef) {
      const paintEvent = handlerData.ImagePainting.paintImageByDrawLazyPixelRef.get(entry.args.LazyPixelRef);
      return paintEvent ? getNonResolvedURL(paintEvent, handlerData) : null;
    }
  }
  if (entry.args?.data?.url) {
    return entry.args.data.url;
  }
  const requestId = entry.args?.data?.requestId;
  if (handlerData && requestId) {
    const url = handlerData.NetworkRequests.byId.get(requestId)?.args.data.url;
    if (url) {
      return url;
    }
  }
  return null;
}
function makeUpEntity(entityCache, url) {
  if (url.startsWith("chrome-extension:")) {
    return makeUpChromeExtensionEntity(entityCache, url);
  }
  if (!url.startsWith("http")) {
    return;
  }
  const rootDomain = import_third_party_web.default.getRootDomain(url);
  if (!rootDomain) {
    return;
  }
  if (entityCache.has(rootDomain)) {
    return entityCache.get(rootDomain);
  }
  const unrecognizedEntity = {
    name: rootDomain,
    company: rootDomain,
    category: "",
    categories: [],
    domains: [rootDomain],
    averageExecutionTime: 0,
    totalExecutionTime: 0,
    totalOccurrences: 0,
    isUnrecognized: true
  };
  entityCache.set(rootDomain, unrecognizedEntity);
  return unrecognizedEntity;
}
function getChromeExtensionOrigin(url) {
  return url.protocol + "//" + url.host;
}
function makeUpChromeExtensionEntity(entityCache, url, extensionName) {
  const parsedUrl = new URL(url);
  const origin = getChromeExtensionOrigin(parsedUrl);
  const host = new URL(origin).host;
  const name = extensionName || host;
  const cachedEntity = entityCache.get(origin);
  if (cachedEntity) {
    return cachedEntity;
  }
  const chromeExtensionEntity = {
    name,
    company: name,
    category: "Chrome Extension",
    homepage: "https://chromewebstore.google.com/detail/" + host,
    categories: [],
    domains: [origin],
    averageExecutionTime: 0,
    totalExecutionTime: 0,
    totalOccurrences: 0
  };
  entityCache.set(origin, chromeExtensionEntity);
  return chromeExtensionEntity;
}
function addEventToEntityMapping(event, entityMappings3) {
  if (entityMappings3.entityByEvent.has(event)) {
    return;
  }
  const entity = getEntityForEvent(event, entityMappings3);
  if (!entity) {
    return;
  }
  const mappedEvents = entityMappings3.eventsByEntity.get(entity);
  if (mappedEvents) {
    mappedEvents.push(event);
  } else {
    entityMappings3.eventsByEntity.set(entity, [event]);
  }
  entityMappings3.entityByEvent.set(event, entity);
}
function addNetworkRequestToEntityMapping(networkRequest, entityMappings3, requestTraceEvents) {
  const entity = getEntityForEvent(networkRequest, entityMappings3);
  if (!entity) {
    return;
  }
  const eventsToMap = [networkRequest, ...Object.values(requestTraceEvents).flat()];
  const mappedEvents = entityMappings3.eventsByEntity.get(entity);
  if (mappedEvents) {
    mappedEvents.push(...eventsToMap);
  } else {
    entityMappings3.eventsByEntity.set(entity, eventsToMap);
  }
  for (const evt of eventsToMap) {
    entityMappings3.entityByEvent.set(evt, entity);
  }
}
var init_helpers = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/helpers.js"() {
    init_process_global();
    init_third_party_web();
    init_types2();
    __name(getEntityForEvent, "getEntityForEvent");
    __name(getEntityForUrl, "getEntityForUrl");
    __name(getNonResolvedURL, "getNonResolvedURL");
    __name(makeUpEntity, "makeUpEntity");
    __name(getChromeExtensionOrigin, "getChromeExtensionOrigin");
    __name(makeUpChromeExtensionEntity, "makeUpChromeExtensionEntity");
    __name(addEventToEntityMapping, "addEventToEntityMapping");
    __name(addNetworkRequestToEntityMapping, "addNetworkRequestToEntityMapping");
  }
});

// node_modules/@paulirish/trace_engine/core/platform/ArrayUtilities.js
var ArrayUtilities_exports = {};
__export(ArrayUtilities_exports, {
  DEFAULT_COMPARATOR: () => DEFAULT_COMPARATOR,
  arrayDoesNotContainNullOrUndefined: () => arrayDoesNotContainNullOrUndefined,
  assertArrayIsSorted: () => assertArrayIsSorted,
  binaryIndexOf: () => binaryIndexOf,
  intersectOrdered: () => intersectOrdered,
  lowerBound: () => lowerBound,
  mergeOrdered: () => mergeOrdered,
  nearestIndexFromBeginning: () => nearestIndexFromBeginning,
  nearestIndexFromEnd: () => nearestIndexFromEnd,
  removeElement: () => removeElement,
  sortRange: () => sortRange,
  swap: () => swap,
  upperBound: () => upperBound
});
function swap(array, i1, i2) {
  const temp = array[i1];
  array[i1] = array[i2];
  array[i2] = temp;
}
function partition(array, comparator, left, right, pivotIndex) {
  const pivotValue = array[pivotIndex];
  swap(array, right, pivotIndex);
  let storeIndex = left;
  for (let i = left; i < right; ++i) {
    if (comparator(array[i], pivotValue) < 0) {
      swap(array, storeIndex, i);
      ++storeIndex;
    }
  }
  swap(array, right, storeIndex);
  return storeIndex;
}
function quickSortRange(array, comparator, left, right, sortWindowLeft, sortWindowRight) {
  if (right <= left) {
    return;
  }
  const pivotIndex = Math.floor(Math.random() * (right - left)) + left;
  const pivotNewIndex = partition(array, comparator, left, right, pivotIndex);
  if (sortWindowLeft < pivotNewIndex) {
    quickSortRange(array, comparator, left, pivotNewIndex - 1, sortWindowLeft, sortWindowRight);
  }
  if (pivotNewIndex < sortWindowRight) {
    quickSortRange(array, comparator, pivotNewIndex + 1, right, sortWindowLeft, sortWindowRight);
  }
}
function sortRange(array, comparator, leftBound, rightBound, sortWindowLeft, sortWindowRight) {
  if (leftBound === 0 && rightBound === array.length - 1 && sortWindowLeft === 0 && sortWindowRight >= rightBound) {
    array.sort(comparator);
  } else {
    quickSortRange(array, comparator, leftBound, rightBound, sortWindowLeft, sortWindowRight);
  }
  return array;
}
function mergeOrIntersect(array1, array2, comparator, mergeNotIntersect) {
  const result = [];
  let i = 0;
  let j = 0;
  while (i < array1.length && j < array2.length) {
    const compareValue = comparator(array1[i], array2[j]);
    if (mergeNotIntersect || !compareValue) {
      result.push(compareValue <= 0 ? array1[i] : array2[j]);
    }
    if (compareValue <= 0) {
      i++;
    }
    if (compareValue >= 0) {
      j++;
    }
  }
  if (mergeNotIntersect) {
    while (i < array1.length) {
      result.push(array1[i++]);
    }
    while (j < array2.length) {
      result.push(array2[j++]);
    }
  }
  return result;
}
function lowerBound(array, needle, comparator, left, right) {
  let l = left || 0;
  let r = right !== void 0 ? right : array.length;
  while (l < r) {
    const m = l + r >> 1;
    if (comparator(needle, array[m]) > 0) {
      l = m + 1;
    } else {
      r = m;
    }
  }
  return r;
}
function upperBound(array, needle, comparator, left, right) {
  let l = left || 0;
  let r = right !== void 0 ? right : array.length;
  while (l < r) {
    const m = l + r >> 1;
    if (comparator(needle, array[m]) >= 0) {
      l = m + 1;
    } else {
      r = m;
    }
  }
  return r;
}
function nearestIndex(arr, predicate, searchStart) {
  const searchFromEnd = searchStart === "END";
  if (arr.length === 0) {
    return null;
  }
  let left = 0;
  let right = arr.length - 1;
  let pivot = 0;
  let matchesPredicate = false;
  let moveToTheRight = false;
  let middle = 0;
  do {
    middle = left + (right - left) / 2;
    pivot = searchFromEnd ? Math.ceil(middle) : Math.floor(middle);
    matchesPredicate = predicate(arr[pivot]);
    moveToTheRight = matchesPredicate === searchFromEnd;
    if (moveToTheRight) {
      left = Math.min(right, pivot + (left === pivot ? 1 : 0));
    } else {
      right = Math.max(left, pivot + (right === pivot ? -1 : 0));
    }
  } while (right !== left);
  if (!predicate(arr[left])) {
    return null;
  }
  return left;
}
function nearestIndexFromBeginning(arr, predicate) {
  return nearestIndex(
    arr,
    predicate,
    "BEGINNING"
    /* NearestSearchStart.BEGINNING */
  );
}
function nearestIndexFromEnd(arr, predicate) {
  return nearestIndex(
    arr,
    predicate,
    "END"
    /* NearestSearchStart.END */
  );
}
function arrayDoesNotContainNullOrUndefined(arr) {
  return !arr.includes(null) && !arr.includes(void 0);
}
function assertArrayIsSorted(arr, compareFn) {
  const comparator = compareFn || DEFAULT_COMPARATOR;
  for (let i = 0; i < arr.length - 1; i++) {
    const current = arr[i];
    const next = arr[i + 1];
    if (comparator(current, next) > 0) {
      throw new Error(`Array is not sorted at index ${i}: ${JSON.stringify(current)} > ${JSON.stringify(next)}`);
    }
  }
}
var removeElement, binaryIndexOf, intersectOrdered, mergeOrdered, DEFAULT_COMPARATOR;
var init_ArrayUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/ArrayUtilities.js"() {
    init_process_global();
    removeElement = /* @__PURE__ */ __name((array, element, firstOnly) => {
      let index = array.indexOf(element);
      if (index === -1) {
        return false;
      }
      if (firstOnly) {
        array.splice(index, 1);
        return true;
      }
      for (let i = index + 1, n = array.length; i < n; ++i) {
        if (array[i] !== element) {
          array[index++] = array[i];
        }
      }
      array.length = index;
      return true;
    }, "removeElement");
    __name(swap, "swap");
    __name(partition, "partition");
    __name(quickSortRange, "quickSortRange");
    __name(sortRange, "sortRange");
    binaryIndexOf = /* @__PURE__ */ __name((array, value, comparator) => {
      const index = lowerBound(array, value, comparator);
      return index < array.length && comparator(value, array[index]) === 0 ? index : -1;
    }, "binaryIndexOf");
    __name(mergeOrIntersect, "mergeOrIntersect");
    intersectOrdered = /* @__PURE__ */ __name((array1, array2, comparator) => {
      return mergeOrIntersect(array1, array2, comparator, false);
    }, "intersectOrdered");
    mergeOrdered = /* @__PURE__ */ __name((array1, array2, comparator) => {
      return mergeOrIntersect(array1, array2, comparator, true);
    }, "mergeOrdered");
    DEFAULT_COMPARATOR = /* @__PURE__ */ __name((a, b) => {
      return a < b ? -1 : a > b ? 1 : 0;
    }, "DEFAULT_COMPARATOR");
    __name(lowerBound, "lowerBound");
    __name(upperBound, "upperBound");
    __name(nearestIndex, "nearestIndex");
    __name(nearestIndexFromBeginning, "nearestIndexFromBeginning");
    __name(nearestIndexFromEnd, "nearestIndexFromEnd");
    __name(arrayDoesNotContainNullOrUndefined, "arrayDoesNotContainNullOrUndefined");
    __name(assertArrayIsSorted, "assertArrayIsSorted");
  }
});

// node_modules/@paulirish/trace_engine/core/platform/Brand.js
var init_Brand = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/Brand.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/Constructor.js
var init_Constructor = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/Constructor.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/DateUtilities.js
var init_DateUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/DateUtilities.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/DevToolsPath.js
var init_DevToolsPath = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/DevToolsPath.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/HostRuntime.js
var IS_NODE, IS_BROWSER;
var init_HostRuntime = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/HostRuntime.js"() {
    init_process_global();
    IS_NODE = typeof process !== "undefined" && process.versions?.node !== null;
    IS_BROWSER = // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore 'window' is not available when type-checking against node.js types.
    typeof window !== "undefined" || typeof self !== "undefined" && typeof self.postMessage === "function";
  }
});

// node_modules/@paulirish/trace_engine/core/platform/KeyboardUtilities.js
var init_KeyboardUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/KeyboardUtilities.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/MapUtilities.js
var MapUtilities_exports = {};
__export(MapUtilities_exports, {
  Multimap: () => Multimap,
  getWithDefault: () => getWithDefault,
  inverse: () => inverse
});
function getWithDefault(map, key, defaultValueFactory) {
  let value = map.get(key);
  if (value === void 0 || value === null) {
    value = defaultValueFactory(key);
    map.set(key, value);
  }
  return value;
}
var inverse, Multimap;
var init_MapUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/MapUtilities.js"() {
    init_process_global();
    inverse = /* @__PURE__ */ __name(function(map) {
      const result = new Multimap();
      for (const [key, value] of map.entries()) {
        result.set(value, key);
      }
      return result;
    }, "inverse");
    Multimap = class {
      static {
        __name(this, "Multimap");
      }
      map = /* @__PURE__ */ new Map();
      set(key, value) {
        let set = this.map.get(key);
        if (!set) {
          set = /* @__PURE__ */ new Set();
          this.map.set(key, set);
        }
        set.add(value);
      }
      get(key) {
        return this.map.get(key) || /* @__PURE__ */ new Set();
      }
      has(key) {
        return this.map.has(key);
      }
      hasValue(key, value) {
        const set = this.map.get(key);
        if (!set) {
          return false;
        }
        return set.has(value);
      }
      get size() {
        return this.map.size;
      }
      delete(key, value) {
        const values = this.get(key);
        if (!values) {
          return false;
        }
        const result = values.delete(value);
        if (!values.size) {
          this.map.delete(key);
        }
        return result;
      }
      deleteAll(key) {
        this.map.delete(key);
      }
      keysArray() {
        return [...this.map.keys()];
      }
      keys() {
        return this.map.keys();
      }
      valuesArray() {
        const result = [];
        for (const set of this.map.values()) {
          result.push(...set.values());
        }
        return result;
      }
      clear() {
        this.map.clear();
      }
    };
    __name(getWithDefault, "getWithDefault");
  }
});

// node_modules/@paulirish/trace_engine/core/platform/MimeType.js
var init_MimeType = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/MimeType.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/NumberUtilities.js
var NumberUtilities_exports = {};
__export(NumberUtilities_exports, {
  aspectRatio: () => aspectRatio,
  clamp: () => clamp,
  floor: () => floor,
  greatestCommonDivisor: () => greatestCommonDivisor,
  mod: () => mod,
  toFixedIfFloating: () => toFixedIfFloating,
  withThousandsSeparator: () => withThousandsSeparator
});
var clamp, mod, toFixedIfFloating, floor, greatestCommonDivisor, commonRatios, aspectRatio, withThousandsSeparator;
var init_NumberUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/NumberUtilities.js"() {
    init_process_global();
    clamp = /* @__PURE__ */ __name((num, min, max) => {
      let clampedNumber = num;
      if (num < min) {
        clampedNumber = min;
      } else if (num > max) {
        clampedNumber = max;
      }
      return clampedNumber;
    }, "clamp");
    mod = /* @__PURE__ */ __name((m, n) => {
      return (m % n + n) % n;
    }, "mod");
    toFixedIfFloating = /* @__PURE__ */ __name((value) => {
      if (!value || Number.isNaN(Number(value))) {
        return value;
      }
      const number = Number(value);
      return number % 1 ? number.toFixed(3) : String(number);
    }, "toFixedIfFloating");
    floor = /* @__PURE__ */ __name((value, precision = 0) => {
      if (precision > 0 && precision < 1) {
        precision = 1 / precision;
        return Math.floor(value / precision) * precision;
      }
      const mult = Math.pow(10, precision);
      return Math.floor(value * mult) / mult;
    }, "floor");
    greatestCommonDivisor = /* @__PURE__ */ __name((a, b) => {
      a = Math.round(a);
      b = Math.round(b);
      while (b !== 0) {
        const t = b;
        b = a % b;
        a = t;
      }
      return a;
    }, "greatestCommonDivisor");
    commonRatios = /* @__PURE__ */ new Map([
      ["8∶5", "16∶10"]
    ]);
    aspectRatio = /* @__PURE__ */ __name((width, height) => {
      const divisor = greatestCommonDivisor(width, height);
      if (divisor !== 0) {
        width /= divisor;
        height /= divisor;
      }
      const result = `${width}∶${height}`;
      return commonRatios.get(result) || result;
    }, "aspectRatio");
    withThousandsSeparator = /* @__PURE__ */ __name(function(num) {
      let str = String(num);
      const re = /(\d+)(\d{3})/;
      while (str.match(re)) {
        str = str.replace(re, "$1 $2");
      }
      return str;
    }, "withThousandsSeparator");
  }
});

// node_modules/@paulirish/trace_engine/core/platform/StringUtilities.js
var init_StringUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/StringUtilities.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/Timing.js
var init_Timing2 = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/Timing.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/TypedArrayUtilities.js
var init_TypedArrayUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/TypedArrayUtilities.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/TypescriptUtilities.js
var TypescriptUtilities_exports = {};
__export(TypescriptUtilities_exports, {
  assertNever: () => assertNever,
  assertNotNullOrUndefined: () => assertNotNullOrUndefined,
  assertUnhandled: () => assertUnhandled
});
function assertNotNullOrUndefined(val, message) {
  if (val === null || val === void 0) {
    throw new Error(`Expected given value to not be null/undefined but it was: ${val}${message ? `
${message}` : ""}`);
  }
}
function assertNever(_type, message) {
  throw new Error(message);
}
function assertUnhandled(_caseVariable) {
  return _caseVariable;
}
var init_TypescriptUtilities = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/TypescriptUtilities.js"() {
    init_process_global();
    __name(assertNotNullOrUndefined, "assertNotNullOrUndefined");
    __name(assertNever, "assertNever");
    __name(assertUnhandled, "assertUnhandled");
  }
});

// node_modules/@paulirish/trace_engine/core/platform/UIString.js
var init_UIString = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/UIString.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/UserVisibleError.js
var init_UserVisibleError = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/UserVisibleError.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/core/platform/platform.js
var init_platform = __esm({
  "node_modules/@paulirish/trace_engine/core/platform/platform.js"() {
    init_process_global();
    init_ArrayUtilities();
    init_Brand();
    init_Constructor();
    init_DateUtilities();
    init_DevToolsPath();
    init_HostRuntime();
    init_KeyboardUtilities();
    init_MapUtilities();
    init_MimeType();
    init_NumberUtilities();
    init_StringUtilities();
    init_Timing2();
    init_TypedArrayUtilities();
    init_TypescriptUtilities();
    init_UIString();
    init_UserVisibleError();
    init_TypescriptUtilities();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/SyntheticEvents.js
var SyntheticEvents_exports = {};
__export(SyntheticEvents_exports, {
  SyntheticEventsManager: () => SyntheticEventsManager
});
var activeManager, SyntheticEventsManager;
var init_SyntheticEvents = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/SyntheticEvents.js"() {
    init_process_global();
    activeManager = null;
    SyntheticEventsManager = class _SyntheticEventsManager {
      static {
        __name(this, "SyntheticEventsManager");
      }
      /**
       * All synthetic entries created in a trace from a corresponding trace events.
       * (ProfileCalls are excluded because they are not based on a real trace event)
       */
      #syntheticTraces = [];
      /**
       * All raw entries from a trace.
       */
      #rawTraceEvents = [];
      static activate(manager) {
        activeManager = manager;
      }
      static createAndActivate(rawEvents) {
        const manager = new _SyntheticEventsManager(rawEvents);
        _SyntheticEventsManager.activate(manager);
        return manager;
      }
      static getActiveManager() {
        if (!activeManager) {
          throw new Error("Attempted to get a SyntheticEventsManager without initializing");
        }
        return activeManager;
      }
      static reset() {
        activeManager = null;
      }
      static registerSyntheticEvent(syntheticEvent) {
        try {
          return _SyntheticEventsManager.getActiveManager().#registerSyntheticEvent(syntheticEvent);
        } catch {
          return syntheticEvent;
        }
      }
      constructor(rawEvents) {
        this.#rawTraceEvents = rawEvents;
      }
      /**
       * Registers and returns a branded synthetic event. Synthetic events need to
       * be created with this method to ensure they are registered and made
       * available to load events using serialized keys.
       */
      #registerSyntheticEvent(syntheticEvent) {
        const rawIndex = this.#rawTraceEvents.indexOf(syntheticEvent.rawSourceEvent);
        if (rawIndex < 0) {
          throw new Error("Attempted to register a synthetic event paired to an unknown raw event.");
        }
        const eventAsSynthetic = syntheticEvent;
        this.#syntheticTraces[rawIndex] = eventAsSynthetic;
        return eventAsSynthetic;
      }
      syntheticEventForRawEventIndex(rawEventIndex) {
        const syntheticEvent = this.#syntheticTraces.at(rawEventIndex);
        if (!syntheticEvent) {
          throw new Error(`Attempted to get a synthetic event from an unknown raw event index: ${rawEventIndex}`);
        }
        return syntheticEvent;
      }
      getSyntheticTraces() {
        return this.#syntheticTraces;
      }
      getRawTraceEvents() {
        return this.#rawTraceEvents;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/Timing.js
var Timing_exports3 = {};
__export(Timing_exports3, {
  boundsIncludeTimeRange: () => boundsIncludeTimeRange,
  combineTraceWindowsMicro: () => combineTraceWindowsMicro,
  eventIsInBounds: () => eventIsInBounds,
  eventTimingsMicroSeconds: () => eventTimingsMicroSeconds,
  eventTimingsMilliSeconds: () => eventTimingsMilliSeconds,
  expandWindowByPercentOrToOneMillisecond: () => expandWindowByPercentOrToOneMillisecond,
  microToMilli: () => microToMilli,
  microToSeconds: () => microToSeconds,
  milliToMicro: () => milliToMicro,
  secondsToMicro: () => secondsToMicro,
  secondsToMilli: () => secondsToMilli,
  timeStampForEventAdjustedByClosestNavigation: () => timeStampForEventAdjustedByClosestNavigation,
  timestampIsInBounds: () => timestampIsInBounds,
  traceWindowFromEvent: () => traceWindowFromEvent,
  traceWindowFromMicroSeconds: () => traceWindowFromMicroSeconds,
  traceWindowFromMilliSeconds: () => traceWindowFromMilliSeconds,
  traceWindowFromOverlay: () => traceWindowFromOverlay,
  traceWindowMicroSecondsToMilliSeconds: () => traceWindowMicroSecondsToMilliSeconds,
  traceWindowMilliSeconds: () => traceWindowMilliSeconds,
  windowFitsInsideBounds: () => windowFitsInsideBounds,
  windowsEqual: () => windowsEqual
});
function timeStampForEventAdjustedByClosestNavigation(event, traceBounds2, navigationsByNavigationId2, softNavigationsById2, navigationsByFrameId2) {
  let eventTimeStamp = event.ts - traceBounds2.min;
  if (event.name === TraceEvents_exports.Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION && event.args?.data?.performanceTimelineNavigationId) {
    const navigationForEvent = softNavigationsById2.get(event.args.data.performanceTimelineNavigationId);
    if (navigationForEvent) {
      eventTimeStamp = event.ts - navigationForEvent.ts;
    }
  } else if (event.args?.data?.navigationId) {
    const navigationForEvent = navigationsByNavigationId2.get(event.args.data.navigationId);
    if (navigationForEvent) {
      eventTimeStamp = event.ts - navigationForEvent.ts;
    }
  } else if (event.args?.data?.frame) {
    const navigationForEvent = getNavigationForTraceEvent(event, event.args.data.frame, navigationsByFrameId2);
    if (navigationForEvent) {
      eventTimeStamp = event.ts - navigationForEvent.ts;
    }
  }
  return Timing_exports.Micro(eventTimeStamp);
}
function expandWindowByPercentOrToOneMillisecond(annotationWindow, maxTraceWindow, percentage) {
  let newMin = annotationWindow.min - annotationWindow.range * (percentage / 100) / 2;
  let newMax = annotationWindow.max + annotationWindow.range * (percentage / 100) / 2;
  if (newMax - newMin < 1e3) {
    const rangeMiddle = (annotationWindow.min + annotationWindow.max) / 2;
    newMin = rangeMiddle - 500;
    newMax = rangeMiddle + 500;
  }
  newMin = Math.max(newMin, maxTraceWindow.min);
  newMax = Math.min(newMax, maxTraceWindow.max);
  const expandedWindow = {
    min: Timing_exports.Micro(newMin),
    max: Timing_exports.Micro(newMax),
    range: Timing_exports.Micro(newMax - newMin)
  };
  return expandedWindow;
}
function eventTimingsMicroSeconds(event) {
  return {
    startTime: event.ts,
    endTime: event.ts + (event.dur ?? 0),
    duration: event.dur || 0
  };
}
function eventTimingsMilliSeconds(event) {
  return {
    startTime: event.ts / 1e3,
    endTime: (event.ts + (event.dur ?? 0)) / 1e3,
    duration: (event.dur || 0) / 1e3
  };
}
function traceWindowMilliSeconds(bounds) {
  return {
    min: microToMilli(bounds.min),
    max: microToMilli(bounds.max),
    range: microToMilli(bounds.range)
  };
}
function traceWindowMicroSecondsToMilliSeconds(bounds) {
  return {
    min: microToMilli(bounds.min),
    max: microToMilli(bounds.max),
    range: microToMilli(bounds.range)
  };
}
function traceWindowFromMilliSeconds(min, max) {
  const traceWindow = {
    min: milliToMicro(min),
    max: milliToMicro(max),
    range: Timing_exports.Micro(milliToMicro(max) - milliToMicro(min))
  };
  return traceWindow;
}
function traceWindowFromMicroSeconds(min, max) {
  const traceWindow = {
    min,
    max,
    range: max - min
  };
  return traceWindow;
}
function traceWindowFromEvent(event) {
  return {
    min: event.ts,
    max: event.ts + (event.dur ?? 0),
    range: event.dur ?? 0
  };
}
function traceWindowFromOverlay(overlay) {
  switch (overlay.type) {
    case "ENTRY_LABEL":
    case "ENTRY_OUTLINE":
    case "ENTRY_SELECTED": {
      return traceWindowFromEvent(overlay.entry);
    }
    case "TIMESPAN_BREAKDOWN": {
      const windows = overlay.sections.map((s) => s.bounds);
      if (overlay.entry) {
        windows.push(traceWindowFromEvent(overlay.entry));
      }
      return combineTraceWindowsMicro(windows);
    }
    case "CANDY_STRIPED_TIME_RANGE":
    case "TIME_RANGE": {
      return structuredClone(overlay.bounds);
    }
    case "ENTRIES_LINK": {
      const from = traceWindowFromEvent(overlay.entryFrom);
      if (!overlay.entryTo) {
        return from;
      }
      const to = traceWindowFromEvent(overlay.entryTo);
      return combineTraceWindowsMicro([from, to]);
    }
    case "TIMESTAMP_MARKER":
      return traceWindowFromMicroSeconds(overlay.timestamp, overlay.timestamp);
    case "TIMINGS_MARKER":
      return traceWindowFromMicroSeconds(overlay.adjustedTimestamp, overlay.adjustedTimestamp);
    case "BOTTOM_INFO_BAR":
      return null;
    default:
      TypescriptUtilities_exports.assertNever(overlay, `Unexpected overlay ${overlay}`);
  }
}
function combineTraceWindowsMicro(windows) {
  if (!windows.length) {
    return null;
  }
  const result = structuredClone(windows[0]);
  for (const bounds of windows.slice(1)) {
    result.min = Math.min(result.min, bounds.min);
    result.max = Math.max(result.max, bounds.max);
  }
  result.range = result.max - result.min;
  return result;
}
function boundsIncludeTimeRange(data31) {
  const { min: visibleMin, max: visibleMax } = data31.bounds;
  const { min: rangeMin, max: rangeMax } = data31.timeRange;
  return visibleMin <= rangeMax && visibleMax >= rangeMin;
}
function eventIsInBounds(event, bounds) {
  const startTime = event.ts;
  return startTime <= bounds.max && bounds.min < startTime + (event.dur ?? 0);
}
function timestampIsInBounds(bounds, timestamp) {
  return timestamp >= bounds.min && timestamp <= bounds.max;
}
function windowFitsInsideBounds(data31) {
  return data31.window.min >= data31.bounds.min && data31.window.max <= data31.bounds.max;
}
function windowsEqual(w1, w2) {
  return w1.min === w2.min && w1.max === w2.max;
}
var milliToMicro, secondsToMilli, secondsToMicro, microToMilli, microToSeconds;
var init_Timing3 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/Timing.js"() {
    init_process_global();
    init_platform();
    init_types2();
    init_Trace();
    milliToMicro = /* @__PURE__ */ __name((value) => Timing_exports.Micro(value * 1e3), "milliToMicro");
    secondsToMilli = /* @__PURE__ */ __name((value) => Timing_exports.Milli(value * 1e3), "secondsToMilli");
    secondsToMicro = /* @__PURE__ */ __name((value) => milliToMicro(secondsToMilli(value)), "secondsToMicro");
    microToMilli = /* @__PURE__ */ __name((value) => Timing_exports.Milli(value / 1e3), "microToMilli");
    microToSeconds = /* @__PURE__ */ __name((value) => Timing_exports.Seconds(value / 1e3 / 1e3), "microToSeconds");
    __name(timeStampForEventAdjustedByClosestNavigation, "timeStampForEventAdjustedByClosestNavigation");
    __name(expandWindowByPercentOrToOneMillisecond, "expandWindowByPercentOrToOneMillisecond");
    __name(eventTimingsMicroSeconds, "eventTimingsMicroSeconds");
    __name(eventTimingsMilliSeconds, "eventTimingsMilliSeconds");
    __name(traceWindowMilliSeconds, "traceWindowMilliSeconds");
    __name(traceWindowMicroSecondsToMilliSeconds, "traceWindowMicroSecondsToMilliSeconds");
    __name(traceWindowFromMilliSeconds, "traceWindowFromMilliSeconds");
    __name(traceWindowFromMicroSeconds, "traceWindowFromMicroSeconds");
    __name(traceWindowFromEvent, "traceWindowFromEvent");
    __name(traceWindowFromOverlay, "traceWindowFromOverlay");
    __name(combineTraceWindowsMicro, "combineTraceWindowsMicro");
    __name(boundsIncludeTimeRange, "boundsIncludeTimeRange");
    __name(eventIsInBounds, "eventIsInBounds");
    __name(timestampIsInBounds, "timestampIsInBounds");
    __name(windowFitsInsideBounds, "windowFitsInsideBounds");
    __name(windowsEqual, "windowsEqual");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/Trace.js
var Trace_exports = {};
__export(Trace_exports, {
  VISIBLE_TRACE_EVENT_TYPES: () => VISIBLE_TRACE_EVENT_TYPES,
  activeURLForFrameAtTime: () => activeURLForFrameAtTime,
  addEventToProcessThread: () => addEventToProcessThread,
  compareBeginAndEnd: () => compareBeginAndEnd,
  createMatchedSortedSyntheticEvents: () => createMatchedSortedSyntheticEvents,
  eventContainsTimestamp: () => eventContainsTimestamp,
  eventHasCategory: () => eventHasCategory,
  eventTimeComparator: () => eventTimeComparator,
  extractId: () => extractId,
  extractOriginFromTrace: () => extractOriginFromTrace,
  extractSampleTraceId: () => extractSampleTraceId,
  findNextEventAfterTimestamp: () => findNextEventAfterTimestamp,
  findPreviousEventBeforeTimestamp: () => findPreviousEventBeforeTimestamp,
  findRecalcStyleEvents: () => findRecalcStyleEvents,
  forEachEvent: () => forEachEvent,
  frameIDForEvent: () => frameIDForEvent,
  getNavigationForTraceEvent: () => getNavigationForTraceEvent,
  getStackTraceTopCallFrameInEventPayload: () => getStackTraceTopCallFrameInEventPayload,
  getSyntheticId: () => getSyntheticId,
  getZeroIndexedLineAndColumnForEvent: () => getZeroIndexedLineAndColumnForEvent,
  getZeroIndexedStackTraceInEventPayload: () => getZeroIndexedStackTraceInEventPayload,
  isExtensionUrl: () => isExtensionUrl,
  isMatchingCallFrame: () => isMatchingCallFrame,
  isTopLevelEvent: () => isTopLevelEvent,
  makeProfileCall: () => makeProfileCall,
  makeZeroBasedCallFrame: () => makeZeroBasedCallFrame,
  mergeEventsInOrder: () => mergeEventsInOrder,
  parseDevtoolsDetails: () => parseDevtoolsDetails,
  rawCallFrameForEntry: () => rawCallFrameForEntry,
  sortTraceEventsInPlace: () => sortTraceEventsInPlace,
  stackTraceInEvent: () => stackTraceInEvent
});
function stackTraceInEvent(event) {
  if (event.args?.data?.stackTrace) {
    return event.args.data.stackTrace;
  }
  if (event.args?.stackTrace) {
    return event.args.stackTrace;
  }
  if (TraceEvents_exports.isRecalcStyle(event)) {
    return event.args.beginData?.stackTrace || null;
  }
  if (TraceEvents_exports.isLayout(event)) {
    return event.args.beginData.stackTrace ?? null;
  }
  if (TraceEvents_exports.isFunctionCall(event)) {
    const data31 = event.args.data;
    if (!data31) {
      return null;
    }
    const { columnNumber, lineNumber, url, scriptId, functionName } = data31;
    if (lineNumber === void 0 || functionName === void 0 || columnNumber === void 0 || scriptId === void 0 || url === void 0) {
      return null;
    }
    return [{ columnNumber, lineNumber, url, scriptId, functionName }];
  }
  if (TraceEvents_exports.isProfileCall(event)) {
    const callFrame = event.callFrame;
    if (!callFrame) {
      return null;
    }
    const { columnNumber, lineNumber, url, scriptId, functionName } = callFrame;
    if (lineNumber === void 0 || functionName === void 0 || columnNumber === void 0 || scriptId === void 0 || url === void 0) {
      return null;
    }
    return [{ columnNumber, lineNumber, url, scriptId, functionName }];
  }
  return null;
}
function extractOriginFromTrace(firstNavigationURL) {
  const url = URL.parse(firstNavigationURL);
  if (url) {
    if (url.host.startsWith("www.")) {
      return url.host.slice(4);
    }
    return url.host;
  }
  return null;
}
function addEventToProcessThread(event, eventsInProcessThread2) {
  const { tid, pid } = event;
  let eventsInThread = eventsInProcessThread2.get(pid);
  if (!eventsInThread) {
    eventsInThread = /* @__PURE__ */ new Map();
  }
  let events = eventsInThread.get(tid);
  if (!events) {
    events = [];
  }
  events.push(event);
  eventsInThread.set(event.tid, events);
  eventsInProcessThread2.set(event.pid, eventsInThread);
}
function compareBeginAndEnd(aBeginTime, bBeginTime, aEndTime, bEndTime) {
  if (aBeginTime < bBeginTime) {
    return -1;
  }
  if (aBeginTime > bBeginTime) {
    return 1;
  }
  if (aEndTime > bEndTime) {
    return -1;
  }
  if (aEndTime < bEndTime) {
    return 1;
  }
  return 0;
}
function eventTimeComparator(a, b) {
  const aBeginTime = a.ts;
  const bBeginTime = b.ts;
  const aDuration = a.dur ?? 0;
  const bDuration = b.dur ?? 0;
  const aEndTime = aBeginTime + aDuration;
  const bEndTime = bBeginTime + bDuration;
  const timeDifference = compareBeginAndEnd(aBeginTime, bBeginTime, aEndTime, bEndTime);
  if (timeDifference) {
    return timeDifference;
  }
  if (TraceEvents_exports.isProfileCall(a) && !TraceEvents_exports.isProfileCall(b)) {
    return -1;
  }
  if (TraceEvents_exports.isProfileCall(b) && !TraceEvents_exports.isProfileCall(a)) {
    return 1;
  }
  return 0;
}
function sortTraceEventsInPlace(events) {
  events.sort(eventTimeComparator);
}
function mergeEventsInOrder(eventsArray1, eventsArray2) {
  const result = [];
  let i = 0;
  let j = 0;
  while (i < eventsArray1.length && j < eventsArray2.length) {
    const event1 = eventsArray1[i];
    const event2 = eventsArray2[j];
    const compareValue = eventTimeComparator(event1, event2);
    if (compareValue <= 0) {
      result.push(event1);
      i++;
    }
    if (compareValue === 1) {
      result.push(event2);
      j++;
    }
  }
  while (i < eventsArray1.length) {
    result.push(eventsArray1[i++]);
  }
  while (j < eventsArray2.length) {
    result.push(eventsArray2[j++]);
  }
  return result;
}
function parseDevtoolsDetails(timingDetail, key) {
  try {
    const detailObj = JSON.parse(timingDetail);
    if (!(key in detailObj)) {
      return null;
    }
    if (!Extensions_exports.isValidExtensionPayload(detailObj[key])) {
      return null;
    }
    return detailObj[key];
  } catch {
    return null;
  }
}
function getNavigationForTraceEvent(event, eventFrameId, navigationsByFrameId2) {
  const navigations = navigationsByFrameId2.get(eventFrameId);
  if (!navigations || eventFrameId === "") {
    return null;
  }
  const eventNavigationIndex = ArrayUtilities_exports.nearestIndexFromEnd(navigations, (navigation2) => navigation2.ts <= event.ts);
  if (eventNavigationIndex === null) {
    return null;
  }
  return navigations[eventNavigationIndex];
}
function extractId(event) {
  return event.id ?? event.id2?.global ?? event.id2?.local;
}
function activeURLForFrameAtTime(frameId, time, rendererProcessesByFrame) {
  const processData = rendererProcessesByFrame.get(frameId);
  if (!processData) {
    return null;
  }
  for (const processes2 of processData.values()) {
    for (const processInfo of processes2) {
      if (processInfo.window.min > time || processInfo.window.max < time) {
        continue;
      }
      return processInfo.frame.url;
    }
  }
  return null;
}
function makeProfileCall(node, profileId, sampleIndex, ts, pid, tid) {
  return {
    cat: "",
    name: "ProfileCall",
    nodeId: node.id,
    args: {},
    ph: TraceEvents_exports.Phase.COMPLETE,
    pid,
    tid,
    ts,
    dur: Timing_exports.Micro(0),
    callFrame: node.callFrame,
    sampleIndex,
    profileId
  };
}
function matchEvents(unpairedEvents) {
  sortTraceEventsInPlace(unpairedEvents);
  const matches = [];
  const beginEventsById = /* @__PURE__ */ new Map();
  const instantEventsById = /* @__PURE__ */ new Map();
  for (const event of unpairedEvents) {
    const id = getSyntheticId(event);
    if (id === void 0) {
      continue;
    }
    if (TraceEvents_exports.isPairableAsyncBegin(event)) {
      const existingEvents = beginEventsById.get(id) ?? [];
      existingEvents.push(event);
      beginEventsById.set(id, existingEvents);
    } else if (TraceEvents_exports.isPairableAsyncInstant(event)) {
      const existingEvents = instantEventsById.get(id) ?? [];
      existingEvents.push(event);
      instantEventsById.set(id, existingEvents);
    } else if (TraceEvents_exports.isPairableAsyncEnd(event)) {
      const beginEventsWithMatchingId = beginEventsById.get(id) ?? [];
      const beginEvent = beginEventsWithMatchingId.pop();
      if (!beginEvent) {
        continue;
      }
      const instantEventsWithMatchingId = instantEventsById.get(id) ?? [];
      const instantEventsForThisGroup = [];
      while (instantEventsWithMatchingId.length > 0) {
        if (instantEventsWithMatchingId[0].ts >= beginEvent.ts) {
          const event2 = instantEventsWithMatchingId.pop();
          if (event2) {
            instantEventsForThisGroup.push(event2);
          }
        } else {
          break;
        }
      }
      const matchingGroup = {
        begin: beginEvent,
        end: event,
        instant: instantEventsForThisGroup,
        syntheticId: id
      };
      matches.push(matchingGroup);
    }
  }
  for (const [id, beginEvents] of beginEventsById) {
    const beginEvent = beginEvents.pop();
    if (!beginEvent) {
      continue;
    }
    const matchingInstantEvents = instantEventsById.get(id);
    if (matchingInstantEvents?.length) {
      matches.push({
        syntheticId: id,
        begin: beginEvent,
        end: null,
        instant: matchingInstantEvents
      });
    }
  }
  return matches;
}
function getSyntheticId(event) {
  const id = extractId(event);
  return id && `${event.cat}:${id}:${event.name}`;
}
function createSortedSyntheticEvents(matchedPairs) {
  const syntheticEvents2 = [];
  for (const eventsTriplet of matchedPairs) {
    let eventsArePairable = function(data31) {
      const instantEventsMatch = data31.instantEvents ? data31.instantEvents.some((e) => id === getSyntheticId(e)) : false;
      const endEventMatch = data31.endEvent ? id === getSyntheticId(data31.endEvent) : false;
      return Boolean(id) && (instantEventsMatch || endEventMatch);
    };
    __name(eventsArePairable, "eventsArePairable");
    const id = eventsTriplet.syntheticId;
    const beginEvent = eventsTriplet.begin;
    const endEvent = eventsTriplet.end;
    const instantEvents = eventsTriplet.instant;
    if (!beginEvent || !(endEvent || instantEvents)) {
      continue;
    }
    const triplet = { beginEvent, endEvent, instantEvents };
    if (!eventsArePairable(triplet)) {
      continue;
    }
    const targetEvent = endEvent || beginEvent;
    const event = SyntheticEventsManager.registerSyntheticEvent({
      rawSourceEvent: triplet.beginEvent,
      cat: targetEvent.cat,
      ph: targetEvent.ph,
      pid: targetEvent.pid,
      tid: targetEvent.tid,
      id,
      // Both events have the same name, so it doesn't matter which we pick to
      // use as the description
      name: beginEvent.name,
      dur: Timing_exports.Micro(targetEvent.ts - beginEvent.ts),
      ts: beginEvent.ts,
      args: {
        data: triplet
      }
    });
    if (event.dur < 0) {
      continue;
    }
    syntheticEvents2.push(event);
  }
  sortTraceEventsInPlace(syntheticEvents2);
  return syntheticEvents2;
}
function createMatchedSortedSyntheticEvents(unpairedAsyncEvents2) {
  const matchedPairs = matchEvents(unpairedAsyncEvents2);
  const syntheticEvents2 = createSortedSyntheticEvents(matchedPairs);
  return syntheticEvents2;
}
function getZeroIndexedLineAndColumnForEvent(event) {
  const numbers = getRawLineAndColumnNumbersForEvent(event);
  const { lineNumber, columnNumber } = numbers;
  switch (event.name) {
    // All these events have line/column numbers which are 1 indexed; so we
    // subtract to make them 0 indexed.
    case TraceEvents_exports.Name.FUNCTION_CALL:
    case TraceEvents_exports.Name.EVALUATE_SCRIPT:
    case TraceEvents_exports.Name.COMPILE:
    case TraceEvents_exports.Name.CACHE_SCRIPT: {
      return {
        lineNumber: typeof lineNumber === "number" ? lineNumber - 1 : void 0,
        columnNumber: typeof columnNumber === "number" ? columnNumber - 1 : void 0
      };
    }
    case TraceEvents_exports.Name.PROFILE_CALL: {
      const callFrame = event.callFrame;
      return {
        lineNumber: typeof lineNumber === "number" ? callFrame.lineNumber - 1 : void 0,
        columnNumber: typeof columnNumber === "number" ? callFrame.columnNumber - 1 : void 0
      };
    }
    default: {
      return numbers;
    }
  }
}
function getZeroIndexedStackTraceInEventPayload(event) {
  const stack = stackTraceInEvent(event);
  if (!stack) {
    return null;
  }
  switch (event.name) {
    case TraceEvents_exports.Name.SCHEDULE_STYLE_RECALCULATION:
    case TraceEvents_exports.Name.INVALIDATE_LAYOUT:
    case TraceEvents_exports.Name.FUNCTION_CALL:
    case TraceEvents_exports.Name.LAYOUT:
    case TraceEvents_exports.Name.RECALC_STYLE: {
      return stack.map(makeZeroBasedCallFrame);
    }
    default: {
      if (TraceEvents_exports.isUserTiming(event) || Extensions_exports.isSyntheticExtensionEntry(event)) {
        return stack.map(makeZeroBasedCallFrame);
      }
      return stack;
    }
  }
}
function getStackTraceTopCallFrameInEventPayload(event) {
  const stack = stackTraceInEvent(event);
  if (!stack || stack.length === 0) {
    return null;
  }
  switch (event.name) {
    case TraceEvents_exports.Name.SCHEDULE_STYLE_RECALCULATION:
    case TraceEvents_exports.Name.INVALIDATE_LAYOUT:
    case TraceEvents_exports.Name.FUNCTION_CALL:
    case TraceEvents_exports.Name.LAYOUT:
    case TraceEvents_exports.Name.RECALC_STYLE: {
      return makeZeroBasedCallFrame(stack[0]);
    }
    default: {
      if (TraceEvents_exports.isUserTiming(event) || Extensions_exports.isSyntheticExtensionEntry(event)) {
        return makeZeroBasedCallFrame(stack[0]);
      }
      return stack[0];
    }
  }
}
function rawCallFrameForEntry(entry) {
  if (TraceEvents_exports.isProfileCall(entry)) {
    return entry.callFrame;
  }
  const topCallFrame = getStackTraceTopCallFrameInEventPayload(entry);
  if (topCallFrame) {
    return topCallFrame;
  }
  return null;
}
function makeZeroBasedCallFrame(callFrame) {
  const normalizedCallFrame = { ...callFrame };
  normalizedCallFrame.lineNumber = callFrame.lineNumber && callFrame.lineNumber - 1;
  normalizedCallFrame.columnNumber = callFrame.columnNumber && callFrame.columnNumber - 1;
  return normalizedCallFrame;
}
function getRawLineAndColumnNumbersForEvent(event) {
  if (!event.args?.data) {
    return {};
  }
  let lineNumber = void 0;
  let columnNumber = void 0;
  if ("lineNumber" in event.args.data && typeof event.args.data.lineNumber === "number") {
    lineNumber = event.args.data.lineNumber;
  }
  if ("columnNumber" in event.args.data && typeof event.args.data.columnNumber === "number") {
    columnNumber = event.args.data.columnNumber;
  }
  return { lineNumber, columnNumber };
}
function frameIDForEvent(event) {
  if (event.args && "beginData" in event.args && typeof event.args.beginData === "object" && event.args.beginData !== null && "frame" in event.args.beginData && typeof event.args.beginData.frame === "string") {
    return event.args.beginData.frame;
  }
  if (event.args?.data?.frame) {
    return event.args.data.frame;
  }
  return null;
}
function isTopLevelEvent(event) {
  return event.cat.includes(DevToolsTimelineEventCategory) && event.name === TraceEvents_exports.Name.RUN_TASK;
}
function isExtensionUrl(url) {
  return url.startsWith("extensions:") || url.startsWith("chrome-extension:");
}
function topLevelEventIndexEndingAfter(events, time) {
  let index = ArrayUtilities_exports.upperBound(events, time, (time2, event) => time2 - event.ts) - 1;
  while (index > 0 && !isTopLevelEvent(events[index])) {
    index--;
  }
  return Math.max(index, 0);
}
function findRecalcStyleEvents(events, startTime, endTime) {
  const foundEvents = [];
  const startEventIndex = topLevelEventIndexEndingAfter(events, startTime);
  for (let i = startEventIndex; i < events.length; i++) {
    const event = events[i];
    if (!TraceEvents_exports.isRecalcStyle(event)) {
      continue;
    }
    if (event.ts >= (endTime || Infinity)) {
      continue;
    }
    foundEvents.push(event);
  }
  return foundEvents;
}
function findNextEventAfterTimestamp(candidates, ts) {
  const index = ArrayUtilities_exports.nearestIndexFromBeginning(candidates, (candidate) => ts < candidate.ts);
  return index === null ? null : candidates[index];
}
function findPreviousEventBeforeTimestamp(candidates, ts) {
  const index = ArrayUtilities_exports.nearestIndexFromEnd(candidates, (candidate) => candidate.ts < ts);
  return index === null ? null : candidates[index];
}
function forEachEvent(events, config5) {
  const globalStartTime = config5.startTime ?? Timing_exports.Micro(0);
  const globalEndTime = config5.endTime || Timing_exports.Micro(Infinity);
  const ignoreAsyncEvents = config5.ignoreAsyncEvents === false ? false : true;
  const stack = [];
  const startEventIndex = topLevelEventIndexEndingAfter(events, globalStartTime);
  for (let i = startEventIndex; i < events.length; i++) {
    const currentEvent = events[i];
    const currentEventTimings = eventTimingsMicroSeconds(currentEvent);
    if (currentEventTimings.endTime < globalStartTime) {
      continue;
    }
    if (currentEventTimings.startTime > globalEndTime) {
      break;
    }
    const isIgnoredAsyncEvent = ignoreAsyncEvents && TraceEvents_exports.isPhaseAsync(currentEvent.ph);
    if (isIgnoredAsyncEvent || TraceEvents_exports.isFlowPhase(currentEvent.ph)) {
      continue;
    }
    let lastEventOnStack = stack.at(-1);
    let lastEventEndTime = lastEventOnStack ? eventTimingsMicroSeconds(lastEventOnStack).endTime : null;
    while (lastEventOnStack && lastEventEndTime && lastEventEndTime <= currentEventTimings.startTime) {
      stack.pop();
      config5.onEndEvent(lastEventOnStack);
      lastEventOnStack = stack.at(-1);
      lastEventEndTime = lastEventOnStack ? eventTimingsMicroSeconds(lastEventOnStack).endTime : null;
    }
    if (config5.eventFilter && !config5.eventFilter(currentEvent)) {
      continue;
    }
    if (currentEventTimings.duration) {
      config5.onStartEvent(currentEvent);
      stack.push(currentEvent);
    } else if (config5.onInstantEvent) {
      config5.onInstantEvent(currentEvent);
    }
  }
  while (stack.length) {
    const last = stack.pop();
    if (last) {
      config5.onEndEvent(last);
    }
  }
}
function eventHasCategory(event, category) {
  let parsedCategoriesForEvent = parsedCategories.get(event.cat);
  if (!parsedCategoriesForEvent) {
    parsedCategoriesForEvent = new Set(event.cat.split(",") || []);
  }
  return parsedCategoriesForEvent.has(category);
}
function isMatchingCallFrame(eventFrame, nodeFrame) {
  return eventFrame.columnNumber === nodeFrame.columnNumber && eventFrame.lineNumber === nodeFrame.lineNumber && String(eventFrame.scriptId) === nodeFrame.scriptId && eventFrame.url === nodeFrame.url && eventFrame.functionName === nodeFrame.functionName;
}
function eventContainsTimestamp(event, ts) {
  return event.ts <= ts && event.ts + (event.dur || 0) >= ts;
}
function extractSampleTraceId(event) {
  if (!event.args) {
    return null;
  }
  if ("beginData" in event.args) {
    const beginData = event.args["beginData"];
    return beginData.sampleTraceId ?? null;
  }
  return event.args?.sampleTraceId ?? event.args?.data?.sampleTraceId ?? null;
}
var DevToolsTimelineEventCategory, parsedCategories, VISIBLE_TRACE_EVENT_TYPES;
var init_Trace = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/Trace.js"() {
    init_process_global();
    init_platform();
    init_types2();
    init_SyntheticEvents();
    init_Timing3();
    __name(stackTraceInEvent, "stackTraceInEvent");
    __name(extractOriginFromTrace, "extractOriginFromTrace");
    __name(addEventToProcessThread, "addEventToProcessThread");
    __name(compareBeginAndEnd, "compareBeginAndEnd");
    __name(eventTimeComparator, "eventTimeComparator");
    __name(sortTraceEventsInPlace, "sortTraceEventsInPlace");
    __name(mergeEventsInOrder, "mergeEventsInOrder");
    __name(parseDevtoolsDetails, "parseDevtoolsDetails");
    __name(getNavigationForTraceEvent, "getNavigationForTraceEvent");
    __name(extractId, "extractId");
    __name(activeURLForFrameAtTime, "activeURLForFrameAtTime");
    __name(makeProfileCall, "makeProfileCall");
    __name(matchEvents, "matchEvents");
    __name(getSyntheticId, "getSyntheticId");
    __name(createSortedSyntheticEvents, "createSortedSyntheticEvents");
    __name(createMatchedSortedSyntheticEvents, "createMatchedSortedSyntheticEvents");
    __name(getZeroIndexedLineAndColumnForEvent, "getZeroIndexedLineAndColumnForEvent");
    __name(getZeroIndexedStackTraceInEventPayload, "getZeroIndexedStackTraceInEventPayload");
    __name(getStackTraceTopCallFrameInEventPayload, "getStackTraceTopCallFrameInEventPayload");
    __name(rawCallFrameForEntry, "rawCallFrameForEntry");
    __name(makeZeroBasedCallFrame, "makeZeroBasedCallFrame");
    __name(getRawLineAndColumnNumbersForEvent, "getRawLineAndColumnNumbersForEvent");
    __name(frameIDForEvent, "frameIDForEvent");
    DevToolsTimelineEventCategory = "disabled-by-default-devtools.timeline";
    __name(isTopLevelEvent, "isTopLevelEvent");
    __name(isExtensionUrl, "isExtensionUrl");
    __name(topLevelEventIndexEndingAfter, "topLevelEventIndexEndingAfter");
    __name(findRecalcStyleEvents, "findRecalcStyleEvents");
    __name(findNextEventAfterTimestamp, "findNextEventAfterTimestamp");
    __name(findPreviousEventBeforeTimestamp, "findPreviousEventBeforeTimestamp");
    __name(forEachEvent, "forEachEvent");
    parsedCategories = /* @__PURE__ */ new Map();
    __name(eventHasCategory, "eventHasCategory");
    __name(isMatchingCallFrame, "isMatchingCallFrame");
    __name(eventContainsTimestamp, "eventContainsTimestamp");
    __name(extractSampleTraceId, "extractSampleTraceId");
    VISIBLE_TRACE_EVENT_TYPES = /* @__PURE__ */ new Set([
      TraceEvents_exports.Name.ABORT_POST_TASK_CALLBACK,
      TraceEvents_exports.Name.ANIMATION,
      TraceEvents_exports.Name.ASYNC_TASK,
      TraceEvents_exports.Name.BACKGROUND_DESERIALIZE,
      TraceEvents_exports.Name.CACHE_MODULE,
      TraceEvents_exports.Name.CACHE_SCRIPT,
      TraceEvents_exports.Name.CANCEL_ANIMATION_FRAME,
      TraceEvents_exports.Name.CANCEL_IDLE_CALLBACK,
      TraceEvents_exports.Name.COMMIT,
      TraceEvents_exports.Name.COMPILE_CODE,
      TraceEvents_exports.Name.COMPILE_MODULE,
      TraceEvents_exports.Name.COMPILE,
      TraceEvents_exports.Name.COMPOSITE_LAYERS,
      TraceEvents_exports.Name.COMPUTE_INTERSECTION,
      TraceEvents_exports.Name.CONSOLE_TIME,
      TraceEvents_exports.Name.CPPGC_SWEEP,
      TraceEvents_exports.Name.CRYPTO_DO_DECRYPT_REPLY,
      TraceEvents_exports.Name.CRYPTO_DO_DECRYPT,
      TraceEvents_exports.Name.CRYPTO_DO_DIGEST_REPLY,
      TraceEvents_exports.Name.CRYPTO_DO_DIGEST,
      TraceEvents_exports.Name.CRYPTO_DO_ENCRYPT_REPLY,
      TraceEvents_exports.Name.CRYPTO_DO_ENCRYPT,
      TraceEvents_exports.Name.CRYPTO_DO_SIGN_REPLY,
      TraceEvents_exports.Name.CRYPTO_DO_SIGN,
      TraceEvents_exports.Name.CRYPTO_DO_VERIFY_REPLY,
      TraceEvents_exports.Name.CRYPTO_DO_VERIFY,
      TraceEvents_exports.Name.DECODE_IMAGE,
      TraceEvents_exports.Name.EMBEDDER_CALLBACK,
      TraceEvents_exports.Name.EVALUATE_MODULE,
      TraceEvents_exports.Name.EVALUATE_SCRIPT,
      TraceEvents_exports.Name.EVENT_DISPATCH,
      TraceEvents_exports.Name.EVENT_TIMING,
      TraceEvents_exports.Name.FINALIZE_DESERIALIZATION,
      TraceEvents_exports.Name.FIRE_ANIMATION_FRAME,
      TraceEvents_exports.Name.FIRE_IDLE_CALLBACK,
      TraceEvents_exports.Name.FUNCTION_CALL,
      TraceEvents_exports.Name.GC_COLLECT_GARBARGE,
      TraceEvents_exports.Name.GC,
      TraceEvents_exports.Name.GPU_TASK,
      TraceEvents_exports.Name.HANDLE_POST_MESSAGE,
      TraceEvents_exports.Name.HIT_TEST,
      TraceEvents_exports.Name.JS_SAMPLE,
      TraceEvents_exports.Name.LAYERIZE,
      TraceEvents_exports.Name.LAYOUT,
      TraceEvents_exports.Name.MAJOR_GC,
      TraceEvents_exports.Name.MINOR_GC,
      TraceEvents_exports.Name.OPTIMIZE_CODE,
      TraceEvents_exports.Name.PAINT_SETUP,
      TraceEvents_exports.Name.PAINT,
      TraceEvents_exports.Name.PARSE_AUTHOR_STYLE_SHEET,
      TraceEvents_exports.Name.PARSE_HTML,
      TraceEvents_exports.Name.PRE_PAINT,
      TraceEvents_exports.Name.PROFILE_CALL,
      TraceEvents_exports.Name.PROGRAM,
      TraceEvents_exports.Name.RASTER_TASK,
      TraceEvents_exports.Name.REQUEST_ANIMATION_FRAME,
      TraceEvents_exports.Name.REQUEST_IDLE_CALLBACK,
      TraceEvents_exports.Name.RESOURCE_FINISH,
      TraceEvents_exports.Name.RESOURCE_RECEIVE_DATA,
      TraceEvents_exports.Name.RESOURCE_RECEIVE_RESPONSE,
      TraceEvents_exports.Name.RESOURCE_SEND_REQUEST,
      TraceEvents_exports.Name.RESOURCE_WILL_SEND_REQUEST,
      TraceEvents_exports.Name.RUN_MICROTASKS,
      TraceEvents_exports.Name.RUN_POST_TASK_CALLBACK,
      TraceEvents_exports.Name.RUN_TASK,
      TraceEvents_exports.Name.SCHEDULE_POST_MESSAGE,
      TraceEvents_exports.Name.SCHEDULE_POST_TASK_CALLBACK,
      TraceEvents_exports.Name.SCHEDULE_STYLE_RECALCULATION,
      TraceEvents_exports.Name.SCROLL_LAYER,
      TraceEvents_exports.Name.START_PROFILING,
      TraceEvents_exports.Name.STREAMING_COMPILE_SCRIPT_PARSING,
      TraceEvents_exports.Name.STREAMING_COMPILE_SCRIPT_WAITING,
      TraceEvents_exports.Name.STREAMING_COMPILE_SCRIPT,
      TraceEvents_exports.Name.SYNTHETIC_LAYOUT_SHIFT_CLUSTER,
      TraceEvents_exports.Name.SYNTHETIC_LAYOUT_SHIFT,
      TraceEvents_exports.Name.TIME_STAMP,
      TraceEvents_exports.Name.TIMER_FIRE,
      TraceEvents_exports.Name.TIMER_INSTALL,
      TraceEvents_exports.Name.TIMER_REMOVE,
      TraceEvents_exports.Name.UPDATE_LAYER_TREE,
      TraceEvents_exports.Name.RECALC_STYLE,
      TraceEvents_exports.Name.USER_TIMING,
      TraceEvents_exports.Name.V8_CONSOLE_RUN_TASK,
      TraceEvents_exports.Name.WASM_CACHED_MODULE,
      TraceEvents_exports.Name.WASM_COMPILED_MODULE,
      TraceEvents_exports.Name.WASM_MODULE_CACHE_HIT,
      TraceEvents_exports.Name.WASM_MODULE_CACHE_INVALID,
      TraceEvents_exports.Name.WASM_STREAM_FROM_RESPONSE_CALLBACK,
      TraceEvents_exports.Name.WEB_SOCKET_CREATE,
      TraceEvents_exports.Name.WEB_SOCKET_DESTROY,
      TraceEvents_exports.Name.WEB_SOCKET_RECEIVE_HANDSHAKE_REQUEST,
      TraceEvents_exports.Name.WEB_SOCKET_RECEIVE,
      TraceEvents_exports.Name.WEB_SOCKET_SEND_HANDSHAKE_REQUEST,
      TraceEvents_exports.Name.WEB_SOCKET_SEND,
      TraceEvents_exports.Name.XHR_LOAD,
      TraceEvents_exports.Name.XHR_READY_STATE_CHANGED
    ]);
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/TreeHelpers.js
var TreeHelpers_exports = {};
__export(TreeHelpers_exports, {
  canBuildTreesFromEvents: () => canBuildTreesFromEvents,
  makeEmptyTraceEntryNode: () => makeEmptyTraceEntryNode,
  makeEmptyTraceEntryTree: () => makeEmptyTraceEntryTree,
  makeTraceEntryNodeId: () => makeTraceEntryNodeId,
  treify: () => treify,
  walkEntireTree: () => walkEntireTree,
  walkTreeFromEntry: () => walkTreeFromEntry
});
function treify(entries, options) {
  const entryToNode4 = /* @__PURE__ */ new Map();
  const stack = [];
  nodeIdCount = -1;
  const tree = makeEmptyTraceEntryTree();
  for (let i = 0; i < entries.length; i++) {
    const event = entries[i];
    if (options && !options.filter.has(event.name)) {
      continue;
    }
    const duration = event.dur || 0;
    const nodeId = makeTraceEntryNodeId();
    const node = makeEmptyTraceEntryNode(event, nodeId);
    if (stack.length === 0) {
      tree.roots.add(node);
      node.selfTime = Timing_exports.Micro(duration);
      stack.push(node);
      tree.maxDepth = Math.max(tree.maxDepth, stack.length);
      entryToNode4.set(event, node);
      continue;
    }
    const parentNode = stack.at(-1);
    if (parentNode === void 0) {
      throw new Error("Impossible: no parent node found in the stack");
    }
    const parentEvent = parentNode.entry;
    const begin = event.ts;
    const parentBegin = parentEvent.ts;
    const parentDuration = parentEvent.dur || 0;
    const end = begin + duration;
    const parentEnd = parentBegin + parentDuration;
    const startsBeforeParent = begin < parentBegin;
    if (startsBeforeParent) {
      throw new Error("Impossible: current event starts before the parent event");
    }
    const startsAfterParent = begin >= parentEnd;
    if (startsAfterParent) {
      stack.pop();
      i--;
      nodeIdCount--;
      continue;
    }
    const endsAfterParent = end > parentEnd;
    if (endsAfterParent) {
      continue;
    }
    node.depth = stack.length;
    node.parent = parentNode;
    parentNode.children.push(node);
    node.selfTime = Timing_exports.Micro(duration);
    if (parentNode.selfTime !== void 0) {
      parentNode.selfTime = Timing_exports.Micro(parentNode.selfTime - (event.dur || 0));
    }
    stack.push(node);
    tree.maxDepth = Math.max(tree.maxDepth, stack.length);
    entryToNode4.set(event, node);
  }
  return { tree, entryToNode: entryToNode4 };
}
function walkTreeFromEntry(entryToNode4, rootEntry, onEntryStart, onEntryEnd) {
  const startNode = entryToNode4.get(rootEntry);
  if (!startNode) {
    return;
  }
  walkTreeByNode(entryToNode4, startNode, onEntryStart, onEntryEnd);
}
function walkEntireTree(entryToNode4, tree, onEntryStart, onEntryEnd, traceWindowToInclude, minDuration) {
  for (const rootNode of tree.roots) {
    walkTreeByNode(entryToNode4, rootNode, onEntryStart, onEntryEnd, traceWindowToInclude, minDuration);
  }
}
function walkTreeByNode(entryToNode4, rootNode, onEntryStart, onEntryEnd, traceWindowToInclude, minDuration) {
  if (traceWindowToInclude && !treeNodeIsInWindow(rootNode, traceWindowToInclude)) {
    return;
  }
  if (typeof minDuration !== "undefined") {
    const duration = Timing_exports.Micro(rootNode.entry.ts + Timing_exports.Micro(rootNode.entry.dur ?? 0));
    if (duration < minDuration) {
      return;
    }
  }
  onEntryStart(rootNode.entry);
  for (const child of rootNode.children) {
    walkTreeByNode(entryToNode4, child, onEntryStart, onEntryEnd, traceWindowToInclude, minDuration);
  }
  onEntryEnd(rootNode.entry);
}
function treeNodeIsInWindow(node, traceWindow) {
  return eventIsInBounds(node.entry, traceWindow);
}
function canBuildTreesFromEvents(events) {
  const stack = [];
  for (const event of events) {
    const startTime = event.ts;
    const endTime = event.ts + (event.dur ?? 0);
    let parent = stack.at(-1);
    if (parent === void 0) {
      stack.push(event);
      continue;
    }
    let parentEndTime = parent.ts + (parent.dur ?? 0);
    while (stack.length && startTime >= parentEndTime) {
      stack.pop();
      parent = stack.at(-1);
      if (parent === void 0) {
        break;
      }
      parentEndTime = parent.ts + (parent.dur ?? 0);
    }
    if (stack.length && endTime > parentEndTime) {
      return false;
    }
    stack.push(event);
  }
  return true;
}
var nodeIdCount, makeTraceEntryNodeId, makeEmptyTraceEntryTree, makeEmptyTraceEntryNode;
var init_TreeHelpers = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/TreeHelpers.js"() {
    init_process_global();
    init_types2();
    init_Timing3();
    nodeIdCount = 0;
    makeTraceEntryNodeId = /* @__PURE__ */ __name(() => ++nodeIdCount, "makeTraceEntryNodeId");
    makeEmptyTraceEntryTree = /* @__PURE__ */ __name(() => ({
      roots: /* @__PURE__ */ new Set(),
      maxDepth: 0
    }), "makeEmptyTraceEntryTree");
    makeEmptyTraceEntryNode = /* @__PURE__ */ __name((entry, id) => ({
      entry,
      id,
      parent: null,
      children: [],
      depth: 0
    }), "makeEmptyTraceEntryNode");
    __name(treify, "treify");
    __name(walkTreeFromEntry, "walkTreeFromEntry");
    __name(walkEntireTree, "walkEntireTree");
    __name(walkTreeByNode, "walkTreeByNode");
    __name(treeNodeIsInWindow, "treeNodeIsInWindow");
    __name(canBuildTreesFromEvents, "canBuildTreesFromEvents");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/Extensions.js
var Extensions_exports2 = {};
__export(Extensions_exports2, {
  buildTrackDataFromExtensionEntries: () => buildTrackDataFromExtensionEntries
});
function buildTrackDataFromExtensionEntries(extensionEntries, extensionTrackData2, entryToNode4) {
  const dataByTrack = /* @__PURE__ */ new Map();
  for (const entry of extensionEntries) {
    const key = entry.devtoolsObj.trackGroup || `track-name-${entry.devtoolsObj.track}`;
    const batchedData = MapUtilities_exports.getWithDefault(dataByTrack, key, () => ({
      name: entry.devtoolsObj.trackGroup || entry.devtoolsObj.track,
      isTrackGroup: Boolean(entry.devtoolsObj.trackGroup),
      entriesByTrack: { [entry.devtoolsObj.track]: [] }
    }));
    if (!batchedData.entriesByTrack[entry.devtoolsObj.track]) {
      batchedData.entriesByTrack[entry.devtoolsObj.track] = [];
    }
    const entriesInTrack = batchedData.entriesByTrack[entry.devtoolsObj.track];
    entriesInTrack.push(entry);
  }
  for (const trackData of dataByTrack.values()) {
    for (const entries of Object.values(trackData.entriesByTrack)) {
      sortTraceEventsInPlace(entries);
      if (canBuildTreesFromEvents(entries)) {
        for (const [entry, node] of treify(entries).entryToNode) {
          entryToNode4.set(entry, node);
        }
      }
    }
    extensionTrackData2.push(trackData);
  }
  return { extensionTrackData: extensionTrackData2, entryToNode: entryToNode4 };
}
var init_Extensions2 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/Extensions.js"() {
    init_process_global();
    init_platform();
    init_Trace();
    init_TreeHelpers();
    __name(buildTrackDataFromExtensionEntries, "buildTrackDataFromExtensionEntries");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/Network.js
var Network_exports = {};
__export(Network_exports, {
  CACHEABLE_STATUS_CODES: () => CACHEABLE_STATUS_CODES,
  NON_NETWORK_SCHEMES: () => NON_NETWORK_SCHEMES2,
  STATIC_RESOURCE_TYPES: () => STATIC_RESOURCE_TYPES,
  isSyntheticNetworkRequestEventRenderBlocking: () => isSyntheticNetworkRequestEventRenderBlocking,
  isSyntheticNetworkRequestHighPriority: () => isSyntheticNetworkRequestHighPriority,
  isSyntheticNetworkRequestLocalhost: () => isSyntheticNetworkRequestLocalhost,
  parseCacheControl: () => parseCacheControl
});
function isSyntheticNetworkRequestEventRenderBlocking(event) {
  return !NON_RENDER_BLOCKING_VALUES.has(event.args.data.renderBlocking);
}
function isSyntheticNetworkRequestHighPriority(event) {
  return HIGH_NETWORK_PRIORITIES.has(event.args.data.priority);
}
function parseCacheControl(header) {
  if (!header) {
    return null;
  }
  const directives = header.split(",").map((directive) => directive.trim());
  const cacheControlOptions = {};
  for (const directive of directives) {
    const [key, value] = directive.split("=").map((part) => part.trim());
    switch (key) {
      case "max-age": {
        const maxAge = parseInt(value, 10);
        if (!isNaN(maxAge)) {
          cacheControlOptions["max-age"] = maxAge;
        }
        break;
      }
      case "no-cache":
        cacheControlOptions["no-cache"] = true;
        break;
      case "no-store":
        cacheControlOptions["no-store"] = true;
        break;
      case "must-revalidate":
        cacheControlOptions["must-revalidate"] = true;
        break;
      case "private":
        cacheControlOptions["private"] = true;
        break;
      default:
        break;
    }
  }
  return cacheControlOptions;
}
function isSyntheticNetworkRequestLocalhost(event) {
  try {
    const hostname = new URL(event.args.data.url).hostname;
    return SECURE_LOCALHOST_DOMAINS.includes(hostname) || hostname.endsWith(".localhost");
  } catch {
    return false;
  }
}
var NON_RENDER_BLOCKING_VALUES, HIGH_NETWORK_PRIORITIES, CACHEABLE_STATUS_CODES, STATIC_RESOURCE_TYPES, NON_NETWORK_SCHEMES2, SECURE_LOCALHOST_DOMAINS;
var init_Network = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/Network.js"() {
    init_process_global();
    NON_RENDER_BLOCKING_VALUES = /* @__PURE__ */ new Set([
      "non_blocking",
      "dynamically_injected_non_blocking",
      "potentially_blocking"
    ]);
    __name(isSyntheticNetworkRequestEventRenderBlocking, "isSyntheticNetworkRequestEventRenderBlocking");
    HIGH_NETWORK_PRIORITIES = /* @__PURE__ */ new Set([
      "VeryHigh",
      "High",
      "Medium"
    ]);
    __name(isSyntheticNetworkRequestHighPriority, "isSyntheticNetworkRequestHighPriority");
    CACHEABLE_STATUS_CODES = /* @__PURE__ */ new Set([200, 203, 206]);
    STATIC_RESOURCE_TYPES = /* @__PURE__ */ new Set([
      "Font",
      "Image",
      "Media",
      "Script",
      "Stylesheet"
    ]);
    NON_NETWORK_SCHEMES2 = [
      "blob",
      // @see https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
      "data",
      // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
      "intent",
      // @see https://developer.chrome.com/docs/multidevice/android/intents/
      "file",
      // @see https://en.wikipedia.org/wiki/File_URI_scheme
      "filesystem",
      // @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystem
      "chrome-extension"
    ];
    __name(parseCacheControl, "parseCacheControl");
    SECURE_LOCALHOST_DOMAINS = ["localhost", "127.0.0.1"];
    __name(isSyntheticNetworkRequestLocalhost, "isSyntheticNetworkRequestLocalhost");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/SamplesIntegrator.js
var SamplesIntegrator_exports = {};
__export(SamplesIntegrator_exports, {
  SamplesIntegrator: () => SamplesIntegrator
});
var _a, SamplesIntegrator;
var init_SamplesIntegrator = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/SamplesIntegrator.js"() {
    init_process_global();
    init_types2();
    init_Timing3();
    init_Trace();
    SamplesIntegrator = class {
      static {
        __name(this, "SamplesIntegrator");
      }
      /**
       * The result of running the samples integrator. Holds the JS calls
       * with their approximated duration after integrating samples into the
       * trace event tree.
       */
      #constructedProfileCalls = [];
      /**
       * tracks the state of the JS stack at each point in time to update
       * the profile call durations as new events arrive. This doesn't only
       * happen with new profile calls (in which case we would compare the
       * stack in them) but also with trace events (in which case we would
       * update the duration of the events we are tracking at the moment).
       */
      #currentJSStack = [];
      /**
       * Process holding the CPU profile and trace events.
       */
      #processId;
      /**
       * Thread holding the CPU profile and trace events.
       */
      #threadId;
      /**
       * Tracks the depth of the JS stack at the moment a trace event starts
       * or ends. It is assumed that for the duration of a trace event, the
       * JS stack's depth cannot decrease, since JS calls that started
       * before a trace event cannot end during the trace event. So as trace
       * events arrive, we store the "locked" amount of JS frames that were
       * in the stack before the event came.
       */
      #lockedJsStackDepth = [];
      /**
       * Used to keep track when samples should be integrated even if they
       * are not children of invocation trace events. This is useful in
       * cases where we can be missing the start of JS invocation events if
       * we start tracing half-way through.
       */
      #fakeJSInvocation = false;
      /**
       * The parsed CPU profile, holding the tree hierarchy of JS frames and
       * the sample data.
       */
      #profileModel;
      /**
       * Because GC nodes don't have a stack, we artificially add a stack to
       * them which corresponds to that of the previous sample. This map
       * tracks which node is used for the stack of a GC call.
       * Note that GC samples are not shown in the flamechart, however they
       * are used during the construction of for profile calls, as we can
       * infer information about the duration of the executed code when a
       * GC node is sampled.
       */
      #nodeForGC = /* @__PURE__ */ new Map();
      #engineConfig;
      #profileId;
      /**
       * Keeps track of the individual samples from the CPU Profile.
       * Only used with Debug Mode experiment enabled.
       */
      jsSampleEvents = [];
      constructor(profileModel, profileId, pid, tid, configuration) {
        this.#profileModel = profileModel;
        this.#threadId = tid;
        this.#processId = pid;
        this.#engineConfig = configuration || Configuration_exports.defaults();
        this.#profileId = profileId;
      }
      buildProfileCalls(traceEvents) {
        const mergedEvents = mergeEventsInOrder(traceEvents, this.callsFromProfileSamples());
        const stack = [];
        for (let i = 0; i < mergedEvents.length; i++) {
          const event = mergedEvents[i];
          if (event.ph === TraceEvents_exports.Phase.INSTANT && !extractSampleTraceId(event)) {
            continue;
          }
          if (stack.length === 0) {
            if (TraceEvents_exports.isProfileCall(event)) {
              this.#onProfileCall(event);
              continue;
            }
            stack.push(event);
            this.#onTraceEventStart(event);
            continue;
          }
          const parentEvent = stack.at(-1);
          if (parentEvent === void 0) {
            continue;
          }
          const begin = event.ts;
          const parentBegin = parentEvent.ts;
          const parentDuration = parentEvent.dur || 0;
          const parentEnd = parentBegin + parentDuration;
          const startsAfterParent = begin >= parentEnd;
          if (startsAfterParent) {
            this.#onTraceEventEnd(parentEvent);
            stack.pop();
            i--;
            continue;
          }
          if (TraceEvents_exports.isProfileCall(event)) {
            this.#onProfileCall(event, parentEvent);
            continue;
          }
          this.#onTraceEventStart(event);
          stack.push(event);
        }
        while (stack.length) {
          const last = stack.pop();
          if (last) {
            this.#onTraceEventEnd(last);
          }
        }
        sortTraceEventsInPlace(this.jsSampleEvents);
        return this.#constructedProfileCalls;
      }
      #onTraceEventStart(event) {
        if (event.name === TraceEvents_exports.Name.RUN_MICROTASKS || event.name === TraceEvents_exports.Name.RUN_TASK) {
          this.#lockedJsStackDepth = [];
          this.#truncateJSStack(0, event.ts);
          this.#fakeJSInvocation = false;
        }
        if (this.#fakeJSInvocation) {
          this.#truncateJSStack(this.#lockedJsStackDepth.pop() || 0, event.ts);
          this.#fakeJSInvocation = false;
        }
        this.#extractStackTrace(event);
        this.#lockedJsStackDepth.push(this.#currentJSStack.length);
      }
      #onProfileCall(event, parent) {
        if (parent && TraceEvents_exports.isJSInvocationEvent(parent) || this.#fakeJSInvocation) {
          this.#extractStackTrace(event);
        } else if (TraceEvents_exports.isProfileCall(event) && this.#currentJSStack.length === 0) {
          this.#fakeJSInvocation = true;
          const stackDepthBefore = this.#currentJSStack.length;
          this.#extractStackTrace(event);
          this.#lockedJsStackDepth.push(stackDepthBefore);
        }
      }
      #onTraceEventEnd(event) {
        const endTime = Timing_exports.Micro(event.ts + (event.dur ?? 0));
        this.#truncateJSStack(this.#lockedJsStackDepth.pop() || 0, endTime);
      }
      /**
       * Builds the initial calls with no duration from samples. Their
       * purpose is to be merged with the trace event array being parsed so
       * that they can be traversed in order with them and their duration
       * can be updated as the SampleIntegrator callbacks are invoked.
       */
      callsFromProfileSamples() {
        const samples = this.#profileModel.samples;
        const timestamps = this.#profileModel.timestamps;
        if (!samples) {
          return [];
        }
        const calls = [];
        let prevNode;
        for (let i = 0; i < samples.length; i++) {
          const node = this.#profileModel.nodeByIndex(i);
          const timestamp = milliToMicro(Timing_exports.Milli(timestamps[i]));
          if (!node) {
            continue;
          }
          const call = makeProfileCall(node, this.#profileId, i, timestamp, this.#processId, this.#threadId);
          calls.push(call);
          if (this.#engineConfig.debugMode) {
            const traceId = this.#profileModel.traceIds?.[i];
            this.jsSampleEvents.push(this.#makeJSSampleEvent(call, timestamp, traceId));
          }
          if (node.id === this.#profileModel.gcNode?.id && prevNode) {
            this.#nodeForGC.set(call, prevNode);
            continue;
          }
          prevNode = node;
        }
        return calls;
      }
      /**
       * Given a synthetic profile call, returns an array of profile calls
       * representing the stack trace that profile call belongs to based on
       * its nodeId. The input profile call will be at the top of the
       * returned stack (last position), meaning that any other frames that
       * were effectively above it are omitted.
       * @param profileCall
       * @param overrideTimeStamp a custom timestamp to use for the returned
       * profile calls. If not defined, the timestamp of the input
       * profileCall is used instead. This param is useful for example when
       * creating the profile calls for a sample with a trace id, since the
       * timestamp of the corresponding trace event should be used instead
       * of the sample's.
       */
      #makeProfileCallsForStack(profileCall, overrideTimeStamp) {
        let node = this.#profileModel.nodeById(profileCall.nodeId);
        const isGarbageCollection = node?.id === this.#profileModel.gcNode?.id;
        if (isGarbageCollection) {
          node = this.#nodeForGC.get(profileCall) || null;
        }
        if (!node) {
          return [];
        }
        const callFrames = new Array(node.depth + 1 + Number(isGarbageCollection));
        let i = callFrames.length - 1;
        if (isGarbageCollection) {
          callFrames[i--] = profileCall;
        }
        while (node) {
          callFrames[i--] = makeProfileCall(node, profileCall.profileId, profileCall.sampleIndex, overrideTimeStamp ?? profileCall.ts, this.#processId, this.#threadId);
          node = node.parent;
        }
        return callFrames;
      }
      #getStackForSampleTraceId(traceId, timestamp) {
        const nodeId = this.#profileModel.traceIds?.[traceId];
        const node = nodeId && this.#profileModel.nodeById(nodeId);
        const maybeCallForTraceId = node && makeProfileCall(node, this.#profileId, -1, timestamp, this.#processId, this.#threadId);
        if (!maybeCallForTraceId) {
          return null;
        }
        if (this.#engineConfig.debugMode) {
          this.jsSampleEvents.push(this.#makeJSSampleEvent(maybeCallForTraceId, timestamp, traceId));
        }
        return this.#makeProfileCallsForStack(maybeCallForTraceId);
      }
      /**
       * Update tracked stack using this event's call stack.
       */
      #extractStackTrace(event) {
        let stackTrace = this.#currentJSStack;
        if (TraceEvents_exports.isProfileCall(event)) {
          stackTrace = this.#makeProfileCallsForStack(event);
        }
        const traceId = extractSampleTraceId(event);
        const maybeCallForTraceId = traceId && this.#getStackForSampleTraceId(traceId, event.ts);
        if (maybeCallForTraceId) {
          stackTrace = maybeCallForTraceId;
        }
        _a.filterStackFrames(stackTrace, this.#engineConfig);
        const endTime = event.ts + (event.dur || 0);
        const minFrames = Math.min(stackTrace.length, this.#currentJSStack.length);
        let i;
        for (i = this.#lockedJsStackDepth.at(-1) || 0; i < minFrames; ++i) {
          const newFrame = stackTrace[i].callFrame;
          const oldFrame = this.#currentJSStack[i].callFrame;
          if (!_a.framesAreEqual(newFrame, oldFrame)) {
            break;
          }
          this.#currentJSStack[i].dur = Timing_exports.Micro(Math.max(this.#currentJSStack[i].dur || 0, endTime - this.#currentJSStack[i].ts));
        }
        this.#truncateJSStack(i, event.ts);
        for (; i < stackTrace.length; ++i) {
          const call = stackTrace[i];
          if (call.nodeId === this.#profileModel.programNode?.id || call.nodeId === this.#profileModel.root?.id || call.nodeId === this.#profileModel.idleNode?.id || call.nodeId === this.#profileModel.gcNode?.id) {
            continue;
          }
          this.#currentJSStack.push(call);
          this.#constructedProfileCalls.push(call);
        }
      }
      /**
       * When a call stack that differs from the one we are tracking has
       * been detected in the samples, the latter is "truncated" by
       * setting the ending time of its call frames and removing the top
       * call frames that aren't shared with the new call stack. This way,
       * we can update the tracked stack with the new call frames on top.
       * @param depth the amount of call frames from bottom to top that
       * should be kept in the tracking stack trace. AKA amount of shared
       * call frames between two stacks.
       * @param time the new end of the call frames in the stack.
       */
      #truncateJSStack(depth, time) {
        if (this.#lockedJsStackDepth.length) {
          const lockedDepth = this.#lockedJsStackDepth.at(-1);
          if (lockedDepth && depth < lockedDepth) {
            console.error(`Child stack is shallower (${depth}) than the parent stack (${lockedDepth}) at ${time}`);
            depth = lockedDepth;
          }
        }
        if (this.#currentJSStack.length < depth) {
          console.error(`Trying to truncate higher than the current stack size at ${time}`);
          depth = this.#currentJSStack.length;
        }
        for (let k = 0; k < this.#currentJSStack.length; ++k) {
          this.#currentJSStack[k].dur = Timing_exports.Micro(Math.max(time - this.#currentJSStack[k].ts, 0));
        }
        this.#currentJSStack.length = depth;
      }
      #makeJSSampleEvent(call, timestamp, traceId) {
        const JSSampleEvent = {
          name: TraceEvents_exports.Name.JS_SAMPLE,
          cat: "devtools.timeline",
          args: {
            data: { traceId, stackTrace: this.#makeProfileCallsForStack(call).map((e) => e.callFrame) }
          },
          ph: TraceEvents_exports.Phase.INSTANT,
          ts: timestamp,
          dur: Timing_exports.Micro(0),
          pid: this.#processId,
          tid: this.#threadId
        };
        return JSSampleEvent;
      }
      static framesAreEqual(frame1, frame2) {
        return frame1.scriptId === frame2.scriptId && frame1.functionName === frame2.functionName && frame1.lineNumber === frame2.lineNumber;
      }
      static showNativeName(name, runtimeCallStatsEnabled) {
        return runtimeCallStatsEnabled && Boolean(_a.nativeGroup(name));
      }
      static nativeGroup(nativeName) {
        if (nativeName.startsWith("Parse")) {
          return _a.NativeGroups.PARSE;
        }
        if (nativeName.startsWith("Compile") || nativeName.startsWith("Recompile")) {
          return _a.NativeGroups.COMPILE;
        }
        return null;
      }
      static isNativeRuntimeFrame(frame) {
        return frame.url === "native V8Runtime";
      }
      static filterStackFrames(stack, engineConfig) {
        const showAllEvents = engineConfig.showAllEvents;
        if (showAllEvents) {
          return;
        }
        let j = 0;
        for (let i = 0; i < stack.length; ++i) {
          const frame = stack[i].callFrame;
          const nativeRuntimeFrame = _a.isNativeRuntimeFrame(frame);
          if (nativeRuntimeFrame) {
            continue;
          }
          stack[j++] = stack[i];
        }
        stack.length = j;
      }
      static createFakeTraceFromCpuProfile(profile, tid) {
        if (!profile) {
          return { traceEvents: [], metadata: {} };
        }
        const cpuProfileEvent = {
          cat: "disabled-by-default-devtools.timeline",
          name: TraceEvents_exports.Name.CPU_PROFILE,
          ph: TraceEvents_exports.Phase.COMPLETE,
          pid: TraceEvents_exports.ProcessID(1),
          tid,
          ts: Timing_exports.Micro(profile.startTime),
          dur: Timing_exports.Micro(profile.endTime - profile.startTime),
          args: { data: { cpuProfile: profile } },
          // Create an arbitrary profile id.
          id: "0x1"
        };
        return {
          traceEvents: [cpuProfileEvent],
          metadata: {
            dataOrigin: File_exports.DataOrigin.CPU_PROFILE
          }
        };
      }
      static extractCpuProfileFromFakeTrace(traceEvents) {
        const profileEvent = traceEvents.find((e) => TraceEvents_exports.isSyntheticCpuProfile(e));
        const profile = profileEvent?.args.data.cpuProfile;
        if (!profile) {
          throw new Error("Missing cpuProfile data");
        }
        return profile;
      }
    };
    _a = SamplesIntegrator;
    (function(SamplesIntegrator2) {
      let NativeGroups;
      (function(NativeGroups2) {
        NativeGroups2["COMPILE"] = "Compile";
        NativeGroups2["PARSE"] = "Parse";
      })(NativeGroups = SamplesIntegrator2.NativeGroups || (SamplesIntegrator2.NativeGroups = {}));
    })(SamplesIntegrator || (SamplesIntegrator = {}));
  }
});

// node_modules/@paulirish/trace_engine/models/trace/helpers/helpers.js
var init_helpers2 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/helpers/helpers.js"() {
    init_process_global();
    init_Extensions2();
    init_Network();
    init_SamplesIntegrator();
    init_SyntheticEvents();
    init_Timing3();
    init_Trace();
    init_TreeHelpers();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/AnimationFramesHandler.js
var AnimationFramesHandler_exports = {};
__export(AnimationFramesHandler_exports, {
  data: () => data,
  deps: () => deps,
  finalize: () => finalize,
  handleEvent: () => handleEvent,
  handleUserConfig: () => handleUserConfig,
  reset: () => reset
});
function threadKey(data31) {
  return `${data31.pid}-${data31.tid}`;
}
function reset() {
  animationFrameStarts = /* @__PURE__ */ new Map();
  animationFrameEnds = /* @__PURE__ */ new Map();
  animationFrames = [];
  presentationForFrame = /* @__PURE__ */ new Map();
  animationFramePresentations = /* @__PURE__ */ new Map();
  isEnabled = false;
}
function handleUserConfig(config5) {
  isEnabled = config5.enableAnimationsFrameHandler;
}
function handleEvent(event) {
  if (!isEnabled) {
    return;
  }
  if (TraceEvents_exports.isAnimationFrameAsyncStart(event)) {
    const key = threadKey(event);
    const existing = animationFrameStarts.get(key) ?? [];
    existing.push(event);
    animationFrameStarts.set(key, existing);
  } else if (TraceEvents_exports.isAnimationFrameAsyncEnd(event)) {
    const key = threadKey(event);
    const existing = animationFrameEnds.get(key) ?? [];
    existing.push(event);
    animationFrameEnds.set(key, existing);
  } else if (TraceEvents_exports.isAnimationFramePresentation(event) && event.args?.id) {
    animationFramePresentations.set(event.args.id, event);
  }
}
async function finalize() {
  for (const [key, startEvents] of animationFrameStarts.entries()) {
    const endEvents = animationFrameEnds.get(key);
    if (!endEvents) {
      continue;
    }
    Trace_exports.sortTraceEventsInPlace(startEvents);
    Trace_exports.sortTraceEventsInPlace(endEvents);
    for (let i = 0; i < startEvents.length; i++) {
      const endEvent = endEvents.at(i);
      if (!endEvent) {
        break;
      }
      const startEvent = startEvents[i];
      const syntheticEvent = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
        rawSourceEvent: startEvent,
        ...startEvent,
        dur: Timing_exports.Micro(endEvent.ts - startEvent.ts),
        args: {
          data: {
            beginEvent: startEvent,
            endEvent
          }
        }
      });
      animationFrames.push(syntheticEvent);
      const id = startEvent.args?.id;
      if (id) {
        const presentationEvent = animationFramePresentations.get(id);
        if (presentationEvent) {
          presentationForFrame.set(syntheticEvent, presentationEvent);
        }
      }
    }
  }
}
function data() {
  return {
    animationFrames,
    presentationForFrame
  };
}
function deps() {
  return ["Meta"];
}
var animationFrameStarts, animationFrameEnds, animationFramePresentations, animationFrames, presentationForFrame, isEnabled;
var init_AnimationFramesHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/AnimationFramesHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    __name(threadKey, "threadKey");
    animationFrameStarts = /* @__PURE__ */ new Map();
    animationFrameEnds = /* @__PURE__ */ new Map();
    animationFramePresentations = /* @__PURE__ */ new Map();
    animationFrames = [];
    presentationForFrame = /* @__PURE__ */ new Map();
    __name(reset, "reset");
    isEnabled = false;
    __name(handleUserConfig, "handleUserConfig");
    __name(handleEvent, "handleEvent");
    __name(finalize, "finalize");
    __name(data, "data");
    __name(deps, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/AnimationHandler.js
var AnimationHandler_exports = {};
__export(AnimationHandler_exports, {
  data: () => data2,
  finalize: () => finalize2,
  handleEvent: () => handleEvent2,
  reset: () => reset2
});
function reset2() {
  animations = [];
  animationsSyntheticEvents = [];
}
function handleEvent2(event) {
  if (TraceEvents_exports.isAnimation(event)) {
    animations.push(event);
    return;
  }
}
async function finalize2() {
  const syntheticEvents2 = Trace_exports.createMatchedSortedSyntheticEvents(animations);
  animationsSyntheticEvents.push(...syntheticEvents2);
}
function data2() {
  return {
    animations: animationsSyntheticEvents
  };
}
var animations, animationsSyntheticEvents;
var init_AnimationHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/AnimationHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    animations = [];
    animationsSyntheticEvents = [];
    __name(reset2, "reset");
    __name(handleEvent2, "handleEvent");
    __name(finalize2, "finalize");
    __name(data2, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/FlowsHandler.js
var FlowsHandler_exports = {};
__export(FlowsHandler_exports, {
  data: () => data3,
  finalize: () => finalize3,
  handleEvent: () => handleEvent3,
  reset: () => reset3
});
function reset3() {
  flows = [];
  flowEvents = [];
  nonFlowEvents = [];
  flowDataByGroupToken = /* @__PURE__ */ new Map();
  boundFlowData = /* @__PURE__ */ new Map();
  flowsById = /* @__PURE__ */ new Map();
}
function handleEvent3(event) {
  if (TraceEvents_exports.isFlowPhaseEvent(event)) {
    flowEvents.push(event);
    return;
  }
  nonFlowEvents.push(event);
}
function processNonFlowEvent(event) {
  const flowDataForEvent = boundFlowData.get(event.ts)?.get(event.pid)?.get(event.tid)?.get(event.cat);
  if (!flowDataForEvent) {
    return;
  }
  const { flows: flows2, bindingParsed } = flowDataForEvent;
  if (bindingParsed) {
    return;
  }
  for (const flowId of flows2) {
    const flow = MapUtilities_exports.getWithDefault(flowsById, flowId, () => /* @__PURE__ */ new Map());
    flow.set(event.ts, event);
  }
  flowDataForEvent.bindingParsed = true;
}
function processFlowEvent(flowPhaseEvent) {
  const flowGroup = flowGroupTokenForFlowPhaseEvent(flowPhaseEvent);
  switch (flowPhaseEvent.ph) {
    case TraceEvents_exports.Phase.FLOW_START: {
      const flowMetadata = { flowId: flowPhaseEvent.id, times: /* @__PURE__ */ new Map([[flowPhaseEvent.ts, void 0]]) };
      flowDataByGroupToken.set(flowGroup, flowPhaseEvent.id);
      addFlowIdToEventBinding(flowPhaseEvent, flowMetadata.flowId);
      return;
    }
    case TraceEvents_exports.Phase.FLOW_STEP: {
      const flowId = flowDataByGroupToken.get(flowGroup);
      if (flowId === void 0) {
        return;
      }
      addFlowIdToEventBinding(flowPhaseEvent, flowId);
      return;
    }
    case TraceEvents_exports.Phase.FLOW_END: {
      const flowId = flowDataByGroupToken.get(flowGroup);
      if (flowId === void 0) {
        return;
      }
      addFlowIdToEventBinding(flowPhaseEvent, flowId);
      flowDataByGroupToken.delete(flowGroup);
    }
  }
}
function addFlowIdToEventBinding(event, flowId) {
  const flowsByPid = MapUtilities_exports.getWithDefault(boundFlowData, event.ts, () => /* @__PURE__ */ new Map());
  const flowsByTid = MapUtilities_exports.getWithDefault(flowsByPid, event.pid, () => /* @__PURE__ */ new Map());
  const flowsByCat = MapUtilities_exports.getWithDefault(flowsByTid, event.tid, () => /* @__PURE__ */ new Map());
  const flowData = MapUtilities_exports.getWithDefault(flowsByCat, event.cat, () => ({ flows: /* @__PURE__ */ new Set(), bindingParsed: false }));
  flowData.flows.add(flowId);
}
function flowGroupTokenForFlowPhaseEvent(event) {
  return `${event.cat}${ID_COMPONENT_SEPARATOR}${event.name}${ID_COMPONENT_SEPARATOR}${event.id}`;
}
async function finalize3() {
  flowEvents.forEach(processFlowEvent);
  nonFlowEvents.forEach(processNonFlowEvent);
  flows = [...flowsById.values()].map((flowMapping) => [...flowMapping.values()]).map((flow) => flow.filter((event) => event !== void 0)).filter((flow) => flow.length > 1);
}
function data3() {
  return {
    flows
  };
}
var flowDataByGroupToken, boundFlowData, flowsById, flowEvents, nonFlowEvents, flows, ID_COMPONENT_SEPARATOR;
var init_FlowsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/FlowsHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    flowDataByGroupToken = /* @__PURE__ */ new Map();
    boundFlowData = /* @__PURE__ */ new Map();
    flowsById = /* @__PURE__ */ new Map();
    flowEvents = [];
    nonFlowEvents = [];
    flows = [];
    ID_COMPONENT_SEPARATOR = "-$-";
    __name(reset3, "reset");
    __name(handleEvent3, "handleEvent");
    __name(processNonFlowEvent, "processNonFlowEvent");
    __name(processFlowEvent, "processFlowEvent");
    __name(addFlowIdToEventBinding, "addFlowIdToEventBinding");
    __name(flowGroupTokenForFlowPhaseEvent, "flowGroupTokenForFlowPhaseEvent");
    __name(finalize3, "finalize");
    __name(data3, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/AuctionWorkletsHandler.js
var AuctionWorkletsHandler_exports = {};
__export(AuctionWorkletsHandler_exports, {
  data: () => data4,
  finalize: () => finalize4,
  handleEvent: () => handleEvent4,
  reset: () => reset4
});
function reset4() {
  runningInProcessEvents = /* @__PURE__ */ new Map();
  doneWithProcessEvents = /* @__PURE__ */ new Map();
  createdSyntheticEvents = /* @__PURE__ */ new Map();
  utilityThreads = /* @__PURE__ */ new Map();
  v8HelperThreads = /* @__PURE__ */ new Map();
}
function handleEvent4(event) {
  if (TraceEvents_exports.isAuctionWorkletRunningInProcess(event)) {
    runningInProcessEvents.set(event.args.data.pid, event);
    return;
  }
  if (TraceEvents_exports.isAuctionWorkletDoneWithProcess(event)) {
    doneWithProcessEvents.set(event.args.data.pid, event);
    return;
  }
  if (TraceEvents_exports.isThreadName(event)) {
    if (event.args.name === "auction_worklet.CrUtilityMain") {
      utilityThreads.set(event.pid, event);
      return;
    }
    if (event.args.name === "AuctionV8HelperThread") {
      v8HelperThreads.set(event.pid, event);
    }
  }
}
function workletType(input) {
  switch (input) {
    case "seller":
      return TraceEvents_exports.AuctionWorkletType.SELLER;
    case "bidder":
      return TraceEvents_exports.AuctionWorkletType.BIDDER;
    default:
      return TraceEvents_exports.AuctionWorkletType.UNKNOWN;
  }
}
function makeSyntheticEventBase(event) {
  return SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
    rawSourceEvent: event,
    name: "SyntheticAuctionWorklet",
    s: TraceEvents_exports.Scope.THREAD,
    cat: event.cat,
    tid: event.tid,
    ts: event.ts,
    ph: TraceEvents_exports.Phase.INSTANT,
    pid: event.args.data.pid,
    host: event.args.data.host,
    target: event.args.data.target,
    type: workletType(event.args.data.type)
  });
}
async function finalize4() {
  for (const [pid, utilityThreadNameEvent] of utilityThreads) {
    const v8HelperEvent = v8HelperThreads.get(pid);
    if (!v8HelperEvent) {
      continue;
    }
    const runningEvent = runningInProcessEvents.get(pid);
    const doneWithEvent = doneWithProcessEvents.get(pid);
    let syntheticEvent = null;
    if (runningEvent) {
      syntheticEvent = {
        ...makeSyntheticEventBase(runningEvent),
        args: {
          data: {
            runningInProcessEvent: runningEvent,
            utilityThread: utilityThreadNameEvent,
            v8HelperThread: v8HelperEvent
          }
        }
      };
      if (doneWithEvent) {
        syntheticEvent.args.data.doneWithProcessEvent = doneWithEvent;
      }
    } else if (doneWithEvent) {
      syntheticEvent = {
        ...makeSyntheticEventBase(doneWithEvent),
        args: {
          data: {
            doneWithProcessEvent: doneWithEvent,
            utilityThread: utilityThreadNameEvent,
            v8HelperThread: v8HelperEvent
          }
        }
      };
      if (runningEvent) {
        syntheticEvent.args.data.runningInProcessEvent = runningEvent;
      }
    }
    if (syntheticEvent === null) {
      continue;
    }
    createdSyntheticEvents.set(pid, syntheticEvent);
  }
}
function data4() {
  return {
    worklets: createdSyntheticEvents
  };
}
var runningInProcessEvents, doneWithProcessEvents, createdSyntheticEvents, utilityThreads, v8HelperThreads;
var init_AuctionWorkletsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/AuctionWorkletsHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    runningInProcessEvents = /* @__PURE__ */ new Map();
    doneWithProcessEvents = /* @__PURE__ */ new Map();
    createdSyntheticEvents = /* @__PURE__ */ new Map();
    utilityThreads = /* @__PURE__ */ new Map();
    v8HelperThreads = /* @__PURE__ */ new Map();
    __name(reset4, "reset");
    __name(handleEvent4, "handleEvent");
    __name(workletType, "workletType");
    __name(makeSyntheticEventBase, "makeSyntheticEventBase");
    __name(finalize4, "finalize");
    __name(data4, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/MetaHandler.js
var MetaHandler_exports = {};
__export(MetaHandler_exports, {
  data: () => data5,
  finalize: () => finalize5,
  handleEvent: () => handleEvent5,
  reset: () => reset5
});
function makeNewTraceBounds() {
  return {
    min: Timing_exports.Micro(Number.POSITIVE_INFINITY),
    max: Timing_exports.Micro(Number.NEGATIVE_INFINITY),
    range: Timing_exports.Micro(Number.POSITIVE_INFINITY)
  };
}
function reset5() {
  navigationsByFrameId = /* @__PURE__ */ new Map();
  navigationsByNavigationId = /* @__PURE__ */ new Map();
  softNavigationsById = /* @__PURE__ */ new Map();
  finalDisplayUrlByNavigationId = /* @__PURE__ */ new Map();
  processNames = /* @__PURE__ */ new Map();
  mainFrameNavigations = [];
  browserProcessId = TraceEvents_exports.ProcessID(-1);
  browserThreadId = TraceEvents_exports.ThreadID(-1);
  gpuProcessId = TraceEvents_exports.ProcessID(-1);
  gpuThreadId = TraceEvents_exports.ThreadID(-1);
  viewportRect = null;
  topLevelRendererIds = /* @__PURE__ */ new Set();
  threadsInProcess = /* @__PURE__ */ new Map();
  rendererProcessesByFrameId = /* @__PURE__ */ new Map();
  framesByProcessId = /* @__PURE__ */ new Map();
  traceBounds = makeNewTraceBounds();
  traceStartedTimeFromTracingStartedEvent = Timing_exports.Micro(-1);
  traceIsGeneric = true;
}
function updateRendererProcessByFrame(event, frame) {
  const framesInProcessById = MapUtilities_exports.getWithDefault(framesByProcessId, frame.processId, () => /* @__PURE__ */ new Map());
  framesInProcessById.set(frame.frame, frame);
  const rendererProcessInFrame = MapUtilities_exports.getWithDefault(rendererProcessesByFrameId, frame.frame, () => /* @__PURE__ */ new Map());
  const rendererProcessInfo = MapUtilities_exports.getWithDefault(rendererProcessInFrame, frame.processId, () => {
    return [];
  });
  const lastProcessData = rendererProcessInfo.at(-1);
  if (lastProcessData && lastProcessData.frame.url === frame.url) {
    return;
  }
  rendererProcessInfo.push({
    frame,
    window: {
      min: event.ts,
      max: Timing_exports.Micro(0),
      range: Timing_exports.Micro(0)
    }
  });
}
function handleEvent5(event) {
  if (traceIsGeneric && CHROME_WEB_TRACE_EVENTS.has(event.name)) {
    traceIsGeneric = false;
  }
  if (TraceEvents_exports.isProcessName(event)) {
    processNames.set(event.pid, event);
  }
  if (event.ts !== 0 && !event.name.endsWith("::UMA") && eventPhasesOfInterestForTraceBounds.has(event.ph)) {
    traceBounds.min = Timing_exports.Micro(Math.min(event.ts, traceBounds.min));
    const eventDuration = event.dur ?? Timing_exports.Micro(0);
    traceBounds.max = Timing_exports.Micro(Math.max(event.ts + eventDuration, traceBounds.max));
  }
  if (TraceEvents_exports.isProcessName(event) && (event.args.name === "Browser" || event.args.name === "HeadlessBrowser")) {
    browserProcessId = event.pid;
    return;
  }
  if (TraceEvents_exports.isProcessName(event) && (event.args.name === "Gpu" || event.args.name === "GPU Process")) {
    gpuProcessId = event.pid;
    return;
  }
  if (TraceEvents_exports.isThreadName(event) && event.args.name === "CrGpuMain") {
    gpuThreadId = event.tid;
    return;
  }
  if (TraceEvents_exports.isThreadName(event) && event.args.name === "CrBrowserMain") {
    browserThreadId = event.tid;
  }
  if (TraceEvents_exports.isMainFrameViewport(event) && viewportRect === null) {
    const rectAsArray = event.args.data.viewport_rect;
    const viewportX = rectAsArray[0];
    const viewportY = rectAsArray[1];
    const viewportWidth = rectAsArray[2];
    const viewportHeight = rectAsArray[5];
    viewportRect = { x: viewportX, y: viewportY, width: viewportWidth, height: viewportHeight };
    devicePixelRatio2 = event.args.data.dpr;
  }
  if (TraceEvents_exports.isTracingStartedInBrowser(event)) {
    traceStartedTimeFromTracingStartedEvent = event.ts;
    if (!event.args.data) {
      throw new Error("No frames found in trace data");
    }
    for (const frame of event.args.data.frames ?? []) {
      updateRendererProcessByFrame(event, frame);
      if (!frame.parent) {
        topLevelRendererIds.add(frame.processId);
      }
      const traceHasPrimaryMainFrameFlag = "isInPrimaryMainFrame" in frame;
      const traceHasOutermostMainFrameFlag = "isOutermostMainFrame" in frame;
      if (traceHasPrimaryMainFrameFlag && traceHasOutermostMainFrameFlag) {
        if (frame.isInPrimaryMainFrame && frame.isOutermostMainFrame) {
          mainFrameId = frame.frame;
          mainFrameURL = frame.url;
        }
      } else if (traceHasOutermostMainFrameFlag) {
        if (frame.isOutermostMainFrame) {
          mainFrameId = frame.frame;
          mainFrameURL = frame.url;
        }
      } else if (!frame.parent && frame.url) {
        mainFrameId = frame.frame;
        mainFrameURL = frame.url;
      }
    }
    return;
  }
  if (TraceEvents_exports.isFrameCommittedInBrowser(event)) {
    const frame = event.args.data;
    if (!frame) {
      return;
    }
    updateRendererProcessByFrame(event, frame);
    if (frame.parent) {
      return;
    }
    topLevelRendererIds.add(frame.processId);
    return;
  }
  if (TraceEvents_exports.isCommitLoad(event)) {
    const frameData = event.args.data;
    if (!frameData) {
      return;
    }
    const { frame, name, url } = frameData;
    updateRendererProcessByFrame(event, { processId: event.pid, frame, name, url });
    return;
  }
  if (TraceEvents_exports.isThreadName(event)) {
    const threads = MapUtilities_exports.getWithDefault(threadsInProcess, event.pid, () => /* @__PURE__ */ new Map());
    threads.set(event.tid, event);
    return;
  }
  if (TraceEvents_exports.isNavigationStart(event) && event.args.data) {
    const navigationId = event.args.data.navigationId;
    if (navigationsByNavigationId.has(navigationId)) {
      return;
    }
    navigationsByNavigationId.set(navigationId, event);
    finalDisplayUrlByNavigationId.set(navigationId, event.args.data.documentLoaderURL);
    const frameId = event.args.frame;
    const existingFrameNavigations = navigationsByFrameId.get(frameId) || [];
    existingFrameNavigations.push(event);
    navigationsByFrameId.set(frameId, existingFrameNavigations);
    if (frameId === mainFrameId) {
      mainFrameNavigations.push(event);
    }
    return;
  }
  if (TraceEvents_exports.isSoftNavigationStart(event)) {
    softNavigationsById.set(event.args.context.performanceTimelineNavigationId, event);
  }
  if (TraceEvents_exports.isResourceSendRequest(event)) {
    if (event.args.data.resourceType !== "Document") {
      return;
    }
    const maybeNavigationId = event.args.data.requestId;
    const navigation2 = navigationsByNavigationId.get(maybeNavigationId);
    if (!navigation2) {
      return;
    }
    finalDisplayUrlByNavigationId.set(maybeNavigationId, event.args.data.url);
    return;
  }
  if (TraceEvents_exports.isDidCommitSameDocumentNavigation(event)) {
    if (event.args.render_frame_host.frame_type !== "PRIMARY_MAIN_FRAME") {
      return;
    }
    const navigation2 = mainFrameNavigations.at(-1);
    const key = navigation2?.args.data?.navigationId ?? "";
    finalDisplayUrlByNavigationId.set(key, event.args.url);
    return;
  }
}
async function finalize5(options) {
  config = { showAllEvents: Boolean(options?.showAllEvents) };
  if (traceStartedTimeFromTracingStartedEvent >= 0) {
    traceBounds.min = traceStartedTimeFromTracingStartedEvent;
  }
  traceBounds.range = Timing_exports.Micro(traceBounds.max - traceBounds.min);
  for (const [, processWindows] of rendererProcessesByFrameId) {
    const processWindowValues = [...processWindows.values()].flat().sort((a, b) => {
      return a.window.min - b.window.min;
    });
    for (let i = 0; i < processWindowValues.length; i++) {
      const currentWindow = processWindowValues[i];
      const nextWindow = processWindowValues[i + 1];
      if (!nextWindow) {
        currentWindow.window.max = Timing_exports.Micro(traceBounds.max);
        currentWindow.window.range = Timing_exports.Micro(traceBounds.max - currentWindow.window.min);
      } else {
        currentWindow.window.max = Timing_exports.Micro(nextWindow.window.min - 1);
        currentWindow.window.range = Timing_exports.Micro(currentWindow.window.max - currentWindow.window.min);
      }
    }
  }
  for (const [frameId, navigations] of navigationsByFrameId) {
    if (rendererProcessesByFrameId.has(frameId)) {
      continue;
    }
    navigationsByFrameId.delete(frameId);
    for (const navigation2 of navigations) {
      if (!navigation2.args.data) {
        continue;
      }
      navigationsByNavigationId.delete(navigation2.args.data.navigationId);
    }
  }
  const firstMainFrameNav = mainFrameNavigations.at(0);
  const firstNavTimeThreshold = Timing_exports3.secondsToMicro(Timing_exports.Seconds(0.5));
  if (firstMainFrameNav) {
    const navigationIsWithinThreshold = firstMainFrameNav.ts - traceBounds.min < firstNavTimeThreshold;
    if (firstMainFrameNav.args.data?.isOutermostMainFrame && firstMainFrameNav.args.data?.documentLoaderURL && navigationIsWithinThreshold) {
      mainFrameURL = firstMainFrameNav.args.data.documentLoaderURL;
    }
  }
}
function data5() {
  return {
    config,
    traceBounds,
    browserProcessId,
    browserThreadId,
    processNames,
    gpuProcessId,
    gpuThreadId: gpuThreadId === TraceEvents_exports.ThreadID(-1) ? void 0 : gpuThreadId,
    viewportRect: viewportRect || void 0,
    devicePixelRatio: devicePixelRatio2 ?? void 0,
    mainFrameId,
    mainFrameURL,
    navigationsByFrameId,
    navigationsByNavigationId,
    softNavigationsById,
    finalDisplayUrlByNavigationId,
    threadsInProcess,
    rendererProcessesByFrame: rendererProcessesByFrameId,
    topLevelRendererIds,
    frameByProcessId: framesByProcessId,
    mainFrameNavigations,
    traceIsGeneric
  };
}
var config, rendererProcessesByFrameId, mainFrameId, mainFrameURL, framesByProcessId, browserProcessId, browserThreadId, gpuProcessId, gpuThreadId, viewportRect, devicePixelRatio2, processNames, topLevelRendererIds, traceBounds, navigationsByFrameId, navigationsByNavigationId, softNavigationsById, finalDisplayUrlByNavigationId, mainFrameNavigations, threadsInProcess, traceStartedTimeFromTracingStartedEvent, eventPhasesOfInterestForTraceBounds, traceIsGeneric, CHROME_WEB_TRACE_EVENTS;
var init_MetaHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/MetaHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    rendererProcessesByFrameId = /* @__PURE__ */ new Map();
    mainFrameId = "";
    mainFrameURL = "";
    framesByProcessId = /* @__PURE__ */ new Map();
    browserProcessId = TraceEvents_exports.ProcessID(-1);
    browserThreadId = TraceEvents_exports.ThreadID(-1);
    gpuProcessId = TraceEvents_exports.ProcessID(-1);
    gpuThreadId = TraceEvents_exports.ThreadID(-1);
    viewportRect = null;
    devicePixelRatio2 = null;
    processNames = /* @__PURE__ */ new Map();
    topLevelRendererIds = /* @__PURE__ */ new Set();
    __name(makeNewTraceBounds, "makeNewTraceBounds");
    traceBounds = makeNewTraceBounds();
    navigationsByFrameId = /* @__PURE__ */ new Map();
    navigationsByNavigationId = /* @__PURE__ */ new Map();
    softNavigationsById = /* @__PURE__ */ new Map();
    finalDisplayUrlByNavigationId = /* @__PURE__ */ new Map();
    mainFrameNavigations = [];
    threadsInProcess = /* @__PURE__ */ new Map();
    traceStartedTimeFromTracingStartedEvent = Timing_exports.Micro(-1);
    eventPhasesOfInterestForTraceBounds = /* @__PURE__ */ new Set([
      TraceEvents_exports.Phase.BEGIN,
      TraceEvents_exports.Phase.END,
      TraceEvents_exports.Phase.COMPLETE,
      TraceEvents_exports.Phase.INSTANT
    ]);
    traceIsGeneric = true;
    CHROME_WEB_TRACE_EVENTS = /* @__PURE__ */ new Set([
      TraceEvents_exports.Name.TRACING_STARTED_IN_PAGE,
      TraceEvents_exports.Name.TRACING_SESSION_ID_FOR_WORKER,
      TraceEvents_exports.Name.TRACING_STARTED_IN_BROWSER,
      TraceEvents_exports.Name.CPU_PROFILE
    ]);
    __name(reset5, "reset");
    __name(updateRendererProcessByFrame, "updateRendererProcessByFrame");
    __name(handleEvent5, "handleEvent");
    __name(finalize5, "finalize");
    __name(data5, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/NetworkRequestsHandler.js
var NetworkRequestsHandler_exports = {};
__export(NetworkRequestsHandler_exports, {
  data: () => data6,
  deps: () => deps2,
  finalize: () => finalize6,
  handleEvent: () => handleEvent6,
  reset: () => reset6
});
function storeTraceEventWithRequestId(requestId, key, value) {
  if (!requestMap.has(requestId)) {
    requestMap.set(requestId, {});
  }
  const traceEvents = requestMap.get(requestId);
  if (!traceEvents) {
    throw new Error(`Unable to locate trace events for request ID ${requestId}`);
  }
  if (Array.isArray(traceEvents[key])) {
    const target = traceEvents[key];
    const values = value;
    target.push(...values);
  } else {
    traceEvents[key] = value;
  }
}
function firstPositiveValueInList(entries) {
  for (const entry of entries) {
    if (entry && entry > 0) {
      return entry;
    }
  }
  return 0;
}
function reset6() {
  requestsById = /* @__PURE__ */ new Map();
  requestMap = /* @__PURE__ */ new Map();
  requestsByTime = [];
  networkRequestEventByInitiatorUrl = /* @__PURE__ */ new Map();
  eventToInitiatorMap = /* @__PURE__ */ new Map();
  webSocketData = /* @__PURE__ */ new Map();
  requestIdsByURL = /* @__PURE__ */ new Map();
  entityMappings = {
    eventsByEntity: /* @__PURE__ */ new Map(),
    entityByEvent: /* @__PURE__ */ new Map(),
    createdEntityCache: /* @__PURE__ */ new Map(),
    entityByUrlCache: /* @__PURE__ */ new Map()
  };
  linkPreconnectEvents = [];
}
function handleEvent6(event) {
  if (TraceEvents_exports.isResourceChangePriority(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "changePriority", event);
    return;
  }
  if (TraceEvents_exports.isResourceWillSendRequest(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "willSendRequests", [event]);
    return;
  }
  if (TraceEvents_exports.isResourceSendRequest(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "sendRequests", [event]);
    return;
  }
  if (TraceEvents_exports.isResourceReceiveResponse(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "receiveResponse", event);
    return;
  }
  if (TraceEvents_exports.isResourceReceivedData(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "receivedData", [event]);
    return;
  }
  if (TraceEvents_exports.isResourceFinish(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "resourceFinish", event);
    return;
  }
  if (TraceEvents_exports.isResourceMarkAsCached(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "resourceMarkAsCached", event);
    return;
  }
  if (TraceEvents_exports.isPreloadRenderBlockingStatusChangeEvent(event)) {
    storeTraceEventWithRequestId(event.args.data.requestId, "preloadRenderBlockingStatusChange", [event]);
  }
  if (TraceEvents_exports.isWebSocketCreate(event) || TraceEvents_exports.isWebSocketInfo(event) || TraceEvents_exports.isWebSocketTransfer(event)) {
    const identifier = event.args.data.identifier;
    if (!webSocketData.has(identifier)) {
      if (event.args.data.frame) {
        webSocketData.set(identifier, {
          frame: event.args.data.frame,
          webSocketIdentifier: identifier,
          events: [],
          syntheticConnection: null
        });
      } else if (event.args.data.workerId) {
        webSocketData.set(identifier, {
          workerId: event.args.data.workerId,
          webSocketIdentifier: identifier,
          events: [],
          syntheticConnection: null
        });
      }
    }
    webSocketData.get(identifier)?.events.push(event);
  }
  if (TraceEvents_exports.isLinkPreconnect(event)) {
    linkPreconnectEvents.push(event);
    return;
  }
}
async function finalize6() {
  const { rendererProcessesByFrame } = data5();
  for (const [requestId, request] of requestMap.entries()) {
    if (!request.sendRequests) {
      continue;
    }
    const redirects = [];
    for (let i = 0; i < request.sendRequests.length - 1; i++) {
      const sendRequest = request.sendRequests[i];
      const nextSendRequest = request.sendRequests[i + 1];
      let ts = sendRequest.ts;
      let dur = Timing_exports.Micro(nextSendRequest.ts - sendRequest.ts);
      if (request.willSendRequests?.[i] && request.willSendRequests[i + 1]) {
        const willSendRequest = request.willSendRequests[i];
        const nextWillSendRequest = request.willSendRequests[i + 1];
        ts = willSendRequest.ts;
        dur = Timing_exports.Micro(nextWillSendRequest.ts - willSendRequest.ts);
      }
      redirects.push({
        url: sendRequest.args.data.url,
        priority: sendRequest.args.data.priority,
        requestMethod: sendRequest.args.data.requestMethod,
        ts,
        dur
      });
    }
    const firstSendRequest = request.sendRequests[0];
    const finalSendRequest = request.sendRequests[request.sendRequests.length - 1];
    if (finalSendRequest.args.data.url.startsWith("data:")) {
      continue;
    }
    const isLightrider = globalThis.isLightrider;
    if (isLightrider && request.resourceFinish && request.receiveResponse?.args.data.headers) {
      const lrSizeHeader = request.receiveResponse.args.data.headers.find((h) => h.name === "X-TotalFetchedSize");
      if (lrSizeHeader) {
        const size = parseFloat(lrSizeHeader.value);
        if (!isNaN(size)) {
          request.resourceFinish.args.data.encodedDataLength = size;
        }
      }
    }
    const isPushedResource = request.resourceFinish?.args.data.encodedDataLength !== 0;
    const isDiskCached = !!request.receiveResponse && request.receiveResponse.args.data.fromCache && !request.receiveResponse.args.data.fromServiceWorker && !isPushedResource;
    const isMemoryCached = request.resourceMarkAsCached !== void 0;
    let timing = isMemoryCached ? void 0 : request.receiveResponse?.args.data.timing;
    let lrServerResponseTime;
    if (isLightrider && request.receiveResponse?.args.data.headers) {
      timing = {
        requestTime: Timing_exports3.microToSeconds(request.sendRequests.at(0)?.ts ?? 0),
        connectEnd: 0,
        connectStart: 0,
        dnsEnd: 0,
        dnsStart: 0,
        proxyEnd: 0,
        proxyStart: 0,
        pushEnd: 0,
        pushStart: 0,
        receiveHeadersEnd: 0,
        receiveHeadersStart: 0,
        sendEnd: 0,
        sendStart: 0,
        sslEnd: 0,
        sslStart: 0,
        workerReady: 0,
        workerStart: 0,
        ...timing
      };
      const TCPMsHeader = request.receiveResponse.args.data.headers.find((h) => h.name === "X-TCPMs");
      const TCPMs = TCPMsHeader ? Math.max(0, parseInt(TCPMsHeader.value, 10)) : 0;
      if (request.receiveResponse.args.data.protocol.startsWith("h3")) {
        timing.connectStart = 0;
        timing.connectEnd = TCPMs;
      } else {
        timing.connectStart = 0;
        timing.sslStart = TCPMs / 2;
        timing.connectEnd = TCPMs;
        timing.sslEnd = TCPMs;
      }
      const ResponseMsHeader = request.receiveResponse.args.data.headers.find((h) => h.name === "X-ResponseMs");
      if (ResponseMsHeader) {
        lrServerResponseTime = Math.max(0, parseInt(ResponseMsHeader.value, 10));
      }
    }
    const allowedProtocols2 = [
      "blob:",
      "file:",
      "filesystem:",
      "http:",
      "https:"
    ];
    if (!allowedProtocols2.some((p) => firstSendRequest.args.data.url.startsWith(p))) {
      continue;
    }
    const initialPriority = finalSendRequest.args.data.priority;
    let finalPriority = initialPriority;
    if (request.changePriority) {
      finalPriority = request.changePriority.args.data.priority;
    }
    const startTime = request.willSendRequests?.length ? Timing_exports.Micro(request.willSendRequests[0].ts) : Timing_exports.Micro(firstSendRequest.ts);
    const endRedirectTime = request.willSendRequests?.length ? Timing_exports.Micro(request.willSendRequests[request.willSendRequests.length - 1].ts) : Timing_exports.Micro(finalSendRequest.ts);
    const endTime = request.resourceFinish ? request.resourceFinish.ts : endRedirectTime;
    const finishTime = request.resourceFinish?.args.data.finishTime ? Timing_exports.Micro(request.resourceFinish.args.data.finishTime * SECONDS_TO_MICROSECONDS) : Timing_exports.Micro(endTime);
    const networkDuration = Timing_exports.Micro(timing ? (finishTime || endRedirectTime) - endRedirectTime : 0);
    const processingDuration = Timing_exports.Micro(endTime - (finishTime || endTime));
    const redirectionDuration = Timing_exports.Micro(endRedirectTime - startTime);
    const queueingFromTraceData = timing ? timing.requestTime * SECONDS_TO_MICROSECONDS - endRedirectTime : 0;
    const queueing = Timing_exports.Micro(NumberUtilities_exports.clamp(queueingFromTraceData, 0, Number.MAX_VALUE));
    const stalled = timing ? Timing_exports.Micro(firstPositiveValueInList([
      timing.dnsStart * MILLISECONDS_TO_MICROSECONDS,
      timing.connectStart * MILLISECONDS_TO_MICROSECONDS,
      timing.sendStart * MILLISECONDS_TO_MICROSECONDS,
      request.receiveResponse ? request.receiveResponse.ts - endRedirectTime : null
    ])) : request.receiveResponse ? Timing_exports.Micro(request.receiveResponse.ts - startTime) : Timing_exports.Micro(0);
    const sendStartTime = timing ? Timing_exports.Micro(timing.requestTime * SECONDS_TO_MICROSECONDS + timing.sendStart * MILLISECONDS_TO_MICROSECONDS) : startTime;
    const waiting = timing ? Timing_exports.Micro((timing.receiveHeadersEnd - timing.sendEnd) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const serverResponseTime = timing ? Timing_exports.Micro(((timing.receiveHeadersStart ?? timing.receiveHeadersEnd) - timing.sendEnd) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const downloadStart = timing ? Timing_exports.Micro(timing.requestTime * SECONDS_TO_MICROSECONDS + timing.receiveHeadersEnd * MILLISECONDS_TO_MICROSECONDS) : startTime;
    const download = timing ? Timing_exports.Micro((finishTime || downloadStart) - downloadStart) : request.receiveResponse ? Timing_exports.Micro(endTime - request.receiveResponse.ts) : Timing_exports.Micro(0);
    const totalTime = Timing_exports.Micro(networkDuration + processingDuration);
    const dnsLookup = timing ? Timing_exports.Micro((timing.dnsEnd - timing.dnsStart) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const ssl = timing ? Timing_exports.Micro((timing.sslEnd - timing.sslStart) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const proxyNegotiation = timing ? Timing_exports.Micro((timing.proxyEnd - timing.proxyStart) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const requestSent = timing ? Timing_exports.Micro((timing.sendEnd - timing.sendStart) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const initialConnection = timing ? Timing_exports.Micro((timing.connectEnd - timing.connectStart) * MILLISECONDS_TO_MICROSECONDS) : Timing_exports.Micro(0);
    const { frame, url, renderBlocking: sendRequestIsRenderBlocking } = finalSendRequest.args.data;
    const { encodedDataLength, decodedBodyLength } = request.resourceFinish ? request.resourceFinish.args.data : { encodedDataLength: 0, decodedBodyLength: 0 };
    const parsedUrl = new URL(url);
    const isHttps = parsedUrl.protocol === "https:";
    const requestingFrameUrl = Trace_exports.activeURLForFrameAtTime(frame, finalSendRequest.ts, rendererProcessesByFrame) || "";
    const preloadRenderBlockingStatusChange = request.preloadRenderBlockingStatusChange?.at(-1)?.args.data.renderBlocking;
    const isRenderBlocking = preloadRenderBlockingStatusChange ?? sendRequestIsRenderBlocking ?? "non_blocking";
    const networkEvent = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
      rawSourceEvent: finalSendRequest,
      args: {
        data: {
          // All data we create from trace events should be added to |syntheticData|.
          syntheticData: {
            dnsLookup,
            download,
            downloadStart,
            finishTime,
            initialConnection,
            isDiskCached,
            isHttps,
            isMemoryCached,
            isPushedResource,
            networkDuration,
            processingDuration,
            proxyNegotiation,
            queueing,
            redirectionDuration,
            requestSent,
            sendStartTime,
            ssl,
            stalled,
            totalTime,
            waiting,
            serverResponseTime
          },
          // All fields below are from TraceEventsForNetworkRequest.
          decodedBodyLength,
          encodedDataLength,
          frame,
          fromServiceWorker: request.receiveResponse?.args.data.fromServiceWorker,
          isLinkPreload: finalSendRequest.args.data.isLinkPreload || false,
          mimeType: request.receiveResponse?.args.data.mimeType ?? "",
          priority: finalPriority,
          initialPriority,
          protocol: request.receiveResponse?.args.data.protocol ?? "unknown",
          redirects,
          renderBlocking: isRenderBlocking,
          requestId,
          requestingFrameUrl,
          requestMethod: finalSendRequest.args.data.requestMethod,
          resourceType: finalSendRequest.args.data.resourceType ?? "Other",
          statusCode: request.receiveResponse?.args.data.statusCode ?? 0,
          responseHeaders: request.receiveResponse?.args.data.headers ?? null,
          fetchPriorityHint: finalSendRequest.args.data.fetchPriorityHint ?? "auto",
          initiator: finalSendRequest.args.data.initiator,
          stackTrace: finalSendRequest.args.data.stackTrace,
          timing,
          lrServerResponseTime,
          url,
          failed: request.resourceFinish?.args.data.didFail ?? false,
          finished: Boolean(request.resourceFinish),
          hasResponse: Boolean(request.receiveResponse),
          connectionId: request.receiveResponse?.args.data.connectionId,
          connectionReused: request.receiveResponse?.args.data.connectionReused
        }
      },
      cat: "loading",
      name: TraceEvents_exports.Name.SYNTHETIC_NETWORK_REQUEST,
      ph: TraceEvents_exports.Phase.COMPLETE,
      dur: Timing_exports.Micro(endTime - startTime),
      tdur: Timing_exports.Micro(endTime - startTime),
      ts: Timing_exports.Micro(startTime),
      tts: Timing_exports.Micro(startTime),
      pid: finalSendRequest.pid,
      tid: finalSendRequest.tid
    });
    requestsByTime.push(networkEvent);
    requestsById.set(networkEvent.args.data.requestId, networkEvent);
    const requestsForUrl = requestIdsByURL.get(networkEvent.args.data.url) ?? [];
    requestsForUrl.push(networkEvent.args.data.requestId);
    requestIdsByURL.set(networkEvent.args.data.url, requestsForUrl);
    addNetworkRequestToEntityMapping(networkEvent, entityMappings, request);
    const initiatorUrl = networkEvent.args.data.initiator?.url || Trace_exports.getStackTraceTopCallFrameInEventPayload(networkEvent)?.url;
    if (initiatorUrl) {
      const events = networkRequestEventByInitiatorUrl.get(initiatorUrl) ?? [];
      events.push(networkEvent);
      networkRequestEventByInitiatorUrl.set(initiatorUrl, events);
    }
  }
  for (const request of requestsByTime) {
    const initiatedEvents = networkRequestEventByInitiatorUrl.get(request.args.data.url);
    if (initiatedEvents) {
      for (const initiatedEvent of initiatedEvents) {
        eventToInitiatorMap.set(initiatedEvent, request);
      }
    }
  }
  finalizeWebSocketData();
}
function data6() {
  return {
    byId: requestsById,
    byTime: requestsByTime,
    requestIdsByURL,
    incompleteInitiator: eventToInitiatorMap,
    webSocket: [...webSocketData.values()],
    entityMappings: {
      entityByEvent: entityMappings.entityByEvent,
      eventsByEntity: entityMappings.eventsByEntity,
      createdEntityCache: entityMappings.createdEntityCache,
      entityByUrlCache: entityMappings.entityByUrlCache
    },
    linkPreconnectEvents
  };
}
function deps2() {
  return ["Meta"];
}
function finalizeWebSocketData() {
  webSocketData.forEach((data31) => {
    let startEvent = null;
    let endEvent = null;
    for (const event of data31.events) {
      if (TraceEvents_exports.isWebSocketCreate(event)) {
        startEvent = event;
      }
      if (TraceEvents_exports.isWebSocketDestroy(event)) {
        endEvent = event;
      }
    }
    data31.syntheticConnection = createSyntheticWebSocketConnection(startEvent, endEvent, data31.events[0]);
  });
}
function createSyntheticWebSocketConnection(startEvent, endEvent, firstRecordedEvent) {
  const { traceBounds: traceBounds2 } = data5();
  const startTs = startEvent ? startEvent.ts : traceBounds2.min;
  const endTs = endEvent ? endEvent.ts : traceBounds2.max;
  const duration = endTs - startTs;
  const mainEvent = startEvent || endEvent || firstRecordedEvent;
  return {
    name: "SyntheticWebSocketConnection",
    cat: mainEvent.cat,
    ph: TraceEvents_exports.Phase.COMPLETE,
    ts: startTs,
    dur: duration,
    pid: mainEvent.pid,
    tid: mainEvent.tid,
    s: mainEvent.s,
    rawSourceEvent: mainEvent,
    _tag: "SyntheticEntryTag",
    args: {
      data: {
        identifier: mainEvent.args.data.identifier,
        priority: "Low",
        url: mainEvent.args.data.url || ""
      }
    }
  };
}
var MILLISECONDS_TO_MICROSECONDS, SECONDS_TO_MICROSECONDS, webSocketData, linkPreconnectEvents, requestMap, requestsById, requestsByTime, requestIdsByURL, networkRequestEventByInitiatorUrl, eventToInitiatorMap, entityMappings;
var init_NetworkRequestsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/NetworkRequestsHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_helpers();
    init_MetaHandler();
    MILLISECONDS_TO_MICROSECONDS = 1e3;
    SECONDS_TO_MICROSECONDS = 1e6;
    webSocketData = /* @__PURE__ */ new Map();
    linkPreconnectEvents = [];
    requestMap = /* @__PURE__ */ new Map();
    requestsById = /* @__PURE__ */ new Map();
    requestsByTime = [];
    requestIdsByURL = /* @__PURE__ */ new Map();
    networkRequestEventByInitiatorUrl = /* @__PURE__ */ new Map();
    eventToInitiatorMap = /* @__PURE__ */ new Map();
    entityMappings = {
      eventsByEntity: /* @__PURE__ */ new Map(),
      entityByEvent: /* @__PURE__ */ new Map(),
      createdEntityCache: /* @__PURE__ */ new Map(),
      entityByUrlCache: /* @__PURE__ */ new Map()
    };
    __name(storeTraceEventWithRequestId, "storeTraceEventWithRequestId");
    __name(firstPositiveValueInList, "firstPositiveValueInList");
    __name(reset6, "reset");
    __name(handleEvent6, "handleEvent");
    __name(finalize6, "finalize");
    __name(data6, "data");
    __name(deps2, "deps");
    __name(finalizeWebSocketData, "finalizeWebSocketData");
    __name(createSyntheticWebSocketConnection, "createSyntheticWebSocketConnection");
  }
});

// node_modules/@paulirish/trace_engine/models/cpu_profile/ProfileTreeModel.js
var ProfileNode, ProfileTreeModel;
var init_ProfileTreeModel = __esm({
  "node_modules/@paulirish/trace_engine/models/cpu_profile/ProfileTreeModel.js"() {
    init_process_global();
    ProfileNode = class {
      static {
        __name(this, "ProfileNode");
      }
      callFrame;
      callUID;
      self;
      total;
      id;
      parent;
      children;
      originalFunctionName = null;
      depth;
      deoptReason;
      constructor(callFrame) {
        this.callFrame = callFrame;
        this.callUID = `${callFrame.functionName}@${callFrame.scriptId}:${callFrame.lineNumber}:${callFrame.columnNumber}`;
        this.self = 0;
        this.total = 0;
        this.id = 0;
        this.parent = null;
        this.children = [];
      }
      get scriptId() {
        return String(this.callFrame.scriptId);
      }
      get url() {
        return this.callFrame.url;
      }
      get lineNumber() {
        return this.callFrame.lineNumber;
      }
      get columnNumber() {
        return this.callFrame.columnNumber;
      }
      get functionName() {
        return this.originalFunctionName ?? this.callFrame.functionName;
      }
      setOriginalFunctionName(name) {
        this.originalFunctionName = name;
      }
    };
    ProfileTreeModel = class {
      static {
        __name(this, "ProfileTreeModel");
      }
      root;
      total;
      maxDepth;
      initialize(root2) {
        this.root = root2;
        this.assignDepthsAndParents();
        this.total = this.calculateTotals(this.root);
      }
      assignDepthsAndParents() {
        const root2 = this.root;
        root2.depth = -1;
        root2.parent = null;
        this.maxDepth = 0;
        const nodesToTraverse = [root2];
        while (nodesToTraverse.length) {
          const parent = nodesToTraverse.pop();
          const depth = parent.depth + 1;
          if (depth > this.maxDepth) {
            this.maxDepth = depth;
          }
          const children = parent.children;
          for (const child of children) {
            child.depth = depth;
            child.parent = parent;
            nodesToTraverse.push(child);
          }
        }
      }
      calculateTotals(root2) {
        const nodesToTraverse = [root2];
        const dfsList = [];
        while (nodesToTraverse.length) {
          const node = nodesToTraverse.pop();
          node.total = node.self;
          dfsList.push(node);
          nodesToTraverse.push(...node.children);
        }
        while (dfsList.length > 1) {
          const node = dfsList.pop();
          if (node.parent) {
            node.parent.total += node.total;
          }
        }
        return root2.total;
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/cpu_profile/CPUProfileDataModel.js
var CPUProfileDataModel_exports = {};
__export(CPUProfileDataModel_exports, {
  CPUProfileDataModel: () => CPUProfileDataModel,
  CPUProfileNode: () => CPUProfileNode
});
var CPUProfileNode, CPUProfileDataModel;
var init_CPUProfileDataModel = __esm({
  "node_modules/@paulirish/trace_engine/models/cpu_profile/CPUProfileDataModel.js"() {
    init_process_global();
    init_platform();
    init_ProfileTreeModel();
    CPUProfileNode = class extends ProfileNode {
      static {
        __name(this, "CPUProfileNode");
      }
      id;
      self;
      // Position ticks are available in profile nodes coming from CDP
      // profiles and not in those coming from tracing. They are used to
      // calculate the line level execution time shown in the Sources panel
      // after recording a profile. For trace CPU profiles we use the
      // `lines` array instead.
      positionTicks;
      deoptReason;
      constructor(node, samplingInterval) {
        const callFrame = node.callFrame || {
          // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
          // @ts-expect-error
          functionName: node["functionName"],
          // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
          // @ts-expect-error
          scriptId: node["scriptId"],
          // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
          // @ts-expect-error
          url: node["url"],
          // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
          // @ts-expect-error
          lineNumber: node["lineNumber"] - 1,
          // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
          // @ts-expect-error
          columnNumber: node["columnNumber"] - 1
        };
        super(callFrame);
        this.id = node.id;
        this.self = (node.hitCount || 0) * samplingInterval;
        this.positionTicks = node.positionTicks;
        this.deoptReason = node.deoptReason && node.deoptReason !== "no reason" ? node.deoptReason : null;
      }
    };
    CPUProfileDataModel = class extends ProfileTreeModel {
      static {
        __name(this, "CPUProfileDataModel");
      }
      profileStartTime;
      profileEndTime;
      timestamps;
      samples;
      /**
       * Contains trace ids assigned to samples, if any. Trace ids are
       * keyed by the sample index in the profile. These are only created
       * for CPU profiles coming from traces.
       */
      traceIds;
      /**
       * Each item in the `lines` array contains the script line executing
       * when the sample in that array position was taken.
       */
      lines;
      /**
       * Same as `lines` above, but with the script column.
       */
      columns;
      totalHitCount;
      profileHead;
      /**
       * A cache for the nodes we have parsed.
       * Note: "Parsed" nodes are different from the "Protocol" nodes, the
       * latter being the raw data we receive from the backend.
       */
      #idToParsedNode;
      gcNode;
      programNode;
      idleNode;
      #stackStartTimes;
      #stackChildrenDuration;
      constructor(profile) {
        super();
        const isLegacyFormat = Boolean(profile["head"]);
        if (isLegacyFormat) {
          this.profileStartTime = profile.startTime * 1e3;
          this.profileEndTime = profile.endTime * 1e3;
          this.timestamps = profile.timestamps;
          this.compatibilityConversionHeadToNodes(profile);
        } else {
          this.profileStartTime = profile.startTime / 1e3;
          this.profileEndTime = profile.endTime / 1e3;
          this.timestamps = this.convertTimeDeltas(profile);
        }
        this.traceIds = profile.traceIds;
        this.samples = profile.samples;
        this.lines = profile.lines;
        this.columns = profile.columns;
        this.totalHitCount = 0;
        this.profileHead = this.translateProfileTree(profile.nodes);
        this.initialize(this.profileHead);
        this.extractMetaNodes();
        if (this.samples?.length) {
          this.sortSamples();
          this.normalizeTimestamps();
          this.fixMissingSamples();
        }
      }
      compatibilityConversionHeadToNodes(profile) {
        if (!profile.head || profile.nodes) {
          return;
        }
        const nodes = [];
        convertNodesTree(profile.head);
        profile.nodes = nodes;
        delete profile.head;
        function convertNodesTree(node) {
          nodes.push(node);
          node.children = node.children.map(convertNodesTree);
          return node.id;
        }
        __name(convertNodesTree, "convertNodesTree");
      }
      /**
       * Calculate timestamps using timeDeltas. Some CPU profile formats,
       * like the ones contained in traces have timeDeltas instead of
       * timestamps.
       */
      convertTimeDeltas(profile) {
        if (!profile.timeDeltas) {
          return [];
        }
        let lastTimeMicroSec = profile.startTime;
        const timestamps = new Array(profile.timeDeltas.length);
        for (let i = 0; i < profile.timeDeltas.length; ++i) {
          lastTimeMicroSec += profile.timeDeltas[i];
          timestamps[i] = lastTimeMicroSec;
        }
        return timestamps;
      }
      /**
       * Creates a Tree of CPUProfileNodes using the Protocol.Profiler.ProfileNodes.
       * As the tree is built, samples of native code (prefixed with "native ") are
       * filtered out. Samples of filtered nodes are replaced with the parent of the
       * node being filtered.
       *
       * This function supports legacy and new definitions of the CDP Profiler.Profile
       * type.
       */
      translateProfileTree(nodes) {
        function buildChildrenFromParents(nodes2) {
          if (nodes2[0].children) {
            return;
          }
          nodes2[0].children = [];
          for (let i = 1; i < nodes2.length; ++i) {
            const node = nodes2[i];
            const parentNode = protocolNodeById.get(node.parent);
            if (!parentNode) {
              continue;
            }
            if (parentNode.children) {
              parentNode.children.push(node.id);
            } else {
              parentNode.children = [node.id];
            }
          }
        }
        __name(buildChildrenFromParents, "buildChildrenFromParents");
        function buildHitCountFromSamples(nodes2, samples) {
          if (typeof nodes2[0].hitCount === "number") {
            return;
          }
          if (!samples) {
            throw new Error("Error: Neither hitCount nor samples are present in profile.");
          }
          for (let i = 0; i < nodes2.length; ++i) {
            nodes2[i].hitCount = 0;
          }
          for (let i = 0; i < samples.length; ++i) {
            const node = protocolNodeById.get(samples[i]);
            if (node?.hitCount === void 0) {
              continue;
            }
            node.hitCount++;
          }
        }
        __name(buildHitCountFromSamples, "buildHitCountFromSamples");
        const protocolNodeById = /* @__PURE__ */ new Map();
        for (let i = 0; i < nodes.length; ++i) {
          const node = nodes[i];
          protocolNodeById.set(node.id, node);
        }
        buildHitCountFromSamples(nodes, this.samples);
        buildChildrenFromParents(nodes);
        this.totalHitCount = nodes.reduce((acc, node) => acc + (node.hitCount || 0), 0);
        const sampleTime = (this.profileEndTime - this.profileStartTime) / this.totalHitCount;
        const root2 = nodes[0];
        const idToUseForRemovedNode = /* @__PURE__ */ new Map([[root2.id, root2.id]]);
        this.#idToParsedNode = /* @__PURE__ */ new Map();
        const resultRoot = new CPUProfileNode(root2, sampleTime);
        this.#idToParsedNode.set(root2.id, resultRoot);
        if (!root2.children) {
          throw new Error("Missing children for root");
        }
        const parentNodeStack = root2.children.map(() => resultRoot);
        const sourceNodeStack = root2.children.map((id) => protocolNodeById.get(id));
        while (sourceNodeStack.length) {
          let parentNode = parentNodeStack.pop();
          const sourceNode = sourceNodeStack.pop();
          if (!sourceNode || !parentNode) {
            continue;
          }
          if (!sourceNode.children) {
            sourceNode.children = [];
          }
          const targetNode = new CPUProfileNode(sourceNode, sampleTime);
          parentNode.children.push(targetNode);
          parentNode = targetNode;
          idToUseForRemovedNode.set(sourceNode.id, parentNode.id);
          parentNodeStack.push.apply(parentNodeStack, sourceNode.children.map(() => parentNode));
          sourceNodeStack.push.apply(sourceNodeStack, sourceNode.children.map((id) => protocolNodeById.get(id)));
          this.#idToParsedNode.set(sourceNode.id, targetNode);
        }
        if (this.samples) {
          this.samples = this.samples.map((id) => idToUseForRemovedNode.get(id));
        }
        return resultRoot;
      }
      /**
       * Sorts the samples array using the timestamps array (there is a one
       * to one matching by index between the two).
       */
      sortSamples() {
        if (!this.timestamps || !this.samples) {
          return;
        }
        const timestamps = this.timestamps;
        const samples = this.samples;
        const orderedIndices = timestamps.map((_x, index) => index);
        orderedIndices.sort((a, b) => timestamps[a] - timestamps[b]);
        this.timestamps = [];
        this.samples = [];
        for (let i = 0; i < orderedIndices.length; i++) {
          const orderedIndex = orderedIndices[i];
          this.timestamps.push(timestamps[orderedIndex]);
          this.samples.push(samples[orderedIndex]);
        }
      }
      /**
       * Fills in timestamps and/or time deltas from legacy profiles where
       * they could be missing.
       */
      normalizeTimestamps() {
        if (!this.samples) {
          return;
        }
        let timestamps = this.timestamps;
        if (!timestamps) {
          const profileStartTime = this.profileStartTime;
          const interval = (this.profileEndTime - profileStartTime) / this.samples.length;
          timestamps = new Array(this.samples.length + 1);
          for (let i = 0; i < timestamps.length; ++i) {
            timestamps[i] = profileStartTime + i * interval;
          }
          this.timestamps = timestamps;
          return;
        }
        for (let i = 0; i < timestamps.length; ++i) {
          timestamps[i] /= 1e3;
        }
        if (this.samples.length === timestamps.length) {
          const lastTimestamp = timestamps.at(-1) || 0;
          const averageIntervalTime = (lastTimestamp - timestamps[0]) / (timestamps.length - 1);
          this.timestamps.push(lastTimestamp + averageIntervalTime);
        }
        this.profileStartTime = timestamps.at(0) || this.profileStartTime;
        this.profileEndTime = timestamps.at(-1) || this.profileEndTime;
      }
      /**
       * Some nodes do not refer to JS samples but to V8 system tasks, AKA
       * "meta" nodes. This function extracts those nodes from the profile.
       */
      extractMetaNodes() {
        const topLevelNodes = this.profileHead.children;
        for (let i = 0; i < topLevelNodes.length && !(this.gcNode && this.programNode && this.idleNode); i++) {
          const node = topLevelNodes[i];
          if (node.functionName === "(garbage collector)") {
            this.gcNode = node;
          } else if (node.functionName === "(program)") {
            this.programNode = node;
          } else if (node.functionName === "(idle)") {
            this.idleNode = node;
          }
        }
      }
      fixMissingSamples() {
        const samples = this.samples;
        if (!samples) {
          return;
        }
        const samplesCount = samples.length;
        if (!this.programNode || samplesCount < 3) {
          return;
        }
        const idToNode = this.#idToParsedNode;
        const programNodeId = this.programNode.id;
        const gcNodeId = this.gcNode ? this.gcNode.id : -1;
        const idleNodeId = this.idleNode ? this.idleNode.id : -1;
        let prevNodeId = samples[0];
        let nodeId = samples[1];
        for (let sampleIndex = 1; sampleIndex < samplesCount - 1; sampleIndex++) {
          const nextNodeId = samples[sampleIndex + 1];
          const prevNode = idToNode.get(prevNodeId);
          const nextNode = idToNode.get(nextNodeId);
          if (prevNodeId === void 0 || nextNodeId === void 0 || !prevNode || !nextNode) {
            console.error(`Unexpectedly found undefined nodes: ${prevNodeId} ${nextNodeId}`);
            continue;
          }
          if (nodeId === programNodeId && !isSystemNode(prevNodeId) && !isSystemNode(nextNodeId) && bottomNode(prevNode) === bottomNode(nextNode)) {
            samples[sampleIndex] = prevNodeId;
          }
          prevNodeId = nodeId;
          nodeId = nextNodeId;
        }
        function bottomNode(node) {
          while (node.parent?.parent) {
            node = node.parent;
          }
          return node;
        }
        __name(bottomNode, "bottomNode");
        function isSystemNode(nodeId2) {
          return nodeId2 === programNodeId || nodeId2 === gcNodeId || nodeId2 === idleNodeId;
        }
        __name(isSystemNode, "isSystemNode");
      }
      /**
       * Traverses the call tree derived from the samples calling back when a call is opened
       * and when it's closed
       */
      forEachFrame(openFrameCallback, closeFrameCallback, startTime, stopTime) {
        if (!this.profileHead || !this.samples) {
          return;
        }
        startTime = startTime || 0;
        stopTime = stopTime || Infinity;
        const samples = this.samples;
        const timestamps = this.timestamps;
        const idToNode = this.#idToParsedNode;
        const gcNode = this.gcNode;
        const samplesCount = samples.length;
        const startIndex = ArrayUtilities_exports.lowerBound(timestamps, startTime, ArrayUtilities_exports.DEFAULT_COMPARATOR);
        let stackTop = 0;
        const stackNodes = [];
        let prevId = this.profileHead.id;
        let sampleTime;
        let gcParentNode = null;
        const stackDepth = this.maxDepth + 3;
        if (!this.#stackStartTimes) {
          this.#stackStartTimes = new Array(stackDepth);
        }
        const stackStartTimes = this.#stackStartTimes;
        if (!this.#stackChildrenDuration) {
          this.#stackChildrenDuration = new Array(stackDepth);
        }
        const stackChildrenDuration = this.#stackChildrenDuration;
        let node;
        let sampleIndex;
        for (sampleIndex = startIndex; sampleIndex < samplesCount; sampleIndex++) {
          sampleTime = timestamps[sampleIndex];
          if (sampleTime >= stopTime) {
            break;
          }
          const id = samples[sampleIndex];
          if (id === prevId) {
            continue;
          }
          node = idToNode.get(id);
          let prevNode = idToNode.get(prevId) || null;
          if (!prevNode) {
            continue;
          }
          if (gcNode && node === gcNode) {
            gcParentNode = prevNode;
            openFrameCallback(gcParentNode.depth + 1, gcNode, sampleIndex, sampleTime);
            stackStartTimes[++stackTop] = sampleTime;
            stackChildrenDuration[stackTop] = 0;
            prevId = id;
            continue;
          }
          if (gcNode && prevNode === gcNode && gcParentNode) {
            const start = stackStartTimes[stackTop];
            const duration = sampleTime - start;
            stackChildrenDuration[stackTop - 1] += duration;
            closeFrameCallback(gcParentNode.depth + 1, gcNode, sampleIndex, start, duration, duration - stackChildrenDuration[stackTop]);
            --stackTop;
            prevNode = gcParentNode;
            prevId = prevNode.id;
            gcParentNode = null;
          }
          while (node && node.depth > prevNode.depth) {
            stackNodes.push(node);
            node = node.parent;
          }
          while (prevNode && prevNode !== node) {
            const start = stackStartTimes[stackTop];
            const duration = sampleTime - start;
            stackChildrenDuration[stackTop - 1] += duration;
            closeFrameCallback(prevNode.depth, prevNode, sampleIndex, start, duration, duration - stackChildrenDuration[stackTop]);
            --stackTop;
            if (node && node.depth === prevNode.depth) {
              stackNodes.push(node);
              node = node.parent;
            }
            prevNode = prevNode.parent;
          }
          while (stackNodes.length) {
            const currentNode = stackNodes.pop();
            if (!currentNode) {
              break;
            }
            node = currentNode;
            openFrameCallback(currentNode.depth, currentNode, sampleIndex, sampleTime);
            stackStartTimes[++stackTop] = sampleTime;
            stackChildrenDuration[stackTop] = 0;
          }
          prevId = id;
        }
        sampleTime = timestamps[sampleIndex] || this.profileEndTime;
        if (node && gcParentNode && idToNode.get(prevId) === gcNode) {
          const start = stackStartTimes[stackTop];
          const duration = sampleTime - start;
          stackChildrenDuration[stackTop - 1] += duration;
          closeFrameCallback(gcParentNode.depth + 1, node, sampleIndex, start, duration, duration - stackChildrenDuration[stackTop]);
          --stackTop;
          prevId = gcParentNode.id;
        }
        for (let node2 = idToNode.get(prevId); node2?.parent; node2 = node2.parent) {
          const start = stackStartTimes[stackTop];
          const duration = sampleTime - start;
          stackChildrenDuration[stackTop - 1] += duration;
          closeFrameCallback(node2.depth, node2, sampleIndex, start, duration, duration - stackChildrenDuration[stackTop]);
          --stackTop;
        }
      }
      /**
       * Returns the node that corresponds to a given index of a sample.
       */
      nodeByIndex(index) {
        return this.samples && this.#idToParsedNode.get(this.samples[index]) || null;
      }
      /**
       * Returns the node that corresponds to a given node id.
       */
      nodeById(nodeId) {
        return this.#idToParsedNode.get(nodeId) || null;
      }
      nodes() {
        if (!this.#idToParsedNode) {
          return null;
        }
        return [...this.#idToParsedNode.values()];
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/cpu_profile/cpu_profile.js
var init_cpu_profile = __esm({
  "node_modules/@paulirish/trace_engine/models/cpu_profile/cpu_profile.js"() {
    init_process_global();
    init_CPUProfileDataModel();
    init_ProfileTreeModel();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/SamplesHandler.js
var SamplesHandler_exports = {};
__export(SamplesHandler_exports, {
  data: () => data7,
  finalize: () => finalize7,
  getProfileCallFunctionName: () => getProfileCallFunctionName,
  handleEvent: () => handleEvent7,
  reset: () => reset7
});
function parseCPUProfileData(parseOptions) {
  const priorityList = parseOptions.isCPUProfile ? PROFILE_SOURCES_BY_PRIORITY.cpuProfile : PROFILE_SOURCES_BY_PRIORITY.performanceTrace;
  for (const [processId, profiles] of preprocessedData) {
    const profilesByThread = /* @__PURE__ */ new Map();
    for (const [profileId, preProcessedData] of profiles) {
      const threadId = preProcessedData.threadId;
      if (threadId === void 0) {
        continue;
      }
      const listForThread = MapUtilities_exports.getWithDefault(profilesByThread, threadId, () => []);
      listForThread.push({ id: profileId, data: preProcessedData });
    }
    for (const [threadId, candidates] of profilesByThread) {
      let buildProfileCallsForCPUProfile = function() {
        profileModel.forEachFrame(openFrameCallback, closeFrameCallback);
        function openFrameCallback(depth, node, sampleIndex, timeStampMilliseconds) {
          if (threadId === void 0) {
            return;
          }
          const ts = Timing_exports3.milliToMicro(Timing_exports.Milli(timeStampMilliseconds));
          const nodeId = node.id;
          const profileCall = Trace_exports.makeProfileCall(node, selectedProfileId, sampleIndex, ts, processId, threadId);
          finalizedData.profileCalls.push(profileCall);
          indexStack.push(finalizedData.profileCalls.length - 1);
          const traceEntryNode = TreeHelpers_exports.makeEmptyTraceEntryNode(profileCall, nodeId);
          entryToNode.set(profileCall, traceEntryNode);
          traceEntryNode.depth = depth;
          if (indexStack.length === 1) {
            finalizedData.profileTree?.roots.add(traceEntryNode);
          }
        }
        __name(openFrameCallback, "openFrameCallback");
        function closeFrameCallback(_depth, _node, _sampleIndex, _timeStampMillis, durMs, selfTimeMs) {
          const profileCallIndex = indexStack.pop();
          const profileCall = profileCallIndex !== void 0 && finalizedData.profileCalls[profileCallIndex];
          if (!profileCall) {
            return;
          }
          const { callFrame, ts, pid, tid } = profileCall;
          const traceEntryNode = entryToNode.get(profileCall);
          if (callFrame === void 0 || ts === void 0 || pid === void 0 || selectedProfileId === void 0 || tid === void 0 || traceEntryNode === void 0) {
            return;
          }
          const dur = Timing_exports3.milliToMicro(Timing_exports.Milli(durMs));
          const selfTime = Timing_exports3.milliToMicro(Timing_exports.Milli(selfTimeMs));
          profileCall.dur = dur;
          traceEntryNode.selfTime = selfTime;
          const parentIndex = indexStack.at(-1);
          const parent = parentIndex !== void 0 && finalizedData.profileCalls.at(parentIndex);
          const parentNode = parent && entryToNode.get(parent);
          if (!parentNode) {
            return;
          }
          traceEntryNode.parent = parentNode;
          parentNode.children.push(traceEntryNode);
        }
        __name(closeFrameCallback, "closeFrameCallback");
      };
      __name(buildProfileCallsForCPUProfile, "buildProfileCallsForCPUProfile");
      if (!candidates.length) {
        continue;
      }
      let chosen = candidates[0];
      for (const source of priorityList) {
        const match = candidates.find((p) => p.data.source === source);
        if (match) {
          chosen = match;
          break;
        }
      }
      const chosenData = chosen.data;
      if (!chosenData.rawProfile.nodes.length) {
        continue;
      }
      const indexStack = [];
      const profileModel = new CPUProfileDataModel_exports.CPUProfileDataModel(chosenData.rawProfile);
      const profileTree = TreeHelpers_exports.makeEmptyTraceEntryTree();
      profileTree.maxDepth = profileModel.maxDepth;
      const selectedProfileId = chosen.id;
      const finalizedData = {
        rawProfile: chosenData.rawProfile,
        parsedProfile: profileModel,
        profileCalls: [],
        profileTree,
        profileId: selectedProfileId
      };
      const dataByThread = MapUtilities_exports.getWithDefault(profilesInProcess, processId, () => /* @__PURE__ */ new Map());
      dataByThread.set(threadId, finalizedData);
      if (parseOptions.isCPUProfile) {
        buildProfileCallsForCPUProfile();
      }
    }
  }
}
function reset7() {
  preprocessedData = /* @__PURE__ */ new Map();
  profilesInProcess = /* @__PURE__ */ new Map();
  entryToNode = /* @__PURE__ */ new Map();
}
function handleEvent7(event) {
  if (TraceEvents_exports.isSyntheticCpuProfile(event)) {
    const profileData = getOrCreatePreProcessedData(event.pid, event.id);
    profileData.rawProfile = event.args.data.cpuProfile;
    profileData.threadId = event.tid;
    return;
  }
  if (TraceEvents_exports.isProfile(event)) {
    const profileData = getOrCreatePreProcessedData(event.pid, event.id);
    profileData.rawProfile.startTime = event.ts;
    profileData.threadId = event.tid;
    assignProfileSourceIfKnown(profileData, event.args?.data?.source);
    return;
  }
  if (TraceEvents_exports.isProfileChunk(event)) {
    const profileData = getOrCreatePreProcessedData(event.pid, event.id);
    const cdpProfile = profileData.rawProfile;
    const nodesAndSamples = event.args?.data?.cpuProfile || { samples: [] };
    const samples = nodesAndSamples?.samples || [];
    const traceIds = event.args?.data?.cpuProfile?.trace_ids;
    for (const n of nodesAndSamples?.nodes || []) {
      const lineNumber = typeof n.callFrame.lineNumber === "undefined" ? -1 : n.callFrame.lineNumber;
      const columnNumber = typeof n.callFrame.columnNumber === "undefined" ? -1 : n.callFrame.columnNumber;
      const scriptId = String(n.callFrame.scriptId);
      const url = n.callFrame.url || "";
      const node = {
        ...n,
        callFrame: {
          ...n.callFrame,
          url,
          lineNumber,
          columnNumber,
          scriptId
        }
      };
      cdpProfile.nodes.push(node);
    }
    const timeDeltas = event.args.data?.timeDeltas || [];
    const lines = event.args.data?.lines || Array(samples.length).fill(0);
    const columns = event.args.data?.columns || Array(samples.length).fill(0);
    cdpProfile.samples?.push(...samples);
    cdpProfile.timeDeltas?.push(...timeDeltas);
    cdpProfile.lines?.push(...lines);
    cdpProfile.columns?.push(...columns);
    if (traceIds) {
      cdpProfile.traceIds ??= {};
      for (const key in traceIds) {
        cdpProfile.traceIds[key] = traceIds[key];
      }
    }
    if (cdpProfile.samples && cdpProfile.timeDeltas && cdpProfile.samples.length !== cdpProfile.timeDeltas.length) {
      console.error("Failed to parse CPU profile.");
      return;
    }
    if (!cdpProfile.endTime && cdpProfile.timeDeltas) {
      const timeDeltas2 = cdpProfile.timeDeltas;
      cdpProfile.endTime = timeDeltas2.reduce((x, y) => x + y, cdpProfile.startTime);
    }
    assignProfileSourceIfKnown(profileData, event.args?.data?.source);
    return;
  }
}
async function finalize7(parseOptions = {}) {
  parseCPUProfileData(parseOptions);
}
function assignProfileSourceIfKnown(profileData, source) {
  if (TraceEvents_exports.VALID_PROFILE_SOURCES.includes(source)) {
    profileData.source = source;
  }
}
function data7() {
  return {
    profilesInProcess,
    entryToNode
  };
}
function getOrCreatePreProcessedData(processId, profileId) {
  const profileById = MapUtilities_exports.getWithDefault(preprocessedData, processId, () => /* @__PURE__ */ new Map());
  return MapUtilities_exports.getWithDefault(profileById, profileId, () => ({
    rawProfile: {
      startTime: 0,
      endTime: 0,
      nodes: [],
      samples: [],
      timeDeltas: [],
      lines: [],
      columns: []
    },
    profileId
  }));
}
function getProfileCallFunctionName(data31, entry) {
  const profile = data31.profilesInProcess.get(entry.pid)?.get(entry.tid);
  const node = profile?.parsedProfile.nodeById(entry.nodeId);
  if (node?.functionName) {
    return node.functionName;
  }
  return entry.callFrame.functionName;
}
var profilesInProcess, entryToNode, preprocessedData, PROFILE_SOURCES_BY_PRIORITY;
var init_SamplesHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/SamplesHandler.js"() {
    init_process_global();
    init_platform();
    init_cpu_profile();
    init_helpers2();
    init_types2();
    profilesInProcess = /* @__PURE__ */ new Map();
    entryToNode = /* @__PURE__ */ new Map();
    preprocessedData = /* @__PURE__ */ new Map();
    PROFILE_SOURCES_BY_PRIORITY = {
      cpuProfile: ["Inspector"],
      performanceTrace: ["Internal", "Inspector"]
    };
    __name(parseCPUProfileData, "parseCPUProfileData");
    __name(reset7, "reset");
    __name(handleEvent7, "handleEvent");
    __name(finalize7, "finalize");
    __name(assignProfileSourceIfKnown, "assignProfileSourceIfKnown");
    __name(data7, "data");
    __name(getOrCreatePreProcessedData, "getOrCreatePreProcessedData");
    __name(getProfileCallFunctionName, "getProfileCallFunctionName");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/RendererHandler.js
var RendererHandler_exports = {};
__export(RendererHandler_exports, {
  assignIsMainFrame: () => assignIsMainFrame,
  assignMeta: () => assignMeta,
  assignOrigin: () => assignOrigin,
  assignThreadName: () => assignThreadName,
  buildHierarchy: () => buildHierarchy,
  data: () => data8,
  deps: () => deps3,
  finalize: () => finalize8,
  handleEvent: () => handleEvent8,
  handleUserConfig: () => handleUserConfig2,
  makeCompleteEvent: () => makeCompleteEvent,
  reset: () => reset8,
  sanitizeProcesses: () => sanitizeProcesses,
  sanitizeThreads: () => sanitizeThreads
});
function handleUserConfig2(userConfig) {
  config2 = userConfig;
}
function reset8() {
  processes = /* @__PURE__ */ new Map();
  entryToNode2 = /* @__PURE__ */ new Map();
  entityMappings2 = {
    eventsByEntity: /* @__PURE__ */ new Map(),
    entityByEvent: /* @__PURE__ */ new Map(),
    createdEntityCache: /* @__PURE__ */ new Map(),
    entityByUrlCache: /* @__PURE__ */ new Map()
  };
  completeEventStack = [];
  compositorTileWorkers = [];
}
function handleEvent8(event) {
  if (TraceEvents_exports.isThreadName(event) && event.args.name?.startsWith("CompositorTileWorker")) {
    compositorTileWorkers.push({
      pid: event.pid,
      tid: event.tid
    });
  }
  if (TraceEvents_exports.isBegin(event) || TraceEvents_exports.isEnd(event)) {
    const process5 = getOrCreateRendererProcess(processes, event.pid);
    const thread = getOrCreateRendererThread(process5, event.tid);
    const completeEvent = makeCompleteEvent(event);
    if (!completeEvent) {
      return;
    }
    thread.entries.push(completeEvent);
    return;
  }
  if (TraceEvents_exports.isInstant(event) || TraceEvents_exports.isComplete(event)) {
    const process5 = getOrCreateRendererProcess(processes, event.pid);
    const thread = getOrCreateRendererThread(process5, event.tid);
    thread.entries.push(event);
  }
  if (TraceEvents_exports.isLayout(event)) {
    const process5 = getOrCreateRendererProcess(processes, event.pid);
    const thread = getOrCreateRendererThread(process5, event.tid);
    thread.layoutEvents.push(event);
  }
  if (TraceEvents_exports.isRecalcStyle(event)) {
    const process5 = getOrCreateRendererProcess(processes, event.pid);
    const thread = getOrCreateRendererThread(process5, event.tid);
    thread.recalcStyleEvents.push(event);
  }
}
async function finalize8() {
  const { mainFrameId: mainFrameId2, rendererProcessesByFrame, threadsInProcess: threadsInProcess2 } = data5();
  entityMappings2 = data6().entityMappings;
  assignMeta(processes, mainFrameId2, rendererProcessesByFrame, threadsInProcess2);
  sanitizeProcesses(processes);
  buildHierarchy(processes);
  sanitizeThreads(processes);
}
function data8() {
  return {
    processes,
    compositorTileWorkers: gatherCompositorThreads(),
    entryToNode: entryToNode2,
    entityMappings: {
      entityByEvent: entityMappings2.entityByEvent,
      eventsByEntity: entityMappings2.eventsByEntity,
      createdEntityCache: entityMappings2.createdEntityCache,
      entityByUrlCache: entityMappings2.entityByUrlCache
    }
  };
}
function gatherCompositorThreads() {
  const threadsByProcess = /* @__PURE__ */ new Map();
  for (const worker of compositorTileWorkers) {
    const byProcess = threadsByProcess.get(worker.pid) || [];
    byProcess.push(worker.tid);
    threadsByProcess.set(worker.pid, byProcess);
  }
  return threadsByProcess;
}
function assignMeta(processes2, mainFrameId2, rendererProcessesByFrame, threadsInProcess2) {
  assignOrigin(processes2, rendererProcessesByFrame);
  assignIsMainFrame(processes2, mainFrameId2, rendererProcessesByFrame);
  assignThreadName(processes2, threadsInProcess2);
}
function assignOrigin(processes2, rendererProcessesByFrame) {
  for (const renderProcessesByPid of rendererProcessesByFrame.values()) {
    for (const [pid, processWindows] of renderProcessesByPid) {
      for (const processInfo of processWindows.flat()) {
        const process5 = getOrCreateRendererProcess(processes2, pid);
        if (process5.url === null || process5.url === "about:blank") {
          try {
            new URL(processInfo.frame.url);
            process5.url = processInfo.frame.url;
          } catch {
            process5.url = null;
          }
        }
      }
    }
  }
}
function assignIsMainFrame(processes2, mainFrameId2, rendererProcessesByFrame) {
  for (const [frameId, renderProcessesByPid] of rendererProcessesByFrame) {
    for (const [pid] of renderProcessesByPid) {
      const process5 = getOrCreateRendererProcess(processes2, pid);
      if (frameId === mainFrameId2) {
        process5.isOnMainFrame = true;
      }
    }
  }
}
function assignThreadName(processes2, threadsInProcess2) {
  for (const [pid, process5] of processes2) {
    for (const [tid, threadInfo] of threadsInProcess2.get(pid) ?? []) {
      const thread = getOrCreateRendererThread(process5, tid);
      thread.name = threadInfo?.args.name ?? `${tid}`;
    }
  }
}
function sanitizeProcesses(processes2) {
  const auctionWorklets = data4().worklets;
  const metaData = data5();
  if (metaData.traceIsGeneric) {
    return;
  }
  for (const [pid, process5] of processes2) {
    if (process5.url === null) {
      const maybeWorklet = auctionWorklets.get(pid);
      if (maybeWorklet) {
        process5.url = maybeWorklet.host;
      } else {
        processes2.delete(pid);
      }
      continue;
    }
  }
}
function sanitizeThreads(processes2) {
  for (const [, process5] of processes2) {
    for (const [tid, thread] of process5.threads) {
      if (!thread.tree?.roots.size) {
        process5.threads.delete(tid);
      }
    }
  }
}
function buildHierarchy(processes2, options) {
  const samplesData = data7();
  for (const [pid, process5] of processes2) {
    for (const [tid, thread] of process5.threads) {
      if (!thread.entries.length) {
        thread.tree = TreeHelpers_exports.makeEmptyTraceEntryTree();
        continue;
      }
      Trace_exports.sortTraceEventsInPlace(thread.entries);
      const samplesDataForThread = samplesData.profilesInProcess.get(pid)?.get(tid);
      if (samplesDataForThread) {
        const cpuProfile = samplesDataForThread.parsedProfile;
        const samplesIntegrator = cpuProfile && new SamplesIntegrator_exports.SamplesIntegrator(cpuProfile, samplesDataForThread.profileId, pid, tid, config2);
        const profileCalls = samplesIntegrator?.buildProfileCalls(thread.entries);
        if (samplesIntegrator && profileCalls) {
          thread.entries = Trace_exports.mergeEventsInOrder(thread.entries, profileCalls);
          thread.profileCalls = profileCalls;
          const jsSamples = samplesIntegrator.jsSampleEvents;
          if (jsSamples.length) {
            thread.entries = Trace_exports.mergeEventsInOrder(thread.entries, jsSamples);
          }
        }
      }
      const treeData = TreeHelpers_exports.treify(thread.entries, options);
      thread.tree = treeData.tree;
      for (const [entry, node] of treeData.entryToNode) {
        entryToNode2.set(entry, node);
        addEventToEntityMapping(entry, entityMappings2);
      }
    }
  }
}
function makeCompleteEvent(event) {
  if (TraceEvents_exports.isEnd(event)) {
    const beginEvent = completeEventStack.pop();
    if (!beginEvent) {
      return null;
    }
    if (beginEvent.name !== event.name || beginEvent.cat !== event.cat) {
      console.error("Begin/End events mismatch at " + beginEvent.ts + " (" + beginEvent.name + ") vs. " + event.ts + " (" + event.name + ")");
      return null;
    }
    beginEvent.dur = Timing_exports.Micro(event.ts - beginEvent.ts);
    return null;
  }
  const syntheticComplete = {
    ...event,
    ph: TraceEvents_exports.Phase.COMPLETE,
    dur: Timing_exports.Micro(0)
  };
  completeEventStack.push(syntheticComplete);
  return syntheticComplete;
}
function deps3() {
  return ["Meta", "Samples", "AuctionWorklets", "NetworkRequests"];
}
var processes, entityMappings2, compositorTileWorkers, entryToNode2, completeEventStack, config2, makeRendererProcess, makeRendererThread, getOrCreateRendererProcess, getOrCreateRendererThread;
var init_RendererHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/RendererHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_AuctionWorkletsHandler();
    init_helpers();
    init_MetaHandler();
    init_NetworkRequestsHandler();
    init_SamplesHandler();
    processes = /* @__PURE__ */ new Map();
    entityMappings2 = {
      eventsByEntity: /* @__PURE__ */ new Map(),
      entityByEvent: /* @__PURE__ */ new Map(),
      createdEntityCache: /* @__PURE__ */ new Map(),
      entityByUrlCache: /* @__PURE__ */ new Map()
    };
    compositorTileWorkers = Array();
    entryToNode2 = /* @__PURE__ */ new Map();
    completeEventStack = [];
    config2 = Configuration_exports.defaults();
    makeRendererProcess = /* @__PURE__ */ __name(() => ({
      url: null,
      isOnMainFrame: false,
      threads: /* @__PURE__ */ new Map()
    }), "makeRendererProcess");
    makeRendererThread = /* @__PURE__ */ __name(() => ({
      name: null,
      entries: [],
      profileCalls: [],
      layoutEvents: [],
      recalcStyleEvents: []
    }), "makeRendererThread");
    getOrCreateRendererProcess = /* @__PURE__ */ __name((processes2, pid) => {
      return MapUtilities_exports.getWithDefault(processes2, pid, makeRendererProcess);
    }, "getOrCreateRendererProcess");
    getOrCreateRendererThread = /* @__PURE__ */ __name((process5, tid) => {
      return MapUtilities_exports.getWithDefault(process5.threads, tid, makeRendererThread);
    }, "getOrCreateRendererThread");
    __name(handleUserConfig2, "handleUserConfig");
    __name(reset8, "reset");
    __name(handleEvent8, "handleEvent");
    __name(finalize8, "finalize");
    __name(data8, "data");
    __name(gatherCompositorThreads, "gatherCompositorThreads");
    __name(assignMeta, "assignMeta");
    __name(assignOrigin, "assignOrigin");
    __name(assignIsMainFrame, "assignIsMainFrame");
    __name(assignThreadName, "assignThreadName");
    __name(sanitizeProcesses, "sanitizeProcesses");
    __name(sanitizeThreads, "sanitizeThreads");
    __name(buildHierarchy, "buildHierarchy");
    __name(makeCompleteEvent, "makeCompleteEvent");
    __name(deps3, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/AsyncJSCallsHandler.js
var AsyncJSCallsHandler_exports = {};
__export(AsyncJSCallsHandler_exports, {
  data: () => data9,
  deps: () => deps4,
  finalize: () => finalize9,
  handleEvent: () => handleEvent9,
  reset: () => reset9
});
function reset9() {
  schedulerToRunEntryPoints = /* @__PURE__ */ new Map();
  asyncCallToScheduler = /* @__PURE__ */ new Map();
  taskScheduleForTaskRunEvent = /* @__PURE__ */ new Map();
  runEntryPointToScheduler = /* @__PURE__ */ new Map();
}
function handleEvent9(_) {
}
async function finalize9() {
  const { flows: flows2 } = data3();
  const { entryToNode: entryToNode4 } = data8();
  for (const flow of flows2) {
    let maybeAsyncTaskScheduled = flow.at(0);
    if (!maybeAsyncTaskScheduled) {
      continue;
    }
    if (TraceEvents_exports.isDebuggerAsyncTaskRun(maybeAsyncTaskScheduled)) {
      maybeAsyncTaskScheduled = taskScheduleForTaskRunEvent.get(maybeAsyncTaskScheduled);
    }
    if (!maybeAsyncTaskScheduled || !TraceEvents_exports.isDebuggerAsyncTaskScheduled(maybeAsyncTaskScheduled)) {
      continue;
    }
    const taskName = maybeAsyncTaskScheduled.args.taskName;
    const asyncTaskRun = flow.at(1);
    if (!asyncTaskRun || !TraceEvents_exports.isDebuggerAsyncTaskRun(asyncTaskRun)) {
      continue;
    }
    taskScheduleForTaskRunEvent.set(asyncTaskRun, maybeAsyncTaskScheduled);
    const asyncCaller = findNearestJSAncestor(maybeAsyncTaskScheduled, entryToNode4);
    const asyncEntryPoint = findFirstJsInvocationForAsyncTaskRun(asyncTaskRun, entryToNode4);
    runEntryPointToScheduler.set(asyncEntryPoint || asyncTaskRun, { taskName, scheduler: asyncCaller || maybeAsyncTaskScheduled });
    if (!asyncCaller || !asyncEntryPoint) {
      continue;
    }
    const entryPoints = MapUtilities_exports.getWithDefault(schedulerToRunEntryPoints, asyncCaller, () => []);
    entryPoints.push(asyncEntryPoint);
    const scheduledProfileCalls = findFirstJSCallsForAsyncTaskRun(asyncTaskRun, entryToNode4);
    for (const call of scheduledProfileCalls) {
      asyncCallToScheduler.set(call, { taskName, scheduler: asyncCaller });
    }
  }
}
function findNearestJSAncestor(asyncTaskScheduled, entryToNode4) {
  let node = entryToNode4.get(asyncTaskScheduled)?.parent;
  while (node) {
    if (TraceEvents_exports.isProfileCall(node.entry) || acceptJSInvocationsPredicate(node.entry)) {
      return node.entry;
    }
    node = node.parent;
  }
  return null;
}
function acceptJSInvocationsPredicate(event) {
  const eventIsConsoleRunTask = TraceEvents_exports.isConsoleRunTask(event);
  const eventIsV8EntryPoint = event.name.startsWith("v8") || event.name.startsWith("V8");
  return TraceEvents_exports.isJSInvocationEvent(event) && (eventIsConsoleRunTask || !eventIsV8EntryPoint);
}
function findFirstJsInvocationForAsyncTaskRun(asyncTaskRun, entryToNode4) {
  return findFirstDescendantsOfType(asyncTaskRun, entryToNode4, acceptJSInvocationsPredicate, TraceEvents_exports.isDebuggerAsyncTaskRun).at(0);
}
function findFirstJSCallsForAsyncTaskRun(asyncTaskRun, entryToNode4) {
  return findFirstDescendantsOfType(asyncTaskRun, entryToNode4, TraceEvents_exports.isProfileCall, TraceEvents_exports.isDebuggerAsyncTaskRun);
}
function findFirstDescendantsOfType(root2, entryToNode4, predicateAccept, predicateIgnore) {
  const node = entryToNode4.get(root2);
  if (!node) {
    return [];
  }
  const childrenGroups = [[...node.children]];
  const firstDescendants = [];
  for (let i = 0; i < childrenGroups.length; i++) {
    const siblings = childrenGroups[i];
    for (let j = 0; j < siblings.length; j++) {
      const node2 = siblings[j];
      if (predicateAccept(node2.entry)) {
        firstDescendants.push(node2.entry);
      } else if (!predicateIgnore(node2.entry)) {
        childrenGroups.push([...node2.children]);
      }
    }
  }
  return firstDescendants;
}
function data9() {
  return {
    schedulerToRunEntryPoints,
    asyncCallToScheduler,
    runEntryPointToScheduler
  };
}
function deps4() {
  return ["Renderer", "Flows"];
}
var schedulerToRunEntryPoints, taskScheduleForTaskRunEvent, asyncCallToScheduler, runEntryPointToScheduler;
var init_AsyncJSCallsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/AsyncJSCallsHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    init_FlowsHandler();
    init_RendererHandler();
    schedulerToRunEntryPoints = /* @__PURE__ */ new Map();
    taskScheduleForTaskRunEvent = /* @__PURE__ */ new Map();
    asyncCallToScheduler = /* @__PURE__ */ new Map();
    runEntryPointToScheduler = /* @__PURE__ */ new Map();
    __name(reset9, "reset");
    __name(handleEvent9, "handleEvent");
    __name(finalize9, "finalize");
    __name(findNearestJSAncestor, "findNearestJSAncestor");
    __name(acceptJSInvocationsPredicate, "acceptJSInvocationsPredicate");
    __name(findFirstJsInvocationForAsyncTaskRun, "findFirstJsInvocationForAsyncTaskRun");
    __name(findFirstJSCallsForAsyncTaskRun, "findFirstJSCallsForAsyncTaskRun");
    __name(findFirstDescendantsOfType, "findFirstDescendantsOfType");
    __name(data9, "data");
    __name(deps4, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/DOMStatsHandler.js
var DOMStatsHandler_exports = {};
__export(DOMStatsHandler_exports, {
  data: () => data10,
  finalize: () => finalize10,
  handleEvent: () => handleEvent10,
  reset: () => reset10
});
function reset10() {
  domStatsByFrameId = /* @__PURE__ */ new Map();
}
function handleEvent10(event) {
  if (!TraceEvents_exports.isDOMStats(event)) {
    return;
  }
  const domStatEvents = MapUtilities_exports.getWithDefault(domStatsByFrameId, event.args.data.frame, () => []);
  domStatEvents.push(event);
}
async function finalize10() {
}
function data10() {
  return { domStatsByFrameId };
}
var domStatsByFrameId;
var init_DOMStatsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/DOMStatsHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    domStatsByFrameId = /* @__PURE__ */ new Map();
    __name(reset10, "reset");
    __name(handleEvent10, "handleEvent");
    __name(finalize10, "finalize");
    __name(data10, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/UserTimingsHandler.js
var UserTimingsHandler_exports = {};
__export(UserTimingsHandler_exports, {
  data: () => data11,
  finalize: () => finalize11,
  handleEvent: () => handleEvent11,
  reset: () => reset11,
  userTimingComparator: () => userTimingComparator
});
function reset11() {
  syntheticEvents = [];
  performanceMeasureEvents = [];
  performanceMarkEvents = [];
  consoleTimings = [];
  timestampEvents = [];
  measureTraceByTraceId = /* @__PURE__ */ new Map();
}
function getEventTimings(event) {
  if ("dur" in event) {
    return { start: event.ts, end: Timing_exports.Micro(event.ts + (event.dur ?? 0)) };
  }
  if (TraceEvents_exports.isConsoleTimeStamp(event)) {
    const { start, end } = event.args.data || {};
    if (typeof start === "number" && typeof end === "number") {
      return { start: Timing_exports.Micro(start), end: Timing_exports.Micro(end) };
    }
  }
  return { start: event.ts, end: event.ts };
}
function getEventTrack(event) {
  if (event.cat === "blink.user_timing") {
    const detailString = event.args.data.beginEvent.args?.detail;
    if (detailString) {
      const details = Trace_exports.parseDevtoolsDetails(detailString, "devtools");
      if (details && "track" in details) {
        return details.track;
      }
    }
  } else if (TraceEvents_exports.isConsoleTimeStamp(event)) {
    const track = event.args.data?.track;
    return typeof track === "string" ? track : void 0;
  }
  return void 0;
}
function userTimingComparator(a, b, originalArray) {
  const { start: aStart, end: aEnd } = getEventTimings(a);
  const { start: bStart, end: bEnd } = getEventTimings(b);
  const timeDifference = Trace_exports.compareBeginAndEnd(aStart, bStart, aEnd, bEnd);
  if (timeDifference) {
    return timeDifference;
  }
  const aTrack = getEventTrack(a);
  const bTrack = getEventTrack(b);
  if (aTrack !== bTrack) {
    return 0;
  }
  const aIndex = originalArray.indexOf(a);
  const bIndex = originalArray.indexOf(b);
  return bIndex - aIndex;
}
function handleEvent11(event) {
  if (ignoredNames.includes(event.name)) {
    return;
  }
  if (TraceEvents_exports.isUserTimingMeasure(event)) {
    measureTraceByTraceId.set(event.args.traceId, event);
  }
  if (TraceEvents_exports.isPerformanceMeasure(event)) {
    performanceMeasureEvents.push(event);
    return;
  }
  if (TraceEvents_exports.isPerformanceMark(event)) {
    performanceMarkEvents.push(event);
  }
  if (TraceEvents_exports.isConsoleTime(event)) {
    consoleTimings.push(event);
  }
  if (TraceEvents_exports.isConsoleTimeStamp(event)) {
    timestampEvents.push(event);
  }
}
async function finalize11() {
  const asyncEvents = [...performanceMeasureEvents, ...consoleTimings];
  syntheticEvents = Trace_exports.createMatchedSortedSyntheticEvents(asyncEvents);
  syntheticEvents = syntheticEvents.sort((a, b) => userTimingComparator(a, b, [...syntheticEvents]));
  timestampEvents = timestampEvents.sort((a, b) => userTimingComparator(a, b, [...timestampEvents]));
}
function data11() {
  return {
    consoleTimings: syntheticEvents.filter((e) => e.cat === "blink.console"),
    performanceMeasures: syntheticEvents.filter((e) => e.cat === "blink.user_timing"),
    performanceMarks: performanceMarkEvents,
    timestampEvents,
    measureTraceByTraceId
  };
}
var syntheticEvents, measureTraceByTraceId, performanceMeasureEvents, performanceMarkEvents, consoleTimings, timestampEvents, resourceTimingNames, navTimingNames, ignoredNames;
var init_UserTimingsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/UserTimingsHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    syntheticEvents = [];
    measureTraceByTraceId = /* @__PURE__ */ new Map();
    performanceMeasureEvents = [];
    performanceMarkEvents = [];
    consoleTimings = [];
    timestampEvents = [];
    __name(reset11, "reset");
    resourceTimingNames = [
      "workerStart",
      "redirectStart",
      "redirectEnd",
      "fetchStart",
      "domainLookupStart",
      "domainLookupEnd",
      "connectStart",
      "connectEnd",
      "secureConnectionStart",
      "requestStart",
      "responseStart",
      "responseEnd"
    ];
    navTimingNames = [
      "navigationStart",
      "unloadEventStart",
      "unloadEventEnd",
      "redirectStart",
      "redirectEnd",
      "fetchStart",
      "commitNavigationEnd",
      "domainLookupStart",
      "domainLookupEnd",
      "connectStart",
      "connectEnd",
      "secureConnectionStart",
      "requestStart",
      "responseStart",
      "responseEnd",
      "domLoading",
      "domInteractive",
      "domContentLoadedEventStart",
      "domContentLoadedEventEnd",
      "domComplete",
      "loadEventStart",
      "loadEventEnd"
    ];
    ignoredNames = [...resourceTimingNames, ...navTimingNames];
    __name(getEventTimings, "getEventTimings");
    __name(getEventTrack, "getEventTrack");
    __name(userTimingComparator, "userTimingComparator");
    __name(handleEvent11, "handleEvent");
    __name(finalize11, "finalize");
    __name(data11, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/ExtensionTraceDataHandler.js
var ExtensionTraceDataHandler_exports = {};
__export(ExtensionTraceDataHandler_exports, {
  data: () => data12,
  deps: () => deps5,
  extensionDataInConsoleTimeStamp: () => extensionDataInConsoleTimeStamp,
  extensionDataInPerformanceTiming: () => extensionDataInPerformanceTiming,
  extractConsoleAPIExtensionEntries: () => extractConsoleAPIExtensionEntries,
  extractPerformanceAPIExtensionEntries: () => extractPerformanceAPIExtensionEntries,
  finalize: () => finalize12,
  handleEvent: () => handleEvent12,
  reset: () => reset12
});
function handleEvent12(_event) {
}
function reset12() {
  extensionTrackEntries = [];
  syntheticConsoleEntriesForTimingsTrack = [];
  extensionTrackData = [];
  extensionMarkers = [];
  entryToNode3 = /* @__PURE__ */ new Map();
  timeStampByName = /* @__PURE__ */ new Map();
}
async function finalize12() {
  createExtensionFlameChartEntries();
}
function createExtensionFlameChartEntries() {
  const pairedMeasures = data11().performanceMeasures;
  const marks = data11().performanceMarks;
  const mergedRawExtensionEvents = Trace_exports.mergeEventsInOrder(pairedMeasures, marks);
  extractPerformanceAPIExtensionEntries(mergedRawExtensionEvents);
  extractConsoleAPIExtensionEntries();
  Trace_exports.sortTraceEventsInPlace(extensionTrackEntries);
  Extensions_exports2.buildTrackDataFromExtensionEntries(extensionTrackEntries, extensionTrackData, entryToNode3);
}
function extractConsoleAPIExtensionEntries() {
  const consoleTimeStamps = data11().timestampEvents;
  for (const currentTimeStamp of consoleTimeStamps) {
    if (!currentTimeStamp.args.data) {
      continue;
    }
    const timeStampName = String(currentTimeStamp.args.data.name ?? currentTimeStamp.args.data.message);
    timeStampByName.set(timeStampName, currentTimeStamp);
    const { devtoolsObj: extensionData, userDetail } = extensionDataInConsoleTimeStamp(currentTimeStamp);
    const start = currentTimeStamp.args.data.start;
    const end = currentTimeStamp.args.data.end;
    if (!extensionData && !start && !end) {
      continue;
    }
    const startTimeStamp = typeof start === "number" ? Timing_exports.Micro(start) : timeStampByName.get(String(start))?.ts;
    const endTimeStamp = typeof end === "number" ? Timing_exports.Micro(end) : timeStampByName.get(String(end))?.ts;
    if (endTimeStamp !== void 0 && startTimeStamp === void 0) {
      continue;
    }
    const entryStartTime = startTimeStamp ?? currentTimeStamp.ts;
    const entryEndTime = endTimeStamp ?? currentTimeStamp.ts;
    if (extensionData) {
      const unregisteredExtensionEntry = {
        ...currentTimeStamp,
        name: timeStampName,
        cat: "devtools.extension",
        devtoolsObj: extensionData,
        userDetail,
        rawSourceEvent: currentTimeStamp,
        dur: Timing_exports.Micro(entryEndTime - entryStartTime),
        ts: entryStartTime,
        ph: TraceEvents_exports.Phase.COMPLETE
      };
      const extensionEntry = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent(unregisteredExtensionEntry);
      extensionTrackEntries.push(extensionEntry);
      continue;
    }
    const unregisteredSyntheticTimeStamp = {
      ...currentTimeStamp,
      name: timeStampName,
      cat: "disabled-by-default-v8.inspector",
      ph: TraceEvents_exports.Phase.COMPLETE,
      ts: entryStartTime,
      dur: Timing_exports.Micro(entryEndTime - entryStartTime),
      rawSourceEvent: currentTimeStamp
    };
    const syntheticTimeStamp = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent(unregisteredSyntheticTimeStamp);
    syntheticConsoleEntriesForTimingsTrack.push(syntheticTimeStamp);
  }
}
function extractPerformanceAPIExtensionEntries(timings) {
  for (const timing of timings) {
    const { devtoolsObj, userDetail } = extensionDataInPerformanceTiming(timing);
    if (!devtoolsObj) {
      continue;
    }
    const extensionSyntheticEntry = {
      name: timing.name,
      ph: Extensions_exports.isExtensionPayloadMarker(devtoolsObj) ? TraceEvents_exports.Phase.INSTANT : TraceEvents_exports.Phase.COMPLETE,
      pid: timing.pid,
      tid: timing.tid,
      ts: timing.ts,
      dur: timing.dur,
      cat: "devtools.extension",
      devtoolsObj,
      userDetail,
      rawSourceEvent: TraceEvents_exports.isSyntheticUserTiming(timing) ? timing.rawSourceEvent : timing
    };
    if (Extensions_exports.isExtensionPayloadMarker(devtoolsObj)) {
      const extensionMarker = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent(extensionSyntheticEntry);
      extensionMarkers.push(extensionMarker);
      continue;
    }
    if (Extensions_exports.isExtensionEntryObj(extensionSyntheticEntry.devtoolsObj)) {
      const extensionTrackEntry = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent(extensionSyntheticEntry);
      extensionTrackEntries.push(extensionTrackEntry);
      continue;
    }
  }
}
function extensionDataInPerformanceTiming(timing) {
  const timingDetail = TraceEvents_exports.isPerformanceMark(timing) ? timing.args.data?.detail : timing.args.data.beginEvent.args.detail;
  if (!timingDetail) {
    return { devtoolsObj: null, userDetail: null };
  }
  const devtoolsObj = Trace_exports.parseDevtoolsDetails(timingDetail, "devtools");
  let userDetail = null;
  try {
    userDetail = JSON.parse(timingDetail);
    delete userDetail.devtools;
  } catch {
  }
  return { devtoolsObj, userDetail };
}
function extensionDataInConsoleTimeStamp(timeStamp) {
  if (!timeStamp.args.data || !timeStamp.args.data.track) {
    return { devtoolsObj: null, userDetail: null };
  }
  let userDetail = null;
  try {
    userDetail = JSON.parse(timeStamp.args.data?.devtools || '""');
  } catch {
  }
  const devtoolsObj = {
    // the color is defaulted to primary if it's value isn't one from
    // the defined palette (see ExtensionUI::extensionEntryColor) so
    // we don't need to check the value is valid here.
    color: String(timeStamp.args.data.color),
    track: String(timeStamp.args.data.track),
    dataType: "track-entry",
    trackGroup: timeStamp.args.data.trackGroup !== void 0 ? String(timeStamp.args.data.trackGroup) : void 0
  };
  return { devtoolsObj, userDetail };
}
function data12() {
  return {
    entryToNode: entryToNode3,
    extensionTrackData,
    extensionMarkers,
    syntheticConsoleEntriesForTimingsTrack
  };
}
function deps5() {
  return ["UserTimings"];
}
var extensionTrackEntries, extensionTrackData, extensionMarkers, entryToNode3, timeStampByName, syntheticConsoleEntriesForTimingsTrack;
var init_ExtensionTraceDataHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/ExtensionTraceDataHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    init_UserTimingsHandler();
    extensionTrackEntries = [];
    extensionTrackData = [];
    extensionMarkers = [];
    entryToNode3 = /* @__PURE__ */ new Map();
    timeStampByName = /* @__PURE__ */ new Map();
    syntheticConsoleEntriesForTimingsTrack = [];
    __name(handleEvent12, "handleEvent");
    __name(reset12, "reset");
    __name(finalize12, "finalize");
    __name(createExtensionFlameChartEntries, "createExtensionFlameChartEntries");
    __name(extractConsoleAPIExtensionEntries, "extractConsoleAPIExtensionEntries");
    __name(extractPerformanceAPIExtensionEntries, "extractPerformanceAPIExtensionEntries");
    __name(extensionDataInPerformanceTiming, "extensionDataInPerformanceTiming");
    __name(extensionDataInConsoleTimeStamp, "extensionDataInConsoleTimeStamp");
    __name(data12, "data");
    __name(deps5, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/LayerTreeHandler.js
var LayerTreeHandler_exports = {};
__export(LayerTreeHandler_exports, {
  data: () => data13,
  deps: () => deps6,
  finalize: () => finalize13,
  handleEvent: () => handleEvent13,
  reset: () => reset13
});
function reset13() {
  paintEvents = [];
  snapshotEvents = [];
  paintToSnapshotMap = /* @__PURE__ */ new Map();
  lastPaintForLayerId = {};
  currentMainFrameLayerTreeId = null;
  updateLayerEvents = [];
  relevantEvents = [];
}
function handleEvent13(event) {
  if (TraceEvents_exports.isPaint(event) || TraceEvents_exports.isDisplayListItemListSnapshot(event) || TraceEvents_exports.isUpdateLayer(event) || TraceEvents_exports.isSetLayerId(event)) {
    relevantEvents.push(event);
  }
}
async function finalize13() {
  const metaData = data5();
  Trace_exports.sortTraceEventsInPlace(relevantEvents);
  for (const event of relevantEvents) {
    if (TraceEvents_exports.isSetLayerId(event)) {
      if (metaData.mainFrameId !== event.args.data.frame) {
        continue;
      }
      currentMainFrameLayerTreeId = event.args.data.layerTreeId;
    } else if (TraceEvents_exports.isUpdateLayer(event)) {
      updateLayerEvents.push(event);
    } else if (TraceEvents_exports.isPaint(event)) {
      if (!event.args.data.layerId) {
        continue;
      }
      paintEvents.push(event);
      lastPaintForLayerId[event.args.data.layerId] = event;
      continue;
    } else if (TraceEvents_exports.isDisplayListItemListSnapshot(event)) {
      let lastUpdateLayerEventForThread = null;
      for (let i = updateLayerEvents.length - 1; i > -1; i--) {
        const updateEvent = updateLayerEvents[i];
        if (updateEvent.pid === event.pid && updateEvent.tid === event.tid) {
          lastUpdateLayerEventForThread = updateEvent;
          break;
        }
      }
      if (!lastUpdateLayerEventForThread) {
        continue;
      }
      if (lastUpdateLayerEventForThread.args.layerTreeId !== currentMainFrameLayerTreeId) {
        continue;
      }
      const paintEvent = lastPaintForLayerId[lastUpdateLayerEventForThread.args.layerId];
      if (!paintEvent) {
        continue;
      }
      snapshotEvents.push(event);
      paintToSnapshotMap.set(paintEvent, event);
    }
  }
}
function data13() {
  return {
    paints: paintEvents,
    snapshots: snapshotEvents,
    paintsToSnapshots: paintToSnapshotMap
  };
}
function deps6() {
  return ["Meta"];
}
var paintEvents, snapshotEvents, paintToSnapshotMap, lastPaintForLayerId, currentMainFrameLayerTreeId, updateLayerEvents, relevantEvents;
var init_LayerTreeHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/LayerTreeHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    init_MetaHandler();
    paintEvents = [];
    snapshotEvents = [];
    paintToSnapshotMap = /* @__PURE__ */ new Map();
    lastPaintForLayerId = {};
    currentMainFrameLayerTreeId = null;
    updateLayerEvents = [];
    relevantEvents = [];
    __name(reset13, "reset");
    __name(handleEvent13, "handleEvent");
    __name(finalize13, "finalize");
    __name(data13, "data");
    __name(deps6, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/Threads.js
var Threads_exports = {};
__export(Threads_exports, {
  ThreadType: () => ThreadType,
  threadsInRenderer: () => threadsInRenderer,
  threadsInTrace: () => threadsInTrace
});
function getThreadTypeForRendererThread(pid, thread, auctionWorkletsData) {
  let threadType = ThreadType.OTHER;
  if (thread.name === "CrRendererMain") {
    threadType = ThreadType.MAIN_THREAD;
  } else if (thread.name === "DedicatedWorker thread") {
    threadType = ThreadType.WORKER;
  } else if (thread.name?.startsWith("CompositorTileWorker")) {
    threadType = ThreadType.RASTERIZER;
  } else if (auctionWorkletsData.worklets.has(pid)) {
    threadType = ThreadType.AUCTION_WORKLET;
  } else if (thread.name?.startsWith("ThreadPool")) {
    threadType = ThreadType.THREAD_POOL;
  }
  return threadType;
}
function threadsInRenderer(rendererData, auctionWorkletsData) {
  const foundThreads = [];
  if (rendererData.processes.size) {
    for (const [pid, process5] of rendererData.processes) {
      for (const [tid, thread] of process5.threads) {
        if (!thread.tree) {
          continue;
        }
        const threadType = getThreadTypeForRendererThread(pid, thread, auctionWorkletsData);
        foundThreads.push({
          name: thread.name,
          pid,
          tid,
          processIsOnMainFrame: process5.isOnMainFrame,
          entries: thread.entries,
          tree: thread.tree,
          type: threadType,
          entryToNode: rendererData.entryToNode
        });
      }
    }
  }
  return foundThreads;
}
function threadsInTrace(handlerData) {
  const cached = threadsInHandlerDataCache.get(handlerData);
  if (cached) {
    return cached;
  }
  const threadsFromRenderer = threadsInRenderer(handlerData.Renderer, handlerData.AuctionWorklets);
  if (threadsFromRenderer.length) {
    threadsInHandlerDataCache.set(handlerData, threadsFromRenderer);
    return threadsFromRenderer;
  }
  const foundThreads = [];
  if (handlerData.Samples.profilesInProcess.size) {
    for (const [pid, process5] of handlerData.Samples.profilesInProcess) {
      for (const [tid, thread] of process5) {
        if (!thread.profileTree) {
          continue;
        }
        foundThreads.push({
          pid,
          tid,
          // CPU Profile threads do not have a name.
          name: null,
          entries: thread.profileCalls,
          // There is no concept of a "Main Frame" in a CPU profile.
          processIsOnMainFrame: false,
          tree: thread.profileTree,
          type: ThreadType.CPU_PROFILE,
          entryToNode: handlerData.Samples.entryToNode
        });
      }
    }
  }
  threadsInHandlerDataCache.set(handlerData, foundThreads);
  return foundThreads;
}
var ThreadType, threadsInHandlerDataCache;
var init_Threads = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/Threads.js"() {
    init_process_global();
    (function(ThreadType2) {
      ThreadType2["MAIN_THREAD"] = "MAIN_THREAD";
      ThreadType2["WORKER"] = "WORKER";
      ThreadType2["RASTERIZER"] = "RASTERIZER";
      ThreadType2["AUCTION_WORKLET"] = "AUCTION_WORKLET";
      ThreadType2["OTHER"] = "OTHER";
      ThreadType2["CPU_PROFILE"] = "CPU_PROFILE";
      ThreadType2["THREAD_POOL"] = "THREAD_POOL";
    })(ThreadType || (ThreadType = {}));
    __name(getThreadTypeForRendererThread, "getThreadTypeForRendererThread");
    __name(threadsInRenderer, "threadsInRenderer");
    threadsInHandlerDataCache = /* @__PURE__ */ new WeakMap();
    __name(threadsInTrace, "threadsInTrace");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/FramesHandler.js
var FramesHandler_exports = {};
__export(FramesHandler_exports, {
  LayerPaintEvent: () => LayerPaintEvent,
  PendingFrame: () => PendingFrame,
  TimelineFrameBeginFrameQueue: () => TimelineFrameBeginFrameQueue,
  TimelineFrameModel: () => TimelineFrameModel,
  data: () => data14,
  deps: () => deps7,
  finalize: () => finalize14,
  framesWithinWindow: () => framesWithinWindow,
  handleEvent: () => handleEvent14,
  reset: () => reset14
});
function isFrameEvent(event) {
  return TraceEvents_exports.isSetLayerId(event) || TraceEvents_exports.isBeginFrame(event) || TraceEvents_exports.isDroppedFrame(event) || TraceEvents_exports.isRequestMainThreadFrame(event) || TraceEvents_exports.isBeginMainThreadFrame(event) || TraceEvents_exports.isNeedsBeginFrameChanged(event) || // Note that "Commit" is the replacement for "CompositeLayers" so in a trace
  // we wouldn't expect to see a combination of these. All "new" trace
  // recordings use "Commit", but we can easily support "CompositeLayers" too
  // to not break older traces being imported.
  TraceEvents_exports.isCommit(event) || TraceEvents_exports.isCompositeLayers(event) || TraceEvents_exports.isActivateLayerTree(event) || TraceEvents_exports.isDrawFrame(event);
}
function entryIsTopLevel(entry) {
  const devtoolsTimelineCategory = "disabled-by-default-devtools.timeline";
  return entry.name === TraceEvents_exports.Name.RUN_TASK && entry.cat.includes(devtoolsTimelineCategory);
}
function reset14() {
  model = null;
  relevantFrameEvents = [];
}
function handleEvent14(event) {
  if (isFrameEvent(event) || TraceEvents_exports.isLayerTreeHostImplSnapshot(event) || entryIsTopLevel(event) || MAIN_FRAME_MARKERS.has(event.name) || TraceEvents_exports.isPaint(event)) {
    relevantFrameEvents.push(event);
  }
}
async function finalize14() {
  Trace_exports.sortTraceEventsInPlace(relevantFrameEvents);
  const modelForTrace = new TimelineFrameModel(relevantFrameEvents, data8(), data4(), data5(), data13());
  model = modelForTrace;
}
function data14() {
  return {
    frames: model?.frames() ?? [],
    framesById: model?.framesById() ?? {}
  };
}
function deps7() {
  return ["Meta", "Renderer", "AuctionWorklets", "LayerTree"];
}
function framesWithinWindow(frames2, startTime, endTime) {
  const firstFrame = ArrayUtilities_exports.lowerBound(frames2, startTime || 0, (time, frame) => time - frame.endTime);
  const lastFrame = ArrayUtilities_exports.lowerBound(frames2, endTime || Infinity, (time, frame) => time - frame.startTime);
  return frames2.slice(firstFrame, lastFrame);
}
var model, relevantFrameEvents, MAIN_FRAME_MARKERS, TimelineFrameModel, TimelineFrame, LayerPaintEvent, PendingFrame, BeginFrameInfo, TimelineFrameBeginFrameQueue;
var init_FramesHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/FramesHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_AuctionWorkletsHandler();
    init_LayerTreeHandler();
    init_MetaHandler();
    init_RendererHandler();
    init_Threads();
    model = null;
    relevantFrameEvents = [];
    __name(isFrameEvent, "isFrameEvent");
    __name(entryIsTopLevel, "entryIsTopLevel");
    MAIN_FRAME_MARKERS = /* @__PURE__ */ new Set([
      TraceEvents_exports.Name.SCHEDULE_STYLE_RECALCULATION,
      TraceEvents_exports.Name.INVALIDATE_LAYOUT,
      TraceEvents_exports.Name.BEGIN_MAIN_THREAD_FRAME,
      TraceEvents_exports.Name.SCROLL_LAYER
    ]);
    __name(reset14, "reset");
    __name(handleEvent14, "handleEvent");
    __name(finalize14, "finalize");
    __name(data14, "data");
    __name(deps7, "deps");
    TimelineFrameModel = class {
      static {
        __name(this, "TimelineFrameModel");
      }
      #frames = [];
      #frameById = {};
      #beginFrameQueue = new TimelineFrameBeginFrameQueue();
      #lastFrame = null;
      #mainFrameCommitted = false;
      #mainFrameRequested = false;
      #lastLayerTree = null;
      #framePendingActivation = null;
      #framePendingCommit = null;
      #lastBeginFrame = null;
      #lastNeedsBeginFrame = null;
      #lastTaskBeginTime = null;
      #layerTreeId = null;
      #activeProcessId = null;
      #activeThreadId = null;
      #layerTreeData;
      constructor(allEvents, rendererData, auctionWorkletsData, metaData, layerTreeData) {
        const mainThreads = threadsInRenderer(rendererData, auctionWorkletsData).filter((thread) => {
          return thread.type === ThreadType.MAIN_THREAD && thread.processIsOnMainFrame;
        });
        const threadData = mainThreads.map((thread) => {
          return {
            tid: thread.tid,
            pid: thread.pid,
            startTime: thread.entries[0].ts
          };
        });
        this.#layerTreeData = layerTreeData;
        this.#addTraceEvents(allEvents, threadData, metaData.mainFrameId);
      }
      framesById() {
        return this.#frameById;
      }
      frames() {
        return this.#frames;
      }
      #handleBeginFrame(startTime, seqId) {
        if (!this.#lastFrame) {
          this.#startFrame(startTime, seqId);
        }
        this.#lastBeginFrame = startTime;
        this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, false, false);
      }
      #handleDroppedFrame(startTime, seqId, isPartial) {
        if (!this.#lastFrame) {
          this.#startFrame(startTime, seqId);
        }
        this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, true, isPartial);
        this.#beginFrameQueue.setDropped(seqId, true);
        this.#beginFrameQueue.setPartial(seqId, isPartial);
      }
      #handleDrawFrame(startTime, seqId) {
        if (!this.#lastFrame) {
          this.#startFrame(startTime, seqId);
          return;
        }
        if (this.#mainFrameCommitted || !this.#mainFrameRequested) {
          if (this.#lastNeedsBeginFrame) {
            const idleTimeEnd = this.#framePendingActivation ? this.#framePendingActivation.triggerTime : this.#lastBeginFrame || this.#lastNeedsBeginFrame;
            if (idleTimeEnd > this.#lastFrame.startTime) {
              this.#lastFrame.idle = true;
              this.#lastBeginFrame = null;
            }
            this.#lastNeedsBeginFrame = null;
          }
          const framesToVisualize = this.#beginFrameQueue.processPendingBeginFramesOnDrawFrame(seqId);
          for (const frame of framesToVisualize) {
            const isLastFrameIdle = this.#lastFrame.idle;
            this.#startFrame(frame.startTime, seqId);
            if (isLastFrameIdle && this.#framePendingActivation) {
              this.#commitPendingFrame();
            }
            if (frame.isDropped) {
              this.#lastFrame.dropped = true;
            }
            if (frame.isPartial) {
              this.#lastFrame.isPartial = true;
            }
          }
        }
        this.#mainFrameCommitted = false;
      }
      #handleActivateLayerTree() {
        if (!this.#lastFrame) {
          return;
        }
        if (this.#framePendingActivation && !this.#lastNeedsBeginFrame) {
          this.#commitPendingFrame();
        }
      }
      #handleRequestMainThreadFrame() {
        if (!this.#lastFrame) {
          return;
        }
        this.#mainFrameRequested = true;
      }
      #handleCommit() {
        if (!this.#framePendingCommit) {
          return;
        }
        this.#framePendingActivation = this.#framePendingCommit;
        this.#framePendingCommit = null;
        this.#mainFrameRequested = false;
        this.#mainFrameCommitted = true;
      }
      #handleLayerTreeSnapshot(layerTree) {
        this.#lastLayerTree = layerTree;
      }
      #handleNeedFrameChanged(startTime, needsBeginFrame) {
        if (needsBeginFrame) {
          this.#lastNeedsBeginFrame = startTime;
        }
      }
      #startFrame(startTime, seqId) {
        if (this.#lastFrame) {
          this.#flushFrame(this.#lastFrame, startTime);
        }
        this.#lastFrame = new TimelineFrame(seqId, startTime, Timing_exports.Micro(startTime - data5().traceBounds.min));
      }
      #flushFrame(frame, endTime) {
        frame.setLayerTree(this.#lastLayerTree);
        frame.setEndTime(endTime);
        if (this.#lastLayerTree) {
          this.#lastLayerTree.paints = frame.paints;
        }
        const lastFrame = this.#frames[this.#frames.length - 1];
        if (this.#frames.length && lastFrame && (frame.startTime !== lastFrame.endTime || frame.startTime > frame.endTime)) {
          console.assert(false, `Inconsistent frame time for frame ${this.#frames.length} (${frame.startTime} - ${frame.endTime})`);
        }
        const newFramesLength = this.#frames.push(frame);
        frame.setIndex(newFramesLength - 1);
        if (typeof frame.mainFrameId === "number") {
          this.#frameById[frame.mainFrameId] = frame;
        }
      }
      #commitPendingFrame() {
        if (!this.#framePendingActivation || !this.#lastFrame) {
          return;
        }
        this.#lastFrame.paints = this.#framePendingActivation.paints;
        this.#lastFrame.mainFrameId = this.#framePendingActivation.mainFrameId;
        this.#framePendingActivation = null;
      }
      #addTraceEvents(events, threadData, mainFrameId2) {
        let j = 0;
        this.#activeThreadId = threadData.length && threadData[0].tid || null;
        this.#activeProcessId = threadData.length && threadData[0].pid || null;
        for (let i = 0; i < events.length; ++i) {
          while (j + 1 < threadData.length && threadData[j + 1].startTime <= events[i].ts) {
            this.#activeThreadId = threadData[++j].tid;
            this.#activeProcessId = threadData[j].pid;
          }
          this.#addTraceEvent(events[i], mainFrameId2);
        }
        this.#activeThreadId = null;
        this.#activeProcessId = null;
      }
      #addTraceEvent(event, mainFrameId2) {
        if (TraceEvents_exports.isSetLayerId(event) && event.args.data.frame === mainFrameId2) {
          this.#layerTreeId = event.args.data.layerTreeId;
        } else if (TraceEvents_exports.isLayerTreeHostImplSnapshot(event) && Number(event.id) === this.#layerTreeId) {
          this.#handleLayerTreeSnapshot({
            entry: event,
            paints: []
          });
        } else {
          if (isFrameEvent(event)) {
            this.#processCompositorEvents(event);
          }
          if (event.tid === this.#activeThreadId && event.pid === this.#activeProcessId) {
            this.#addMainThreadTraceEvent(event);
          }
        }
      }
      #processCompositorEvents(entry) {
        if (entry.args["layerTreeId"] !== this.#layerTreeId) {
          return;
        }
        if (TraceEvents_exports.isBeginFrame(entry)) {
          this.#handleBeginFrame(entry.ts, entry.args["frameSeqId"]);
        } else if (TraceEvents_exports.isDrawFrame(entry)) {
          this.#handleDrawFrame(entry.ts, entry.args["frameSeqId"]);
        } else if (TraceEvents_exports.isActivateLayerTree(entry)) {
          this.#handleActivateLayerTree();
        } else if (TraceEvents_exports.isRequestMainThreadFrame(entry)) {
          this.#handleRequestMainThreadFrame();
        } else if (TraceEvents_exports.isNeedsBeginFrameChanged(entry)) {
          this.#handleNeedFrameChanged(entry.ts, entry.args["data"] && Boolean(entry.args["data"]["needsBeginFrame"]));
        } else if (TraceEvents_exports.isDroppedFrame(entry)) {
          this.#handleDroppedFrame(entry.ts, entry.args["frameSeqId"], Boolean(entry.args["hasPartialUpdate"]));
        }
      }
      #addMainThreadTraceEvent(entry) {
        if (entryIsTopLevel(entry)) {
          this.#lastTaskBeginTime = entry.ts;
        }
        if (!this.#framePendingCommit && MAIN_FRAME_MARKERS.has(entry.name)) {
          this.#framePendingCommit = new PendingFrame(this.#lastTaskBeginTime || entry.ts);
        }
        if (!this.#framePendingCommit) {
          return;
        }
        if (TraceEvents_exports.isBeginMainThreadFrame(entry) && entry.args.data.frameId) {
          this.#framePendingCommit.mainFrameId = entry.args.data.frameId;
        }
        if (TraceEvents_exports.isPaint(entry)) {
          const snapshot2 = this.#layerTreeData.paintsToSnapshots.get(entry);
          if (snapshot2) {
            this.#framePendingCommit.paints.push(new LayerPaintEvent(entry, snapshot2));
          }
        }
        if ((TraceEvents_exports.isCompositeLayers(entry) || TraceEvents_exports.isCommit(entry)) && entry.args["layerTreeId"] === this.#layerTreeId) {
          this.#handleCommit();
        }
      }
    };
    TimelineFrame = class {
      static {
        __name(this, "TimelineFrame");
      }
      // These fields exist to satisfy the base Event type which all
      // "trace events" must implement. They aren't used, but doing this means we
      // can pass `TimelineFrame` instances into places that expect
      // Types.Events.Event.
      cat = "devtools.legacy_frame";
      name = "frame";
      ph = TraceEvents_exports.Phase.COMPLETE;
      ts;
      pid = TraceEvents_exports.ProcessID(-1);
      tid = TraceEvents_exports.ThreadID(-1);
      index = -1;
      startTime;
      startTimeOffset;
      endTime;
      duration;
      idle;
      dropped;
      isPartial;
      layerTree;
      paints;
      mainFrameId;
      seqId;
      constructor(seqId, startTime, startTimeOffset) {
        this.seqId = seqId;
        this.startTime = startTime;
        this.ts = startTime;
        this.startTimeOffset = startTimeOffset;
        this.endTime = this.startTime;
        this.duration = Timing_exports.Micro(0);
        this.idle = false;
        this.dropped = false;
        this.isPartial = false;
        this.layerTree = null;
        this.paints = [];
        this.mainFrameId = void 0;
      }
      setIndex(i) {
        this.index = i;
      }
      setEndTime(endTime) {
        this.endTime = endTime;
        this.duration = Timing_exports.Micro(this.endTime - this.startTime);
      }
      setLayerTree(layerTree) {
        this.layerTree = layerTree;
      }
      /**
       * Fake the `dur` field to meet the expected value given that we pretend
       * these TimelineFrame classes are trace events across the codebase.
       */
      get dur() {
        return this.duration;
      }
    };
    LayerPaintEvent = class {
      static {
        __name(this, "LayerPaintEvent");
      }
      #event;
      #snapshot;
      constructor(event, snapshot2) {
        this.#event = event;
        this.#snapshot = snapshot2;
      }
      layerId() {
        return this.#event.args.data.layerId;
      }
      event() {
        return this.#event;
      }
      picture() {
        const rect = this.#snapshot.args.snapshot.params?.layer_rect;
        const pictureData = this.#snapshot.args.snapshot.skp64;
        return rect && pictureData ? { rect, serializedPicture: pictureData } : null;
      }
    };
    PendingFrame = class {
      static {
        __name(this, "PendingFrame");
      }
      paints;
      mainFrameId;
      triggerTime;
      constructor(triggerTime) {
        this.paints = [];
        this.mainFrameId = void 0;
        this.triggerTime = triggerTime;
      }
    };
    BeginFrameInfo = class {
      static {
        __name(this, "BeginFrameInfo");
      }
      seqId;
      startTime;
      isDropped;
      isPartial;
      constructor(seqId, startTime, isDropped, isPartial) {
        this.seqId = seqId;
        this.startTime = startTime;
        this.isDropped = isDropped;
        this.isPartial = isPartial;
      }
    };
    TimelineFrameBeginFrameQueue = class {
      static {
        __name(this, "TimelineFrameBeginFrameQueue");
      }
      queueFrames = [];
      // Maps frameSeqId to BeginFrameInfo.
      mapFrames = {};
      // Add a BeginFrame to the queue, if it does not already exit.
      addFrameIfNotExists(seqId, startTime, isDropped, isPartial) {
        if (!(seqId in this.mapFrames)) {
          this.mapFrames[seqId] = new BeginFrameInfo(seqId, startTime, isDropped, isPartial);
          this.queueFrames.push(seqId);
        }
      }
      // Set a BeginFrame in queue as dropped.
      setDropped(seqId, isDropped) {
        if (seqId in this.mapFrames) {
          this.mapFrames[seqId].isDropped = isDropped;
        }
      }
      setPartial(seqId, isPartial) {
        if (seqId in this.mapFrames) {
          this.mapFrames[seqId].isPartial = isPartial;
        }
      }
      processPendingBeginFramesOnDrawFrame(seqId) {
        const framesToVisualize = [];
        if (seqId in this.mapFrames) {
          while (this.queueFrames[0] !== seqId) {
            const currentSeqId = this.queueFrames[0];
            if (this.mapFrames[currentSeqId].isDropped) {
              framesToVisualize.push(this.mapFrames[currentSeqId]);
            }
            delete this.mapFrames[currentSeqId];
            this.queueFrames.shift();
          }
          framesToVisualize.push(this.mapFrames[seqId]);
          delete this.mapFrames[seqId];
          this.queueFrames.shift();
        }
        return framesToVisualize;
      }
    };
    __name(framesWithinWindow, "framesWithinWindow");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/GPUHandler.js
var GPUHandler_exports = {};
__export(GPUHandler_exports, {
  data: () => data15,
  deps: () => deps8,
  finalize: () => finalize15,
  handleEvent: () => handleEvent15,
  reset: () => reset15
});
function reset15() {
  eventsInProcessThread = /* @__PURE__ */ new Map();
  mainGPUThreadTasks = [];
}
function handleEvent15(event) {
  if (!TraceEvents_exports.isGPUTask(event)) {
    return;
  }
  Trace_exports.addEventToProcessThread(event, eventsInProcessThread);
}
async function finalize15() {
  const { gpuProcessId: gpuProcessId2, gpuThreadId: gpuThreadId2 } = data5();
  const gpuThreadsForProcess = eventsInProcessThread.get(gpuProcessId2);
  if (gpuThreadsForProcess && gpuThreadId2) {
    mainGPUThreadTasks = gpuThreadsForProcess.get(gpuThreadId2) || [];
  }
}
function data15() {
  return {
    mainGPUThreadTasks
  };
}
function deps8() {
  return ["Meta"];
}
var eventsInProcessThread, mainGPUThreadTasks;
var init_GPUHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/GPUHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    init_MetaHandler();
    eventsInProcessThread = /* @__PURE__ */ new Map();
    mainGPUThreadTasks = [];
    __name(reset15, "reset");
    __name(handleEvent15, "handleEvent");
    __name(finalize15, "finalize");
    __name(data15, "data");
    __name(deps8, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/ImagePaintingHandler.js
var ImagePaintingHandler_exports = {};
__export(ImagePaintingHandler_exports, {
  data: () => data16,
  finalize: () => finalize16,
  handleEvent: () => handleEvent16,
  reset: () => reset16
});
function reset16() {
  paintImageEvents = /* @__PURE__ */ new Map();
  decodeLazyPixelRefEvents = /* @__PURE__ */ new Map();
  paintImageByLazyPixelRef = /* @__PURE__ */ new Map();
  eventToPaintImage = /* @__PURE__ */ new Map();
  urlToPaintImage = /* @__PURE__ */ new Map();
  paintEventToCorrectedDisplaySize = /* @__PURE__ */ new Map();
  didCorrectForHostDpr = false;
}
function handleEvent16(event) {
  if (TraceEvents_exports.isPaintImage(event)) {
    const forProcess = paintImageEvents.get(event.pid) || /* @__PURE__ */ new Map();
    const forThread = forProcess.get(event.tid) || [];
    forThread.push(event);
    forProcess.set(event.tid, forThread);
    paintImageEvents.set(event.pid, forProcess);
    if (event.args.data.url) {
      const paintsForUrl = MapUtilities_exports.getWithDefault(urlToPaintImage, event.args.data.url, () => []);
      paintsForUrl.push(event);
    }
    return;
  }
  if (TraceEvents_exports.isDecodeLazyPixelRef(event) && typeof event.args?.LazyPixelRef !== "undefined") {
    const forProcess = decodeLazyPixelRefEvents.get(event.pid) || /* @__PURE__ */ new Map();
    const forThread = forProcess.get(event.tid) || [];
    forThread.push(event);
    forProcess.set(event.tid, forThread);
    decodeLazyPixelRefEvents.set(event.pid, forProcess);
  }
  if (TraceEvents_exports.isDrawLazyPixelRef(event) && typeof event.args?.LazyPixelRef !== "undefined") {
    const lastPaintEvent = paintImageEvents.get(event.pid)?.get(event.tid)?.at(-1);
    if (!lastPaintEvent) {
      return;
    }
    paintImageByLazyPixelRef.set(event.args.LazyPixelRef, lastPaintEvent);
    return;
  }
  if (TraceEvents_exports.isDecodeImage(event)) {
    const lastPaintImageEventOnThread = paintImageEvents.get(event.pid)?.get(event.tid)?.at(-1);
    if (lastPaintImageEventOnThread) {
      eventToPaintImage.set(event, lastPaintImageEventOnThread);
      return;
    }
    const lastDecodeLazyPixelRef = decodeLazyPixelRefEvents.get(event.pid)?.get(event.tid)?.at(-1);
    if (typeof lastDecodeLazyPixelRef?.args?.LazyPixelRef === "undefined") {
      return;
    }
    const paintEvent = paintImageByLazyPixelRef.get(lastDecodeLazyPixelRef.args.LazyPixelRef);
    if (!paintEvent) {
      return;
    }
    eventToPaintImage.set(event, paintEvent);
  }
}
async function finalize16(options) {
  if (!options.metadata?.hostDPR) {
    return;
  }
  const { devicePixelRatio: emulatedDpr } = data5();
  if (!emulatedDpr) {
    return;
  }
  for (const byThread of paintImageEvents.values()) {
    for (const paintEvents2 of byThread.values()) {
      for (const paintEvent of paintEvents2) {
        const cssPixelsWidth = paintEvent.args.data.width / options.metadata.hostDPR;
        const cssPixelsHeight = paintEvent.args.data.height / options.metadata.hostDPR;
        const width = cssPixelsWidth * emulatedDpr;
        const height = cssPixelsHeight * emulatedDpr;
        paintEventToCorrectedDisplaySize.set(paintEvent, { width, height });
      }
    }
  }
  didCorrectForHostDpr = true;
}
function data16() {
  return {
    paintImageByDrawLazyPixelRef: paintImageByLazyPixelRef,
    paintImageForEvent: eventToPaintImage,
    paintImageEventForUrl: urlToPaintImage,
    paintEventToCorrectedDisplaySize,
    didCorrectForHostDpr
  };
}
var paintImageEvents, decodeLazyPixelRefEvents, paintImageByLazyPixelRef, eventToPaintImage, urlToPaintImage, paintEventToCorrectedDisplaySize, didCorrectForHostDpr;
var init_ImagePaintingHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/ImagePaintingHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    init_MetaHandler();
    paintImageEvents = /* @__PURE__ */ new Map();
    decodeLazyPixelRefEvents = /* @__PURE__ */ new Map();
    paintImageByLazyPixelRef = /* @__PURE__ */ new Map();
    eventToPaintImage = /* @__PURE__ */ new Map();
    urlToPaintImage = /* @__PURE__ */ new Map();
    paintEventToCorrectedDisplaySize = /* @__PURE__ */ new Map();
    didCorrectForHostDpr = false;
    __name(reset16, "reset");
    __name(handleEvent16, "handleEvent");
    __name(finalize16, "finalize");
    __name(data16, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/InitiatorsHandler.js
var InitiatorsHandler_exports = {};
__export(InitiatorsHandler_exports, {
  data: () => data17,
  deps: () => deps9,
  finalize: () => finalize17,
  handleEvent: () => handleEvent17,
  reset: () => reset17
});
function reset17() {
  lastScheduleStyleRecalcByFrame = /* @__PURE__ */ new Map();
  lastInvalidationEventForFrame = /* @__PURE__ */ new Map();
  lastRecalcByFrame = /* @__PURE__ */ new Map();
  timerInstallEventsById = /* @__PURE__ */ new Map();
  eventToInitiatorMap2 = /* @__PURE__ */ new Map();
  initiatorToEventsMap = /* @__PURE__ */ new Map();
  requestIdleCallbackEventsById = /* @__PURE__ */ new Map();
  webSocketCreateEventsById = /* @__PURE__ */ new Map();
  schedulePostTaskCallbackEventsById = /* @__PURE__ */ new Map();
}
function storeInitiator(data31) {
  eventToInitiatorMap2.set(data31.event, data31.initiator);
  const eventsForInitiator = initiatorToEventsMap.get(data31.initiator) || [];
  eventsForInitiator.push(data31.event);
  initiatorToEventsMap.set(data31.initiator, eventsForInitiator);
}
function handleEvent17(event) {
  if (TraceEvents_exports.isScheduleStyleRecalculation(event)) {
    lastScheduleStyleRecalcByFrame.set(event.args.data.frame, event);
  } else if (TraceEvents_exports.isRecalcStyle(event)) {
    if (event.args.beginData) {
      lastRecalcByFrame.set(event.args.beginData.frame, event);
      const scheduledStyleForFrame = lastScheduleStyleRecalcByFrame.get(event.args.beginData.frame);
      if (scheduledStyleForFrame) {
        storeInitiator({
          event,
          initiator: scheduledStyleForFrame
        });
      }
    }
  } else if (TraceEvents_exports.isInvalidateLayout(event)) {
    let invalidationInitiator = event;
    if (!lastInvalidationEventForFrame.has(event.args.data.frame)) {
      const lastRecalcStyleForFrame = lastRecalcByFrame.get(event.args.data.frame);
      if (lastRecalcStyleForFrame) {
        const { endTime } = Timing_exports3.eventTimingsMicroSeconds(lastRecalcStyleForFrame);
        const initiatorOfRecalcStyle = eventToInitiatorMap2.get(lastRecalcStyleForFrame);
        if (initiatorOfRecalcStyle && endTime && endTime > event.ts) {
          invalidationInitiator = initiatorOfRecalcStyle;
        }
      }
    }
    lastInvalidationEventForFrame.set(event.args.data.frame, invalidationInitiator);
  } else if (TraceEvents_exports.isLayout(event)) {
    const lastInvalidation = lastInvalidationEventForFrame.get(event.args.beginData.frame);
    if (lastInvalidation) {
      storeInitiator({
        event,
        initiator: lastInvalidation
      });
    }
    lastInvalidationEventForFrame.delete(event.args.beginData.frame);
  } else if (TraceEvents_exports.isTimerInstall(event)) {
    timerInstallEventsById.set(event.args.data.timerId, event);
  } else if (TraceEvents_exports.isTimerFire(event)) {
    const matchingInstall = timerInstallEventsById.get(event.args.data.timerId);
    if (matchingInstall) {
      storeInitiator({ event, initiator: matchingInstall });
    }
  } else if (TraceEvents_exports.isRequestIdleCallback(event)) {
    requestIdleCallbackEventsById.set(event.args.data.id, event);
  } else if (TraceEvents_exports.isFireIdleCallback(event)) {
    const matchingRequestEvent = requestIdleCallbackEventsById.get(event.args.data.id);
    if (matchingRequestEvent) {
      storeInitiator({
        event,
        initiator: matchingRequestEvent
      });
    }
  } else if (TraceEvents_exports.isWebSocketCreate(event)) {
    webSocketCreateEventsById.set(event.args.data.identifier, event);
  } else if (TraceEvents_exports.isWebSocketInfo(event) || TraceEvents_exports.isWebSocketTransfer(event)) {
    const matchingCreateEvent = webSocketCreateEventsById.get(event.args.data.identifier);
    if (matchingCreateEvent) {
      storeInitiator({
        event,
        initiator: matchingCreateEvent
      });
    }
  } else if (TraceEvents_exports.isSchedulePostTaskCallback(event)) {
    schedulePostTaskCallbackEventsById.set(event.args.data.taskId, event);
  } else if (TraceEvents_exports.isRunPostTaskCallback(event) || TraceEvents_exports.isAbortPostTaskCallback(event)) {
    const matchingSchedule = schedulePostTaskCallbackEventsById.get(event.args.data.taskId);
    if (matchingSchedule) {
      storeInitiator({ event, initiator: matchingSchedule });
    }
  }
}
function createRelationshipsFromFlows() {
  const flows2 = data3().flows;
  for (let i = 0; i < flows2.length; i++) {
    const flow = flows2[i];
    for (let j = 0; j < flow.length - 1; j++) {
      storeInitiator({ event: flow[j + 1], initiator: flow[j] });
    }
  }
}
function createRelationshipsFromAsyncJSCalls() {
  const asyncCallEntries = data9().schedulerToRunEntryPoints.entries();
  for (const [asyncCaller, asyncCallees] of asyncCallEntries) {
    for (const asyncCallee of asyncCallees) {
      storeInitiator({ event: asyncCallee, initiator: asyncCaller });
    }
  }
}
async function finalize17() {
  createRelationshipsFromFlows();
  createRelationshipsFromAsyncJSCalls();
}
function data17() {
  return {
    eventToInitiator: eventToInitiatorMap2,
    initiatorToEvents: initiatorToEventsMap
  };
}
function deps9() {
  return ["Flows", "AsyncJSCalls"];
}
var lastScheduleStyleRecalcByFrame, lastInvalidationEventForFrame, lastRecalcByFrame, eventToInitiatorMap2, initiatorToEventsMap, timerInstallEventsById, requestIdleCallbackEventsById, webSocketCreateEventsById, schedulePostTaskCallbackEventsById;
var init_InitiatorsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/InitiatorsHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    init_AsyncJSCallsHandler();
    init_FlowsHandler();
    lastScheduleStyleRecalcByFrame = /* @__PURE__ */ new Map();
    lastInvalidationEventForFrame = /* @__PURE__ */ new Map();
    lastRecalcByFrame = /* @__PURE__ */ new Map();
    eventToInitiatorMap2 = /* @__PURE__ */ new Map();
    initiatorToEventsMap = /* @__PURE__ */ new Map();
    timerInstallEventsById = /* @__PURE__ */ new Map();
    requestIdleCallbackEventsById = /* @__PURE__ */ new Map();
    webSocketCreateEventsById = /* @__PURE__ */ new Map();
    schedulePostTaskCallbackEventsById = /* @__PURE__ */ new Map();
    __name(reset17, "reset");
    __name(storeInitiator, "storeInitiator");
    __name(handleEvent17, "handleEvent");
    __name(createRelationshipsFromFlows, "createRelationshipsFromFlows");
    __name(createRelationshipsFromAsyncJSCalls, "createRelationshipsFromAsyncJSCalls");
    __name(finalize17, "finalize");
    __name(data17, "data");
    __name(deps9, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/InvalidationsHandler.js
var InvalidationsHandler_exports = {};
__export(InvalidationsHandler_exports, {
  data: () => data18,
  finalize: () => finalize18,
  handleEvent: () => handleEvent18,
  handleUserConfig: () => handleUserConfig3,
  reset: () => reset18
});
function reset18() {
  frameStateByFrame.clear();
  maxInvalidationsPerEvent = null;
}
function handleUserConfig3(userConfig) {
  maxInvalidationsPerEvent = userConfig.maxInvalidationEventsPerEvent;
}
function getState(frameId) {
  let frameState = frameStateByFrame.get(frameId);
  if (!frameState) {
    frameState = {
      invalidationsForEvent: /* @__PURE__ */ new Map(),
      invalidationCountForEvent: /* @__PURE__ */ new Map(),
      lastRecalcStyleEvent: null,
      pendingInvalidations: [],
      hasPainted: false
    };
    frameStateByFrame.set(frameId, frameState);
  }
  return frameState;
}
function getFrameId(event) {
  if (TraceEvents_exports.isRecalcStyle(event) || TraceEvents_exports.isLayout(event)) {
    return event.args.beginData?.frame ?? null;
  }
  return event.args?.data?.frame ?? null;
}
function addInvalidationToEvent(frameState, event, invalidation) {
  const existingInvalidations = frameState.invalidationsForEvent.get(event) || [];
  existingInvalidations.push(invalidation);
  if (maxInvalidationsPerEvent !== null && existingInvalidations.length > maxInvalidationsPerEvent) {
    existingInvalidations.shift();
  }
  frameState.invalidationsForEvent.set(event, existingInvalidations);
  const count = frameState.invalidationCountForEvent.get(event) ?? 0;
  frameState.invalidationCountForEvent.set(event, count + 1);
}
function handleEvent18(event) {
  if (maxInvalidationsPerEvent === 0) {
    return;
  }
  const frameId = getFrameId(event);
  if (!frameId) {
    return;
  }
  const thisFrame = getState(frameId);
  if (TraceEvents_exports.isRecalcStyle(event)) {
    thisFrame.lastRecalcStyleEvent = event;
    for (const invalidation of thisFrame.pendingInvalidations) {
      if (TraceEvents_exports.isLayoutInvalidationTracking(invalidation)) {
        continue;
      }
      addInvalidationToEvent(thisFrame, event, invalidation);
    }
    return;
  }
  if (TraceEvents_exports.isInvalidationTracking(event)) {
    if (thisFrame.hasPainted) {
      thisFrame.pendingInvalidations.length = 0;
      thisFrame.lastRecalcStyleEvent = null;
      thisFrame.hasPainted = false;
    }
    if (thisFrame.lastRecalcStyleEvent && (TraceEvents_exports.isScheduleStyleInvalidationTracking(event) || TraceEvents_exports.isStyleRecalcInvalidationTracking(event) || TraceEvents_exports.isStyleInvalidatorInvalidationTracking(event))) {
      const recalcLastRecalc = thisFrame.lastRecalcStyleEvent;
      const recalcEndTime = recalcLastRecalc.ts + (recalcLastRecalc.dur || 0);
      if (event.ts >= recalcLastRecalc.ts && event.ts <= recalcEndTime) {
        addInvalidationToEvent(thisFrame, recalcLastRecalc, event);
      }
    }
    thisFrame.pendingInvalidations.push(event);
    return;
  }
  if (TraceEvents_exports.isPaint(event)) {
    thisFrame.hasPainted = true;
    return;
  }
  if (TraceEvents_exports.isLayout(event)) {
    for (const invalidation of thisFrame.pendingInvalidations) {
      if (!TraceEvents_exports.isLayoutInvalidationTracking(invalidation)) {
        continue;
      }
      addInvalidationToEvent(thisFrame, event, invalidation);
    }
  }
}
async function finalize18() {
}
function data18() {
  const invalidationsForEvent = /* @__PURE__ */ new Map();
  const invalidationCountForEvent = /* @__PURE__ */ new Map();
  for (const frame of frameStateByFrame.values()) {
    for (const [event, invalidations] of frame.invalidationsForEvent.entries()) {
      invalidationsForEvent.set(event, invalidations);
    }
    for (const [event, count] of frame.invalidationCountForEvent.entries()) {
      invalidationCountForEvent.set(event, count);
    }
  }
  return {
    invalidationsForEvent,
    invalidationCountForEvent
  };
}
var frameStateByFrame, maxInvalidationsPerEvent;
var init_InvalidationsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/InvalidationsHandler.js"() {
    init_process_global();
    init_types2();
    frameStateByFrame = /* @__PURE__ */ new Map();
    maxInvalidationsPerEvent = null;
    __name(reset18, "reset");
    __name(handleUserConfig3, "handleUserConfig");
    __name(getState, "getState");
    __name(getFrameId, "getFrameId");
    __name(addInvalidationToEvent, "addInvalidationToEvent");
    __name(handleEvent18, "handleEvent");
    __name(finalize18, "finalize");
    __name(data18, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/PageLoadMetricsHandler.js
var PageLoadMetricsHandler_exports = {};
__export(PageLoadMetricsHandler_exports, {
  MetricName: () => MetricName,
  ScoreClassification: () => ScoreClassification,
  data: () => data19,
  deps: () => deps10,
  finalize: () => finalize19,
  getFrameIdForPageLoadEvent: () => getFrameIdForPageLoadEvent,
  handleEvent: () => handleEvent19,
  metricIsLCP: () => metricIsLCP,
  reset: () => reset19,
  scoreClassificationForDOMContentLoaded: () => scoreClassificationForDOMContentLoaded,
  scoreClassificationForFirstContentfulPaint: () => scoreClassificationForFirstContentfulPaint,
  scoreClassificationForLargestContentfulPaint: () => scoreClassificationForLargestContentfulPaint,
  scoreClassificationForTimeToInteractive: () => scoreClassificationForTimeToInteractive,
  scoreClassificationForTotalBlockingTime: () => scoreClassificationForTotalBlockingTime
});
function reset19() {
  metricScoresByFrameId = /* @__PURE__ */ new Map();
  pageLoadEventsArray = [];
  allMarkerEvents = [];
  selectedLCPCandidateEvents = /* @__PURE__ */ new Set();
  metaCharsetCheckEventsByNavigation = /* @__PURE__ */ new Map();
  metaCharsetCheckEventsArray = [];
}
function handleEvent19(event) {
  if (TraceEvents_exports.isMetaCharsetCheck(event)) {
    metaCharsetCheckEventsArray.push(event);
    return;
  }
  if (!TraceEvents_exports.eventIsPageLoadEvent(event)) {
    return;
  }
  pageLoadEventsArray.push(event);
}
function storePageLoadMetricAgainstNavigationId(navigation2, event) {
  const frameId = getFrameIdForPageLoadEvent(event);
  const { rendererProcessesByFrame } = data5();
  const rendererProcessesInFrame = rendererProcessesByFrame.get(frameId);
  if (!rendererProcessesInFrame) {
    return;
  }
  const processData = rendererProcessesInFrame.get(event.pid);
  if (!processData) {
    return;
  }
  if (TraceEvents_exports.isNavigationStart(event)) {
    return;
  }
  if (TraceEvents_exports.isFirstContentfulPaint(event)) {
    const fcpTime = Timing_exports.Micro(event.ts - navigation2.ts);
    const classification = scoreClassificationForFirstContentfulPaint(fcpTime);
    const metricScore = { event, metricName: MetricName.FCP, classification, navigation: navigation2, timing: fcpTime };
    storeMetricScore(frameId, navigation2, metricScore);
    return;
  }
  if (TraceEvents_exports.isFirstPaint(event)) {
    const paintTime = Timing_exports.Micro(event.ts - navigation2.ts);
    const classification = ScoreClassification.UNCLASSIFIED;
    const metricScore = { event, metricName: MetricName.FP, classification, navigation: navigation2, timing: paintTime };
    storeMetricScore(frameId, navigation2, metricScore);
    return;
  }
  if (TraceEvents_exports.isMarkDOMContent(event)) {
    const dclTime = Timing_exports.Micro(event.ts - navigation2.ts);
    const metricScore = {
      event,
      metricName: MetricName.DCL,
      classification: scoreClassificationForDOMContentLoaded(dclTime),
      navigation: navigation2,
      timing: dclTime
    };
    storeMetricScore(frameId, navigation2, metricScore);
    return;
  }
  if (TraceEvents_exports.isInteractiveTime(event)) {
    const ttiValue = Timing_exports.Micro(event.ts - navigation2.ts);
    const tti = {
      event,
      metricName: MetricName.TTI,
      classification: scoreClassificationForTimeToInteractive(ttiValue),
      navigation: navigation2,
      timing: ttiValue
    };
    storeMetricScore(frameId, navigation2, tti);
    const tbtValue = Timing_exports3.milliToMicro(Timing_exports.Milli(event.args.args.total_blocking_time_ms));
    const tbt = {
      event,
      metricName: MetricName.TBT,
      classification: scoreClassificationForTotalBlockingTime(tbtValue),
      navigation: navigation2,
      timing: tbtValue
    };
    storeMetricScore(frameId, navigation2, tbt);
    return;
  }
  if (TraceEvents_exports.isMarkLoad(event)) {
    const loadTime = Timing_exports.Micro(event.ts - navigation2.ts);
    const metricScore = {
      event,
      metricName: MetricName.L,
      classification: ScoreClassification.UNCLASSIFIED,
      navigation: navigation2,
      timing: loadTime
    };
    storeMetricScore(frameId, navigation2, metricScore);
    return;
  }
  if (TraceEvents_exports.isAnyLargestContentfulPaintCandidate(event)) {
    const candidateIndex = event.args.data?.candidateIndex;
    if (!candidateIndex) {
      throw new Error("Largest Contentful Paint unexpectedly had no candidateIndex.");
    }
    const lcpTime = Timing_exports.Micro(event.ts - navigation2.ts);
    const lcp = {
      event,
      metricName: MetricName.LCP,
      classification: scoreClassificationForLargestContentfulPaint(lcpTime),
      navigation: navigation2,
      timing: lcpTime
    };
    const metricsByNavigation = MapUtilities_exports.getWithDefault(metricScoresByFrameId, frameId, () => /* @__PURE__ */ new Map());
    const metrics = MapUtilities_exports.getWithDefault(metricsByNavigation, navigation2, () => /* @__PURE__ */ new Map());
    const lastLCPCandidate = metrics.get(MetricName.LCP);
    if (lastLCPCandidate === void 0) {
      selectedLCPCandidateEvents.add(lcp.event);
      storeMetricScore(frameId, navigation2, lcp);
      return;
    }
    const lastLCPCandidateEvent = lastLCPCandidate.event;
    if (!TraceEvents_exports.isAnyLargestContentfulPaintCandidate(lastLCPCandidateEvent)) {
      return;
    }
    const lastCandidateIndex = lastLCPCandidateEvent.args.data?.candidateIndex;
    if (!lastCandidateIndex) {
      return;
    }
    if (lastCandidateIndex < candidateIndex) {
      selectedLCPCandidateEvents.delete(lastLCPCandidateEvent);
      selectedLCPCandidateEvents.add(lcp.event);
      storeMetricScore(frameId, navigation2, lcp);
    }
    return;
  }
  if (TraceEvents_exports.isLayoutShift(event)) {
    return;
  }
  if (TraceEvents_exports.isSoftNavigationStart(event)) {
    return;
  }
  return assertNever(event, `Unexpected event type: ${event}`);
}
function storeMetricScore(frameId, navigation2, metricScore) {
  const metricsByNavigation = MapUtilities_exports.getWithDefault(metricScoresByFrameId, frameId, () => /* @__PURE__ */ new Map());
  const metrics = MapUtilities_exports.getWithDefault(metricsByNavigation, navigation2, () => /* @__PURE__ */ new Map());
  metrics.delete(metricScore.metricName);
  metrics.set(metricScore.metricName, metricScore);
}
function getFrameIdForPageLoadEvent(event) {
  if (TraceEvents_exports.isFirstContentfulPaint(event) || TraceEvents_exports.isInteractiveTime(event) || TraceEvents_exports.isAnyLargestContentfulPaintCandidate(event) || TraceEvents_exports.isNavigationStart(event) || TraceEvents_exports.isSoftNavigationStart(event) || TraceEvents_exports.isLayoutShift(event) || TraceEvents_exports.isFirstPaint(event)) {
    return event.args.frame;
  }
  if (TraceEvents_exports.isMarkDOMContent(event) || TraceEvents_exports.isMarkLoad(event)) {
    const frameId = event.args.data?.frame;
    if (!frameId) {
      throw new Error("MarkDOMContent unexpectedly had no frame ID.");
    }
    return frameId;
  }
  assertNever(event, `Unexpected event type: ${event}`);
}
function getNavigationForPageLoadEvent(event) {
  if (TraceEvents_exports.isFirstContentfulPaint(event) || TraceEvents_exports.isAnyLargestContentfulPaintCandidate(event) || TraceEvents_exports.isFirstPaint(event)) {
    const { navigationsByNavigationId: navigationsByNavigationId2, softNavigationsById: softNavigationsById2 } = data5();
    let navigation2;
    if (event.name === TraceEvents_exports.Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION && event.args.data?.performanceTimelineNavigationId) {
      navigation2 = softNavigationsById2.get(event.args.data.performanceTimelineNavigationId);
      if (!navigation2) {
        return null;
      }
    } else {
      const navigationId = event.args.data?.navigationId;
      if (!navigationId) {
        throw new Error(`Trace event unexpectedly had no navigation ID: ${JSON.stringify(event, null, 2)}`);
      }
      navigation2 = navigationsByNavigationId2.get(navigationId);
    }
    if (!navigation2) {
      return null;
    }
    return navigation2;
  }
  if (TraceEvents_exports.isSoftNavigationStart(event)) {
    const { softNavigationsById: softNavigationsById2 } = data5();
    return softNavigationsById2.get(event.args.context.performanceTimelineNavigationId) ?? null;
  }
  if (TraceEvents_exports.isMarkDOMContent(event) || TraceEvents_exports.isInteractiveTime(event) || TraceEvents_exports.isLayoutShift(event) || TraceEvents_exports.isMarkLoad(event)) {
    const frameId = getFrameIdForPageLoadEvent(event);
    const { navigationsByFrameId: navigationsByFrameId2 } = data5();
    return Trace_exports.getNavigationForTraceEvent(event, frameId, navigationsByFrameId2);
  }
  if (TraceEvents_exports.isNavigationStart(event)) {
    return null;
  }
  return assertNever(event, `Unexpected event type: ${event}`);
}
function scoreClassificationForFirstContentfulPaint(fcpScoreInMicroseconds) {
  const FCP_GOOD_TIMING = Timing_exports3.secondsToMicro(Timing_exports.Seconds(1.8));
  const FCP_MEDIUM_TIMING = Timing_exports3.secondsToMicro(Timing_exports.Seconds(3));
  let scoreClassification = ScoreClassification.BAD;
  if (fcpScoreInMicroseconds <= FCP_MEDIUM_TIMING) {
    scoreClassification = ScoreClassification.OK;
  }
  if (fcpScoreInMicroseconds <= FCP_GOOD_TIMING) {
    scoreClassification = ScoreClassification.GOOD;
  }
  return scoreClassification;
}
function scoreClassificationForTimeToInteractive(ttiTimeInMicroseconds) {
  const TTI_GOOD_TIMING = Timing_exports3.secondsToMicro(Timing_exports.Seconds(3.8));
  const TTI_MEDIUM_TIMING = Timing_exports3.secondsToMicro(Timing_exports.Seconds(7.3));
  let scoreClassification = ScoreClassification.BAD;
  if (ttiTimeInMicroseconds <= TTI_MEDIUM_TIMING) {
    scoreClassification = ScoreClassification.OK;
  }
  if (ttiTimeInMicroseconds <= TTI_GOOD_TIMING) {
    scoreClassification = ScoreClassification.GOOD;
  }
  return scoreClassification;
}
function scoreClassificationForLargestContentfulPaint(lcpTimeInMicroseconds) {
  const LCP_GOOD_TIMING = Timing_exports3.secondsToMicro(Timing_exports.Seconds(2.5));
  const LCP_MEDIUM_TIMING = Timing_exports3.secondsToMicro(Timing_exports.Seconds(4));
  let scoreClassification = ScoreClassification.BAD;
  if (lcpTimeInMicroseconds <= LCP_MEDIUM_TIMING) {
    scoreClassification = ScoreClassification.OK;
  }
  if (lcpTimeInMicroseconds <= LCP_GOOD_TIMING) {
    scoreClassification = ScoreClassification.GOOD;
  }
  return scoreClassification;
}
function scoreClassificationForDOMContentLoaded(_dclTimeInMicroseconds) {
  return ScoreClassification.UNCLASSIFIED;
}
function scoreClassificationForTotalBlockingTime(tbtTimeInMicroseconds) {
  const TBT_GOOD_TIMING = Timing_exports3.milliToMicro(Timing_exports.Milli(200));
  const TBT_MEDIUM_TIMING = Timing_exports3.milliToMicro(Timing_exports.Milli(600));
  let scoreClassification = ScoreClassification.BAD;
  if (tbtTimeInMicroseconds <= TBT_MEDIUM_TIMING) {
    scoreClassification = ScoreClassification.OK;
  }
  if (tbtTimeInMicroseconds <= TBT_GOOD_TIMING) {
    scoreClassification = ScoreClassification.GOOD;
  }
  return scoreClassification;
}
function gatherFinalLCPEvents() {
  const allFinalLCPEvents = [];
  const dataForAllFrames = [...metricScoresByFrameId.values()];
  const dataForAllNavigations = dataForAllFrames.flatMap((frameData) => [...frameData.values()]);
  for (let i = 0; i < dataForAllNavigations.length; i++) {
    const navigationData = dataForAllNavigations[i];
    const lcpInNavigation = navigationData.get(MetricName.LCP);
    if (!lcpInNavigation?.event) {
      continue;
    }
    allFinalLCPEvents.push(lcpInNavigation.event);
  }
  return allFinalLCPEvents;
}
async function finalize19() {
  pageLoadEventsArray.sort((a, b) => a.ts - b.ts);
  for (const pageLoadEvent of pageLoadEventsArray) {
    const navigation2 = getNavigationForPageLoadEvent(pageLoadEvent);
    if (navigation2) {
      storePageLoadMetricAgainstNavigationId(navigation2, pageLoadEvent);
    }
  }
  const { navigationsByFrameId: navigationsByFrameId2 } = data5();
  metaCharsetCheckEventsArray.sort((a, b) => a.ts - b.ts);
  for (const metaCharsetCheckEvent of metaCharsetCheckEventsArray) {
    const frameId = metaCharsetCheckEvent.args.data?.frame;
    if (!frameId) {
      continue;
    }
    const navigation2 = Trace_exports.getNavigationForTraceEvent(metaCharsetCheckEvent, frameId, navigationsByFrameId2);
    if (!navigation2) {
      continue;
    }
    const eventsForNavigation = MapUtilities_exports.getWithDefault(metaCharsetCheckEventsByNavigation, navigation2, () => []);
    eventsForNavigation.push(metaCharsetCheckEvent);
  }
  const allFinalLCPEvents = gatherFinalLCPEvents();
  const mainFrame = data5().mainFrameId;
  const allEventsButLCP = pageLoadEventsArray.filter((event) => !TraceEvents_exports.isAnyLargestContentfulPaintCandidate(event));
  const markerEvents = [...allFinalLCPEvents, ...allEventsButLCP].filter(TraceEvents_exports.isMarkerEvent);
  allMarkerEvents = markerEvents.filter((event) => getFrameIdForPageLoadEvent(event) === mainFrame).sort((a, b) => a.ts - b.ts);
}
function data19() {
  return {
    metricScoresByFrameId,
    allMarkerEvents,
    metaCharsetCheckEventsByNavigation
  };
}
function deps10() {
  return ["Meta"];
}
function metricIsLCP(metric) {
  return metric.metricName === MetricName.LCP;
}
var metricScoresByFrameId, allMarkerEvents, metaCharsetCheckEventsByNavigation, metaCharsetCheckEventsArray, pageLoadEventsArray, selectedLCPCandidateEvents, ScoreClassification, MetricName;
var init_PageLoadMetricsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/PageLoadMetricsHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_MetaHandler();
    metricScoresByFrameId = /* @__PURE__ */ new Map();
    allMarkerEvents = [];
    metaCharsetCheckEventsByNavigation = /* @__PURE__ */ new Map();
    metaCharsetCheckEventsArray = [];
    __name(reset19, "reset");
    pageLoadEventsArray = [];
    selectedLCPCandidateEvents = /* @__PURE__ */ new Set();
    __name(handleEvent19, "handleEvent");
    __name(storePageLoadMetricAgainstNavigationId, "storePageLoadMetricAgainstNavigationId");
    __name(storeMetricScore, "storeMetricScore");
    __name(getFrameIdForPageLoadEvent, "getFrameIdForPageLoadEvent");
    __name(getNavigationForPageLoadEvent, "getNavigationForPageLoadEvent");
    __name(scoreClassificationForFirstContentfulPaint, "scoreClassificationForFirstContentfulPaint");
    __name(scoreClassificationForTimeToInteractive, "scoreClassificationForTimeToInteractive");
    __name(scoreClassificationForLargestContentfulPaint, "scoreClassificationForLargestContentfulPaint");
    __name(scoreClassificationForDOMContentLoaded, "scoreClassificationForDOMContentLoaded");
    __name(scoreClassificationForTotalBlockingTime, "scoreClassificationForTotalBlockingTime");
    __name(gatherFinalLCPEvents, "gatherFinalLCPEvents");
    __name(finalize19, "finalize");
    __name(data19, "data");
    __name(deps10, "deps");
    (function(ScoreClassification2) {
      ScoreClassification2["GOOD"] = "good";
      ScoreClassification2["OK"] = "ok";
      ScoreClassification2["BAD"] = "bad";
      ScoreClassification2["UNCLASSIFIED"] = "unclassified";
    })(ScoreClassification || (ScoreClassification = {}));
    (function(MetricName2) {
      MetricName2["FCP"] = "FCP";
      MetricName2["FP"] = "FP";
      MetricName2["L"] = "L";
      MetricName2["LCP"] = "LCP";
      MetricName2["DCL"] = "DCL";
      MetricName2["TTI"] = "TTI";
      MetricName2["TBT"] = "TBT";
      MetricName2["CLS"] = "CLS";
      MetricName2["NAV"] = "Nav";
      MetricName2["SOFT_NAV"] = "Nav*";
      MetricName2["SOFT_LCP"] = "LCP*";
    })(MetricName || (MetricName = {}));
    __name(metricIsLCP, "metricIsLCP");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/LargestImagePaintHandler.js
var LargestImagePaintHandler_exports = {};
__export(LargestImagePaintHandler_exports, {
  data: () => data20,
  deps: () => deps11,
  finalize: () => finalize20,
  handleEvent: () => handleEvent20,
  reset: () => reset20
});
function reset20() {
  imagePaintsByNodeIdAndProcess = /* @__PURE__ */ new Map();
  lcpRequestByNavigationId = /* @__PURE__ */ new Map();
}
function handleEvent20(event) {
  if (!TraceEvents_exports.isLargestImagePaintCandidate(event) || !event.args.data) {
    return;
  }
  const imagePaintsByNodeId = MapUtilities_exports.getWithDefault(imagePaintsByNodeIdAndProcess, event.pid, () => /* @__PURE__ */ new Map());
  imagePaintsByNodeId.set(event.args.data.DOMNodeId, event);
}
async function finalize20() {
  const requests = data6().byTime;
  const { traceBounds: traceBounds2, navigationsByNavigationId: navigationsByNavigationId2 } = data5();
  const metricScoresByFrameId2 = data19().metricScoresByFrameId;
  for (const [navigationId, navigation2] of navigationsByNavigationId2) {
    const lcpMetric = metricScoresByFrameId2.get(navigation2.args.frame)?.get(navigation2)?.get(MetricName.LCP);
    const lcpEvent = lcpMetric?.event;
    if (!lcpEvent || !TraceEvents_exports.isAnyLargestContentfulPaintCandidate(lcpEvent)) {
      continue;
    }
    const nodeId = lcpEvent.args.data?.nodeId;
    if (!nodeId) {
      continue;
    }
    const lcpImagePaintEvent = imagePaintsByNodeIdAndProcess.get(lcpEvent.pid)?.get(nodeId);
    const lcpUrl = lcpImagePaintEvent?.args.data?.imageUrl;
    if (!lcpUrl) {
      continue;
    }
    const startTime = navigation2?.ts ?? traceBounds2.min;
    const endTime = lcpImagePaintEvent.ts;
    let lcpRequest;
    for (const request of requests) {
      if (request.ts < startTime) {
        continue;
      }
      if (request.ts >= endTime) {
        break;
      }
      if (request.args.data.url === lcpUrl || request.args.data.redirects.some((r) => r.url === lcpUrl)) {
        lcpRequest = request;
        break;
      }
    }
    if (lcpRequest) {
      lcpRequestByNavigationId.set(navigationId, lcpRequest);
    }
  }
}
function data20() {
  return { lcpRequestByNavigationId };
}
function deps11() {
  return ["Meta", "NetworkRequests", "PageLoadMetrics"];
}
var imagePaintsByNodeIdAndProcess, lcpRequestByNavigationId;
var init_LargestImagePaintHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/LargestImagePaintHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    init_MetaHandler();
    init_NetworkRequestsHandler();
    init_PageLoadMetricsHandler();
    imagePaintsByNodeIdAndProcess = /* @__PURE__ */ new Map();
    lcpRequestByNavigationId = /* @__PURE__ */ new Map();
    __name(reset20, "reset");
    __name(handleEvent20, "handleEvent");
    __name(finalize20, "finalize");
    __name(data20, "data");
    __name(deps11, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/LargestTextPaintHandler.js
var LargestTextPaintHandler_exports = {};
__export(LargestTextPaintHandler_exports, {
  data: () => data21,
  finalize: () => finalize21,
  handleEvent: () => handleEvent21,
  reset: () => reset21
});
function reset21() {
  textPaintByDOMNodeId = /* @__PURE__ */ new Map();
}
function handleEvent21(event) {
  if (!TraceEvents_exports.isLargestTextPaintCandidate(event)) {
    return;
  }
  if (!event.args.data) {
    return;
  }
  textPaintByDOMNodeId.set(event.args.data.DOMNodeId, event);
}
async function finalize21() {
}
function data21() {
  return textPaintByDOMNodeId;
}
var textPaintByDOMNodeId;
var init_LargestTextPaintHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/LargestTextPaintHandler.js"() {
    init_process_global();
    init_types2();
    textPaintByDOMNodeId = /* @__PURE__ */ new Map();
    __name(reset21, "reset");
    __name(handleEvent21, "handleEvent");
    __name(finalize21, "finalize");
    __name(data21, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/ScreenshotsHandler.js
var ScreenshotsHandler_exports = {};
__export(ScreenshotsHandler_exports, {
  data: () => data22,
  deps: () => deps12,
  finalize: () => finalize22,
  handleEvent: () => handleEvent22,
  reset: () => reset22,
  screenshotImageDataUri: () => screenshotImageDataUri
});
function reset22() {
  unpairedAsyncEvents = [];
  legacyScreenshotEvents = [];
  syntheticScreenshots = [];
  modernScreenshotEvents = [];
  frameSequenceToTs = {};
}
function handleEvent22(event) {
  if (TraceEvents_exports.isLegacyScreenshot(event)) {
    legacyScreenshotEvents.push(event);
  } else if (TraceEvents_exports.isScreenshot(event)) {
    modernScreenshotEvents.push(event);
  } else if (TraceEvents_exports.isPipelineReporter(event)) {
    unpairedAsyncEvents.push(event);
  }
}
async function finalize22() {
  const pipelineReporterEvents = Trace_exports.createMatchedSortedSyntheticEvents(unpairedAsyncEvents);
  frameSequenceToTs = Object.fromEntries(pipelineReporterEvents.map((evt) => {
    const args = evt.args.data.beginEvent.args;
    const frameReporter = "frame_reporter" in args ? args.frame_reporter : args.chrome_frame_reporter;
    const frameSequenceId = frameReporter.frame_sequence;
    const presentationTs = Timing_exports.Micro(evt.ts + evt.dur);
    return [frameSequenceId, presentationTs];
  }));
  for (const snapshotEvent of legacyScreenshotEvents) {
    const { cat, name, ph, pid, tid } = snapshotEvent;
    const syntheticEvent = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
      rawSourceEvent: snapshotEvent,
      cat,
      name,
      ph,
      pid,
      tid,
      // TODO(paulirish, crbug.com/41363012): investigate why getPresentationTimestamp(snapshotEvent) seems less accurate. Resolve screenshot timing inaccuracy.
      // `getPresentationTimestamp(snapshotEvent) - snapshotEvent.ts` is how many microsec the screenshot should be adjusted to the right/later
      ts: snapshotEvent.ts,
      args: {
        dataUri: `data:image/jpg;base64,${snapshotEvent.args.snapshot}`
      }
    });
    syntheticScreenshots.push(syntheticEvent);
  }
}
function screenshotImageDataUri(event) {
  if (TraceEvents_exports.isLegacySyntheticScreenshot(event)) {
    return event.args.dataUri;
  }
  return `data:image/jpg;base64,${event.args.snapshot}`;
}
function data22() {
  return {
    legacySyntheticScreenshots: syntheticScreenshots.length ? syntheticScreenshots : null,
    screenshots: modernScreenshotEvents.length ? modernScreenshotEvents : null
  };
}
function deps12() {
  return ["Meta"];
}
var unpairedAsyncEvents, legacyScreenshotEvents, modernScreenshotEvents, syntheticScreenshots, frameSequenceToTs;
var init_ScreenshotsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/ScreenshotsHandler.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    unpairedAsyncEvents = [];
    legacyScreenshotEvents = [];
    modernScreenshotEvents = [];
    syntheticScreenshots = [];
    frameSequenceToTs = {};
    __name(reset22, "reset");
    __name(handleEvent22, "handleEvent");
    __name(finalize22, "finalize");
    __name(screenshotImageDataUri, "screenshotImageDataUri");
    __name(data22, "data");
    __name(deps12, "deps");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/LayoutShiftsHandler.js
var LayoutShiftsHandler_exports = {};
__export(LayoutShiftsHandler_exports, {
  LayoutShiftsThreshold: () => LayoutShiftsThreshold,
  MAX_CLUSTER_DURATION: () => MAX_CLUSTER_DURATION,
  MAX_SHIFT_TIME_DELTA: () => MAX_SHIFT_TIME_DELTA,
  data: () => data23,
  deps: () => deps13,
  finalize: () => finalize23,
  handleEvent: () => handleEvent23,
  reset: () => reset23,
  scoreClassificationForLayoutShift: () => scoreClassificationForLayoutShift
});
function reset23() {
  layoutShiftEvents = [];
  layoutInvalidationEvents = [];
  scheduleStyleInvalidationEvents = [];
  styleRecalcInvalidationEvents = [];
  prePaintEvents = [];
  paintImageEvents2 = [];
  renderFrameImplCreateChildFrameEvents = [];
  layoutImageUnsizedEvents = [];
  domLoadingEvents = [];
  remoteFonts = [];
  backendNodeIds = /* @__PURE__ */ new Set();
  clusters = [];
  sessionMaxScore = 0;
  scoreRecords = [];
  clsWindowID = -1;
  clustersByNavigationId = /* @__PURE__ */ new Map();
}
function handleEvent23(event) {
  if (TraceEvents_exports.isLayoutShift(event) && !event.args.data?.had_recent_input) {
    layoutShiftEvents.push(event);
    return;
  }
  if (TraceEvents_exports.isLayoutInvalidationTracking(event)) {
    layoutInvalidationEvents.push(event);
    return;
  }
  if (TraceEvents_exports.isScheduleStyleInvalidationTracking(event)) {
    scheduleStyleInvalidationEvents.push(event);
  }
  if (TraceEvents_exports.isStyleRecalcInvalidationTracking(event)) {
    styleRecalcInvalidationEvents.push(event);
  }
  if (TraceEvents_exports.isPrePaint(event)) {
    prePaintEvents.push(event);
    return;
  }
  if (TraceEvents_exports.isRenderFrameImplCreateChildFrame(event)) {
    renderFrameImplCreateChildFrameEvents.push(event);
  }
  if (TraceEvents_exports.isDomLoading(event)) {
    domLoadingEvents.push(event);
  }
  if (TraceEvents_exports.isLayoutImageUnsized(event)) {
    layoutImageUnsizedEvents.push(event);
  }
  if (TraceEvents_exports.isBeginRemoteFontLoad(event)) {
    remoteFonts.push({
      display: event.args.display,
      url: event.args.url,
      beginRemoteFontLoadEvent: event
    });
  }
  if (TraceEvents_exports.isRemoteFontLoaded(event)) {
    for (const remoteFont of remoteFonts) {
      if (remoteFont.url === event.args.url) {
        remoteFont.name = event.args.name;
      }
    }
  }
  if (TraceEvents_exports.isPaintImage(event)) {
    paintImageEvents2.push(event);
  }
}
function traceWindowFromTime(time) {
  return {
    min: time,
    max: time,
    range: Timing_exports.Micro(0)
  };
}
function updateTraceWindowMax(traceWindow, newMax) {
  traceWindow.max = newMax;
  traceWindow.range = Timing_exports.Micro(traceWindow.max - traceWindow.min);
}
function findScreenshots(timestamp) {
  const data31 = data22();
  if (data31.screenshots) {
    const before = Trace_exports.findPreviousEventBeforeTimestamp(data31.screenshots, timestamp);
    const after = before ? data31.screenshots[data31.screenshots.indexOf(before) + 1] : null;
    return { before, after };
  }
  if (data31.legacySyntheticScreenshots) {
    const before = Trace_exports.findPreviousEventBeforeTimestamp(data31.legacySyntheticScreenshots, timestamp);
    const after = before ? data31.legacySyntheticScreenshots[data31.legacySyntheticScreenshots.indexOf(before) + 1] : null;
    return { before, after };
  }
  return { before: null, after: null };
}
function buildScoreRecords() {
  const { traceBounds: traceBounds2 } = data5();
  scoreRecords.push({ ts: traceBounds2.min, score: 0 });
  for (const cluster of clusters) {
    let clusterScore = 0;
    if (cluster.events[0].args.data) {
      scoreRecords.push({ ts: cluster.clusterWindow.min, score: cluster.events[0].args.data.weighted_score_delta });
    }
    for (let i = 0; i < cluster.events.length; i++) {
      const event = cluster.events[i];
      if (!event.args.data) {
        continue;
      }
      clusterScore += event.args.data.weighted_score_delta;
      scoreRecords.push({ ts: event.ts, score: clusterScore });
    }
    scoreRecords.push({ ts: cluster.clusterWindow.max, score: 0 });
  }
}
function collectNodes() {
  backendNodeIds.clear();
  for (const layoutShift of layoutShiftEvents) {
    if (!layoutShift.args.data?.impacted_nodes) {
      continue;
    }
    for (const node of layoutShift.args.data.impacted_nodes) {
      backendNodeIds.add(node.node_id);
    }
  }
  for (const layoutInvalidation of layoutInvalidationEvents) {
    if (!layoutInvalidation.args.data?.nodeId) {
      continue;
    }
    backendNodeIds.add(layoutInvalidation.args.data.nodeId);
  }
  for (const scheduleStyleInvalidation of scheduleStyleInvalidationEvents) {
    if (!scheduleStyleInvalidation.args.data?.nodeId) {
      continue;
    }
    backendNodeIds.add(scheduleStyleInvalidation.args.data.nodeId);
  }
}
async function finalize23() {
  layoutShiftEvents.sort((a, b) => a.ts - b.ts);
  prePaintEvents.sort((a, b) => a.ts - b.ts);
  layoutInvalidationEvents.sort((a, b) => a.ts - b.ts);
  renderFrameImplCreateChildFrameEvents.sort((a, b) => a.ts - b.ts);
  domLoadingEvents.sort((a, b) => a.ts - b.ts);
  layoutImageUnsizedEvents.sort((a, b) => a.ts - b.ts);
  remoteFonts.sort((a, b) => a.beginRemoteFontLoadEvent.ts - b.beginRemoteFontLoadEvent.ts);
  paintImageEvents2.sort((a, b) => a.ts - b.ts);
  await buildLayoutShiftsClusters();
  buildScoreRecords();
  collectNodes();
}
async function buildLayoutShiftsClusters() {
  const { navigationsByFrameId: navigationsByFrameId2, mainFrameId: mainFrameId2, traceBounds: traceBounds2 } = data5();
  const navigations = navigationsByFrameId2.get(mainFrameId2) || [];
  if (layoutShiftEvents.length === 0) {
    return;
  }
  let firstShiftTime = layoutShiftEvents[0].ts;
  let lastShiftTime = layoutShiftEvents[0].ts;
  let lastShiftNavigation = null;
  for (const event of layoutShiftEvents) {
    const clusterDurationExceeded = event.ts - firstShiftTime > MAX_CLUSTER_DURATION;
    const maxTimeDeltaSinceLastShiftExceeded = event.ts - lastShiftTime > MAX_SHIFT_TIME_DELTA;
    const currentShiftNavigation = ArrayUtilities_exports.nearestIndexFromEnd(navigations, (nav) => nav.ts < event.ts);
    const hasNavigated = lastShiftNavigation !== currentShiftNavigation && currentShiftNavigation !== null;
    if (clusterDurationExceeded || maxTimeDeltaSinceLastShiftExceeded || hasNavigated || !clusters.length) {
      const clusterStartTime = event.ts;
      const endTimeByMaxSessionDuration = clusterDurationExceeded ? firstShiftTime + MAX_CLUSTER_DURATION : Infinity;
      const endTimeByMaxShiftGap = maxTimeDeltaSinceLastShiftExceeded ? lastShiftTime + MAX_SHIFT_TIME_DELTA : Infinity;
      const endTimeByNavigation = hasNavigated ? navigations[currentShiftNavigation].ts : Infinity;
      const previousClusterEndTime = Math.min(endTimeByMaxSessionDuration, endTimeByMaxShiftGap, endTimeByNavigation);
      if (clusters.length > 0) {
        const currentCluster2 = clusters[clusters.length - 1];
        updateTraceWindowMax(currentCluster2.clusterWindow, Timing_exports.Micro(previousClusterEndTime));
      }
      const navigationId = currentShiftNavigation === null ? TraceEvents_exports.NO_NAVIGATION : navigations[currentShiftNavigation].args.data?.navigationId;
      clusters.push(SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
        name: "SyntheticLayoutShiftCluster",
        // Will be replaced by the worst layout shift in the next for loop.
        rawSourceEvent: event,
        events: [],
        clusterWindow: traceWindowFromTime(clusterStartTime),
        clusterCumulativeScore: 0,
        scoreWindows: {
          good: traceWindowFromTime(clusterStartTime)
        },
        navigationId,
        // Set default Event so that this event is treated accordingly for the track appender.
        ts: event.ts,
        pid: event.pid,
        tid: event.tid,
        ph: TraceEvents_exports.Phase.COMPLETE,
        cat: "",
        dur: Timing_exports.Micro(-1)
        // This `cluster.dur` is updated below.
      }));
      firstShiftTime = clusterStartTime;
    }
    const currentCluster = clusters[clusters.length - 1];
    const timeFromNavigation = currentShiftNavigation !== null ? Timing_exports.Micro(event.ts - navigations[currentShiftNavigation].ts) : void 0;
    currentCluster.clusterCumulativeScore += event.args.data ? event.args.data.weighted_score_delta : 0;
    if (!event.args.data) {
      continue;
    }
    const shift = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
      rawSourceEvent: event,
      ...event,
      name: TraceEvents_exports.Name.SYNTHETIC_LAYOUT_SHIFT,
      args: {
        frame: event.args.frame,
        data: {
          ...event.args.data,
          rawEvent: event,
          navigationId: currentCluster.navigationId ?? void 0
        }
      },
      parsedData: {
        timeFromNavigation,
        screenshots: findScreenshots(event.ts),
        cumulativeWeightedScoreInWindow: currentCluster.clusterCumulativeScore,
        // The score of the session window is temporarily set to 0 just
        // to initialize it. Since we need to get the score of all shifts
        // in the session window to determine its value, its definite
        // value is set when stepping through the built clusters.
        sessionWindowData: { cumulativeWindowScore: 0, id: clusters.length }
      }
    });
    currentCluster.events.push(shift);
    updateTraceWindowMax(currentCluster.clusterWindow, event.ts);
    lastShiftTime = event.ts;
    lastShiftNavigation = currentShiftNavigation;
  }
  for (const cluster of clusters) {
    let weightedScore = 0;
    let windowID = -1;
    if (cluster === clusters[clusters.length - 1]) {
      const clusterEndByMaxDuration = MAX_CLUSTER_DURATION + cluster.clusterWindow.min;
      const clusterEndByMaxGap = cluster.clusterWindow.max + MAX_SHIFT_TIME_DELTA;
      const nextNavigationIndex = ArrayUtilities_exports.nearestIndexFromBeginning(navigations, (nav) => nav.ts > cluster.clusterWindow.max);
      const nextNavigationTime = nextNavigationIndex ? navigations[nextNavigationIndex].ts : Infinity;
      const clusterEnd = Math.min(clusterEndByMaxDuration, clusterEndByMaxGap, traceBounds2.max, nextNavigationTime);
      updateTraceWindowMax(cluster.clusterWindow, Timing_exports.Micro(clusterEnd));
    }
    let largestScore = 0;
    let worstShiftEvent = null;
    for (const shift of cluster.events) {
      weightedScore += shift.args.data ? shift.args.data.weighted_score_delta : 0;
      windowID = shift.parsedData.sessionWindowData.id;
      const ts = shift.ts;
      shift.parsedData.sessionWindowData.cumulativeWindowScore = cluster.clusterCumulativeScore;
      if (weightedScore < LayoutShiftsThreshold.NEEDS_IMPROVEMENT) {
        updateTraceWindowMax(cluster.scoreWindows.good, ts);
      } else if (weightedScore >= LayoutShiftsThreshold.NEEDS_IMPROVEMENT && weightedScore < LayoutShiftsThreshold.BAD) {
        if (!cluster.scoreWindows.needsImprovement) {
          updateTraceWindowMax(cluster.scoreWindows.good, Timing_exports.Micro(ts - 1));
          cluster.scoreWindows.needsImprovement = traceWindowFromTime(ts);
        }
        updateTraceWindowMax(cluster.scoreWindows.needsImprovement, ts);
      } else if (weightedScore >= LayoutShiftsThreshold.BAD) {
        if (!cluster.scoreWindows.bad) {
          if (cluster.scoreWindows.needsImprovement) {
            updateTraceWindowMax(cluster.scoreWindows.needsImprovement, Timing_exports.Micro(ts - 1));
          } else {
            updateTraceWindowMax(cluster.scoreWindows.good, Timing_exports.Micro(ts - 1));
          }
          cluster.scoreWindows.bad = traceWindowFromTime(shift.ts);
        }
        updateTraceWindowMax(cluster.scoreWindows.bad, ts);
      }
      if (cluster.scoreWindows.bad) {
        updateTraceWindowMax(cluster.scoreWindows.bad, cluster.clusterWindow.max);
      } else if (cluster.scoreWindows.needsImprovement) {
        updateTraceWindowMax(cluster.scoreWindows.needsImprovement, cluster.clusterWindow.max);
      } else {
        updateTraceWindowMax(cluster.scoreWindows.good, cluster.clusterWindow.max);
      }
      const score = shift.args.data?.weighted_score_delta;
      if (score !== void 0 && score > largestScore) {
        largestScore = score;
        worstShiftEvent = shift;
      }
    }
    if (worstShiftEvent) {
      cluster.worstShiftEvent = worstShiftEvent;
      cluster.rawSourceEvent = worstShiftEvent.rawSourceEvent;
    }
    cluster.ts = cluster.events[0].ts;
    const lastShiftTimings = Timing_exports3.eventTimingsMicroSeconds(cluster.events[cluster.events.length - 1]);
    cluster.dur = Timing_exports.Micro(lastShiftTimings.endTime - cluster.events[0].ts + MAX_SHIFT_TIME_DELTA);
    if (weightedScore > sessionMaxScore) {
      clsWindowID = windowID;
      sessionMaxScore = weightedScore;
    }
    if (cluster.navigationId) {
      const clustersForId = MapUtilities_exports.getWithDefault(clustersByNavigationId, cluster.navigationId, () => {
        return [];
      });
      clustersForId.push(cluster);
    }
  }
}
function data23() {
  return {
    clusters,
    sessionMaxScore,
    clsWindowID,
    prePaintEvents,
    layoutInvalidationEvents,
    scheduleStyleInvalidationEvents,
    styleRecalcInvalidationEvents,
    renderFrameImplCreateChildFrameEvents,
    domLoadingEvents,
    layoutImageUnsizedEvents,
    remoteFonts,
    scoreRecords,
    backendNodeIds,
    clustersByNavigationId,
    paintImageEvents: paintImageEvents2
  };
}
function deps13() {
  return ["Screenshots", "Meta"];
}
function scoreClassificationForLayoutShift(score) {
  let state = ScoreClassification.GOOD;
  if (score >= LayoutShiftsThreshold.NEEDS_IMPROVEMENT) {
    state = ScoreClassification.OK;
  }
  if (score >= LayoutShiftsThreshold.BAD) {
    state = ScoreClassification.BAD;
  }
  return state;
}
var MAX_CLUSTER_DURATION, MAX_SHIFT_TIME_DELTA, layoutShiftEvents, layoutInvalidationEvents, scheduleStyleInvalidationEvents, styleRecalcInvalidationEvents, renderFrameImplCreateChildFrameEvents, domLoadingEvents, layoutImageUnsizedEvents, remoteFonts, backendNodeIds, prePaintEvents, paintImageEvents2, sessionMaxScore, clsWindowID, clusters, clustersByNavigationId, scoreRecords, LayoutShiftsThreshold;
var init_LayoutShiftsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/LayoutShiftsHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_MetaHandler();
    init_PageLoadMetricsHandler();
    init_ScreenshotsHandler();
    MAX_CLUSTER_DURATION = Timing_exports3.milliToMicro(Timing_exports.Milli(5e3));
    MAX_SHIFT_TIME_DELTA = Timing_exports3.milliToMicro(Timing_exports.Milli(1e3));
    layoutShiftEvents = [];
    layoutInvalidationEvents = [];
    scheduleStyleInvalidationEvents = [];
    styleRecalcInvalidationEvents = [];
    renderFrameImplCreateChildFrameEvents = [];
    domLoadingEvents = [];
    layoutImageUnsizedEvents = [];
    remoteFonts = [];
    backendNodeIds = /* @__PURE__ */ new Set();
    prePaintEvents = [];
    paintImageEvents2 = [];
    sessionMaxScore = 0;
    clsWindowID = -1;
    clusters = [];
    clustersByNavigationId = /* @__PURE__ */ new Map();
    scoreRecords = [];
    __name(reset23, "reset");
    __name(handleEvent23, "handleEvent");
    __name(traceWindowFromTime, "traceWindowFromTime");
    __name(updateTraceWindowMax, "updateTraceWindowMax");
    __name(findScreenshots, "findScreenshots");
    __name(buildScoreRecords, "buildScoreRecords");
    __name(collectNodes, "collectNodes");
    __name(finalize23, "finalize");
    __name(buildLayoutShiftsClusters, "buildLayoutShiftsClusters");
    __name(data23, "data");
    __name(deps13, "deps");
    __name(scoreClassificationForLayoutShift, "scoreClassificationForLayoutShift");
    (function(LayoutShiftsThreshold2) {
      LayoutShiftsThreshold2[LayoutShiftsThreshold2["GOOD"] = 0] = "GOOD";
      LayoutShiftsThreshold2[LayoutShiftsThreshold2["NEEDS_IMPROVEMENT"] = 0.1] = "NEEDS_IMPROVEMENT";
      LayoutShiftsThreshold2[LayoutShiftsThreshold2["BAD"] = 0.25] = "BAD";
    })(LayoutShiftsThreshold || (LayoutShiftsThreshold = {}));
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/MemoryHandler.js
var MemoryHandler_exports = {};
__export(MemoryHandler_exports, {
  data: () => data24,
  finalize: () => finalize24,
  handleEvent: () => handleEvent24,
  reset: () => reset24
});
function reset24() {
  updateCountersByProcess = /* @__PURE__ */ new Map();
}
function handleEvent24(event) {
  if (TraceEvents_exports.isUpdateCounters(event)) {
    const countersForProcess = MapUtilities_exports.getWithDefault(updateCountersByProcess, event.pid, () => []);
    countersForProcess.push(event);
    updateCountersByProcess.set(event.pid, countersForProcess);
  }
}
async function finalize24() {
}
function data24() {
  return { updateCountersByProcess };
}
var updateCountersByProcess;
var init_MemoryHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/MemoryHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    updateCountersByProcess = /* @__PURE__ */ new Map();
    __name(reset24, "reset");
    __name(handleEvent24, "handleEvent");
    __name(finalize24, "finalize");
    __name(data24, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/PageFramesHandler.js
var PageFramesHandler_exports = {};
__export(PageFramesHandler_exports, {
  data: () => data25,
  finalize: () => finalize25,
  handleEvent: () => handleEvent25,
  reset: () => reset25
});
function reset25() {
  frames = /* @__PURE__ */ new Map();
}
function handleEvent25(event) {
  if (TraceEvents_exports.isTracingStartedInBrowser(event)) {
    for (const frame of event.args.data?.frames ?? []) {
      frames.set(frame.frame, frame);
    }
    return;
  }
  if (TraceEvents_exports.isCommitLoad(event)) {
    const frameData = event.args.data;
    if (!frameData) {
      return;
    }
    const frame = frames.get(frameData.frame);
    if (!frame) {
      return;
    }
    frames.set(frameData.frame, {
      ...frame,
      url: frameData.url || frame.url,
      name: frameData.name || frameData.name
    });
  }
}
async function finalize25() {
}
function data25() {
  return {
    frames
  };
}
var frames;
var init_PageFramesHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/PageFramesHandler.js"() {
    init_process_global();
    init_types2();
    frames = /* @__PURE__ */ new Map();
    __name(reset25, "reset");
    __name(handleEvent25, "handleEvent");
    __name(finalize25, "finalize");
    __name(data25, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/ScriptsHandler.js
var ScriptsHandler_exports = {};
__export(ScriptsHandler_exports, {
  data: () => data26,
  deps: () => deps14,
  finalize: () => finalize26,
  getScriptGeneratedSizes: () => getScriptGeneratedSizes,
  handleEvent: () => handleEvent26,
  reset: () => reset26
});
function completeURL(base, url) {
  if (url.startsWith("data:") || url.startsWith("blob:") || url.startsWith("javascript:") || url.startsWith("mailto:")) {
    return url;
  }
  try {
    return new URL(url, base).href;
  } catch {
  }
  return null;
}
function deps14() {
  return ["Meta", "NetworkRequests"];
}
function reset26() {
  scriptById = /* @__PURE__ */ new Map();
  frameIdByIsolate = /* @__PURE__ */ new Map();
}
function handleEvent26(event) {
  const getOrMakeScript = /* @__PURE__ */ __name((isolate, scriptIdAsNumber) => {
    const scriptId = String(scriptIdAsNumber);
    const key = `${isolate}.${scriptId}`;
    return MapUtilities_exports.getWithDefault(scriptById, key, () => ({ isolate, scriptId, frame: "", ts: event.ts }));
  }, "getOrMakeScript");
  if (TraceEvents_exports.isRundownScriptCompiled(event) && event.args.data) {
    const { isolate, scriptId, frame } = event.args.data;
    const script = getOrMakeScript(isolate, scriptId);
    script.frame = frame;
    script.ts = event.ts;
    return;
  }
  if (TraceEvents_exports.isRundownScript(event)) {
    const { isolate, scriptId, url, sourceUrl, sourceMapUrl, sourceMapUrlElided } = event.args.data;
    const script = getOrMakeScript(isolate, scriptId);
    if (!script.frame) {
      script.frame = frameIdByIsolate.get(String(isolate)) ?? "";
    }
    script.url = url;
    script.ts = event.ts;
    if (sourceUrl) {
      script.sourceUrl = sourceUrl;
    }
    if (sourceMapUrlElided) {
      script.sourceMapUrlElided = true;
    } else if (sourceMapUrl) {
      script.sourceMapUrl = sourceMapUrl;
    }
    return;
  }
  if (TraceEvents_exports.isRundownScriptSource(event)) {
    const { isolate, scriptId, sourceText } = event.args.data;
    const script = getOrMakeScript(isolate, scriptId);
    script.content = sourceText;
    return;
  }
  if (TraceEvents_exports.isRundownScriptSourceLarge(event)) {
    const { isolate, scriptId, sourceText } = event.args.data;
    const script = getOrMakeScript(isolate, scriptId);
    script.content = (script.content ?? "") + sourceText;
    return;
  }
  if (TraceEvents_exports.isFunctionCall(event) && event.args.data?.isolate && event.args.data.frame) {
    const { isolate, frame } = event.args.data;
    const existingValue = frameIdByIsolate.get(isolate);
    if (existingValue !== frame) {
      frameIdByIsolate.set(isolate, frame);
      for (const script of scriptById.values()) {
        if (!script.frame && script.isolate === isolate) {
          script.frame = frame;
        }
      }
    }
  }
}
function findFrame(meta, frameId) {
  for (const frames2 of meta.frameByProcessId?.values()) {
    const frame = frames2.get(frameId);
    if (frame) {
      return frame;
    }
  }
  return null;
}
function findNetworkRequest(networkRequests, script) {
  if (!script.url) {
    return null;
  }
  return networkRequests.find((request) => request.args.data.url === script.url) ?? null;
}
function computeMappingEndColumns(map) {
  const result = /* @__PURE__ */ new Map();
  const mappings = map.mappings();
  for (let i = 0; i < mappings.length - 1; i++) {
    const mapping = mappings[i];
    const nextMapping = mappings[i + 1];
    if (mapping.lineNumber === nextMapping.lineNumber) {
      result.set(mapping, nextMapping.columnNumber);
    }
  }
  return result;
}
function computeGeneratedFileSizes(script) {
  if (!script.sourceMap) {
    throw new Error("expected source map");
  }
  const map = script.sourceMap;
  const content = script.content ?? "";
  const contentLength = content.length;
  const lines = content.split("\n");
  const files = {};
  const totalBytes = contentLength;
  let unmappedBytes = totalBytes;
  const mappingEndCols = computeMappingEndColumns(script.sourceMap);
  for (const mapping of map.mappings()) {
    const source = mapping.sourceURL;
    const lineNum = mapping.lineNumber;
    const colNum = mapping.columnNumber;
    const lastColNum = mappingEndCols.get(mapping);
    if (!source) {
      continue;
    }
    const line = lines[lineNum];
    if (line === null || line === void 0) {
      const errorMessage = `${map.url()} mapping for line out of bounds: ${lineNum + 1}`;
      return { errorMessage };
    }
    if (colNum > line.length) {
      const errorMessage = `${map.url()} mapping for column out of bounds: ${lineNum + 1}:${colNum}`;
      return { errorMessage };
    }
    let mappingLength = 0;
    if (lastColNum !== void 0) {
      if (lastColNum > line.length) {
        const errorMessage = `${map.url()} mapping for last column out of bounds: ${lineNum + 1}:${lastColNum}`;
        return { errorMessage };
      }
      mappingLength = lastColNum - colNum;
    } else {
      mappingLength = line.length - colNum + 1;
    }
    files[source] = (files[source] || 0) + mappingLength;
    unmappedBytes -= mappingLength;
  }
  return {
    files,
    unmappedBytes,
    totalBytes
  };
}
function getScriptGeneratedSizes(script) {
  if (script.sourceMap && !script.sizes) {
    script.sizes = computeGeneratedFileSizes(script);
  }
  return script.sizes ?? null;
}
function findCachedRawSourceMap(script, options) {
  if (options.isFreshRecording || !options.metadata?.sourceMaps) {
    return;
  }
  if (script.sourceMapUrlElided) {
    if (!script.url) {
      return;
    }
    const cachedSourceMap = options.metadata.sourceMaps.find((m) => m.url === script.url);
    if (cachedSourceMap) {
      return cachedSourceMap.sourceMap;
    }
    return;
  }
  if (!script.sourceMapUrl) {
    return;
  }
  const isDataUrl = script.sourceMapUrl.startsWith("data:");
  if (!isDataUrl) {
    const cachedSourceMap = options.metadata.sourceMaps.find((m) => m.sourceMapUrl === script.sourceMapUrl);
    if (cachedSourceMap) {
      return cachedSourceMap.sourceMap;
    }
  }
  return;
}
async function finalize26(options) {
  const meta = data5();
  const networkRequests = [...data6().byId.values()];
  const documentUrls = /* @__PURE__ */ new Set();
  for (const frames2 of meta.frameByProcessId.values()) {
    for (const frame of frames2.values()) {
      documentUrls.add(frame.url);
    }
  }
  for (const script of scriptById.values()) {
    script.request = findNetworkRequest(networkRequests, script) ?? void 0;
    script.inline = !!script.url && documentUrls.has(script.url);
  }
  if (!options.resolveSourceMap) {
    return;
  }
  const promises = [];
  for (const script of scriptById.values()) {
    if (!script.frame || !script.url || !script.sourceMapUrl && !script.sourceMapUrlElided) {
      continue;
    }
    const frameUrl = findFrame(meta, script.frame)?.url;
    if (!frameUrl) {
      continue;
    }
    let sourceUrl = script.url;
    if (script.sourceUrl) {
      sourceUrl = completeURL(frameUrl, script.sourceUrl) ?? script.sourceUrl;
    }
    let sourceMapUrl;
    if (script.sourceMapUrl) {
      sourceMapUrl = completeURL(sourceUrl, script.sourceMapUrl);
      if (!sourceMapUrl) {
        continue;
      }
      script.sourceMapUrl = sourceMapUrl;
    }
    const params = {
      scriptId: script.scriptId,
      scriptUrl: script.url,
      sourceUrl,
      sourceMapUrl: sourceMapUrl ?? "",
      frame: script.frame,
      cachedRawSourceMap: findCachedRawSourceMap(script, options)
    };
    const promise = options.resolveSourceMap(params).then((sourceMap) => {
      if (sourceMap) {
        script.sourceMap = sourceMap;
      }
    });
    promises.push(promise.catch((e) => {
      console.error("Uncaught error when resolving source map", params, e);
    }));
  }
  await Promise.all(promises);
}
function data26() {
  return {
    scripts: [...scriptById.values()]
  };
}
var scriptById, frameIdByIsolate;
var init_ScriptsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/ScriptsHandler.js"() {
    init_process_global();
    init_platform();
    init_types2();
    init_MetaHandler();
    init_NetworkRequestsHandler();
    __name(completeURL, "completeURL");
    scriptById = /* @__PURE__ */ new Map();
    frameIdByIsolate = /* @__PURE__ */ new Map();
    __name(deps14, "deps");
    __name(reset26, "reset");
    __name(handleEvent26, "handleEvent");
    __name(findFrame, "findFrame");
    __name(findNetworkRequest, "findNetworkRequest");
    __name(computeMappingEndColumns, "computeMappingEndColumns");
    __name(computeGeneratedFileSizes, "computeGeneratedFileSizes");
    __name(getScriptGeneratedSizes, "getScriptGeneratedSizes");
    __name(findCachedRawSourceMap, "findCachedRawSourceMap");
    __name(finalize26, "finalize");
    __name(data26, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/SelectorStatsHandler.js
var SelectorStatsHandler_exports = {};
__export(SelectorStatsHandler_exports, {
  data: () => data27,
  finalize: () => finalize27,
  handleEvent: () => handleEvent27,
  reset: () => reset27
});
function reset27() {
  lastRecalcStyleEvent = null;
  lastInvalidatedNode = null;
  selectorDataForRecalcStyle = /* @__PURE__ */ new Map();
  invalidatedNodeList = [];
}
function handleEvent27(event) {
  if (TraceEvents_exports.isStyleRecalcInvalidationTracking(event)) {
    if (event.args.data.subtree && event.args.data.reason === TraceEvents_exports.StyleRecalcInvalidationReason.RELATED_STYLE_RULE && lastInvalidatedNode && event.args.data.nodeId === lastInvalidatedNode.backendNodeId) {
      lastInvalidatedNode.subtree = true;
      return;
    }
  }
  if (TraceEvents_exports.isSelectorStats(event) && lastRecalcStyleEvent && event.args.selector_stats) {
    selectorDataForRecalcStyle.set(lastRecalcStyleEvent, {
      timings: event.args.selector_stats.selector_timings
    });
    return;
  }
  if (TraceEvents_exports.isStyleInvalidatorInvalidationTracking(event)) {
    const selectorList = new Array();
    event.args.data.selectors?.forEach((selector) => {
      selectorList.push({
        selector: selector.selector,
        styleSheetId: selector.style_sheet_id
      });
    });
    if (selectorList.length > 0) {
      lastInvalidatedNode = {
        frame: event.args.data.frame,
        backendNodeId: event.args.data.nodeId,
        type: TraceEvents_exports.InvalidationEventType.StyleInvalidatorInvalidationTracking,
        selectorList,
        ts: event.ts,
        tts: event.tts,
        subtree: false,
        lastRecalcStyleEventTs: lastRecalcStyleEvent ? lastRecalcStyleEvent.ts : Timing_exports.Micro(0)
      };
      invalidatedNodeList.push(lastInvalidatedNode);
    }
  }
  if (TraceEvents_exports.isRecalcStyle(event)) {
    lastRecalcStyleEvent = event;
    return;
  }
}
async function finalize27() {
}
function data27() {
  return {
    dataForRecalcStyleEvent: selectorDataForRecalcStyle,
    invalidatedNodeList
  };
}
var lastRecalcStyleEvent, lastInvalidatedNode, selectorDataForRecalcStyle, invalidatedNodeList;
var init_SelectorStatsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/SelectorStatsHandler.js"() {
    init_process_global();
    init_types2();
    lastRecalcStyleEvent = null;
    lastInvalidatedNode = null;
    selectorDataForRecalcStyle = /* @__PURE__ */ new Map();
    invalidatedNodeList = new Array();
    __name(reset27, "reset");
    __name(handleEvent27, "handleEvent");
    __name(finalize27, "finalize");
    __name(data27, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/UserInteractionsHandler.js
var UserInteractionsHandler_exports = {};
__export(UserInteractionsHandler_exports, {
  LONG_INTERACTION_THRESHOLD: () => LONG_INTERACTION_THRESHOLD,
  categoryOfInteraction: () => categoryOfInteraction,
  data: () => data28,
  deps: () => deps15,
  finalize: () => finalize28,
  handleEvent: () => handleEvent28,
  removeNestedInteractionsAndSetProcessingTime: () => removeNestedInteractionsAndSetProcessingTime,
  reset: () => reset28,
  scoreClassificationForInteractionToNextPaint: () => scoreClassificationForInteractionToNextPaint
});
function reset28() {
  beginCommitCompositorFrameEvents = [];
  parseMetaViewportEvents = [];
  interactionEvents = [];
  eventTimingStartEventsForInteractions = [];
  eventTimingEndEventsForInteractions = [];
  interactionEventsWithNoNesting = [];
  longestInteractionEvent = null;
}
function handleEvent28(event) {
  if (TraceEvents_exports.isBeginCommitCompositorFrame(event)) {
    beginCommitCompositorFrameEvents.push(event);
    return;
  }
  if (TraceEvents_exports.isParseMetaViewport(event)) {
    parseMetaViewportEvents.push(event);
    return;
  }
  if (!TraceEvents_exports.isEventTiming(event)) {
    return;
  }
  if (TraceEvents_exports.isEventTimingEnd(event)) {
    eventTimingEndEventsForInteractions.push(event);
  }
  if (!event.args.data || !TraceEvents_exports.isEventTimingStart(event)) {
    return;
  }
  const { duration, interactionId } = event.args.data;
  if (duration < 1 || interactionId === void 0 || interactionId === 0) {
    return;
  }
  eventTimingStartEventsForInteractions.push(event);
}
function categoryOfInteraction(interaction) {
  if (pointerEventTypes.has(interaction.type)) {
    return "POINTER";
  }
  if (keyboardEventTypes.has(interaction.type)) {
    return "KEYBOARD";
  }
  return "OTHER";
}
function removeNestedInteractionsAndSetProcessingTime(interactions) {
  const earliestEventForEndTimePerCategory = {
    POINTER: /* @__PURE__ */ new Map(),
    KEYBOARD: /* @__PURE__ */ new Map(),
    OTHER: /* @__PURE__ */ new Map()
  };
  function storeEventIfEarliestForCategoryAndEndTime(interaction) {
    const category = categoryOfInteraction(interaction);
    const earliestEventForEndTime = earliestEventForEndTimePerCategory[category];
    const endTime = Timing_exports.Micro(interaction.ts + interaction.dur);
    const earliestCurrentEvent = earliestEventForEndTime.get(endTime);
    if (!earliestCurrentEvent) {
      earliestEventForEndTime.set(endTime, interaction);
      return;
    }
    if (interaction.ts < earliestCurrentEvent.ts) {
      earliestEventForEndTime.set(endTime, interaction);
    } else if (interaction.ts === earliestCurrentEvent.ts && interaction.interactionId === earliestCurrentEvent.interactionId) {
      const currentProcessingDuration = earliestCurrentEvent.processingEnd - earliestCurrentEvent.processingStart;
      const newProcessingDuration = interaction.processingEnd - interaction.processingStart;
      if (newProcessingDuration > currentProcessingDuration) {
        earliestEventForEndTime.set(endTime, interaction);
      }
    }
    if (interaction.processingStart < earliestCurrentEvent.processingStart) {
      earliestCurrentEvent.processingStart = interaction.processingStart;
      writeSyntheticTimespans(earliestCurrentEvent);
    }
    if (interaction.processingEnd > earliestCurrentEvent.processingEnd) {
      earliestCurrentEvent.processingEnd = interaction.processingEnd;
      writeSyntheticTimespans(earliestCurrentEvent);
    }
  }
  __name(storeEventIfEarliestForCategoryAndEndTime, "storeEventIfEarliestForCategoryAndEndTime");
  for (const interaction of interactions) {
    storeEventIfEarliestForCategoryAndEndTime(interaction);
  }
  const keptEvents = Object.values(earliestEventForEndTimePerCategory).flatMap((eventsByEndTime) => Array.from(eventsByEndTime.values()));
  keptEvents.sort((eventA, eventB) => {
    return eventA.ts - eventB.ts;
  });
  return keptEvents;
}
function writeSyntheticTimespans(event) {
  const startEvent = event.args.data.beginEvent;
  const endEvent = event.args.data.endEvent;
  event.inputDelay = Timing_exports.Micro(event.processingStart - startEvent.ts);
  event.mainThreadHandling = Timing_exports.Micro(event.processingEnd - event.processingStart);
  event.presentationDelay = Timing_exports.Micro(endEvent.ts - event.processingEnd);
}
async function finalize28() {
  const { navigationsByFrameId: navigationsByFrameId2 } = data5();
  const beginAndEndEvents = ArrayUtilities_exports.mergeOrdered(eventTimingStartEventsForInteractions, eventTimingEndEventsForInteractions, Trace_exports.eventTimeComparator);
  const beginEventById = /* @__PURE__ */ new Map();
  for (const event of beginAndEndEvents) {
    if (TraceEvents_exports.isEventTimingStart(event)) {
      const forId = beginEventById.get(event.id) ?? [];
      forId.push(event);
      beginEventById.set(event.id, forId);
    } else if (TraceEvents_exports.isEventTimingEnd(event)) {
      const beginEvents = beginEventById.get(event.id) ?? [];
      const beginEvent = beginEvents.pop();
      if (!beginEvent) {
        continue;
      }
      const { type, interactionId, timeStamp, processingStart, processingEnd } = beginEvent.args.data;
      if (!type || !interactionId || !timeStamp || !processingStart || !processingEnd) {
        continue;
      }
      const processingStartRelativeToTraceTime = Timing_exports.Micro(Timing_exports3.milliToMicro(processingStart) - Timing_exports3.milliToMicro(timeStamp) + beginEvent.ts);
      const processingEndRelativeToTraceTime = Timing_exports.Micro(Timing_exports3.milliToMicro(processingEnd) - Timing_exports3.milliToMicro(timeStamp) + beginEvent.ts);
      const frameId = beginEvent.args.frame ?? beginEvent.args.data.frame ?? "";
      const navigation2 = Trace_exports.getNavigationForTraceEvent(beginEvent, frameId, navigationsByFrameId2);
      const navigationId = navigation2?.args.data?.navigationId;
      const interactionEvent = SyntheticEvents_exports.SyntheticEventsManager.registerSyntheticEvent({
        // Use the start event to define the common fields.
        rawSourceEvent: beginEvent,
        cat: beginEvent.cat,
        name: beginEvent.name,
        pid: beginEvent.pid,
        tid: beginEvent.tid,
        ph: beginEvent.ph,
        processingStart: processingStartRelativeToTraceTime,
        processingEnd: processingEndRelativeToTraceTime,
        // These will be set in writeSyntheticTimespans()
        inputDelay: Timing_exports.Micro(-1),
        mainThreadHandling: Timing_exports.Micro(-1),
        presentationDelay: Timing_exports.Micro(-1),
        args: {
          data: {
            beginEvent,
            endEvent: event,
            frame: frameId,
            navigationId
          }
        },
        ts: beginEvent.ts,
        dur: Timing_exports.Micro(event.ts - beginEvent.ts),
        type: beginEvent.args.data.type,
        interactionId: beginEvent.args.data.interactionId
      });
      writeSyntheticTimespans(interactionEvent);
      interactionEvents.push(interactionEvent);
    }
  }
  Trace_exports.sortTraceEventsInPlace(interactionEvents);
  interactionEventsWithNoNesting.push(...removeNestedInteractionsAndSetProcessingTime(interactionEvents));
  for (const interactionEvent of interactionEventsWithNoNesting) {
    if (!longestInteractionEvent || longestInteractionEvent.dur < interactionEvent.dur) {
      longestInteractionEvent = interactionEvent;
    }
  }
}
function data28() {
  return {
    beginCommitCompositorFrameEvents,
    parseMetaViewportEvents,
    interactionEvents,
    interactionEventsWithNoNesting,
    longestInteractionEvent,
    interactionsOverThreshold: new Set(interactionEvents.filter((event) => {
      return event.dur > LONG_INTERACTION_THRESHOLD;
    }))
  };
}
function deps15() {
  return ["Meta"];
}
function scoreClassificationForInteractionToNextPaint(timing) {
  if (timing <= INP_GOOD_TIMING) {
    return ScoreClassification.GOOD;
  }
  if (timing <= INP_MEDIUM_TIMING) {
    return ScoreClassification.OK;
  }
  return ScoreClassification.BAD;
}
var beginCommitCompositorFrameEvents, parseMetaViewportEvents, LONG_INTERACTION_THRESHOLD, INP_GOOD_TIMING, INP_MEDIUM_TIMING, longestInteractionEvent, interactionEvents, interactionEventsWithNoNesting, eventTimingStartEventsForInteractions, eventTimingEndEventsForInteractions, pointerEventTypes, keyboardEventTypes;
var init_UserInteractionsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/UserInteractionsHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_MetaHandler();
    init_PageLoadMetricsHandler();
    beginCommitCompositorFrameEvents = [];
    parseMetaViewportEvents = [];
    LONG_INTERACTION_THRESHOLD = Timing_exports3.milliToMicro(Timing_exports.Milli(200));
    INP_GOOD_TIMING = LONG_INTERACTION_THRESHOLD;
    INP_MEDIUM_TIMING = Timing_exports3.milliToMicro(Timing_exports.Milli(500));
    longestInteractionEvent = null;
    interactionEvents = [];
    interactionEventsWithNoNesting = [];
    eventTimingStartEventsForInteractions = [];
    eventTimingEndEventsForInteractions = [];
    __name(reset28, "reset");
    __name(handleEvent28, "handleEvent");
    pointerEventTypes = /* @__PURE__ */ new Set([
      "pointerdown",
      "touchstart",
      "pointerup",
      "touchend",
      "mousedown",
      "mouseup",
      "click"
    ]);
    keyboardEventTypes = /* @__PURE__ */ new Set([
      "keydown",
      "keypress",
      "keyup"
    ]);
    __name(categoryOfInteraction, "categoryOfInteraction");
    __name(removeNestedInteractionsAndSetProcessingTime, "removeNestedInteractionsAndSetProcessingTime");
    __name(writeSyntheticTimespans, "writeSyntheticTimespans");
    __name(finalize28, "finalize");
    __name(data28, "data");
    __name(deps15, "deps");
    __name(scoreClassificationForInteractionToNextPaint, "scoreClassificationForInteractionToNextPaint");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/WorkersHandler.js
var WorkersHandler_exports = {};
__export(WorkersHandler_exports, {
  data: () => data29,
  finalize: () => finalize29,
  handleEvent: () => handleEvent29,
  reset: () => reset29
});
function reset29() {
  sessionIdEvents = [];
  workerIdByThread = /* @__PURE__ */ new Map();
  workerURLById = /* @__PURE__ */ new Map();
}
function handleEvent29(event) {
  if (TraceEvents_exports.isTracingSessionIdForWorker(event)) {
    sessionIdEvents.push(event);
  }
}
async function finalize29() {
  for (const sessionIdEvent of sessionIdEvents) {
    if (!sessionIdEvent.args.data) {
      continue;
    }
    workerIdByThread.set(sessionIdEvent.args.data.workerThreadId, sessionIdEvent.args.data.workerId);
    workerURLById.set(sessionIdEvent.args.data.workerId, sessionIdEvent.args.data.url);
  }
}
function data29() {
  return {
    workerSessionIdEvents: sessionIdEvents,
    workerIdByThread,
    workerURLById
  };
}
var sessionIdEvents, workerIdByThread, workerURLById;
var init_WorkersHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/WorkersHandler.js"() {
    init_process_global();
    init_types2();
    sessionIdEvents = [];
    workerIdByThread = /* @__PURE__ */ new Map();
    workerURLById = /* @__PURE__ */ new Map();
    __name(reset29, "reset");
    __name(handleEvent29, "handleEvent");
    __name(finalize29, "finalize");
    __name(data29, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/WarningsHandler.js
var WarningsHandler_exports = {};
__export(WarningsHandler_exports, {
  FORCED_REFLOW_THRESHOLD: () => FORCED_REFLOW_THRESHOLD,
  LONG_MAIN_THREAD_TASK_THRESHOLD: () => LONG_MAIN_THREAD_TASK_THRESHOLD,
  data: () => data30,
  deps: () => deps16,
  finalize: () => finalize30,
  handleEvent: () => handleEvent30,
  reset: () => reset30
});
function reset30() {
  warningsPerEvent = /* @__PURE__ */ new Map();
  eventsPerWarning = /* @__PURE__ */ new Map();
  allEventsStack = [];
  jsInvokeStack = [];
  taskReflowEvents = [];
  longTaskEvents = [];
}
function storeWarning(event, warning) {
  const existingWarnings = MapUtilities_exports.getWithDefault(warningsPerEvent, event, () => []);
  existingWarnings.push(warning);
  warningsPerEvent.set(event, existingWarnings);
  const existingEvents = MapUtilities_exports.getWithDefault(eventsPerWarning, warning, () => []);
  existingEvents.push(event);
  eventsPerWarning.set(warning, existingEvents);
}
function handleEvent30(event) {
  processForcedReflowWarning(event);
  if (event.name === TraceEvents_exports.Name.RUN_TASK) {
    const { duration } = Timing_exports3.eventTimingsMicroSeconds(event);
    if (duration > LONG_MAIN_THREAD_TASK_THRESHOLD) {
      longTaskEvents.push(event);
    }
    return;
  }
  if (TraceEvents_exports.isFireIdleCallback(event)) {
    const { duration } = Timing_exports3.eventTimingsMilliSeconds(event);
    if (duration > event.args.data.allottedMilliseconds) {
      storeWarning(event, "IDLE_CALLBACK_OVER_TIME");
    }
    return;
  }
}
function processForcedReflowWarning(event) {
  accomodateEventInStack(event, allEventsStack);
  accomodateEventInStack(
    event,
    jsInvokeStack,
    /* pushEventToStack */
    TraceEvents_exports.isJSInvocationEvent(event)
  );
  if (jsInvokeStack.length) {
    if (event.name === TraceEvents_exports.Name.LAYOUT || event.name === TraceEvents_exports.Name.RECALC_STYLE) {
      taskReflowEvents.push(event);
      return;
    }
  }
  if (allEventsStack.length === 1) {
    const totalTime = taskReflowEvents.reduce((time, event2) => time + (event2.dur || 0), 0);
    if (totalTime >= FORCED_REFLOW_THRESHOLD) {
      taskReflowEvents.forEach((reflowEvent) => storeWarning(reflowEvent, "FORCED_REFLOW"));
    }
    taskReflowEvents.length = 0;
  }
}
function accomodateEventInStack(event, stack, pushEventToStack = true) {
  let nextItem = stack.at(-1);
  while (nextItem && event.ts > nextItem.ts + (nextItem.dur || 0)) {
    stack.pop();
    nextItem = stack.at(-1);
  }
  if (!pushEventToStack) {
    return;
  }
  stack.push(event);
}
function deps16() {
  return ["UserInteractions", "Workers"];
}
async function finalize30() {
  const longInteractions = data28().interactionsOverThreshold;
  for (const interaction of longInteractions) {
    storeWarning(interaction, "LONG_INTERACTION");
  }
  for (const event of longTaskEvents) {
    if (!(event.tid, data29().workerIdByThread.has(event.tid))) {
      storeWarning(event, "LONG_TASK");
    }
  }
  longTaskEvents.length = 0;
}
function data30() {
  return {
    perEvent: warningsPerEvent,
    perWarning: eventsPerWarning
  };
}
var warningsPerEvent, eventsPerWarning, allEventsStack, jsInvokeStack, taskReflowEvents, longTaskEvents, FORCED_REFLOW_THRESHOLD, LONG_MAIN_THREAD_TASK_THRESHOLD;
var init_WarningsHandler = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/WarningsHandler.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_UserInteractionsHandler();
    init_WorkersHandler();
    warningsPerEvent = /* @__PURE__ */ new Map();
    eventsPerWarning = /* @__PURE__ */ new Map();
    allEventsStack = [];
    jsInvokeStack = [];
    taskReflowEvents = [];
    longTaskEvents = [];
    FORCED_REFLOW_THRESHOLD = Timing_exports3.milliToMicro(Timing_exports.Milli(30));
    LONG_MAIN_THREAD_TASK_THRESHOLD = Timing_exports3.milliToMicro(Timing_exports.Milli(50));
    __name(reset30, "reset");
    __name(storeWarning, "storeWarning");
    __name(handleEvent30, "handleEvent");
    __name(processForcedReflowWarning, "processForcedReflowWarning");
    __name(accomodateEventInStack, "accomodateEventInStack");
    __name(deps16, "deps");
    __name(finalize30, "finalize");
    __name(data30, "data");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/ModelHandlers.js
var ModelHandlers_exports = {};
__export(ModelHandlers_exports, {
  AnimationFrames: () => AnimationFramesHandler_exports,
  Animations: () => AnimationHandler_exports,
  AsyncJSCalls: () => AsyncJSCallsHandler_exports,
  AuctionWorklets: () => AuctionWorkletsHandler_exports,
  DOMStats: () => DOMStatsHandler_exports,
  ExtensionTraceData: () => ExtensionTraceDataHandler_exports,
  Flows: () => FlowsHandler_exports,
  Frames: () => FramesHandler_exports,
  GPU: () => GPUHandler_exports,
  ImagePainting: () => ImagePaintingHandler_exports,
  Initiators: () => InitiatorsHandler_exports,
  Invalidations: () => InvalidationsHandler_exports,
  LargestImagePaint: () => LargestImagePaintHandler_exports,
  LargestTextPaint: () => LargestTextPaintHandler_exports,
  LayerTree: () => LayerTreeHandler_exports,
  LayoutShifts: () => LayoutShiftsHandler_exports,
  Memory: () => MemoryHandler_exports,
  Meta: () => MetaHandler_exports,
  NetworkRequests: () => NetworkRequestsHandler_exports,
  PageFrames: () => PageFramesHandler_exports,
  PageLoadMetrics: () => PageLoadMetricsHandler_exports,
  Renderer: () => RendererHandler_exports,
  Samples: () => SamplesHandler_exports,
  Screenshots: () => ScreenshotsHandler_exports,
  Scripts: () => ScriptsHandler_exports,
  SelectorStats: () => SelectorStatsHandler_exports,
  UserInteractions: () => UserInteractionsHandler_exports,
  UserTimings: () => UserTimingsHandler_exports,
  Warnings: () => WarningsHandler_exports,
  Workers: () => WorkersHandler_exports
});
var init_ModelHandlers = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/ModelHandlers.js"() {
    init_process_global();
    init_AnimationFramesHandler();
    init_AnimationHandler();
    init_AsyncJSCallsHandler();
    init_AuctionWorkletsHandler();
    init_DOMStatsHandler();
    init_ExtensionTraceDataHandler();
    init_FlowsHandler();
    init_FramesHandler();
    init_GPUHandler();
    init_ImagePaintingHandler();
    init_InitiatorsHandler();
    init_InvalidationsHandler();
    init_LargestImagePaintHandler();
    init_LargestTextPaintHandler();
    init_LayerTreeHandler();
    init_LayoutShiftsHandler();
    init_MemoryHandler();
    init_MetaHandler();
    init_NetworkRequestsHandler();
    init_PageFramesHandler();
    init_PageLoadMetricsHandler();
    init_RendererHandler();
    init_SamplesHandler();
    init_ScreenshotsHandler();
    init_ScriptsHandler();
    init_SelectorStatsHandler();
    init_UserInteractionsHandler();
    init_UserTimingsHandler();
    init_WarningsHandler();
    init_WorkersHandler();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/types.js
var types_exports3 = {};
var init_types3 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/types.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/handlers/handlers.js
var handlers_exports = {};
__export(handlers_exports, {
  Helpers: () => helpers_exports,
  ModelHandlers: () => ModelHandlers_exports,
  Threads: () => Threads_exports,
  Types: () => types_exports3
});
var init_handlers = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/handlers/handlers.js"() {
    init_process_global();
    init_helpers();
    init_ModelHandlers();
    init_Threads();
    init_types3();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/EntityMapper.js
var init_EntityMapper = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/EntityMapper.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/EventsSerializer.js
var init_EventsSerializer = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/EventsSerializer.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/StackTraceForEvent.js
var StackTraceForEvent_exports = {};
__export(StackTraceForEvent_exports, {
  clearCacheForTrace: () => clearCacheForTrace,
  get: () => get,
  stackTraceForEventInTrace: () => stackTraceForEventInTrace
});
function clearCacheForTrace(data31) {
  stackTraceForEventInTrace.delete(data31);
}
function get(event, data31) {
  let cacheForTrace = stackTraceForEventInTrace.get(data31);
  if (!cacheForTrace) {
    cacheForTrace = /* @__PURE__ */ new Map();
    stackTraceForEventInTrace.set(data31, cacheForTrace);
  }
  const resultFromCache = cacheForTrace.get(event);
  if (resultFromCache) {
    return resultFromCache;
  }
  let result = null;
  if (Extensions_exports.isSyntheticExtensionEntry(event)) {
    result = getForExtensionEntry(event, data31);
  } else if (TraceEvents_exports.isPerformanceMeasureBegin(event)) {
    result = getForPerformanceMeasure(event, data31);
  } else {
    result = getForEvent(event, data31);
    const payloadCallFrames = getTraceEventPayloadStackAsProtocolCallFrame(event).filter((callFrame) => !isNativeJSFunction(callFrame));
    if (!result.callFrames.length) {
      result.callFrames = payloadCallFrames;
    } else {
      for (let i = 0; i < payloadCallFrames.length && i < result.callFrames.length; i++) {
        result.callFrames[i] = payloadCallFrames[i];
      }
    }
  }
  if (result) {
    cacheForTrace.set(event, result);
  }
  return result;
}
function getForEvent(event, data31) {
  const entryToNode4 = data31.Renderer.entryToNode.size > 0 ? data31.Renderer.entryToNode : data31.Samples.entryToNode;
  const topStackTrace = { callFrames: [] };
  let stackTrace = topStackTrace;
  let currentEntry;
  let node = entryToNode4.get(event);
  const traceCache = stackTraceForEventInTrace.get(data31) || /* @__PURE__ */ new Map();
  stackTraceForEventInTrace.set(data31, traceCache);
  while (node) {
    if (!TraceEvents_exports.isProfileCall(node.entry)) {
      const maybeAsyncParent = data31.AsyncJSCalls.runEntryPointToScheduler.get(node.entry);
      if (!maybeAsyncParent) {
        node = node.parent;
        continue;
      }
      const maybeAsyncParentNode2 = maybeAsyncParent && entryToNode4.get(maybeAsyncParent.scheduler);
      if (maybeAsyncParentNode2) {
        stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParent.taskName);
        node = maybeAsyncParentNode2;
      }
      continue;
    }
    currentEntry = node.entry;
    const stackTraceFromCache = traceCache.get(node.entry);
    if (stackTraceFromCache) {
      stackTrace.callFrames.push(...stackTraceFromCache.callFrames.filter((callFrame) => !isNativeJSFunction(callFrame)));
      stackTrace.parent = stackTraceFromCache.parent;
      stackTrace.description = stackTrace.description || stackTraceFromCache.description;
      break;
    }
    if (!isNativeJSFunction(currentEntry.callFrame)) {
      stackTrace.callFrames.push(currentEntry.callFrame);
    }
    const maybeAsyncParentEvent = data31.AsyncJSCalls.asyncCallToScheduler.get(currentEntry);
    const maybeAsyncParentNode = maybeAsyncParentEvent && entryToNode4.get(maybeAsyncParentEvent.scheduler);
    if (maybeAsyncParentNode) {
      stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParentEvent.taskName);
      node = maybeAsyncParentNode;
      continue;
    }
    node = node.parent;
  }
  return topStackTrace;
}
function addAsyncParentToStack(stackTrace, taskName) {
  const parent = { callFrames: [] };
  stackTrace.parent = parent;
  parent.description = taskName;
  return parent;
}
function getForExtensionEntry(event, data31) {
  const rawEvent = event.rawSourceEvent;
  if (TraceEvents_exports.isPerformanceMeasureBegin(rawEvent)) {
    return getForPerformanceMeasure(rawEvent, data31);
  }
  if (!rawEvent) {
    return null;
  }
  return get(rawEvent, data31);
}
function getForPerformanceMeasure(event, data31) {
  let rawEvent = event;
  if (event.args.traceId === void 0) {
    return null;
  }
  rawEvent = data31.UserTimings.measureTraceByTraceId.get(event.args.traceId);
  if (!rawEvent) {
    return null;
  }
  return get(rawEvent, data31);
}
function isNativeJSFunction({ columnNumber, lineNumber, url, scriptId }) {
  return lineNumber === -1 && columnNumber === -1 && url === "" && scriptId === "0";
}
function getTraceEventPayloadStackAsProtocolCallFrame(event) {
  const payloadCallStack = Trace_exports.getZeroIndexedStackTraceInEventPayload(event) || [];
  const callFrames = [];
  for (const frame of payloadCallStack) {
    callFrames.push({ ...frame, scriptId: String(frame.scriptId) });
  }
  return callFrames;
}
var stackTraceForEventInTrace;
var init_StackTraceForEvent = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/StackTraceForEvent.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    stackTraceForEventInTrace = /* @__PURE__ */ new Map();
    __name(clearCacheForTrace, "clearCacheForTrace");
    __name(get, "get");
    __name(getForEvent, "getForEvent");
    __name(addAsyncParentToStack, "addAsyncParentToStack");
    __name(getForExtensionEntry, "getForExtensionEntry");
    __name(getForPerformanceMeasure, "getForPerformanceMeasure");
    __name(isNativeJSFunction, "isNativeJSFunction");
    __name(getTraceEventPayloadStackAsProtocolCallFrame, "getTraceEventPayloadStackAsProtocolCallFrame");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/Initiators.js
var Initiators_exports = {};
__export(Initiators_exports, {
  getNetworkInitiator: () => getNetworkInitiator
});
function getNetworkInitiator(data31, event) {
  const networkHandlerInitiator = data31.NetworkRequests.incompleteInitiator.get(event);
  if (networkHandlerInitiator?.args.data.mimeType === "text/css") {
    return networkHandlerInitiator;
  }
  const stack = get(event.rawSourceEvent, data31);
  const initiatorCallFrame = stack?.parent?.callFrames.at(0);
  if (!initiatorCallFrame) {
    return networkHandlerInitiator;
  }
  const matchingRequestIds = data31.NetworkRequests.requestIdsByURL.get(initiatorCallFrame.url) ?? [];
  const matchingRequests = matchingRequestIds.map((id) => data31.NetworkRequests.byId.get(id)).filter((req) => req !== void 0).filter((req) => req.ts < event.ts);
  return matchingRequests.at(-1);
}
var init_Initiators = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/Initiators.js"() {
    init_process_global();
    init_StackTraceForEvent();
    __name(getNetworkInitiator, "getNetworkInitiator");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/ScriptDuplication.js
var ScriptDuplication_exports = {};
__export(ScriptDuplication_exports, {
  computeScriptDuplication: () => computeScriptDuplication,
  getNodeModuleName: () => getNodeModuleName,
  normalizeDuplication: () => normalizeDuplication,
  normalizeSource: () => normalizeSource
});
function normalizeSource(source) {
  source = source.replace(/\?$/, "");
  const lastNodeModulesIndex = source.lastIndexOf("node_modules");
  if (lastNodeModulesIndex !== -1) {
    source = source.substring(lastNodeModulesIndex);
  }
  return source;
}
function shouldIgnoreSource(source) {
  if (source.includes("webpack/bootstrap")) {
    return true;
  }
  if (source.includes("(webpack)/buildin")) {
    return true;
  }
  if (source.includes("external ")) {
    return true;
  }
  return false;
}
function normalizeDuplication(duplication) {
  for (const [key, data31] of duplication) {
    data31.duplicates.sort((a, b) => b.attributedSize - a.attributedSize);
    if (data31.duplicates.length > 1) {
      const largestResourceSize = data31.duplicates[0].attributedSize;
      data31.duplicates = data31.duplicates.filter((duplicate) => {
        const percentSize = duplicate.attributedSize / largestResourceSize;
        return percentSize >= RELATIVE_SIZE_THRESHOLD;
      });
    }
    data31.duplicates = data31.duplicates.filter((duplicate) => duplicate.attributedSize >= ABSOLUTE_SIZE_THRESHOLD_BYTES);
    if (data31.duplicates.length <= 1) {
      duplication.delete(key);
      continue;
    }
    data31.estimatedDuplicateBytes = data31.duplicates.slice(1).reduce((acc, cur) => acc + cur.attributedSize, 0);
  }
}
function indexOfOrLength(haystack, needle, startPosition = 0) {
  const index = haystack.indexOf(needle, startPosition);
  return index === -1 ? haystack.length : index;
}
function getNodeModuleName(source) {
  const sourceSplit = source.split("node_modules/");
  source = sourceSplit[sourceSplit.length - 1];
  const indexFirstSlash = indexOfOrLength(source, "/");
  if (source[0] === "@") {
    return source.slice(0, indexOfOrLength(source, "/", indexFirstSlash + 1));
  }
  return source.slice(0, indexFirstSlash);
}
function groupByNodeModules(duplication) {
  const groupedDuplication = /* @__PURE__ */ new Map();
  for (const [source, data31] of duplication) {
    if (!source.includes("node_modules")) {
      groupedDuplication.set(source, data31);
      continue;
    }
    const nodeModuleKey = "node_modules/" + getNodeModuleName(source);
    const aggregatedData = groupedDuplication.get(nodeModuleKey) ?? {
      duplicates: [],
      // This is calculated in normalizeDuplication.
      estimatedDuplicateBytes: 0
    };
    groupedDuplication.set(nodeModuleKey, aggregatedData);
    for (const { script, attributedSize } of data31.duplicates) {
      let duplicate = aggregatedData.duplicates.find((d) => d.script === script);
      if (!duplicate) {
        duplicate = { script, attributedSize: 0 };
        aggregatedData.duplicates.push(duplicate);
      }
      duplicate.attributedSize += attributedSize;
    }
  }
  return groupedDuplication;
}
function sorted(duplication) {
  return new Map([...duplication].sort((a, b) => b[1].estimatedDuplicateBytes - a[1].estimatedDuplicateBytes));
}
function computeScriptDuplication(scriptsData, compressionRatios) {
  const sourceDatasMap = /* @__PURE__ */ new Map();
  for (const script of scriptsData.scripts) {
    if (!script.content || !script.sourceMap) {
      continue;
    }
    const sizes = ModelHandlers_exports.Scripts.getScriptGeneratedSizes(script);
    if (!sizes) {
      continue;
    }
    if ("errorMessage" in sizes) {
      console.error(sizes.errorMessage);
      continue;
    }
    const sourceDataArray = [];
    sourceDatasMap.set(script, sourceDataArray);
    const sources = script.sourceMap.sourceURLs();
    for (let i = 0; i < sources.length; i++) {
      if (shouldIgnoreSource(sources[i])) {
        continue;
      }
      const sourceSize = sizes.files[sources[i]];
      sourceDataArray.push({
        source: normalizeSource(sources[i]),
        resourceSize: sourceSize
      });
    }
  }
  const duplication = /* @__PURE__ */ new Map();
  for (const [script, sourceDataArray] of sourceDatasMap) {
    for (const sourceData of sourceDataArray) {
      let data31 = duplication.get(sourceData.source);
      if (!data31) {
        data31 = { estimatedDuplicateBytes: 0, duplicates: [] };
        duplication.set(sourceData.source, data31);
      }
      const compressionRatio = script.request ? compressionRatios.get(script.request?.args.data.requestId) ?? 1 : 1;
      const transferSize = Math.round(sourceData.resourceSize * compressionRatio);
      data31.duplicates.push({
        script,
        attributedSize: transferSize
      });
    }
  }
  const duplicationGroupedByNodeModules = groupByNodeModules(duplication);
  normalizeDuplication(duplication);
  normalizeDuplication(duplicationGroupedByNodeModules);
  return {
    duplication: sorted(duplication),
    duplicationGroupedByNodeModules: sorted(duplicationGroupedByNodeModules)
  };
}
var ABSOLUTE_SIZE_THRESHOLD_BYTES, RELATIVE_SIZE_THRESHOLD;
var init_ScriptDuplication = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/ScriptDuplication.js"() {
    init_process_global();
    init_handlers();
    ABSOLUTE_SIZE_THRESHOLD_BYTES = 1024 * 0.5;
    RELATIVE_SIZE_THRESHOLD = 0.1;
    __name(normalizeSource, "normalizeSource");
    __name(shouldIgnoreSource, "shouldIgnoreSource");
    __name(normalizeDuplication, "normalizeDuplication");
    __name(indexOfOrLength, "indexOfOrLength");
    __name(getNodeModuleName, "getNodeModuleName");
    __name(groupByNodeModules, "groupByNodeModules");
    __name(sorted, "sorted");
    __name(computeScriptDuplication, "computeScriptDuplication");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/TraceFilter.js
var TraceFilter, VisibleEventsFilter, ExclusiveNameFilter;
var init_TraceFilter = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/TraceFilter.js"() {
    init_process_global();
    init_types2();
    TraceFilter = class {
      static {
        __name(this, "TraceFilter");
      }
    };
    VisibleEventsFilter = class _VisibleEventsFilter extends TraceFilter {
      static {
        __name(this, "VisibleEventsFilter");
      }
      visibleTypes;
      constructor(visibleTypes) {
        super();
        this.visibleTypes = new Set(visibleTypes);
      }
      accept(event) {
        if (Extensions_exports.isSyntheticExtensionEntry(event)) {
          return true;
        }
        return this.visibleTypes.has(_VisibleEventsFilter.eventType(event));
      }
      static eventType(event) {
        if (event.cat.includes("blink.console")) {
          return TraceEvents_exports.Name.CONSOLE_TIME;
        }
        if (event.cat.includes("blink.user_timing")) {
          return TraceEvents_exports.Name.USER_TIMING;
        }
        return event.name;
      }
    };
    ExclusiveNameFilter = class extends TraceFilter {
      static {
        __name(this, "ExclusiveNameFilter");
      }
      #excludeNames;
      constructor(excludeNames) {
        super();
        this.#excludeNames = new Set(excludeNames);
      }
      accept(event) {
        return !this.#excludeNames.has(event.name);
      }
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/TraceTree.js
function generateEventID(event) {
  if (TraceEvents_exports.isProfileCall(event)) {
    const name = SamplesIntegrator.isNativeRuntimeFrame(event.callFrame) ? SamplesIntegrator.nativeGroup(event.callFrame.functionName) : event.callFrame.functionName;
    const location = event.callFrame.scriptId || event.callFrame.url || "";
    return `f:${name}@${location}:${event.callFrame.lineNumber}:${event.callFrame.columnNumber}`;
  }
  if (TraceEvents_exports.isConsoleTimeStamp(event) && event.args.data) {
    return `${event.name}:${event.args.data.name}`;
  }
  if (TraceEvents_exports.isSyntheticNetworkRequest(event) || TraceEvents_exports.isReceivedDataEvent(event)) {
    return `req:${event.args.data.requestId}`;
  }
  return event.name;
}
var Node2, BottomUpRootNode, GroupNode, BottomUpNode;
var init_TraceTree = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/TraceTree.js"() {
    init_process_global();
    init_helpers2();
    init_SamplesIntegrator();
    init_types2();
    Node2 = class {
      static {
        __name(this, "Node");
      }
      /** ms */
      totalTime;
      /** ms */
      selfTime;
      transferSize;
      id;
      /** The first trace event encountered that necessitated the creation of this tree node. */
      event;
      /**
       * All of the trace events associated with this aggregate node.
       * Minor: In the case of Event Log (EventsTimelineTreeView), the node is not aggregate and this will only hold 1 event, the same that's in this.event
       */
      events;
      parent;
      groupId;
      isGroupNodeInternal;
      depth;
      constructor(id, event) {
        this.totalTime = 0;
        this.selfTime = 0;
        this.transferSize = 0;
        this.id = id;
        this.event = event;
        this.events = [event];
        this.groupId = "";
        this.isGroupNodeInternal = false;
        this.depth = 0;
      }
      isGroupNode() {
        return this.isGroupNodeInternal;
      }
      hasChildren() {
        throw new Error("Not implemented");
      }
      setHasChildren(_value) {
        throw new Error("Not implemented");
      }
      /**
       * Returns the direct descendants of this node.
       * @returns a map with ordered <nodeId, Node> tuples.
       */
      children() {
        throw new Error("Not implemented");
      }
      searchTree(matchFunction, results) {
        results = results || [];
        if (this.event && matchFunction(this.event)) {
          results.push(this);
        }
        for (const child of this.children().values()) {
          child.searchTree(matchFunction, results);
        }
        return results;
      }
    };
    BottomUpRootNode = class extends Node2 {
      static {
        __name(this, "BottomUpRootNode");
      }
      childrenInternal;
      textFilter;
      filter;
      startTime;
      endTime;
      totalTime;
      eventGroupIdCallback;
      calculateTransferSize;
      forceGroupIdCallback;
      constructor(events, { textFilter, filters, startTime, endTime, eventGroupIdCallback, calculateTransferSize, forceGroupIdCallback }) {
        super("", events[0]);
        this.childrenInternal = null;
        this.events = events;
        this.textFilter = textFilter;
        this.filter = (e) => filters.every((f) => f.accept(e));
        this.startTime = startTime;
        this.endTime = endTime;
        this.eventGroupIdCallback = eventGroupIdCallback;
        this.totalTime = endTime - startTime;
        this.calculateTransferSize = calculateTransferSize;
        this.forceGroupIdCallback = forceGroupIdCallback;
      }
      hasChildren() {
        return true;
      }
      filterChildren(children) {
        for (const [id, child] of children) {
          if (child.event && child.depth <= 1 && !this.textFilter.accept(child.event)) {
            children.delete(id);
          }
        }
        return children;
      }
      children() {
        if (!this.childrenInternal) {
          this.childrenInternal = this.filterChildren(this.grouppedTopNodes());
        }
        return this.childrenInternal;
      }
      // If no grouping is applied, the nodes returned here are what's initially shown in the bottom-up view.
      // "No grouping" == no grouping in UI dropdown == no groupingFunction…
      // … HOWEVER, nodes are still aggregated via `generateEventID`, which is ~= the event name.
      ungroupedTopNodes() {
        const root2 = this;
        const startTime = this.startTime;
        const endTime = this.endTime;
        const idStack = [];
        const nodeById = /* @__PURE__ */ new Map();
        const selfTimeStack = [endTime - startTime];
        const firstNodeStack = [];
        const totalTimeById = /* @__PURE__ */ new Map();
        const eventGroupIdCallback = this.eventGroupIdCallback;
        const forceGroupIdCallback = this.forceGroupIdCallback;
        const sumTransferSizeOfInstantEvent = /* @__PURE__ */ __name((e) => {
          if (TraceEvents_exports.isReceivedDataEvent(e)) {
            let id = generateEventID(e);
            if (this.forceGroupIdCallback && this.eventGroupIdCallback) {
              id = `${id}-${this.eventGroupIdCallback(e)}`;
            }
            let node = nodeById.get(id);
            if (!node) {
              node = new BottomUpNode(root2, id, e, false, root2);
              nodeById.set(id, node);
            } else {
              node.events.push(e);
            }
            if (e.name === "ResourceReceivedData") {
              node.transferSize += e.args.data.encodedDataLength;
            } else if (e.args.data.encodedDataLength > 0) {
              node.transferSize = e.args.data.encodedDataLength;
            }
          }
        }, "sumTransferSizeOfInstantEvent");
        Trace_exports.forEachEvent(this.events, {
          onStartEvent,
          onEndEvent,
          onInstantEvent: this.calculateTransferSize ? sumTransferSizeOfInstantEvent : void 0,
          startTime: Timing_exports3.milliToMicro(this.startTime),
          endTime: Timing_exports3.milliToMicro(this.endTime),
          eventFilter: this.filter,
          ignoreAsyncEvents: false
        });
        function onStartEvent(e) {
          const { startTime: currentStartTime, endTime: currentEndTime } = Timing_exports3.eventTimingsMilliSeconds(e);
          const actualEndTime = currentEndTime !== void 0 ? Math.min(currentEndTime, endTime) : endTime;
          const duration = actualEndTime - Math.max(currentStartTime, startTime);
          selfTimeStack[selfTimeStack.length - 1] -= duration;
          selfTimeStack.push(duration);
          let id = generateEventID(e);
          if (forceGroupIdCallback && eventGroupIdCallback) {
            id = `${id}-${eventGroupIdCallback(e)}`;
          }
          idStack.push(id);
          const noNodeOnStack = !totalTimeById.has(id);
          if (noNodeOnStack) {
            totalTimeById.set(id, duration);
          }
          firstNodeStack.push(noNodeOnStack);
        }
        __name(onStartEvent, "onStartEvent");
        function onEndEvent(event) {
          const id = idStack.pop();
          if (!id) {
            return;
          }
          let node = nodeById.get(id);
          if (!node) {
            node = new BottomUpNode(root2, id, event, false, root2);
            nodeById.set(id, node);
          } else {
            node.events.push(event);
          }
          node.selfTime += selfTimeStack.pop() || 0;
          if (firstNodeStack.pop()) {
            node.totalTime += totalTimeById.get(id) || 0;
            totalTimeById.delete(id);
          }
          if (idStack.length > 0) {
            node.setHasChildren(true);
          }
        }
        __name(onEndEvent, "onEndEvent");
        this.selfTime = selfTimeStack.pop() || 0;
        for (const pair of nodeById) {
          if (pair[1].selfTime <= 0 && (!this.calculateTransferSize || pair[1].transferSize <= 0)) {
            nodeById.delete(pair[0]);
          }
        }
        return nodeById;
      }
      grouppedTopNodes() {
        const flatNodes = this.ungroupedTopNodes();
        if (!this.eventGroupIdCallback) {
          return flatNodes;
        }
        const groupNodes = /* @__PURE__ */ new Map();
        for (const node of flatNodes.values()) {
          const groupId = this.eventGroupIdCallback(node.event);
          let groupNode = groupNodes.get(groupId);
          if (!groupNode) {
            groupNode = new GroupNode(groupId, this, node.events);
            groupNodes.set(groupId, groupNode);
          } else {
            for (const e of node.events) {
              groupNode.events.push(e);
            }
          }
          groupNode.addChild(node, node.selfTime, node.selfTime, node.transferSize);
        }
        return groupNodes;
      }
    };
    GroupNode = class extends Node2 {
      static {
        __name(this, "GroupNode");
      }
      childrenInternal;
      isGroupNodeInternal;
      events;
      constructor(id, parent, events) {
        super(id, events[0]);
        this.events = events;
        this.childrenInternal = /* @__PURE__ */ new Map();
        this.parent = parent;
        this.isGroupNodeInternal = true;
      }
      addChild(child, selfTime, totalTime, transferSize) {
        this.childrenInternal.set(child.id, child);
        this.selfTime += selfTime;
        this.totalTime += totalTime;
        this.transferSize += transferSize;
        child.parent = this;
      }
      hasChildren() {
        return true;
      }
      children() {
        return this.childrenInternal;
      }
    };
    BottomUpNode = class _BottomUpNode extends Node2 {
      static {
        __name(this, "BottomUpNode");
      }
      parent;
      root;
      depth;
      cachedChildren;
      hasChildrenInternal;
      constructor(root2, id, event, hasChildren, parent) {
        super(id, event);
        this.parent = parent;
        this.root = root2;
        this.depth = (parent.depth || 0) + 1;
        this.cachedChildren = null;
        this.hasChildrenInternal = hasChildren;
      }
      hasChildren() {
        return this.hasChildrenInternal;
      }
      setHasChildren(value) {
        this.hasChildrenInternal = value;
      }
      children() {
        if (this.cachedChildren) {
          return this.cachedChildren;
        }
        const selfTimeStack = [0];
        const eventIdStack = [];
        const eventStack = [];
        const nodeById = /* @__PURE__ */ new Map();
        const startTime = this.root.startTime;
        const endTime = this.root.endTime;
        let lastTimeMarker = startTime;
        const self2 = this;
        Trace_exports.forEachEvent(this.root.events, {
          onStartEvent,
          onEndEvent,
          startTime: Timing_exports3.milliToMicro(startTime),
          endTime: Timing_exports3.milliToMicro(endTime),
          eventFilter: this.root.filter,
          ignoreAsyncEvents: false
        });
        function onStartEvent(e) {
          const { startTime: currentStartTime, endTime: currentEndTime } = Timing_exports3.eventTimingsMilliSeconds(e);
          const actualEndTime = currentEndTime !== void 0 ? Math.min(currentEndTime, endTime) : endTime;
          const duration = actualEndTime - Math.max(currentStartTime, startTime);
          if (duration < 0) {
            console.assert(false, "Negative duration of an event");
          }
          selfTimeStack[selfTimeStack.length - 1] -= duration;
          selfTimeStack.push(duration);
          const id = generateEventID(e);
          eventIdStack.push(id);
          eventStack.push(e);
        }
        __name(onStartEvent, "onStartEvent");
        function onEndEvent(e) {
          const { startTime: currentStartTime, endTime: currentEndTime } = Timing_exports3.eventTimingsMilliSeconds(e);
          const selfTime = selfTimeStack.pop();
          const id = eventIdStack.pop();
          eventStack.pop();
          let node;
          for (node = self2; node.depth > 1; node = node.parent) {
            if (node.id !== eventIdStack[eventIdStack.length + 1 - node.depth]) {
              return;
            }
          }
          if (node.id !== id || eventIdStack.length < self2.depth) {
            return;
          }
          const childId = eventIdStack[eventIdStack.length - self2.depth];
          node = nodeById.get(childId);
          if (!node) {
            const event = eventStack[eventStack.length - self2.depth];
            const hasChildren = eventStack.length > self2.depth;
            node = new _BottomUpNode(self2.root, childId, event, hasChildren, self2);
            nodeById.set(childId, node);
          } else {
            node.events.push(e);
          }
          const actualEndTime = currentEndTime !== void 0 ? Math.min(currentEndTime, endTime) : endTime;
          const totalTime = actualEndTime - Math.max(currentStartTime, lastTimeMarker);
          node.selfTime += selfTime || 0;
          node.totalTime += totalTime;
          lastTimeMarker = actualEndTime;
        }
        __name(onEndEvent, "onEndEvent");
        this.cachedChildren = this.root.filterChildren(nodeById);
        return this.cachedChildren;
      }
      searchTree(matchFunction, results) {
        results = results || [];
        if (this.event && matchFunction(this.event)) {
          results.push(this);
        }
        return results;
      }
    };
    __name(generateEventID, "generateEventID");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/ThirdParties.js
var ThirdParties_exports = {};
__export(ThirdParties_exports, {
  summarizeByThirdParty: () => summarizeByThirdParty,
  summarizeByURL: () => summarizeByURL
});
function collectMainThreadActivity(data31) {
  const mainFrameMainThread = data31.Renderer.processes.values().find((p) => {
    const url = p.url ?? "";
    return p.isOnMainFrame && !url.startsWith("about:") && !url.startsWith("chrome:");
  })?.threads.values().find((t) => t.name === "CrRendererMain");
  if (!mainFrameMainThread) {
    return [];
  }
  return mainFrameMainThread.entries;
}
function summarizeByThirdParty(data31, traceBounds2) {
  const mainThreadEvents = collectMainThreadActivity(data31).sort(Trace_exports.eventTimeComparator);
  const groupingFunction = /* @__PURE__ */ __name((event) => {
    const entity = data31.Renderer.entityMappings.entityByEvent.get(event);
    return entity?.name ?? "";
  }, "groupingFunction");
  const node = getBottomUpTree(mainThreadEvents, traceBounds2, groupingFunction);
  const summaries = summarizeBottomUpByEntity(node, data31);
  return summaries;
}
function summarizeByURL(data31, traceBounds2) {
  const mainThreadEvents = collectMainThreadActivity(data31).sort(Trace_exports.eventTimeComparator);
  const groupingFunction = /* @__PURE__ */ __name((event) => {
    return helpers_exports.getNonResolvedURL(event, data31) ?? "";
  }, "groupingFunction");
  const node = getBottomUpTree(mainThreadEvents, traceBounds2, groupingFunction);
  const summaries = summarizeBottomUpByURL(node, data31);
  return summaries;
}
function summarizeBottomUpByEntity(root2, data31) {
  const summaries = [];
  const topNodes = [...root2.children().values()].flat();
  for (const node of topNodes) {
    if (node.id === "") {
      continue;
    }
    const entity = data31.Renderer.entityMappings.entityByEvent.get(node.event);
    if (!entity) {
      continue;
    }
    const summary = {
      transferSize: node.transferSize,
      mainThreadTime: Timing_exports.Milli(node.selfTime),
      entity,
      relatedEvents: data31.Renderer.entityMappings.eventsByEntity.get(entity) ?? []
    };
    summaries.push(summary);
  }
  return summaries;
}
function summarizeBottomUpByURL(root2, data31) {
  const summaries = [];
  const allRequests = data31.NetworkRequests.byTime;
  const topNodes = [...root2.children().values()].flat();
  for (const node of topNodes) {
    if (node.id === "" || typeof node.id !== "string") {
      continue;
    }
    const entity = data31.Renderer.entityMappings.entityByEvent.get(node.event);
    if (!entity) {
      continue;
    }
    const url = node.id;
    const request = allRequests.find((r) => r.args.data.url === url);
    const summary = {
      request,
      url,
      entity,
      transferSize: node.transferSize,
      mainThreadTime: Timing_exports.Milli(node.selfTime)
    };
    summaries.push(summary);
  }
  return summaries;
}
function getBottomUpTree(mainThreadEvents, tracebounds, groupingFunction) {
  const visibleEvents = Trace_exports.VISIBLE_TRACE_EVENT_TYPES.values().toArray();
  const filter = new VisibleEventsFilter(visibleEvents.concat([TraceEvents_exports.Name.SYNTHETIC_NETWORK_REQUEST]));
  const startTime = Timing_exports3.microToMilli(tracebounds.min);
  const endTime = Timing_exports3.microToMilli(tracebounds.max);
  return new BottomUpRootNode(mainThreadEvents, {
    textFilter: new ExclusiveNameFilter([]),
    filters: [filter],
    startTime,
    endTime,
    eventGroupIdCallback: groupingFunction,
    calculateTransferSize: true,
    // Ensure we group by 3P alongside eventID for correct 3P grouping.
    forceGroupIdCallback: true
  });
}
var init_ThirdParties = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/ThirdParties.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types2();
    init_TraceFilter();
    init_TraceTree();
    __name(collectMainThreadActivity, "collectMainThreadActivity");
    __name(summarizeByThirdParty, "summarizeByThirdParty");
    __name(summarizeByURL, "summarizeByURL");
    __name(summarizeBottomUpByEntity, "summarizeBottomUpByEntity");
    __name(summarizeBottomUpByURL, "summarizeBottomUpByURL");
    __name(getBottomUpTree, "getBottomUpTree");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/extras/extras.js
var init_extras = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/extras/extras.js"() {
    init_process_global();
    init_Initiators();
    init_ScriptDuplication();
    init_StackTraceForEvent();
    init_ThirdParties();
    init_TraceFilter();
    init_TraceTree();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/Statistics.js
function erf2(x) {
  const sign = Math.sign(x);
  x = Math.abs(x);
  const a1 = 0.254829592;
  const a2 = -0.284496736;
  const a3 = 1.421413741;
  const a4 = -1.453152027;
  const a5 = 1.061405429;
  const p = 0.3275911;
  const t = 1 / (1 + p * x);
  const y = t * (a1 + t * (a2 + t * (a3 + t * (a4 + t * a5))));
  return sign * (1 - y * Math.exp(-x * x));
}
function getLogNormalScore2({ median, p10 }, value) {
  if (median <= 0) {
    throw new Error("median must be greater than zero");
  }
  if (p10 <= 0) {
    throw new Error("p10 must be greater than zero");
  }
  if (p10 >= median) {
    throw new Error("p10 must be less than the median");
  }
  if (value <= 0) {
    return 1;
  }
  const INVERSE_ERFC_ONE_FIFTH = 0.9061938024368232;
  const xRatio = Math.max(Number.MIN_VALUE, value / median);
  const xLogRatio = Math.log(xRatio);
  const p10Ratio = Math.max(Number.MIN_VALUE, p10 / median);
  const p10LogRatio = -Math.log(p10Ratio);
  const standardizedX = xLogRatio * INVERSE_ERFC_ONE_FIFTH / p10LogRatio;
  const complementaryPercentile = (1 - erf2(standardizedX)) / 2;
  let score;
  if (value <= p10) {
    score = Math.max(MIN_PASSING_SCORE2, Math.min(1, complementaryPercentile));
  } else if (value <= median) {
    score = Math.max(MIN_AVERAGE_SCORE2, Math.min(MAX_AVERAGE_SCORE2, complementaryPercentile));
  } else {
    score = Math.max(0, Math.min(MAX_FAILING_SCORE2, complementaryPercentile));
  }
  return score;
}
function linearInterpolation(x0, y0, x1, y1, x) {
  const slope = (y1 - y0) / (x1 - x0);
  return y0 + (x - x0) * slope;
}
var MIN_PASSING_SCORE2, MAX_AVERAGE_SCORE2, MIN_AVERAGE_SCORE2, MAX_FAILING_SCORE2;
var init_Statistics = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/Statistics.js"() {
    init_process_global();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    MIN_PASSING_SCORE2 = 0.9;
    MAX_AVERAGE_SCORE2 = 0.8999999999999999;
    MIN_AVERAGE_SCORE2 = 0.5;
    MAX_FAILING_SCORE2 = 0.49999999999999994;
    __name(erf2, "erf");
    __name(getLogNormalScore2, "getLogNormalScore");
    __name(linearInterpolation, "linearInterpolation");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/types.js
var InsightWarning, InsightCategory, InsightKeys;
var init_types4 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/types.js"() {
    init_process_global();
    (function(InsightWarning2) {
      InsightWarning2["NO_FP"] = "NO_FP";
      InsightWarning2["NO_LCP"] = "NO_LCP";
      InsightWarning2["NO_DOCUMENT_REQUEST"] = "NO_DOCUMENT_REQUEST";
      InsightWarning2["NO_LAYOUT"] = "NO_LAYOUT";
    })(InsightWarning || (InsightWarning = {}));
    (function(InsightCategory2) {
      InsightCategory2["ALL"] = "All";
      InsightCategory2["INP"] = "INP";
      InsightCategory2["LCP"] = "LCP";
      InsightCategory2["CLS"] = "CLS";
    })(InsightCategory || (InsightCategory = {}));
    (function(InsightKeys2) {
      InsightKeys2["LCP_BREAKDOWN"] = "LCPBreakdown";
      InsightKeys2["INP_BREAKDOWN"] = "INPBreakdown";
      InsightKeys2["CLS_CULPRITS"] = "CLSCulprits";
      InsightKeys2["THIRD_PARTIES"] = "ThirdParties";
      InsightKeys2["DOCUMENT_LATENCY"] = "DocumentLatency";
      InsightKeys2["DOM_SIZE"] = "DOMSize";
      InsightKeys2["DUPLICATE_JAVASCRIPT"] = "DuplicatedJavaScript";
      InsightKeys2["FONT_DISPLAY"] = "FontDisplay";
      InsightKeys2["FORCED_REFLOW"] = "ForcedReflow";
      InsightKeys2["IMAGE_DELIVERY"] = "ImageDelivery";
      InsightKeys2["LCP_DISCOVERY"] = "LCPDiscovery";
      InsightKeys2["LEGACY_JAVASCRIPT"] = "LegacyJavaScript";
      InsightKeys2["NETWORK_DEPENDENCY_TREE"] = "NetworkDependencyTree";
      InsightKeys2["RENDER_BLOCKING"] = "RenderBlocking";
      InsightKeys2["SLOW_CSS_SELECTOR"] = "SlowCSSSelector";
      InsightKeys2["VIEWPORT"] = "Viewport";
      InsightKeys2["MODERN_HTTP"] = "ModernHTTP";
      InsightKeys2["CACHE"] = "Cache";
      InsightKeys2["CHARACTER_SET"] = "CharacterSet";
    })(InsightKeys || (InsightKeys = {}));
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/Common.js
var Common_exports = {};
__export(Common_exports, {
  calculateDocFirstByteTs: () => calculateDocFirstByteTs,
  calculateMetricWeightsForSorting: () => calculateMetricWeightsForSorting,
  estimateCompressedContentSize: () => estimateCompressedContentSize,
  estimateCompressionRatioForScript: () => estimateCompressionRatioForScript,
  evaluateCLSMetricScore: () => evaluateCLSMetricScore,
  evaluateINPMetricScore: () => evaluateINPMetricScore,
  evaluateLCPMetricScore: () => evaluateLCPMetricScore,
  getCLS: () => getCLS,
  getFieldMetricsForInsightSet: () => getFieldMetricsForInsightSet,
  getINP: () => getINP,
  getInsight: () => getInsight,
  getLCP: () => getLCP,
  insightBounds: () => insightBounds,
  isRequestCompressed: () => isRequestCompressed,
  isRequestServedFromBrowserCache: () => isRequestServedFromBrowserCache,
  metricSavingsForWastedBytes: () => metricSavingsForWastedBytes
});
function getInsight(insightName, insightSet) {
  return insightSet.model[insightName];
}
function getLCP(insightSet) {
  const insight = getInsight(InsightKeys.LCP_BREAKDOWN, insightSet);
  if (!insight || !insight.lcpMs || !insight.lcpEvent) {
    return null;
  }
  const value = Timing_exports3.milliToMicro(insight.lcpMs);
  return { value, event: insight.lcpEvent };
}
function getINP(insightSet) {
  const insight = getInsight(InsightKeys.INP_BREAKDOWN, insightSet);
  if (!insight?.longestInteractionEvent?.dur) {
    return null;
  }
  const value = insight.longestInteractionEvent.dur;
  return { value, event: insight.longestInteractionEvent };
}
function getCLS(insightSet) {
  const insight = getInsight(InsightKeys.CLS_CULPRITS, insightSet);
  if (!insight) {
    return { value: 0, worstClusterEvent: null };
  }
  let maxScore = 0;
  let worstCluster;
  for (const cluster of insight.clusters) {
    if (cluster.clusterCumulativeScore > maxScore) {
      maxScore = cluster.clusterCumulativeScore;
      worstCluster = cluster;
    }
  }
  return { value: maxScore, worstClusterEvent: worstCluster ?? null };
}
function evaluateLCPMetricScore(value) {
  return getLogNormalScore2({ p10: 2500, median: 4e3 }, value);
}
function evaluateINPMetricScore(value) {
  return getLogNormalScore2({ p10: 200, median: 500 }, value);
}
function evaluateCLSMetricScore(value) {
  return getLogNormalScore2({ p10: 0.1, median: 0.25 }, value);
}
function getPageResult(cruxFieldData, url, origin, scope = null) {
  return cruxFieldData.find((result) => {
    const key = scope ? result[`${scope.pageScope}-${scope.deviceScope}`]?.record.key : (result["url-ALL"] || result["origin-ALL"])?.record.key;
    return key?.url && key.url === url || key?.origin && key.origin === origin;
  });
}
function getMetricResult(pageResult, name, scope = null) {
  const scopes = [];
  if (scope) {
    scopes.push(scope);
  } else {
    scopes.push({ pageScope: "url", deviceScope: "ALL" });
    scopes.push({ pageScope: "origin", deviceScope: "ALL" });
  }
  for (const scope2 of scopes) {
    const key = `${scope2.pageScope}-${scope2.deviceScope}`;
    let value = pageResult[key]?.record.metrics[name]?.percentiles?.p75;
    if (typeof value === "string") {
      value = Number(value);
    }
    if (typeof value === "number" && Number.isFinite(value)) {
      return { value, pageScope: scope2.pageScope };
    }
  }
  return null;
}
function getMetricTimingResult(pageResult, name, scope = null) {
  const result = getMetricResult(pageResult, name, scope);
  if (result) {
    const valueMs = result.value;
    return { value: Timing_exports3.milliToMicro(valueMs), pageScope: result.pageScope };
  }
  return null;
}
function getFieldMetricsForInsightSet(insightSet, metadata, scope = null) {
  const cruxFieldData = metadata?.cruxFieldData;
  if (!cruxFieldData) {
    return null;
  }
  const pageResult = getPageResult(cruxFieldData, insightSet.url.href, insightSet.url.origin, scope);
  if (!pageResult) {
    return null;
  }
  return {
    fcp: getMetricTimingResult(pageResult, "first_contentful_paint", scope),
    lcp: getMetricTimingResult(pageResult, "largest_contentful_paint", scope),
    inp: getMetricTimingResult(pageResult, "interaction_to_next_paint", scope),
    cls: getMetricResult(pageResult, "cumulative_layout_shift", scope),
    lcpBreakdown: {
      ttfb: getMetricTimingResult(pageResult, "largest_contentful_paint_image_time_to_first_byte", scope),
      loadDelay: getMetricTimingResult(pageResult, "largest_contentful_paint_image_resource_load_delay", scope),
      loadDuration: getMetricTimingResult(pageResult, "largest_contentful_paint_image_resource_load_duration", scope),
      renderDelay: getMetricTimingResult(pageResult, "largest_contentful_paint_image_element_render_delay", scope)
    }
  };
}
function calculateMetricWeightsForSorting(insightSet, metadata) {
  const weights = {
    lcp: 1 / 3,
    inp: 1 / 3,
    cls: 1 / 3
  };
  const cruxFieldData = metadata?.cruxFieldData;
  if (!cruxFieldData) {
    return weights;
  }
  const fieldMetrics = getFieldMetricsForInsightSet(insightSet, metadata);
  if (!fieldMetrics) {
    return weights;
  }
  const fieldLcp = fieldMetrics.lcp?.value ?? null;
  const fieldInp = fieldMetrics.inp?.value ?? null;
  const fieldCls = fieldMetrics.cls?.value ?? null;
  const fieldLcpScore = fieldLcp !== null ? evaluateLCPMetricScore(Timing_exports3.microToMilli(fieldLcp)) : 0;
  const fieldInpScore = fieldInp !== null ? evaluateINPMetricScore(Timing_exports3.microToMilli(fieldInp)) : 0;
  const fieldClsScore = fieldCls !== null ? evaluateCLSMetricScore(fieldCls) : 0;
  const fieldLcpScoreInverted = 1 - fieldLcpScore;
  const fieldInpScoreInverted = 1 - fieldInpScore;
  const fieldClsScoreInverted = 1 - fieldClsScore;
  const invertedSum = fieldLcpScoreInverted + fieldInpScoreInverted + fieldClsScoreInverted;
  if (!invertedSum) {
    return weights;
  }
  weights.lcp = fieldLcpScoreInverted / invertedSum;
  weights.inp = fieldInpScoreInverted / invertedSum;
  weights.cls = fieldClsScoreInverted / invertedSum;
  return weights;
}
function estimateSavingsWithGraphs(wastedBytesByRequestId, simulator, graph2) {
  const simulationBeforeChanges = simulator.simulate(graph2);
  const originalTransferSizes = /* @__PURE__ */ new Map();
  graph2.traverse((node) => {
    if (node.type !== "network") {
      return;
    }
    const wastedBytes = wastedBytesByRequestId.get(node.request.requestId);
    if (!wastedBytes) {
      return;
    }
    const original = node.request.transferSize;
    originalTransferSizes.set(node.request.requestId, original);
    node.request.transferSize = Math.max(original - wastedBytes, 0);
  });
  const simulationAfterChanges = simulator.simulate(graph2);
  graph2.traverse((node) => {
    if (node.type !== "network") {
      return;
    }
    const originalTransferSize = originalTransferSizes.get(node.request.requestId);
    if (originalTransferSize === void 0) {
      return;
    }
    node.request.transferSize = originalTransferSize;
  });
  let savings = simulationBeforeChanges.timeInMs - simulationAfterChanges.timeInMs;
  savings = Math.round(savings / GRAPH_SAVINGS_PRECISION) * GRAPH_SAVINGS_PRECISION;
  return Timing_exports.Milli(savings);
}
function metricSavingsForWastedBytes(wastedBytesByRequestId, context) {
  if (!context.navigation || !context.lantern) {
    return;
  }
  if (!wastedBytesByRequestId.size) {
    return { FCP: Timing_exports.Milli(0), LCP: Timing_exports.Milli(0) };
  }
  const simulator = context.lantern.simulator;
  const fcpGraph = context.lantern.metrics.firstContentfulPaint.optimisticGraph;
  const lcpGraph = context.lantern.metrics.largestContentfulPaint.optimisticGraph;
  return {
    FCP: estimateSavingsWithGraphs(wastedBytesByRequestId, simulator, fcpGraph),
    LCP: estimateSavingsWithGraphs(wastedBytesByRequestId, simulator, lcpGraph)
  };
}
function isRequestCompressed(request) {
  if (!request.args.data.responseHeaders) {
    return false;
  }
  const patterns = [
    /^content-encoding$/i,
    /^x-content-encoding-over-network$/i,
    /^x-original-content-encoding$/i
    // Lightrider.
  ];
  const compressionTypes = ["gzip", "br", "deflate", "zstd"];
  return request.args.data.responseHeaders.some((header) => patterns.some((p) => header.name.match(p)) && compressionTypes.includes(header.value));
}
function isRequestServedFromBrowserCache(request) {
  if (!request.args.data.responseHeaders || request.args.data.failed) {
    return false;
  }
  if (request.args.data.statusCode === 304) {
    return true;
  }
  const { transferSize, resourceSize } = getRequestSizes(request);
  const ratio = resourceSize ? transferSize / resourceSize : 0;
  if (ratio < 0.01) {
    return true;
  }
  return false;
}
function getRequestSizes(request) {
  const resourceSize = request.args.data.decodedBodyLength;
  const transferSize = request.args.data.encodedDataLength;
  return { resourceSize, transferSize };
}
function estimateCompressedContentSize(request, totalBytes, resourceType) {
  if (!request || isRequestServedFromBrowserCache(request)) {
    switch (resourceType) {
      case "Stylesheet":
        return Math.round(totalBytes * 0.2);
      case "Script":
      case "Document":
        return Math.round(totalBytes * 0.33);
      default:
        return Math.round(totalBytes * 0.5);
    }
  }
  const { transferSize, resourceSize } = getRequestSizes(request);
  let contentTransferSize = transferSize;
  if (!isRequestCompressed(request)) {
    contentTransferSize = resourceSize;
  }
  if (request.args.data.resourceType === resourceType) {
    return contentTransferSize;
  }
  const compressionRatio = Number.isFinite(resourceSize) && resourceSize > 0 ? contentTransferSize / resourceSize : 1;
  return Math.round(totalBytes * compressionRatio);
}
function estimateCompressionRatioForScript(script) {
  if (!script.request) {
    return 1;
  }
  const request = script.request;
  const contentLength = request.args.data.decodedBodyLength ?? script.content?.length ?? 0;
  const compressedSize = estimateCompressedContentSize(
    request,
    contentLength,
    "Script"
    /* Protocol.Network.ResourceType.Script */
  );
  if (contentLength === 0 || compressedSize === 0) {
    return 1;
  }
  const compressionRatio = compressedSize / contentLength;
  return compressionRatio;
}
function calculateDocFirstByteTs(docRequest) {
  if (docRequest.args.data.protocol === "file") {
    return docRequest.ts;
  }
  const timing = docRequest.args.data.timing;
  if (!timing) {
    return null;
  }
  return Timing_exports.Micro(Timing_exports3.secondsToMicro(timing.requestTime) + Timing_exports3.milliToMicro(timing.receiveHeadersStart ?? timing.receiveHeadersEnd));
}
function insightBounds(insight, insightSetBounds) {
  const overlays = insight.createOverlays?.() ?? [];
  const windows = overlays.map(Timing_exports3.traceWindowFromOverlay).filter((bounds) => !!bounds);
  const overlaysBounds = Timing_exports3.combineTraceWindowsMicro(windows);
  if (overlaysBounds) {
    return overlaysBounds;
  }
  return insightSetBounds;
}
var GRAPH_SAVINGS_PRECISION;
var init_Common = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/Common.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    init_Statistics();
    init_types4();
    GRAPH_SAVINGS_PRECISION = 50;
    __name(getInsight, "getInsight");
    __name(getLCP, "getLCP");
    __name(getINP, "getINP");
    __name(getCLS, "getCLS");
    __name(evaluateLCPMetricScore, "evaluateLCPMetricScore");
    __name(evaluateINPMetricScore, "evaluateINPMetricScore");
    __name(evaluateCLSMetricScore, "evaluateCLSMetricScore");
    __name(getPageResult, "getPageResult");
    __name(getMetricResult, "getMetricResult");
    __name(getMetricTimingResult, "getMetricTimingResult");
    __name(getFieldMetricsForInsightSet, "getFieldMetricsForInsightSet");
    __name(calculateMetricWeightsForSorting, "calculateMetricWeightsForSorting");
    __name(estimateSavingsWithGraphs, "estimateSavingsWithGraphs");
    __name(metricSavingsForWastedBytes, "metricSavingsForWastedBytes");
    __name(isRequestCompressed, "isRequestCompressed");
    __name(isRequestServedFromBrowserCache, "isRequestServedFromBrowserCache");
    __name(getRequestSizes, "getRequestSizes");
    __name(estimateCompressedContentSize, "estimateCompressedContentSize");
    __name(estimateCompressionRatioForScript, "estimateCompressionRatioForScript");
    __name(calculateDocFirstByteTs, "calculateDocFirstByteTs");
    __name(insightBounds, "insightBounds");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js
var Cache_exports = {};
__export(Cache_exports, {
  UIStrings: () => UIStrings2,
  cachingDisabled: () => cachingDisabled,
  computeCacheLifetimeInSeconds: () => computeCacheLifetimeInSeconds,
  createOverlayForRequest: () => createOverlayForRequest,
  createOverlays: () => createOverlays,
  generateInsight: () => generateInsight,
  getCombinedHeaders: () => getCombinedHeaders,
  i18nString: () => i18nString,
  isCacheInsight: () => isCacheInsight,
  isCacheable: () => isCacheable
});
function finalize31(partialModel) {
  return {
    insightKey: InsightKeys.CACHE,
    strings: UIStrings2,
    title: i18nString(UIStrings2.title),
    description: i18nString(UIStrings2.description),
    docs: "https://developer.chrome.com/docs/performance/insights/cache",
    category: InsightCategory.ALL,
    state: partialModel.requests.length > 0 ? "fail" : "pass",
    ...partialModel
  };
}
function isCacheable(request) {
  if (Network_exports.NON_NETWORK_SCHEMES.includes(request.args.data.protocol)) {
    return false;
  }
  return Boolean(Network_exports.CACHEABLE_STATUS_CODES.has(request.args.data.statusCode) && Network_exports.STATIC_RESOURCE_TYPES.has(
    request.args.data.resourceType || "Other"
    /* Protocol.Network.ResourceType.Other */
  ));
}
function computeCacheLifetimeInSeconds(headers, cacheControl) {
  if (cacheControl?.["max-age"] !== void 0) {
    return cacheControl["max-age"];
  }
  const expiresHeaders = headers.find((h) => h.name === "expires")?.value ?? null;
  if (expiresHeaders) {
    const expires = new Date(expiresHeaders).getTime();
    if (!expires) {
      return 0;
    }
    return Math.ceil((expires - Date.now()) / 1e3);
  }
  return null;
}
function getCacheHitProbability(maxAgeInSeconds) {
  const RESOURCE_AGE_IN_HOURS_DECILES = [0, 0.2, 1, 3, 8, 12, 24, 48, 72, 168, 8760, Infinity];
  const maxAgeInHours = maxAgeInSeconds / 3600;
  const upperDecileIndex = RESOURCE_AGE_IN_HOURS_DECILES.findIndex((decile) => decile >= maxAgeInHours);
  if (upperDecileIndex === RESOURCE_AGE_IN_HOURS_DECILES.length - 1) {
    return 1;
  }
  if (upperDecileIndex === 0) {
    return 0;
  }
  const upperDecileValue = RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex];
  const lowerDecileValue = RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex - 1];
  const upperDecile = upperDecileIndex / 10;
  const lowerDecile = (upperDecileIndex - 1) / 10;
  return linearInterpolation(lowerDecileValue, lowerDecile, upperDecileValue, upperDecile, maxAgeInHours);
}
function getCombinedHeaders(responseHeaders) {
  const headers = /* @__PURE__ */ new Map();
  for (const header of responseHeaders) {
    const name = header.name.toLowerCase();
    if (headers.get(name)) {
      headers.set(name, `${headers.get(name)}, ${header.value}`);
    } else {
      headers.set(name, header.value);
    }
  }
  return headers;
}
function cachingDisabled(headers, parsedCacheControl) {
  const cacheControl = headers?.get("cache-control") ?? null;
  const pragma = headers?.get("pragma") ?? null;
  if (!cacheControl && pragma?.includes("no-cache")) {
    return true;
  }
  if (parsedCacheControl && (parsedCacheControl["must-revalidate"] || parsedCacheControl["no-cache"] || parsedCacheControl["no-store"] || parsedCacheControl["private"])) {
    return true;
  }
  return false;
}
function isCacheInsight(model2) {
  return model2.insightKey === InsightKeys.CACHE;
}
function generateInsight(data31, context) {
  const isWithinContext = /* @__PURE__ */ __name((event) => Timing_exports3.eventIsInBounds(event, context.bounds), "isWithinContext");
  const contextRequests = data31.NetworkRequests.byTime.filter(isWithinContext);
  const results = [];
  let totalWastedBytes = 0;
  const wastedBytesByRequestId = /* @__PURE__ */ new Map();
  for (const req of contextRequests) {
    if (!req.args.data.responseHeaders || !isCacheable(req)) {
      continue;
    }
    const headers = getCombinedHeaders(req.args.data.responseHeaders);
    const cacheControl = headers.get("cache-control") ?? null;
    const parsedDirectives = Network_exports.parseCacheControl(cacheControl);
    if (cachingDisabled(headers, parsedDirectives)) {
      continue;
    }
    let ttl = computeCacheLifetimeInSeconds(req.args.data.responseHeaders, parsedDirectives);
    if (ttl !== null && (!Number.isFinite(ttl) || ttl <= 0)) {
      continue;
    }
    ttl = ttl || 0;
    const ttlDays = ttl / 86400;
    if (ttlDays >= 30) {
      continue;
    }
    const cacheHitProbability = getCacheHitProbability(ttl);
    if (cacheHitProbability > IGNORE_THRESHOLD_IN_PERCENT) {
      continue;
    }
    const transferSize = req.args.data.encodedDataLength || 0;
    const wastedBytes = (1 - cacheHitProbability) * transferSize;
    wastedBytesByRequestId.set(req.args.data.requestId, wastedBytes);
    totalWastedBytes += wastedBytes;
    results.push({ request: req, ttl, wastedBytes });
  }
  results.sort((a, b) => {
    return b.request.args.data.decodedBodyLength - a.request.args.data.decodedBodyLength || a.ttl - b.ttl;
  });
  return finalize31({
    relatedEvents: results.map((r) => r.request),
    requests: results,
    metricSavings: metricSavingsForWastedBytes(wastedBytesByRequestId, context),
    wastedBytes: totalWastedBytes
  });
}
function createOverlayForRequest(request) {
  return {
    type: "ENTRY_OUTLINE",
    entry: request,
    outlineReason: "ERROR"
  };
}
function createOverlays(model2) {
  return model2.requests.map((req) => createOverlayForRequest(req.request));
}
var UIStrings2, i18nString, IGNORE_THRESHOLD_IN_PERCENT;
var init_Cache = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js"() {
    init_process_global();
    init_helpers2();
    init_Common();
    init_Statistics();
    init_types4();
    UIStrings2 = {
      /**
       * @description Title of an insight that provides information and suggestions of resources that could improve their caching.
       */
      title: "Use efficient cache lifetimes",
      /**
       * @description Text to tell the user about how caching can help improve performance.
       */
      description: "A long cache lifetime can speed up repeat visits to your page. [Learn more about caching](https://developer.chrome.com/docs/performance/insights/cache).",
      /**
       * @description Column for a font loaded by the page to render text.
       */
      requestColumn: "Request",
      /**
       * @description Column for a resource cache's Time To Live.
       */
      cacheTTL: "Cache TTL",
      /**
       * @description Text describing that there were no requests found that need caching.
       */
      noRequestsToCache: "No requests with inefficient cache policies",
      /**
       * @description Table row value representing the remaining items not shown in the table due to size constraints. This row will always represent at least 2 items.
       * @example {5} PH1
       */
      others: "{PH1} others"
    };
    i18nString = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    IGNORE_THRESHOLD_IN_PERCENT = 0.925;
    __name(finalize31, "finalize");
    __name(isCacheable, "isCacheable");
    __name(computeCacheLifetimeInSeconds, "computeCacheLifetimeInSeconds");
    __name(getCacheHitProbability, "getCacheHitProbability");
    __name(getCombinedHeaders, "getCombinedHeaders");
    __name(cachingDisabled, "cachingDisabled");
    __name(isCacheInsight, "isCacheInsight");
    __name(generateInsight, "generateInsight");
    __name(createOverlayForRequest, "createOverlayForRequest");
    __name(createOverlays, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/CharacterSet.js
var CharacterSet_exports = {};
__export(CharacterSet_exports, {
  UIStrings: () => UIStrings3,
  createOverlays: () => createOverlays2,
  generateInsight: () => generateInsight2,
  i18nString: () => i18nString2,
  isCharacterSetInsight: () => isCharacterSetInsight
});
function isCharacterSetInsight(model2) {
  return model2.insightKey === InsightKeys.CHARACTER_SET;
}
function finalize32(partialModel) {
  let hasFailure = false;
  if (partialModel.data) {
    hasFailure = !partialModel.data.checklist.httpCharset.value && !partialModel.data.checklist.metaCharset.value;
  }
  return {
    insightKey: InsightKeys.CHARACTER_SET,
    strings: UIStrings3,
    title: i18nString2(UIStrings3.title),
    description: i18nString2(UIStrings3.description),
    docs: "https://developer.chrome.com/docs/insights/charset/",
    category: InsightCategory.ALL,
    state: hasFailure ? "fail" : "pass",
    ...partialModel
  };
}
function hasCharsetInContentType(request) {
  if (!request.args.data.responseHeaders) {
    return false;
  }
  for (const header of request.args.data.responseHeaders) {
    if (header.name.toLowerCase() === "content-type") {
      return CHARSET_HTTP_REGEX.test(header.value);
    }
  }
  return false;
}
function findMetaCharsetDisposition(data31, context) {
  if (!context.navigation) {
    return void 0;
  }
  return data31.PageLoadMetrics.metaCharsetCheckEventsByNavigation.get(context.navigation)?.at(-1)?.args.data?.disposition;
}
function metaCharsetLabel(disposition) {
  switch (disposition) {
    case "found-in-first-1024-bytes":
      return i18nString2(UIStrings3.passingMetaCharsetEarly);
    case "found-after-first-1024-bytes":
      return i18nString2(UIStrings3.failedMetaCharsetLate);
    case "not-found":
      return i18nString2(UIStrings3.failedMetaCharsetMissing);
    default:
      return i18nString2(UIStrings3.failedMetaCharsetUnknown);
  }
}
function generateInsight2(data31, context) {
  if (!context.navigation) {
    return finalize32({});
  }
  const documentRequest = data31.NetworkRequests.byId.get(context.navigationId);
  if (!documentRequest) {
    return finalize32({ warnings: [InsightWarning.NO_DOCUMENT_REQUEST] });
  }
  const hasHttpCharset = hasCharsetInContentType(documentRequest);
  const metaCharsetDisposition = findMetaCharsetDisposition(data31, context);
  const hasMetaCharsetInFirst1024Bytes = metaCharsetDisposition === "found-in-first-1024-bytes";
  return finalize32({
    relatedEvents: [documentRequest],
    data: {
      hasHttpCharset,
      metaCharsetDisposition,
      documentRequest,
      checklist: {
        httpCharset: {
          label: hasHttpCharset ? i18nString2(UIStrings3.passingHttpHeader) : i18nString2(UIStrings3.failedHttpHeader),
          value: hasHttpCharset
        },
        metaCharset: {
          label: metaCharsetLabel(metaCharsetDisposition),
          value: hasMetaCharsetInFirst1024Bytes
        }
      }
    }
  });
}
function createOverlays2(model2) {
  if (!model2.data?.documentRequest) {
    return [];
  }
  return [{
    type: "ENTRY_SELECTED",
    entry: model2.data.documentRequest
  }];
}
var UIStrings3, i18nString2, CHARSET_HTTP_REGEX;
var init_CharacterSet = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/CharacterSet.js"() {
    init_process_global();
    init_types4();
    UIStrings3 = {
      /**
       * @description Title of an insight that checks whether the page declares a character encoding early enough.
       */
      title: "Declare a character encoding",
      /**
       * @description Description of an insight that checks whether the page has a proper character encoding declaration via HTTP header or early meta tag.
       */
      description: "A character encoding declaration is required. It can be done with a meta charset tag in the first 1024 bytes of the HTML or in the Content-Type HTTP response header. [Learn more about declaring the character encoding](https://developer.chrome.com/docs/insights/charset/).",
      /**
       * @description Text to tell the user that the charset is declared in the Content-Type HTTP response header.
       */
      passingHttpHeader: "Declares charset in HTTP header",
      /**
       * @description Text to tell the user that the charset is NOT declared in the Content-Type HTTP response header.
       */
      failedHttpHeader: "Does not declare charset in HTTP header",
      /**
       * @description Text to tell the user that a meta charset tag was found in the first 1024 bytes of the HTML.
       */
      passingMetaCharsetEarly: "Declares charset using a meta tag in the first 1024 bytes",
      /**
       * @description Text to tell the user that a meta charset tag was found, but too late in the HTML.
       */
      failedMetaCharsetLate: "Declares charset using a meta tag after the first 1024 bytes",
      /**
       * @description Text to tell the user that no meta charset tag was found in the HTML.
       */
      failedMetaCharsetMissing: "Does not declare charset using a meta tag",
      /**
       * @description Text to tell the user that trace data did not include the Blink signal for meta charset.
       */
      failedMetaCharsetUnknown: "Could not determine meta charset declaration from trace"
    };
    i18nString2 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    CHARSET_HTTP_REGEX = /charset\s*=\s*[a-zA-Z0-9\-_:.()]{2,}/i;
    __name(isCharacterSetInsight, "isCharacterSetInsight");
    __name(finalize32, "finalize");
    __name(hasCharsetInContentType, "hasCharsetInContentType");
    __name(findMetaCharsetDisposition, "findMetaCharsetDisposition");
    __name(metaCharsetLabel, "metaCharsetLabel");
    __name(generateInsight2, "generateInsight");
    __name(createOverlays2, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js
var CLSCulprits_exports = {};
__export(CLSCulprits_exports, {
  AnimationFailureReasons: () => AnimationFailureReasons,
  LayoutShiftType: () => LayoutShiftType,
  UIStrings: () => UIStrings4,
  createOverlays: () => createOverlays3,
  generateInsight: () => generateInsight3,
  getNonCompositedFailure: () => getNonCompositedFailure,
  i18nString: () => i18nString3,
  isCLSCulpritsInsight: () => isCLSCulpritsInsight
});
function isInRootCauseWindow(event, targetEvent) {
  const eventEnd = event.dur ? event.ts + event.dur : event.ts;
  return eventEnd < targetEvent.ts && eventEnd >= targetEvent.ts - ROOT_CAUSE_WINDOW;
}
function getNonCompositedFailure(animationEvent) {
  const failures = [];
  const beginEvent = animationEvent.args.data.beginEvent;
  const instantEvents = animationEvent.args.data.instantEvents || [];
  for (const event of instantEvents) {
    const failureMask = event.args.data.compositeFailed;
    const unsupportedProperties = event.args.data.unsupportedProperties;
    if (!failureMask) {
      continue;
    }
    const failureReasons = ACTIONABLE_FAILURE_REASONS.filter((reason) => failureMask & reason.flag).map((reason) => reason.failure);
    const failure = {
      name: beginEvent.args.data.displayName,
      failureReasons,
      unsupportedProperties,
      animation: animationEvent
    };
    failures.push(failure);
  }
  return failures;
}
function getNonCompositedFailureRootCauses(animationEvents, prePaintEvents2, shiftsByPrePaint, rootCausesByShift) {
  const allAnimationFailures = [];
  for (const animation of animationEvents) {
    const failures = getNonCompositedFailure(animation);
    if (!failures) {
      continue;
    }
    allAnimationFailures.push(...failures);
    const nextPrePaint = getNextEvent(prePaintEvents2, animation);
    if (!nextPrePaint) {
      continue;
    }
    if (!isInRootCauseWindow(animation, nextPrePaint)) {
      continue;
    }
    const shifts = shiftsByPrePaint.get(nextPrePaint);
    if (!shifts) {
      continue;
    }
    for (const shift of shifts) {
      const rootCausesForShift = rootCausesByShift.get(shift);
      if (!rootCausesForShift) {
        throw new Error("Unaccounted shift");
      }
      rootCausesForShift.nonCompositedAnimations.push(...failures);
    }
  }
  return allAnimationFailures;
}
function getShiftsByPrePaintEvents(layoutShifts, prePaintEvents2) {
  const shiftsByPrePaint = /* @__PURE__ */ new Map();
  for (const prePaintEvent of prePaintEvents2) {
    const firstShiftIndex = ArrayUtilities_exports.nearestIndexFromBeginning(layoutShifts, (shift) => shift.ts >= prePaintEvent.ts);
    if (firstShiftIndex === null) {
      continue;
    }
    for (let i = firstShiftIndex; i < layoutShifts.length; i++) {
      const shift = layoutShifts[i];
      if (shift.ts >= prePaintEvent.ts && shift.ts <= prePaintEvent.ts + prePaintEvent.dur) {
        const shiftsInPrePaint = MapUtilities_exports.getWithDefault(shiftsByPrePaint, prePaintEvent, () => []);
        shiftsInPrePaint.push(shift);
      }
      if (shift.ts > prePaintEvent.ts + prePaintEvent.dur) {
        break;
      }
    }
  }
  return shiftsByPrePaint;
}
function getNextEvent(sourceEvents, targetEvent) {
  const index = ArrayUtilities_exports.nearestIndexFromBeginning(sourceEvents, (source) => source.ts > targetEvent.ts + (targetEvent.dur || 0));
  if (index === null) {
    return void 0;
  }
  return sourceEvents[index];
}
function getIframeRootCauses(data31, iframeCreatedEvents, prePaintEvents2, shiftsByPrePaint, rootCausesByShift, domLoadingEvents2) {
  for (const iframeEvent of iframeCreatedEvents) {
    const nextPrePaint = getNextEvent(prePaintEvents2, iframeEvent);
    if (!nextPrePaint) {
      continue;
    }
    const shifts = shiftsByPrePaint.get(nextPrePaint);
    if (!shifts) {
      continue;
    }
    for (const shift of shifts) {
      const rootCausesForShift = rootCausesByShift.get(shift);
      if (!rootCausesForShift) {
        throw new Error("Unaccounted shift");
      }
      const domEvent = domLoadingEvents2.find((e) => {
        const maxIframe = Timing_exports.Micro(iframeEvent.ts + (iframeEvent.dur ?? 0));
        return e.ts >= iframeEvent.ts && e.ts <= maxIframe;
      });
      if (domEvent?.args.frame) {
        const frame = domEvent.args.frame;
        let url;
        const processes2 = data31.Meta.rendererProcessesByFrame.get(frame);
        if (processes2 && processes2.size > 0) {
          url = [...processes2.values()][0]?.[0].frame.url;
        }
        rootCausesForShift.iframes.push({ frame, url });
      }
    }
  }
  return rootCausesByShift;
}
function getUnsizedImageRootCauses(unsizedImageEvents, paintImageEvents3, shiftsByPrePaint, rootCausesByShift) {
  shiftsByPrePaint.forEach((shifts, prePaint) => {
    const paintImage = getNextEvent(paintImageEvents3, prePaint);
    if (!paintImage) {
      return;
    }
    const matchingNode = unsizedImageEvents.find((unsizedImage) => unsizedImage.args.data.nodeId === paintImage.args.data.nodeId);
    if (!matchingNode) {
      return;
    }
    for (const shift of shifts) {
      const rootCausesForShift = rootCausesByShift.get(shift);
      if (!rootCausesForShift) {
        throw new Error("Unaccounted shift");
      }
      rootCausesForShift.unsizedImages.push({
        backendNodeId: matchingNode.args.data.nodeId,
        paintImageEvent: paintImage
      });
    }
  });
  return rootCausesByShift;
}
function isCLSCulpritsInsight(insight) {
  return insight.insightKey === InsightKeys.CLS_CULPRITS;
}
function getFontRootCauses(networkRequests, prePaintEvents2, shiftsByPrePaint, rootCausesByShift) {
  const fontRequests = networkRequests.filter((req) => req.args.data.resourceType === "Font" && req.args.data.mimeType.startsWith("font"));
  for (const req of fontRequests) {
    const nextPrePaint = getNextEvent(prePaintEvents2, req);
    if (!nextPrePaint) {
      continue;
    }
    if (!isInRootCauseWindow(req, nextPrePaint)) {
      continue;
    }
    const shifts = shiftsByPrePaint.get(nextPrePaint);
    if (!shifts) {
      continue;
    }
    for (const shift of shifts) {
      const rootCausesForShift = rootCausesByShift.get(shift);
      if (!rootCausesForShift) {
        throw new Error("Unaccounted shift");
      }
      rootCausesForShift.webFonts.push(req);
    }
  }
  return rootCausesByShift;
}
function getTopCulprits(cluster, culpritsByShift) {
  const MAX_TOP_CULPRITS = 3;
  const causes = [];
  const shifts = cluster.events;
  for (const shift of shifts) {
    const culprits = culpritsByShift.get(shift);
    if (!culprits) {
      continue;
    }
    const fontReq = culprits.webFonts;
    const iframes = culprits.iframes;
    const animations2 = culprits.nonCompositedAnimations;
    const unsizedImages = culprits.unsizedImages;
    for (let i = 0; i < fontReq.length && causes.length < MAX_TOP_CULPRITS; i++) {
      causes.push({ type: LayoutShiftType.WEB_FONT, description: i18nString3(UIStrings4.webFont) });
    }
    for (let i = 0; i < iframes.length && causes.length < MAX_TOP_CULPRITS; i++) {
      causes.push({ type: LayoutShiftType.IFRAMES, description: i18nString3(UIStrings4.injectedIframe) });
    }
    for (let i = 0; i < animations2.length && causes.length < MAX_TOP_CULPRITS; i++) {
      causes.push({ type: LayoutShiftType.ANIMATIONS, description: i18nString3(UIStrings4.animation) });
    }
    for (let i = 0; i < unsizedImages.length && causes.length < MAX_TOP_CULPRITS; i++) {
      causes.push({
        type: LayoutShiftType.UNSIZED_IMAGE,
        description: i18nString3(UIStrings4.unsizedImage),
        url: unsizedImages[i].paintImageEvent.args.data.url || "",
        backendNodeId: unsizedImages[i].backendNodeId,
        frame: unsizedImages[i].paintImageEvent.args.data.frame || ""
      });
    }
    if (causes.length >= MAX_TOP_CULPRITS) {
      break;
    }
  }
  return causes.slice(0, MAX_TOP_CULPRITS);
}
function finalize33(partialModel) {
  let state = "pass";
  if (partialModel.worstCluster) {
    const classification = ModelHandlers_exports.LayoutShifts.scoreClassificationForLayoutShift(partialModel.worstCluster.clusterCumulativeScore);
    if (classification === ModelHandlers_exports.PageLoadMetrics.ScoreClassification.GOOD) {
      state = "informative";
    } else {
      state = "fail";
    }
  }
  return {
    insightKey: InsightKeys.CLS_CULPRITS,
    strings: UIStrings4,
    title: i18nString3(UIStrings4.title),
    description: i18nString3(UIStrings4.description),
    docs: "https://developer.chrome.com/docs/performance/insights/cls-culprit",
    category: InsightCategory.CLS,
    state,
    ...partialModel
  };
}
function generateInsight3(data31, context) {
  const isWithinContext = /* @__PURE__ */ __name((event) => Timing_exports3.eventIsInBounds(event, context.bounds), "isWithinContext");
  const compositeAnimationEvents = data31.Animations.animations.filter(isWithinContext);
  const iframeEvents = data31.LayoutShifts.renderFrameImplCreateChildFrameEvents.filter(isWithinContext);
  const networkRequests = data31.NetworkRequests.byTime.filter(isWithinContext);
  const domLoadingEvents2 = data31.LayoutShifts.domLoadingEvents.filter(isWithinContext);
  const unsizedImageEvents = data31.LayoutShifts.layoutImageUnsizedEvents.filter(isWithinContext);
  const clusterKey = context.navigation ? context.navigationId : TraceEvents_exports.NO_NAVIGATION;
  const clusters2 = data31.LayoutShifts.clustersByNavigationId.get(clusterKey) ?? [];
  const clustersByScore = [...clusters2].sort((a, b) => b.clusterCumulativeScore - a.clusterCumulativeScore);
  const worstCluster = clustersByScore.at(0);
  const layoutShifts = clusters2.flatMap((cluster) => cluster.events);
  const prePaintEvents2 = data31.LayoutShifts.prePaintEvents.filter(isWithinContext);
  const paintImageEvents3 = data31.LayoutShifts.paintImageEvents.filter(isWithinContext);
  const rootCausesByShift = /* @__PURE__ */ new Map();
  const shiftsByPrePaint = getShiftsByPrePaintEvents(layoutShifts, prePaintEvents2);
  for (const shift of layoutShifts) {
    rootCausesByShift.set(shift, { iframes: [], webFonts: [], nonCompositedAnimations: [], unsizedImages: [] });
  }
  getIframeRootCauses(data31, iframeEvents, prePaintEvents2, shiftsByPrePaint, rootCausesByShift, domLoadingEvents2);
  getFontRootCauses(networkRequests, prePaintEvents2, shiftsByPrePaint, rootCausesByShift);
  getUnsizedImageRootCauses(unsizedImageEvents, paintImageEvents3, shiftsByPrePaint, rootCausesByShift);
  const animationFailures = getNonCompositedFailureRootCauses(compositeAnimationEvents, prePaintEvents2, shiftsByPrePaint, rootCausesByShift);
  const relatedEvents = [...layoutShifts];
  if (worstCluster) {
    relatedEvents.push(worstCluster);
  }
  const topCulpritsByCluster = /* @__PURE__ */ new Map();
  for (const cluster of clusters2) {
    topCulpritsByCluster.set(cluster, getTopCulprits(cluster, rootCausesByShift));
  }
  return finalize33({
    relatedEvents,
    animationFailures,
    shifts: rootCausesByShift,
    clusters: clusters2,
    worstCluster,
    topCulpritsByCluster
  });
}
function createOverlays3(model2) {
  const clustersByScore = model2.clusters.toSorted((a, b) => b.clusterCumulativeScore - a.clusterCumulativeScore) ?? [];
  const worstCluster = clustersByScore[0];
  if (!worstCluster) {
    return [];
  }
  const range = Timing_exports.Micro(worstCluster.dur ?? 0);
  const max = Timing_exports.Micro(worstCluster.ts + range);
  return [{
    type: "TIMESPAN_BREAKDOWN",
    sections: [
      {
        bounds: { min: worstCluster.ts, range, max },
        label: i18nString3(UIStrings4.worstLayoutShiftCluster),
        showDuration: false
      }
    ],
    // This allows for the overlay to sit over the layout shift.
    entry: worstCluster.events[0],
    renderLocation: "ABOVE_EVENT"
  }];
}
var UIStrings4, i18nString3, AnimationFailureReasons, LayoutShiftType, ACTIONABLE_FAILURE_REASONS, ROOT_CAUSE_WINDOW;
var init_CLSCulprits = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js"() {
    init_process_global();
    init_platform();
    init_handlers();
    init_helpers2();
    init_types2();
    init_types4();
    UIStrings4 = {
      /** Title of an insight that provides details about why elements shift/move on the page. The causes for these shifts are referred to as culprits ("reasons"). */
      title: "Layout shift culprits",
      /**
       * @description Description of a DevTools insight that identifies the reasons that elements shift on the page.
       * This is displayed after a user expands the section to see more. No character length limits.
       */
      description: "Layout shifts occur when elements move absent any user interaction. [Investigate the causes of layout shifts](https://developer.chrome.com/docs/performance/insights/cls-culprit), such as elements being added, removed, or their fonts changing as the page loads.",
      /**
       * @description Text indicating the worst layout shift cluster.
       */
      worstLayoutShiftCluster: "Worst layout shift cluster",
      /**
       * @description Text indicating the worst layout shift cluster.
       */
      worstCluster: "Worst cluster",
      /**
       * @description Text indicating a layout shift cluster and its start time.
       * @example {32 ms} PH1
       */
      layoutShiftCluster: "Layout shift cluster @ {PH1}",
      /**
       * @description Text indicating the biggest reasons for the layout shifts.
       */
      topCulprits: "Top layout shift culprits",
      /**
       * @description Text for a culprit type of Injected iframe.
       */
      injectedIframe: "Injected iframe",
      /**
       * @description Text for a culprit type of web font request.
       */
      webFont: "Web font",
      /**
       * @description Text for a culprit type of Animation.
       */
      animation: "Animation",
      /**
       * @description Text for a culprit type of Unsized image.
       */
      unsizedImage: "Unsized image element",
      /**
       * @description Text status when there were no layout shifts detected.
       */
      noLayoutShifts: "No layout shifts",
      /**
       * @description Text status when there no layout shifts culprits/root causes were found.
       */
      noCulprits: "Could not detect any layout shift culprits"
    };
    i18nString3 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    (function(AnimationFailureReasons2) {
      AnimationFailureReasons2["ACCELERATED_ANIMATIONS_DISABLED"] = "ACCELERATED_ANIMATIONS_DISABLED";
      AnimationFailureReasons2["EFFECT_SUPPRESSED_BY_DEVTOOLS"] = "EFFECT_SUPPRESSED_BY_DEVTOOLS";
      AnimationFailureReasons2["INVALID_ANIMATION_OR_EFFECT"] = "INVALID_ANIMATION_OR_EFFECT";
      AnimationFailureReasons2["EFFECT_HAS_UNSUPPORTED_TIMING_PARAMS"] = "EFFECT_HAS_UNSUPPORTED_TIMING_PARAMS";
      AnimationFailureReasons2["EFFECT_HAS_NON_REPLACE_COMPOSITE_MODE"] = "EFFECT_HAS_NON_REPLACE_COMPOSITE_MODE";
      AnimationFailureReasons2["TARGET_HAS_INVALID_COMPOSITING_STATE"] = "TARGET_HAS_INVALID_COMPOSITING_STATE";
      AnimationFailureReasons2["TARGET_HAS_INCOMPATIBLE_ANIMATIONS"] = "TARGET_HAS_INCOMPATIBLE_ANIMATIONS";
      AnimationFailureReasons2["TARGET_HAS_CSS_OFFSET"] = "TARGET_HAS_CSS_OFFSET";
      AnimationFailureReasons2["ANIMATION_AFFECTS_NON_CSS_PROPERTIES"] = "ANIMATION_AFFECTS_NON_CSS_PROPERTIES";
      AnimationFailureReasons2["TRANSFORM_RELATED_PROPERTY_CANNOT_BE_ACCELERATED_ON_TARGET"] = "TRANSFORM_RELATED_PROPERTY_CANNOT_BE_ACCELERATED_ON_TARGET";
      AnimationFailureReasons2["TRANSFROM_BOX_SIZE_DEPENDENT"] = "TRANSFROM_BOX_SIZE_DEPENDENT";
      AnimationFailureReasons2["FILTER_RELATED_PROPERTY_MAY_MOVE_PIXELS"] = "FILTER_RELATED_PROPERTY_MAY_MOVE_PIXELS";
      AnimationFailureReasons2["UNSUPPORTED_CSS_PROPERTY"] = "UNSUPPORTED_CSS_PROPERTY";
      AnimationFailureReasons2["MIXED_KEYFRAME_VALUE_TYPES"] = "MIXED_KEYFRAME_VALUE_TYPES";
      AnimationFailureReasons2["TIMELINE_SOURCE_HAS_INVALID_COMPOSITING_STATE"] = "TIMELINE_SOURCE_HAS_INVALID_COMPOSITING_STATE";
      AnimationFailureReasons2["ANIMATION_HAS_NO_VISIBLE_CHANGE"] = "ANIMATION_HAS_NO_VISIBLE_CHANGE";
      AnimationFailureReasons2["AFFECTS_IMPORTANT_PROPERTY"] = "AFFECTS_IMPORTANT_PROPERTY";
      AnimationFailureReasons2["SVG_TARGET_HAS_INDEPENDENT_TRANSFORM_PROPERTY"] = "SVG_TARGET_HAS_INDEPENDENT_TRANSFORM_PROPERTY";
    })(AnimationFailureReasons || (AnimationFailureReasons = {}));
    (function(LayoutShiftType2) {
      LayoutShiftType2[LayoutShiftType2["WEB_FONT"] = 0] = "WEB_FONT";
      LayoutShiftType2[LayoutShiftType2["IFRAMES"] = 1] = "IFRAMES";
      LayoutShiftType2[LayoutShiftType2["ANIMATIONS"] = 2] = "ANIMATIONS";
      LayoutShiftType2[LayoutShiftType2["UNSIZED_IMAGE"] = 3] = "UNSIZED_IMAGE";
    })(LayoutShiftType || (LayoutShiftType = {}));
    ACTIONABLE_FAILURE_REASONS = [
      {
        flag: 1 << 0,
        failure: AnimationFailureReasons.ACCELERATED_ANIMATIONS_DISABLED
      },
      {
        flag: 1 << 1,
        failure: AnimationFailureReasons.EFFECT_SUPPRESSED_BY_DEVTOOLS
      },
      {
        flag: 1 << 2,
        failure: AnimationFailureReasons.INVALID_ANIMATION_OR_EFFECT
      },
      {
        flag: 1 << 3,
        failure: AnimationFailureReasons.EFFECT_HAS_UNSUPPORTED_TIMING_PARAMS
      },
      {
        flag: 1 << 4,
        failure: AnimationFailureReasons.EFFECT_HAS_NON_REPLACE_COMPOSITE_MODE
      },
      {
        flag: 1 << 5,
        failure: AnimationFailureReasons.TARGET_HAS_INVALID_COMPOSITING_STATE
      },
      {
        flag: 1 << 6,
        failure: AnimationFailureReasons.TARGET_HAS_INCOMPATIBLE_ANIMATIONS
      },
      {
        flag: 1 << 7,
        failure: AnimationFailureReasons.TARGET_HAS_CSS_OFFSET
      },
      // The failure 1 << 8 is marked as obsolete in Blink
      {
        flag: 1 << 9,
        failure: AnimationFailureReasons.ANIMATION_AFFECTS_NON_CSS_PROPERTIES
      },
      {
        flag: 1 << 10,
        failure: AnimationFailureReasons.TRANSFORM_RELATED_PROPERTY_CANNOT_BE_ACCELERATED_ON_TARGET
      },
      {
        flag: 1 << 11,
        failure: AnimationFailureReasons.TRANSFROM_BOX_SIZE_DEPENDENT
      },
      {
        flag: 1 << 12,
        failure: AnimationFailureReasons.FILTER_RELATED_PROPERTY_MAY_MOVE_PIXELS
      },
      {
        flag: 1 << 13,
        failure: AnimationFailureReasons.UNSUPPORTED_CSS_PROPERTY
      },
      // The failure 1 << 14 is marked as obsolete in Blink
      {
        flag: 1 << 15,
        failure: AnimationFailureReasons.MIXED_KEYFRAME_VALUE_TYPES
      },
      {
        flag: 1 << 16,
        failure: AnimationFailureReasons.TIMELINE_SOURCE_HAS_INVALID_COMPOSITING_STATE
      },
      {
        flag: 1 << 17,
        failure: AnimationFailureReasons.ANIMATION_HAS_NO_VISIBLE_CHANGE
      },
      {
        flag: 1 << 18,
        failure: AnimationFailureReasons.AFFECTS_IMPORTANT_PROPERTY
      },
      {
        flag: 1 << 19,
        failure: AnimationFailureReasons.SVG_TARGET_HAS_INDEPENDENT_TRANSFORM_PROPERTY
      }
    ];
    ROOT_CAUSE_WINDOW = Timing_exports3.secondsToMicro(Timing_exports.Seconds(0.5));
    __name(isInRootCauseWindow, "isInRootCauseWindow");
    __name(getNonCompositedFailure, "getNonCompositedFailure");
    __name(getNonCompositedFailureRootCauses, "getNonCompositedFailureRootCauses");
    __name(getShiftsByPrePaintEvents, "getShiftsByPrePaintEvents");
    __name(getNextEvent, "getNextEvent");
    __name(getIframeRootCauses, "getIframeRootCauses");
    __name(getUnsizedImageRootCauses, "getUnsizedImageRootCauses");
    __name(isCLSCulpritsInsight, "isCLSCulpritsInsight");
    __name(getFontRootCauses, "getFontRootCauses");
    __name(getTopCulprits, "getTopCulprits");
    __name(finalize33, "finalize");
    __name(generateInsight3, "generateInsight");
    __name(createOverlays3, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js
var DocumentLatency_exports = {};
__export(DocumentLatency_exports, {
  UIStrings: () => UIStrings5,
  createOverlays: () => createOverlays4,
  generateInsight: () => generateInsight4,
  i18nString: () => i18nString4,
  isDocumentLatencyInsight: () => isDocumentLatencyInsight
});
function isDocumentLatencyInsight(x) {
  return x.insightKey === "DocumentLatency";
}
function getServerResponseTime(request) {
  const isLightrider = globalThis.isLightrider;
  if (isLightrider) {
    return request.args.data.lrServerResponseTime ?? null;
  }
  const timing = request.args.data.timing;
  if (!timing) {
    return null;
  }
  const ms = Timing_exports3.microToMilli(request.args.data.syntheticData.serverResponseTime);
  return Math.round(ms);
}
function getCompressionSavings(request) {
  const isCompressed = isRequestCompressed(request);
  if (isCompressed) {
    return 0;
  }
  const originalSize = request.args.data.decodedBodyLength;
  let estimatedSavings = 0;
  switch (request.args.data.mimeType) {
    case "text/css":
      estimatedSavings = Math.round(originalSize * 0.8);
      break;
    case "text/html":
    case "text/javascript":
      estimatedSavings = Math.round(originalSize * 0.67);
      break;
    case "text/plain":
    case "text/xml":
    case "text/x-component":
    case "application/javascript":
    case "application/json":
    case "application/manifest+json":
    case "application/vnd.api+json":
    case "application/xml":
    case "application/xhtml+xml":
    case "application/rss+xml":
    case "application/atom+xml":
    case "application/vnd.ms-fontobject":
    case "application/x-font-ttf":
    case "application/x-font-opentype":
    case "application/x-font-truetype":
    case "image/svg+xml":
    case "image/x-icon":
    case "image/vnd.microsoft.icon":
    case "font/ttf":
    case "font/eot":
    case "font/otf":
    case "font/opentype":
      estimatedSavings = Math.round(originalSize * 0.5);
      break;
    default:
  }
  return estimatedSavings < IGNORE_THRESHOLD_IN_BYTES ? 0 : estimatedSavings;
}
function finalize34(partialModel) {
  let hasFailure = false;
  if (partialModel.data) {
    hasFailure = !partialModel.data.checklist.usesCompression.value || !partialModel.data.checklist.serverResponseIsFast.value || !partialModel.data.checklist.noRedirects.value;
  }
  return {
    insightKey: InsightKeys.DOCUMENT_LATENCY,
    strings: UIStrings5,
    title: i18nString4(UIStrings5.title),
    description: i18nString4(UIStrings5.description),
    docs: "https://developer.chrome.com/docs/performance/insights/document-latency",
    category: InsightCategory.ALL,
    state: hasFailure ? "fail" : "pass",
    ...partialModel
  };
}
function generateInsight4(data31, context) {
  if (!context.navigation) {
    return finalize34({});
  }
  const millisToString = context.options.insightTimeFormatters?.milli ?? ((bytes) => ({ __i18nMillis: bytes }));
  const documentRequest = data31.NetworkRequests.byId.get(context.navigationId);
  if (!documentRequest) {
    return finalize34({ warnings: [InsightWarning.NO_DOCUMENT_REQUEST] });
  }
  const serverResponseTime = getServerResponseTime(documentRequest);
  if (serverResponseTime === null) {
    throw new Error("missing document request timing");
  }
  const serverResponseTooSlow = serverResponseTime > TOO_SLOW_THRESHOLD_MS;
  let overallSavingsMs = 0;
  if (serverResponseTime > TOO_SLOW_THRESHOLD_MS) {
    overallSavingsMs = Math.max(serverResponseTime - TARGET_MS, 0);
  }
  const redirectDuration = Math.round(documentRequest.args.data.syntheticData.redirectionDuration / 1e3);
  overallSavingsMs += redirectDuration;
  const metricSavings = {
    FCP: overallSavingsMs,
    LCP: overallSavingsMs
  };
  const uncompressedResponseBytes = getCompressionSavings(documentRequest);
  const noRedirects = redirectDuration === 0;
  const serverResponseIsFast = !serverResponseTooSlow;
  const usesCompression = uncompressedResponseBytes === 0;
  return finalize34({
    relatedEvents: [documentRequest],
    data: {
      serverResponseTime,
      redirectDuration: Timing_exports.Milli(redirectDuration),
      uncompressedResponseBytes,
      documentRequest,
      checklist: {
        noRedirects: {
          label: noRedirects ? i18nString4(UIStrings5.passingRedirects) : i18nString4(UIStrings5.failedRedirects, {
            PH1: documentRequest.args.data.redirects.length,
            PH2: millisToString(redirectDuration)
          }),
          value: noRedirects
        },
        serverResponseIsFast: {
          label: serverResponseIsFast ? i18nString4(UIStrings5.passingServerResponseTime, { PH1: millisToString(serverResponseTime) }) : i18nString4(UIStrings5.failedServerResponseTime, { PH1: millisToString(serverResponseTime) }),
          value: serverResponseIsFast
        },
        usesCompression: {
          label: usesCompression ? i18nString4(UIStrings5.passingTextCompression) : i18nString4(UIStrings5.failedTextCompression),
          value: usesCompression
        }
      }
    },
    metricSavings,
    wastedBytes: uncompressedResponseBytes
  });
}
function createOverlays4(model2) {
  if (!model2.data?.documentRequest) {
    return [];
  }
  const overlays = [];
  const event = model2.data.documentRequest;
  const redirectDurationMicro = Timing_exports3.milliToMicro(model2.data.redirectDuration);
  const sections = [];
  if (model2.data.redirectDuration) {
    const bounds = Timing_exports3.traceWindowFromMicroSeconds(event.ts, event.ts + redirectDurationMicro);
    sections.push({ bounds, label: i18nString4(UIStrings5.redirectsLabel), showDuration: true });
    overlays.push({ type: "CANDY_STRIPED_TIME_RANGE", bounds, entry: event });
  }
  if (!model2.data.checklist.serverResponseIsFast.value) {
    const serverResponseTimeMicro = Timing_exports3.milliToMicro(model2.data.serverResponseTime);
    const sendEnd = event.args.data.timing?.sendEnd ?? Timing_exports.Milli(0);
    const sendEndMicro = Timing_exports3.milliToMicro(sendEnd);
    const bounds = Timing_exports3.traceWindowFromMicroSeconds(sendEndMicro, sendEndMicro + serverResponseTimeMicro);
    sections.push({ bounds, label: i18nString4(UIStrings5.serverResponseTimeLabel), showDuration: true });
  }
  if (model2.data.uncompressedResponseBytes) {
    const bounds = Timing_exports3.traceWindowFromMicroSeconds(event.args.data.syntheticData.downloadStart, event.args.data.syntheticData.downloadStart + event.args.data.syntheticData.download);
    sections.push({ bounds, label: i18nString4(UIStrings5.uncompressedDownload), showDuration: true });
    overlays.push({ type: "CANDY_STRIPED_TIME_RANGE", bounds, entry: event });
  }
  if (sections.length) {
    overlays.push({
      type: "TIMESPAN_BREAKDOWN",
      sections,
      entry: model2.data.documentRequest,
      // Always render below because the document request is guaranteed to be
      // the first request in the network track.
      renderLocation: "BELOW_EVENT"
    });
  }
  overlays.push({
    type: "ENTRY_SELECTED",
    entry: model2.data.documentRequest
  });
  return overlays;
}
var UIStrings5, i18nString4, TOO_SLOW_THRESHOLD_MS, TARGET_MS, IGNORE_THRESHOLD_IN_BYTES;
var init_DocumentLatency = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js"() {
    init_process_global();
    init_helpers2();
    init_types2();
    init_Common();
    init_types4();
    UIStrings5 = {
      /**
       * @description Title of an insight that provides a breakdown for how long it took to download the main document.
       */
      title: "Document request latency",
      /**
       * @description Description of an insight that provides a breakdown for how long it took to download the main document.
       */
      description: "Your first network request is the most important. [Reduce its latency](https://developer.chrome.com/docs/performance/insights/document-latency) by avoiding redirects, ensuring a fast server response, and enabling text compression.",
      /**
       * @description Text to tell the user that the document request does not have redirects.
       */
      passingRedirects: "Avoids redirects",
      /**
       * @description Text to tell the user that the document request had redirects.
       * @example {3} PH1
       * @example {1000 ms} PH2
       */
      failedRedirects: "Had redirects ({PH1} redirects, +{PH2})",
      /**
       * @description Text to tell the user that the time starting the document request to when the server started responding is acceptable.
       * @example {600 ms} PH1
       */
      passingServerResponseTime: "Server responds quickly (observed {PH1})",
      /**
       * @description Text to tell the user that the time starting the document request to when the server started responding is not acceptable.
       * @example {601 ms} PH1
       */
      failedServerResponseTime: "Server responded slowly (observed {PH1})",
      /**
       * @description Text to tell the user that text compression (like gzip) was applied.
       */
      passingTextCompression: "Applies text compression",
      /**
       * @description Text to tell the user that text compression (like gzip) was not applied.
       */
      failedTextCompression: "No compression applied",
      /**
       * @description Text for a label describing a network request event as having redirects.
       */
      redirectsLabel: "Redirects",
      /**
       * @description Text for a label describing a network request event as taking too long to start delivery by the server.
       */
      serverResponseTimeLabel: "Server response time",
      /**
       * @description Text for a label describing a network request event as taking longer to download because it wasn't compressed.
       */
      uncompressedDownload: "Uncompressed download"
    };
    i18nString4 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    TOO_SLOW_THRESHOLD_MS = 600;
    TARGET_MS = 100;
    IGNORE_THRESHOLD_IN_BYTES = 1400;
    __name(isDocumentLatencyInsight, "isDocumentLatencyInsight");
    __name(getServerResponseTime, "getServerResponseTime");
    __name(getCompressionSavings, "getCompressionSavings");
    __name(finalize34, "finalize");
    __name(generateInsight4, "generateInsight");
    __name(createOverlays4, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js
var DOMSize_exports = {};
__export(DOMSize_exports, {
  UIStrings: () => UIStrings6,
  createOverlays: () => createOverlays5,
  generateInsight: () => generateInsight5,
  i18nString: () => i18nString5,
  isDomSizeInsight: () => isDomSizeInsight
});
function finalize35(partialModel) {
  const relatedEvents = [...partialModel.largeLayoutUpdates, ...partialModel.largeStyleRecalcs];
  return {
    insightKey: InsightKeys.DOM_SIZE,
    strings: UIStrings6,
    title: i18nString5(UIStrings6.title),
    description: i18nString5(UIStrings6.description),
    docs: "https://developer.chrome.com/docs/performance/insights/dom-size",
    category: InsightCategory.INP,
    state: relatedEvents.length > 0 ? "informative" : "pass",
    ...partialModel,
    relatedEvents
  };
}
function isDomSizeInsight(model2) {
  return model2.insightKey === InsightKeys.DOM_SIZE;
}
function generateInsight5(data31, context) {
  const isWithinContext = /* @__PURE__ */ __name((event) => Timing_exports3.eventIsInBounds(event, context.bounds), "isWithinContext");
  const mainTid = context.navigation?.tid;
  const largeLayoutUpdates = [];
  const largeStyleRecalcs = [];
  const threads = Threads_exports.threadsInRenderer(data31.Renderer, data31.AuctionWorklets);
  for (const thread of threads) {
    if (thread.type !== Threads_exports.ThreadType.MAIN_THREAD) {
      continue;
    }
    if (mainTid === void 0) {
      if (!thread.processIsOnMainFrame) {
        continue;
      }
    } else if (thread.tid !== mainTid) {
      continue;
    }
    const rendererThread = data31.Renderer.processes.get(thread.pid)?.threads.get(thread.tid);
    if (!rendererThread) {
      continue;
    }
    const { entries, layoutEvents, recalcStyleEvents } = rendererThread;
    if (!entries.length) {
      continue;
    }
    const first = entries[0];
    const last = entries[entries.length - 1];
    const timeRange = Timing_exports3.traceWindowFromMicroSeconds(first.ts, Timing_exports.Micro(last.ts + (last.dur ?? 0)));
    if (!Timing_exports3.boundsIncludeTimeRange({ timeRange, bounds: context.bounds })) {
      continue;
    }
    for (const event of layoutEvents) {
      if (event.dur < DOM_SIZE_DURATION_THRESHOLD || !isWithinContext(event)) {
        continue;
      }
      const { dirtyObjects } = event.args.beginData;
      if (dirtyObjects > LAYOUT_OBJECTS_THRESHOLD) {
        largeLayoutUpdates.push(event);
      }
    }
    for (const event of recalcStyleEvents) {
      if (event.dur < DOM_SIZE_DURATION_THRESHOLD || !isWithinContext(event)) {
        continue;
      }
      const { elementCount } = event.args;
      if (elementCount > STYLE_RECALC_ELEMENTS_THRESHOLD) {
        largeStyleRecalcs.push(event);
      }
    }
  }
  const largeUpdates = [
    ...largeLayoutUpdates.map((event) => {
      const duration = event.dur / 1e3;
      const size = event.args.beginData.dirtyObjects;
      const label = i18nString5(UIStrings6.largeLayout, { PH1: size });
      return { label, duration, size, event };
    }),
    ...largeStyleRecalcs.map((event) => {
      const duration = event.dur / 1e3;
      const size = event.args.elementCount;
      const label = i18nString5(UIStrings6.largeStyleRecalc, { PH1: size });
      return { label, duration, size, event };
    })
  ].sort((a, b) => b.duration - a.duration).slice(0, 5);
  const domStatsEvents = data31.DOMStats.domStatsByFrameId.get(context.frameId)?.filter(isWithinContext) ?? [];
  let maxDOMStats;
  for (const domStats of domStatsEvents) {
    const navigationPid = context.navigation?.pid;
    if (navigationPid && domStats.pid !== navigationPid) {
      continue;
    }
    if (!maxDOMStats || domStats.args.data.totalElements > maxDOMStats.args.data.totalElements) {
      maxDOMStats = domStats;
    }
  }
  return finalize35({
    largeLayoutUpdates,
    largeStyleRecalcs,
    largeUpdates,
    maxDOMStats
  });
}
function createOverlays5(model2) {
  const entries = [...model2.largeStyleRecalcs, ...model2.largeLayoutUpdates];
  return entries.map((entry) => ({
    type: "ENTRY_OUTLINE",
    entry,
    outlineReason: "ERROR"
  }));
}
var UIStrings6, i18nString5, DOM_SIZE_DURATION_THRESHOLD, LAYOUT_OBJECTS_THRESHOLD, STYLE_RECALC_ELEMENTS_THRESHOLD;
var init_DOMSize = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types2();
    init_types4();
    UIStrings6 = {
      /**
       * @description Title of an insight that recommends reducing the size of the DOM tree as a means to improve page responsiveness. "DOM" is an acronym and should not be translated.
       */
      title: "Optimize DOM size",
      /**
       * @description Description of an insight that recommends reducing the size of the DOM tree as a means to improve page responsiveness. "DOM" is an acronym and should not be translated. "layout reflows" are when the browser will recompute the layout of content on the page.
       */
      description: "A large DOM can increase the duration of style calculations and layout reflows, impacting page responsiveness. A large DOM will also increase memory usage. [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/performance/insights/dom-size).",
      /**
       * @description Header for a column containing the names of statistics as opposed to the actual statistic values.
       */
      statistic: "Statistic",
      /**
       * @description Header for a column containing the value of a statistic.
       */
      value: "Value",
      /**
       * @description Header for a column containing the page element related to a statistic.
       */
      element: "Element",
      /**
       * @description Label for a value representing the total number of elements on the page.
       */
      totalElements: "Total elements",
      /**
       * @description Label for a value representing the maximum depth of the Document Object Model (DOM). "DOM" is a acronym and should not be translated.
       */
      maxDOMDepth: "DOM depth",
      /**
       * @description Label for a value representing the maximum number of child elements of any parent element on the page.
       */
      maxChildren: "Most children",
      /**
       * @description Text for a section.
       */
      topUpdatesDescription: "These are the largest layout and style recalculation events. Their performance impact may be reduced by making the DOM simpler.",
      /**
       * @description Label used for a time duration.
       */
      duration: "Duration",
      /**
       * @description Message displayed in a table detailing how big a layout (rendering) is.
       * @example {134} PH1
       */
      largeLayout: "Layout ({PH1} objects)",
      /**
       * @description Message displayed in a table detailing how big a style recalculation (rendering) is.
       * @example {134} PH1
       */
      largeStyleRecalc: "Style recalculation ({PH1} elements)"
    };
    i18nString5 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    DOM_SIZE_DURATION_THRESHOLD = Timing_exports3.milliToMicro(Timing_exports.Milli(40));
    LAYOUT_OBJECTS_THRESHOLD = 100;
    STYLE_RECALC_ELEMENTS_THRESHOLD = 300;
    __name(finalize35, "finalize");
    __name(isDomSizeInsight, "isDomSizeInsight");
    __name(generateInsight5, "generateInsight");
    __name(createOverlays5, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js
var DuplicatedJavaScript_exports = {};
__export(DuplicatedJavaScript_exports, {
  UIStrings: () => UIStrings7,
  createOverlays: () => createOverlays6,
  generateInsight: () => generateInsight6,
  i18nString: () => i18nString6,
  isDuplicatedJavaScriptInsight: () => isDuplicatedJavaScriptInsight
});
function finalize36(partialModel) {
  const requests = partialModel.scriptsWithDuplication.map((script) => script.request).filter((e) => !!e);
  return {
    insightKey: InsightKeys.DUPLICATE_JAVASCRIPT,
    strings: UIStrings7,
    title: i18nString6(UIStrings7.title),
    description: i18nString6(UIStrings7.description),
    docs: "https://developer.chrome.com/docs/performance/insights/duplicated-javascript",
    category: InsightCategory.LCP,
    state: Boolean(partialModel.duplication.values().next().value) ? "fail" : "pass",
    relatedEvents: [...new Set(requests)],
    ...partialModel
  };
}
function isDuplicatedJavaScriptInsight(model2) {
  return model2.insightKey === InsightKeys.DUPLICATE_JAVASCRIPT;
}
function generateInsight6(data31, context) {
  const scripts = data31.Scripts.scripts.filter((script) => {
    if (script.frame !== context.frameId) {
      return false;
    }
    if (script.url?.startsWith("chrome-extension://")) {
      return false;
    }
    return Timing_exports3.timestampIsInBounds(context.bounds, script.ts);
  });
  const compressionRatios = /* @__PURE__ */ new Map();
  for (const script of scripts) {
    if (script.request) {
      compressionRatios.set(script.request.args.data.requestId, estimateCompressionRatioForScript(script));
    }
  }
  const { duplication, duplicationGroupedByNodeModules } = ScriptDuplication_exports.computeScriptDuplication({ scripts }, compressionRatios);
  const scriptsWithDuplication = [...duplication.values().flatMap((data32) => data32.duplicates.map((d) => d.script))];
  const wastedBytesByRequestId = /* @__PURE__ */ new Map();
  for (const { duplicates } of duplication.values()) {
    for (let i = 1; i < duplicates.length; i++) {
      const sourceData = duplicates[i];
      if (!sourceData.script.request) {
        continue;
      }
      const transferSize = sourceData.attributedSize;
      const requestId = sourceData.script.request.args.data.requestId;
      wastedBytesByRequestId.set(requestId, (wastedBytesByRequestId.get(requestId) || 0) + transferSize);
    }
  }
  return finalize36({
    duplication,
    duplicationGroupedByNodeModules,
    scriptsWithDuplication: [...new Set(scriptsWithDuplication)],
    scripts,
    mainDocumentUrl: context.navigation?.args.data?.url ?? data31.Meta.mainFrameURL,
    metricSavings: metricSavingsForWastedBytes(wastedBytesByRequestId, context),
    wastedBytes: wastedBytesByRequestId.values().reduce((acc, cur) => acc + cur, 0)
  });
}
function createOverlays6(model2) {
  return model2.scriptsWithDuplication.map((script) => script.request).filter((e) => !!e).map((request) => {
    return {
      type: "ENTRY_OUTLINE",
      entry: request,
      outlineReason: "ERROR"
    };
  });
}
var UIStrings7, i18nString6;
var init_DuplicatedJavaScript = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js"() {
    init_process_global();
    init_extras();
    init_helpers2();
    init_Common();
    init_types4();
    UIStrings7 = {
      /**
       * @description Title of an insight that identifies multiple copies of the same JavaScript sources, and recommends removing the duplication.
       */
      title: "Duplicated JavaScript",
      /**
       * @description Description of an insight that identifies multiple copies of the same JavaScript sources, and recommends removing the duplication.
       */
      description: "Remove large, [duplicate JavaScript modules](https://developer.chrome.com/docs/performance/insights/duplicated-javascript) from bundles to reduce unnecessary bytes consumed by network activity.",
      /** Label for a column in a data table; entries will be the locations of JavaScript or CSS code, e.g. the name of a Javascript package or module. */
      columnSource: "Source",
      /** Label for a column in a data table; entries will be the number of wasted bytes due to duplication of a web resource. */
      columnDuplicatedBytes: "Duplicated bytes"
    };
    i18nString6 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(finalize36, "finalize");
    __name(isDuplicatedJavaScriptInsight, "isDuplicatedJavaScriptInsight");
    __name(generateInsight6, "generateInsight");
    __name(createOverlays6, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/FontDisplay.js
var FontDisplay_exports = {};
__export(FontDisplay_exports, {
  UIStrings: () => UIStrings8,
  createOverlays: () => createOverlays7,
  generateInsight: () => generateInsight7,
  i18nString: () => i18nString7,
  isFontDisplayInsight: () => isFontDisplayInsight
});
function finalize37(partialModel) {
  return {
    insightKey: InsightKeys.FONT_DISPLAY,
    strings: UIStrings8,
    title: i18nString7(UIStrings8.title),
    description: i18nString7(UIStrings8.description),
    docs: "https://developer.chrome.com/docs/performance/insights/font-display",
    category: InsightCategory.INP,
    state: partialModel.fonts.find((font) => font.wastedTime > 0) ? "fail" : "pass",
    ...partialModel
  };
}
function isFontDisplayInsight(model2) {
  return model2.insightKey === InsightKeys.FONT_DISPLAY;
}
function generateInsight7(data31, context) {
  const fonts = [];
  for (const remoteFont of data31.LayoutShifts.remoteFonts) {
    const event = remoteFont.beginRemoteFontLoadEvent;
    if (!Timing_exports3.eventIsInBounds(event, context.bounds)) {
      continue;
    }
    const requestId = `${event.pid}.${event.args.id}`;
    const request = data31.NetworkRequests.byId.get(requestId);
    if (!request) {
      continue;
    }
    if (!/^(block|fallback|auto)$/.test(remoteFont.display)) {
      continue;
    }
    const wastedTimeMicro = Timing_exports.Micro(request.args.data.syntheticData.finishTime - request.args.data.syntheticData.sendStartTime);
    let wastedTime = NumberUtilities_exports.floor(Timing_exports3.microToMilli(wastedTimeMicro), 1 / 5);
    if (wastedTime === 0) {
      continue;
    }
    wastedTime = Math.min(wastedTime, 3e3);
    fonts.push({
      name: remoteFont.name,
      request,
      display: remoteFont.display,
      wastedTime
    });
  }
  fonts.sort((a, b) => b.wastedTime - a.wastedTime);
  const savings = Math.max(...fonts.map((f) => f.wastedTime));
  return finalize37({
    relatedEvents: fonts.map((f) => f.request),
    fonts,
    metricSavings: { FCP: savings }
  });
}
function createOverlays7(model2) {
  return model2.fonts.map((font) => ({
    type: "ENTRY_OUTLINE",
    entry: font.request,
    outlineReason: font.wastedTime ? "ERROR" : "INFO"
  }));
}
var UIStrings8, i18nString7;
var init_FontDisplay = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/FontDisplay.js"() {
    init_process_global();
    init_platform();
    init_helpers2();
    init_types2();
    init_types4();
    UIStrings8 = {
      /** Title of an insight that provides details about the fonts used on the page, and the value of their `font-display` properties. */
      title: "Font display",
      /**
       * @description Text to tell the user about the font-display CSS feature to help improve a the UX of a page.
       */
      description: "Consider setting [`font-display`](https://developer.chrome.com/docs/performance/insights/font-display) to `swap` or `optional` to ensure text is consistently visible. `swap` can be further optimized to mitigate layout shifts with [font metric overrides](https://developer.chrome.com/blog/font-fallbacks).",
      /** Column for a font loaded by the page to render text. */
      fontColumn: "Font",
      /** Column for the amount of time wasted. */
      wastedTimeColumn: "Wasted time"
    };
    i18nString7 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(finalize37, "finalize");
    __name(isFontDisplayInsight, "isFontDisplayInsight");
    __name(generateInsight7, "generateInsight");
    __name(createOverlays7, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js
var ForcedReflow_exports = {};
__export(ForcedReflow_exports, {
  UIStrings: () => UIStrings9,
  createOverlayForEvents: () => createOverlayForEvents,
  createOverlays: () => createOverlays8,
  generateInsight: () => generateInsight8,
  i18nString: () => i18nString8,
  isForcedReflowInsight: () => isForcedReflowInsight
});
function getCallFrameId(callFrame) {
  return callFrame.scriptId + ":" + callFrame.lineNumber + ":" + callFrame.columnNumber;
}
function getLargestTopLevelFunctionData(forcedReflowEvents, traceParsedData) {
  const entryToNodeMap = traceParsedData.Renderer.entryToNode;
  const dataByTopLevelFunction = /* @__PURE__ */ new Map();
  if (forcedReflowEvents.length === 0) {
    return;
  }
  for (const event of forcedReflowEvents) {
    const traceNode = entryToNodeMap.get(event);
    if (!traceNode) {
      continue;
    }
    let node = traceNode.parent;
    let topLevelFunctionCall;
    let topLevelFunctionCallEvent;
    while (node) {
      const eventData = node.entry;
      if (TraceEvents_exports.isProfileCall(eventData)) {
        topLevelFunctionCall = eventData.callFrame;
        topLevelFunctionCallEvent = eventData;
      } else {
        if (TraceEvents_exports.isFunctionCall(eventData) && eventData.args.data && TraceEvents_exports.objectIsCallFrame(eventData.args.data)) {
          topLevelFunctionCall = eventData.args.data;
          topLevelFunctionCallEvent = eventData;
        }
        break;
      }
      node = node.parent;
    }
    if (!topLevelFunctionCall || !topLevelFunctionCallEvent) {
      continue;
    }
    const aggregatedDataId = getCallFrameId(topLevelFunctionCall);
    const aggregatedData = MapUtilities_exports.getWithDefault(dataByTopLevelFunction, aggregatedDataId, () => ({
      topLevelFunctionCall,
      totalReflowTime: 0,
      topLevelFunctionCallEvents: []
    }));
    aggregatedData.totalReflowTime += event.dur ?? 0;
    aggregatedData.topLevelFunctionCallEvents.push(topLevelFunctionCallEvent);
  }
  let topTimeConsumingData = void 0;
  dataByTopLevelFunction.forEach((data31) => {
    if (!topTimeConsumingData || data31.totalReflowTime > topTimeConsumingData.totalReflowTime) {
      topTimeConsumingData = data31;
    }
  });
  return topTimeConsumingData;
}
function finalize38(partialModel) {
  return {
    insightKey: InsightKeys.FORCED_REFLOW,
    strings: UIStrings9,
    title: i18nString8(UIStrings9.title),
    description: i18nString8(UIStrings9.description),
    docs: "https://developer.chrome.com/docs/performance/insights/forced-reflow",
    category: InsightCategory.ALL,
    state: partialModel.aggregatedBottomUpData.length !== 0 ? "fail" : "pass",
    ...partialModel
  };
}
function getBottomCallFrameForEvent(event, traceParsedData) {
  const profileStackTrace = StackTraceForEvent_exports.get(event, traceParsedData);
  const eventTopCallFrame = Trace_exports.getStackTraceTopCallFrameInEventPayload(event);
  return profileStackTrace?.callFrames[0] ?? eventTopCallFrame ?? null;
}
function isForcedReflowInsight(model2) {
  return model2.insightKey === InsightKeys.FORCED_REFLOW;
}
function generateInsight8(traceParsedData, context) {
  const isWithinContext = /* @__PURE__ */ __name((event) => {
    const frameId = Trace_exports.frameIDForEvent(event);
    if (frameId !== context.frameId) {
      return false;
    }
    return Timing_exports3.eventIsInBounds(event, context.bounds);
  }, "isWithinContext");
  const bottomUpDataMap = /* @__PURE__ */ new Map();
  const events = traceParsedData.Warnings.perWarning.get("FORCED_REFLOW")?.filter(isWithinContext) ?? [];
  for (const event of events) {
    const bottomCallFrame = getBottomCallFrameForEvent(event, traceParsedData);
    const bottomCallId = bottomCallFrame ? getCallFrameId(bottomCallFrame) : "UNATTRIBUTED";
    const bottomUpData = MapUtilities_exports.getWithDefault(bottomUpDataMap, bottomCallId, () => ({
      bottomUpData: bottomCallFrame,
      totalTime: 0,
      relatedEvents: []
    }));
    bottomUpData.totalTime += event.dur ?? 0;
    bottomUpData.relatedEvents.push(event);
  }
  const topLevelFunctionCallData = getLargestTopLevelFunctionData(events, traceParsedData);
  return finalize38({
    relatedEvents: events,
    topLevelFunctionCallData,
    aggregatedBottomUpData: [...bottomUpDataMap.values()]
  });
}
function createOverlays8(model2) {
  if (!model2.topLevelFunctionCallData) {
    return [];
  }
  const allBottomUpEvents = [...model2.aggregatedBottomUpData.values().flatMap((data31) => data31.relatedEvents)];
  return [
    ...createOverlayForEvents(model2.topLevelFunctionCallData.topLevelFunctionCallEvents, "INFO"),
    ...createOverlayForEvents(allBottomUpEvents)
  ];
}
function createOverlayForEvents(events, outlineReason = "ERROR") {
  return events.map((e) => ({
    type: "ENTRY_OUTLINE",
    entry: e,
    outlineReason
  }));
}
var UIStrings9, i18nString8;
var init_ForcedReflow = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js"() {
    init_process_global();
    init_platform();
    init_extras();
    init_helpers2();
    init_types2();
    init_types4();
    UIStrings9 = {
      /**
       * @description Title of an insight that provides details about Forced reflow.
       */
      title: "Forced reflow",
      /**
       * @description Text to describe the forced reflow.
       */
      description: "A forced reflow occurs when JavaScript queries geometric properties (such as `offsetWidth`) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developer.chrome.com/docs/performance/insights/forced-reflow) and possible mitigations.",
      /**
       * @description Title of a list to provide related stack trace data
       */
      reflowCallFrames: "Call frames that trigger reflow",
      /**
       * @description Text to describe the top time-consuming function call
       */
      topTimeConsumingFunctionCall: "Top function call",
      /**
       * @description Text to describe the total reflow time
       */
      totalReflowTime: "Total reflow time",
      /**
       * @description Text to describe CPU processor tasks that could not be attributed to any specific source code.
       */
      unattributed: "[unattributed]",
      /**
       * @description Text for the name of anonymous functions
       */
      anonymous: "(anonymous)"
    };
    i18nString8 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(getCallFrameId, "getCallFrameId");
    __name(getLargestTopLevelFunctionData, "getLargestTopLevelFunctionData");
    __name(finalize38, "finalize");
    __name(getBottomCallFrameForEvent, "getBottomCallFrameForEvent");
    __name(isForcedReflowInsight, "isForcedReflowInsight");
    __name(generateInsight8, "generateInsight");
    __name(createOverlays8, "createOverlays");
    __name(createOverlayForEvents, "createOverlayForEvents");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/ImageDelivery.js
var ImageDelivery_exports = {};
__export(ImageDelivery_exports, {
  ImageOptimizationType: () => ImageOptimizationType,
  UIStrings: () => UIStrings10,
  createOverlayForRequest: () => createOverlayForRequest2,
  createOverlays: () => createOverlays9,
  generateInsight: () => generateInsight9,
  getOptimizationMessage: () => getOptimizationMessage,
  getOptimizationMessageWithBytes: () => getOptimizationMessageWithBytes,
  i18nString: () => i18nString9,
  isImageDeliveryInsight: () => isImageDeliveryInsight
});
function isImageDeliveryInsight(model2) {
  return model2.insightKey === "ImageDelivery";
}
function getOptimizationMessage(optimization) {
  switch (optimization.type) {
    case ImageOptimizationType.ADJUST_COMPRESSION:
      return i18nString9(UIStrings10.useCompression);
    case ImageOptimizationType.MODERN_FORMAT_OR_COMPRESSION:
      return i18nString9(UIStrings10.useModernFormat);
    case ImageOptimizationType.VIDEO_FORMAT:
      return i18nString9(UIStrings10.useVideoFormat);
    case ImageOptimizationType.RESPONSIVE_SIZE:
      return i18nString9(UIStrings10.useResponsiveSize, {
        PH1: `${optimization.fileDimensions.width}x${optimization.fileDimensions.height}`,
        PH2: `${optimization.displayDimensions.width}x${optimization.displayDimensions.height}`
      });
  }
}
function getOptimizationMessageWithBytes(optimization) {
  const byteSavingsText = /* @__PURE__ */ ((bytes) => ({ __i18nBytes: bytes }))(optimization.byteSavings);
  const optimizationMessage = getOptimizationMessage(optimization);
  return i18nString9(UIStrings10.estimatedSavings, { PH1: optimizationMessage, PH2: byteSavingsText });
}
function finalize39(partialModel) {
  return {
    insightKey: InsightKeys.IMAGE_DELIVERY,
    strings: UIStrings10,
    title: i18nString9(UIStrings10.title),
    description: i18nString9(UIStrings10.description),
    docs: "https://developer.chrome.com/docs/performance/insights/image-delivery",
    category: InsightCategory.LCP,
    state: partialModel.optimizableImages.length > 0 ? "fail" : "pass",
    ...partialModel,
    relatedEvents: new Map(partialModel.optimizableImages.map((image) => [image.request, image.optimizations.map(getOptimizationMessageWithBytes)]))
  };
}
function estimateGIFPercentSavings(request) {
  return Math.round(29.1 * Math.log10(request.args.data.decodedBodyLength) - 100.7) / 100;
}
function getDisplayedSize(data31, paintImage) {
  return data31.ImagePainting.paintEventToCorrectedDisplaySize.get(paintImage) ?? {
    width: paintImage.args.data.width,
    height: paintImage.args.data.height
  };
}
function getPixelCounts(data31, paintImage) {
  const { width, height } = getDisplayedSize(data31, paintImage);
  return {
    filePixels: paintImage.args.data.srcWidth * paintImage.args.data.srcHeight,
    displayedPixels: width * height
  };
}
function generateInsight9(data31, context) {
  const isWithinContext = /* @__PURE__ */ __name((event) => Timing_exports3.eventIsInBounds(event, context.bounds), "isWithinContext");
  const contextRequests = data31.NetworkRequests.byTime.filter(isWithinContext);
  const optimizableImages = [];
  for (const request of contextRequests) {
    if (request.args.data.resourceType !== "Image") {
      continue;
    }
    if (request.args.data.mimeType === "image/svg+xml") {
      continue;
    }
    const url = request.args.data.redirects[0]?.url ?? request.args.data.url;
    const imagePaints = data31.ImagePainting.paintImageEventForUrl.get(url)?.filter(isWithinContext);
    if (!imagePaints?.length) {
      continue;
    }
    const largestImagePaint = imagePaints.reduce((prev, curr) => {
      const prevPixels = getPixelCounts(data31, prev).displayedPixels;
      const currPixels = getPixelCounts(data31, curr).displayedPixels;
      return prevPixels > currPixels ? prev : curr;
    });
    const { filePixels: imageFilePixels, displayedPixels: largestImageDisplayPixels } = getPixelCounts(data31, largestImagePaint);
    const imageBytes = Math.min(request.args.data.decodedBodyLength, request.args.data.encodedDataLength);
    const bytesPerPixel = imageBytes / imageFilePixels;
    let optimizations = [];
    if (request.args.data.mimeType === "image/gif") {
      if (imageBytes > GIF_SIZE_THRESHOLD) {
        const percentSavings = estimateGIFPercentSavings(request);
        const byteSavings = Math.round(imageBytes * percentSavings);
        optimizations.push({ type: ImageOptimizationType.VIDEO_FORMAT, byteSavings });
      }
    } else if (bytesPerPixel > TARGET_BYTES_PER_PIXEL_AVIF) {
      const idealAvifImageSize = Math.round(TARGET_BYTES_PER_PIXEL_AVIF * imageFilePixels);
      const byteSavings = imageBytes - idealAvifImageSize;
      if (request.args.data.mimeType !== "image/webp" && request.args.data.mimeType !== "image/avif") {
        optimizations.push({ type: ImageOptimizationType.MODERN_FORMAT_OR_COMPRESSION, byteSavings });
      } else {
        optimizations.push({ type: ImageOptimizationType.ADJUST_COMPRESSION, byteSavings });
      }
    }
    const imageByteSavingsFromFormat = Math.max(0, ...optimizations.map((o) => o.byteSavings));
    let imageByteSavings = imageByteSavingsFromFormat;
    const wastedPixelRatio = 1 - largestImageDisplayPixels / imageFilePixels;
    if (wastedPixelRatio > 0 && !largestImagePaint.args.data.isCSS) {
      const byteSavings = Math.round(wastedPixelRatio * imageBytes);
      const hadBreakpoints = largestImagePaint.args.data.isPicture || largestImagePaint.args.data.srcsetAttribute;
      if (!hadBreakpoints || byteSavings > BYTE_SAVINGS_THRESHOLD_RESPONSIVE_BREAKPOINTS) {
        imageByteSavings += Math.round(wastedPixelRatio * (imageBytes - imageByteSavingsFromFormat));
        const { width, height } = getDisplayedSize(data31, largestImagePaint);
        optimizations.push({
          type: ImageOptimizationType.RESPONSIVE_SIZE,
          byteSavings,
          fileDimensions: {
            width: Math.round(largestImagePaint.args.data.srcWidth),
            height: Math.round(largestImagePaint.args.data.srcHeight)
          },
          displayDimensions: {
            width: Math.round(width),
            height: Math.round(height)
          }
        });
      }
    }
    optimizations = optimizations.filter((optimization) => optimization.byteSavings > BYTE_SAVINGS_THRESHOLD);
    if (optimizations.length > 0) {
      optimizableImages.push({
        request,
        largestImagePaint,
        optimizations,
        byteSavings: imageByteSavings
      });
    }
  }
  const wastedBytesByRequestId = /* @__PURE__ */ new Map();
  for (const image of optimizableImages) {
    wastedBytesByRequestId.set(image.request.args.data.requestId, image.byteSavings);
  }
  optimizableImages.sort((a, b) => {
    if (b.byteSavings !== a.byteSavings) {
      return b.byteSavings - a.byteSavings;
    }
    return b.request.args.data.decodedBodyLength - a.request.args.data.decodedBodyLength;
  });
  return finalize39({
    optimizableImages,
    metricSavings: metricSavingsForWastedBytes(wastedBytesByRequestId, context),
    wastedBytes: optimizableImages.reduce((total, img) => total + img.byteSavings, 0)
  });
}
function createOverlayForRequest2(request) {
  return {
    type: "ENTRY_OUTLINE",
    entry: request,
    outlineReason: "ERROR"
  };
}
function createOverlays9(model2) {
  return model2.optimizableImages.map((image) => createOverlayForRequest2(image.request));
}
var UIStrings10, i18nString9, TARGET_BYTES_PER_PIXEL_AVIF, GIF_SIZE_THRESHOLD, BYTE_SAVINGS_THRESHOLD, BYTE_SAVINGS_THRESHOLD_RESPONSIVE_BREAKPOINTS, ImageOptimizationType;
var init_ImageDelivery = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/ImageDelivery.js"() {
    init_process_global();
    init_helpers2();
    init_Common();
    init_types4();
    UIStrings10 = {
      /**
       * @description Title of an insight that recommends ways to reduce the size of images downloaded and used on the page.
       */
      title: "Improve image delivery",
      /**
       * @description Description of an insight that recommends ways to reduce the size of images downloaded and used on the page.
       */
      description: "Reducing the download time of images can improve the perceived load time of the page and LCP. [Learn more about optimizing image size](https://developer.chrome.com/docs/performance/insights/image-delivery)",
      /**
       * @description Message displayed in a chip explaining that an image file size is large for the # of pixels it has and recommends possible adjustments to improve the image size.
       */
      useCompression: "Increasing the image compression factor could improve this image's download size.",
      /**
       * @description Message displayed in a chip explaining that an image file size is large for the # of pixels it has and recommends possible adjustments to improve the image size.
       */
      useModernFormat: "Using a modern image format (WebP, AVIF) or increasing the image compression could improve this image's download size.",
      /**
       * @description Message displayed in a chip advising the user to use video formats instead of GIFs because videos generally have smaller file sizes.
       */
      useVideoFormat: "Using video formats instead of GIFs can improve the download size of animated content.",
      /**
       * @description Message displayed in a chip explaining that an image was displayed on the page with dimensions much smaller than the image file dimensions.
       * @example {1000x500} PH1
       * @example {100x50} PH2
       */
      useResponsiveSize: "This image file is larger than it needs to be ({PH1}) for its displayed dimensions ({PH2}). Use responsive images to reduce the image download size.",
      /**
       * @description Column header for a table column containing network requests for images which can improve their file size (e.g. use a different format, increase compression, etc).
       */
      optimizeFile: "Optimize file size",
      /**
       * @description Table row value representing the remaining items not shown in the table due to size constraints. This row will always represent at least 2 items.
       * @example {5} PH1
       */
      others: "{PH1} others",
      /**
       * @description Text status indicating that no potential optimizations were found for any image file
       */
      noOptimizableImages: "No optimizable images",
      /**
       * @description Text describing the estimated number of bytes that an image file optimization can save. This text is appended to another block of text describing the image optimization in more detail. "Est" means "Estimated".
       * @example {Use the correct image dimensions to reduce the image file size.} PH1
       * @example {50 MB} PH2
       */
      estimatedSavings: "{PH1} (Est {PH2})"
    };
    i18nString9 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    TARGET_BYTES_PER_PIXEL_AVIF = 2 * 1 / 12;
    GIF_SIZE_THRESHOLD = 100 * 1024;
    BYTE_SAVINGS_THRESHOLD = 4096;
    BYTE_SAVINGS_THRESHOLD_RESPONSIVE_BREAKPOINTS = 12288;
    (function(ImageOptimizationType2) {
      ImageOptimizationType2["ADJUST_COMPRESSION"] = "ADJUST_COMPRESSION";
      ImageOptimizationType2["MODERN_FORMAT_OR_COMPRESSION"] = "MODERN_FORMAT_OR_COMPRESSION";
      ImageOptimizationType2["VIDEO_FORMAT"] = "VIDEO_FORMAT";
      ImageOptimizationType2["RESPONSIVE_SIZE"] = "RESPONSIVE_SIZE";
    })(ImageOptimizationType || (ImageOptimizationType = {}));
    __name(isImageDeliveryInsight, "isImageDeliveryInsight");
    __name(getOptimizationMessage, "getOptimizationMessage");
    __name(getOptimizationMessageWithBytes, "getOptimizationMessageWithBytes");
    __name(finalize39, "finalize");
    __name(estimateGIFPercentSavings, "estimateGIFPercentSavings");
    __name(getDisplayedSize, "getDisplayedSize");
    __name(getPixelCounts, "getPixelCounts");
    __name(generateInsight9, "generateInsight");
    __name(createOverlayForRequest2, "createOverlayForRequest");
    __name(createOverlays9, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/INPBreakdown.js
var INPBreakdown_exports = {};
__export(INPBreakdown_exports, {
  UIStrings: () => UIStrings11,
  createOverlays: () => createOverlays10,
  createOverlaysForSubpart: () => createOverlaysForSubpart,
  generateInsight: () => generateInsight10,
  i18nString: () => i18nString10,
  isINPBreakdownInsight: () => isINPBreakdownInsight
});
function isINPBreakdownInsight(insight) {
  return insight.insightKey === InsightKeys.INP_BREAKDOWN;
}
function finalize40(partialModel) {
  let state = "pass";
  if (partialModel.longestInteractionEvent) {
    const classification = ModelHandlers_exports.UserInteractions.scoreClassificationForInteractionToNextPaint(partialModel.longestInteractionEvent.dur);
    if (classification === ModelHandlers_exports.PageLoadMetrics.ScoreClassification.GOOD) {
      state = "informative";
    } else {
      state = "fail";
    }
  }
  return {
    insightKey: InsightKeys.INP_BREAKDOWN,
    strings: UIStrings11,
    title: i18nString10(UIStrings11.title),
    description: i18nString10(UIStrings11.description),
    docs: "https://developer.chrome.com/docs/performance/insights/inp-breakdown",
    category: InsightCategory.INP,
    state,
    ...partialModel
  };
}
function generateInsight10(data31, context) {
  const interactionEvents2 = data31.UserInteractions.interactionEventsWithNoNesting.filter((event) => {
    return Timing_exports3.eventIsInBounds(event, context.bounds);
  });
  if (!interactionEvents2.length) {
    return finalize40({});
  }
  const longestByInteractionId = /* @__PURE__ */ new Map();
  for (const event of interactionEvents2) {
    const key = event.interactionId;
    const longest = longestByInteractionId.get(key);
    if (!longest || event.dur > longest.dur) {
      longestByInteractionId.set(key, event);
    }
  }
  const normalizedInteractionEvents = [...longestByInteractionId.values()];
  normalizedInteractionEvents.sort((a, b) => b.dur - a.dur);
  const highPercentileIndex = Math.min(9, Math.floor(normalizedInteractionEvents.length / 50));
  return finalize40({
    relatedEvents: [normalizedInteractionEvents[0]],
    longestInteractionEvent: normalizedInteractionEvents[0],
    highPercentileInteractionEvent: normalizedInteractionEvents[highPercentileIndex]
  });
}
function createOverlaysForSubpart(event, subpartIndex = -1) {
  const p1 = Timing_exports3.traceWindowFromMicroSeconds(event.ts, event.ts + event.inputDelay);
  const p2 = Timing_exports3.traceWindowFromMicroSeconds(p1.max, p1.max + event.mainThreadHandling);
  const p3 = Timing_exports3.traceWindowFromMicroSeconds(p2.max, p2.max + event.presentationDelay);
  let sections = [
    { bounds: p1, label: i18nString10(UIStrings11.inputDelay), showDuration: true },
    { bounds: p2, label: i18nString10(UIStrings11.processingDuration), showDuration: true },
    { bounds: p3, label: i18nString10(UIStrings11.presentationDelay), showDuration: true }
  ];
  if (subpartIndex !== -1) {
    sections = [sections[subpartIndex]];
  }
  return [
    {
      type: "TIMESPAN_BREAKDOWN",
      sections,
      renderLocation: "BELOW_EVENT",
      entry: event
    }
  ];
}
function createOverlays10(model2) {
  const event = model2.longestInteractionEvent;
  if (!event) {
    return [];
  }
  return createOverlaysForSubpart(event);
}
var UIStrings11, i18nString10;
var init_INPBreakdown = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/INPBreakdown.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types4();
    UIStrings11 = {
      /**
       * @description Text to tell the user about the longest user interaction.
       */
      description: "Start investigating [how to improve INP](https://developer.chrome.com/docs/performance/insights/inp-breakdown) by looking at the longest subpart.",
      /**
       * @description Title for the performance insight "INP breakdown", which shows a breakdown of INP by subparts / sections.
       */
      title: "INP breakdown",
      /**
       * @description Label used for the subpart/component/stage/section of a larger duration.
       */
      subpart: "Subpart",
      /**
       * @description Label used for a time duration.
       */
      duration: "Duration",
      // TODO: these are repeated in InteractionBreakdown. Add a place for common strings?
      /**
       * @description Text shown next to the interaction event's input delay time in the detail view.
       */
      inputDelay: "Input delay",
      /**
       * @description Text shown next to the interaction event's thread processing duration in the detail view.
       */
      processingDuration: "Processing duration",
      /**
       * @description Text shown next to the interaction event's presentation delay time in the detail view.
       */
      presentationDelay: "Presentation delay",
      /**
       * @description Text status indicating that no user interactions were detected.
       */
      noInteractions: "No interactions detected"
    };
    i18nString10 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(isINPBreakdownInsight, "isINPBreakdownInsight");
    __name(finalize40, "finalize");
    __name(generateInsight10, "generateInsight");
    __name(createOverlaysForSubpart, "createOverlaysForSubpart");
    __name(createOverlays10, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js
var LCPBreakdown_exports = {};
__export(LCPBreakdown_exports, {
  UIStrings: () => UIStrings12,
  createOverlays: () => createOverlays11,
  generateInsight: () => generateInsight11,
  i18nString: () => i18nString11,
  isLCPBreakdownInsight: () => isLCPBreakdownInsight
});
function isLCPBreakdownInsight(model2) {
  return model2.insightKey === "LCPBreakdown";
}
function anyValuesNaN(...values) {
  return values.some((v) => Number.isNaN(v));
}
function determineSubparts(nav, docRequest, lcpEvent, lcpRequest) {
  const firstDocByteTs = calculateDocFirstByteTs(docRequest);
  if (firstDocByteTs === null) {
    return null;
  }
  const ttfb = Timing_exports3.traceWindowFromMicroSeconds(nav.ts, firstDocByteTs);
  ttfb.label = i18nString11(UIStrings12.timeToFirstByte);
  let renderDelay = Timing_exports3.traceWindowFromMicroSeconds(ttfb.max, lcpEvent.ts);
  renderDelay.label = i18nString11(UIStrings12.elementRenderDelay);
  if (!lcpRequest) {
    if (anyValuesNaN(ttfb.range, renderDelay.range)) {
      return null;
    }
    return { ttfb, renderDelay };
  }
  const lcpStartTs = lcpRequest.ts;
  const lcpReqEndTs = lcpRequest.args.data.syntheticData.finishTime;
  const loadDelay = Timing_exports3.traceWindowFromMicroSeconds(ttfb.max, lcpStartTs);
  const loadDuration = Timing_exports3.traceWindowFromMicroSeconds(lcpStartTs, lcpReqEndTs);
  renderDelay = Timing_exports3.traceWindowFromMicroSeconds(lcpReqEndTs, lcpEvent.ts);
  loadDelay.label = i18nString11(UIStrings12.resourceLoadDelay);
  loadDuration.label = i18nString11(UIStrings12.resourceLoadDuration);
  renderDelay.label = i18nString11(UIStrings12.elementRenderDelay);
  if (anyValuesNaN(ttfb.range, loadDelay.range, loadDuration.range, renderDelay.range)) {
    return null;
  }
  return {
    ttfb,
    loadDelay,
    loadDuration,
    renderDelay
  };
}
function finalize41(partialModel) {
  const relatedEvents = [];
  if (partialModel.lcpEvent) {
    relatedEvents.push(partialModel.lcpEvent);
  }
  if (partialModel.lcpRequest) {
    relatedEvents.push(partialModel.lcpRequest);
  }
  let state = "pass";
  if (partialModel.lcpMs !== void 0) {
    const classification = ModelHandlers_exports.PageLoadMetrics.scoreClassificationForLargestContentfulPaint(Timing_exports3.milliToMicro(partialModel.lcpMs));
    if (classification === ModelHandlers_exports.PageLoadMetrics.ScoreClassification.GOOD) {
      state = "informative";
    } else {
      state = "fail";
    }
  }
  return {
    insightKey: InsightKeys.LCP_BREAKDOWN,
    strings: UIStrings12,
    title: i18nString11(UIStrings12.title),
    description: i18nString11(UIStrings12.description),
    docs: "https://developer.chrome.com/docs/performance/insights/lcp-breakdown",
    category: InsightCategory.LCP,
    state,
    ...partialModel,
    relatedEvents
  };
}
function generateInsight11(data31, context) {
  if (!context.navigation) {
    return finalize41({});
  }
  const networkRequests = data31.NetworkRequests;
  const frameMetrics = data31.PageLoadMetrics.metricScoresByFrameId.get(context.frameId);
  if (!frameMetrics) {
    throw new Error("no frame metrics");
  }
  const navMetrics = frameMetrics.get(context.navigation);
  if (!navMetrics) {
    throw new Error("no navigation metrics");
  }
  const metricScore = navMetrics.get(ModelHandlers_exports.PageLoadMetrics.MetricName.LCP);
  const lcpEvent = metricScore?.event;
  if (!lcpEvent || !TraceEvents_exports.isAnyLargestContentfulPaintCandidate(lcpEvent)) {
    return finalize41({ warnings: [InsightWarning.NO_LCP] });
  }
  const lcpMs = Timing_exports3.microToMilli(metricScore.timing);
  const lcpTs = metricScore.event?.ts ? Timing_exports3.microToMilli(metricScore.event?.ts) : void 0;
  const lcpRequest = data31.LargestImagePaint.lcpRequestByNavigationId.get(context.navigationId);
  const docRequest = networkRequests.byId.get(context.navigationId);
  if (!docRequest) {
    return finalize41({ lcpMs, lcpTs, lcpEvent, lcpRequest, warnings: [InsightWarning.NO_DOCUMENT_REQUEST] });
  }
  return finalize41({
    lcpMs,
    lcpTs,
    lcpEvent,
    lcpRequest,
    subparts: determineSubparts(context.navigation, docRequest, lcpEvent, lcpRequest) ?? void 0
  });
}
function createOverlays11(model2) {
  if (!model2.subparts || !model2.lcpTs) {
    return [];
  }
  const overlays = [
    {
      type: "TIMESPAN_BREAKDOWN",
      sections: Object.values(model2.subparts).map((subpart) => ({ bounds: subpart, label: subpart.label, showDuration: true }))
    }
  ];
  if (model2.lcpRequest) {
    overlays.push({ type: "ENTRY_OUTLINE", entry: model2.lcpRequest, outlineReason: "INFO" });
  }
  return overlays;
}
var UIStrings12, i18nString11;
var init_LCPBreakdown = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types2();
    init_Common();
    init_types4();
    UIStrings12 = {
      /**
       * @description Title of an insight that provides details about the LCP metric, broken down by parts.
       */
      title: "LCP breakdown",
      /**
       * @description Description of a DevTools insight that presents a breakdown for the LCP metric by subparts.
       * This is displayed after a user expands the section to see more. No character length limits.
       */
      description: "Each [subpart has specific improvement strategies](https://developer.chrome.com/docs/performance/insights/lcp-breakdown). Ideally, most of the LCP time should be spent on loading the resources, not within delays.",
      /**
       * @description Time to first byte title for the Largest Contentful Paint's subparts timespan breakdown.
       */
      timeToFirstByte: "Time to first byte",
      /**
       * @description Resource load delay title for the Largest Contentful Paint subparts timespan breakdown.
       */
      resourceLoadDelay: "Resource load delay",
      /**
       * @description Resource load duration title for the Largest Contentful Paint subparts timespan breakdown.
       */
      resourceLoadDuration: "Resource load duration",
      /**
       * @description Element render delay title for the Largest Contentful Paint subparts timespan breakdown.
       */
      elementRenderDelay: "Element render delay",
      /**
       * @description Label used for the subpart (section) of a larger duration.
       */
      subpart: "Subpart",
      /**
       * @description Label used for the duration a single subpart (section) takes up of a larger duration.
       */
      duration: "Duration",
      /**
       * @description Label used for the duration a single subpart (section) takes up of a larger duration. The value will be the 75th percentile of aggregate data. "Field" means that the data was collected from real users in the field as opposed to the developers local environment. "Field" is synonymous with "Real user data".
       */
      fieldDuration: "Field p75",
      /**
       * @description Text status indicating that the the Largest Contentful Paint (LCP) metric timing was not found. "LCP" is an acronym and should not be translated.
       */
      noLcp: "No LCP detected"
    };
    i18nString11 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(isLCPBreakdownInsight, "isLCPBreakdownInsight");
    __name(anyValuesNaN, "anyValuesNaN");
    __name(determineSubparts, "determineSubparts");
    __name(finalize41, "finalize");
    __name(generateInsight11, "generateInsight");
    __name(createOverlays11, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/LCPDiscovery.js
var LCPDiscovery_exports = {};
__export(LCPDiscovery_exports, {
  UIStrings: () => UIStrings13,
  createOverlays: () => createOverlays12,
  generateInsight: () => generateInsight12,
  getImageData: () => getImageData,
  i18nString: () => i18nString12,
  isLCPDiscoveryInsight: () => isLCPDiscoveryInsight
});
function isLCPDiscoveryInsight(model2) {
  return model2.insightKey === "LCPDiscovery";
}
function finalize42(partialModel) {
  const relatedEvents = partialModel.lcpEvent && partialModel.lcpRequest ? (
    // TODO: add entire request initiator chain?
    [partialModel.lcpEvent, partialModel.lcpRequest]
  ) : [];
  return {
    insightKey: InsightKeys.LCP_DISCOVERY,
    strings: UIStrings13,
    title: i18nString12(UIStrings13.title),
    description: i18nString12(UIStrings13.description),
    docs: "https://developer.chrome.com/docs/performance/insights/lcp-discovery",
    category: InsightCategory.LCP,
    state: partialModel.lcpRequest && partialModel.checklist && (!partialModel.checklist.eagerlyLoaded.value || !partialModel.checklist.requestDiscoverable.value || !partialModel.checklist.priorityHinted.value) ? "fail" : "pass",
    ...partialModel,
    relatedEvents
  };
}
function generateInsight12(data31, context) {
  if (!context.navigation) {
    return finalize42({});
  }
  const networkRequests = data31.NetworkRequests;
  const frameMetrics = data31.PageLoadMetrics.metricScoresByFrameId.get(context.frameId);
  if (!frameMetrics) {
    throw new Error("no frame metrics");
  }
  const navMetrics = frameMetrics.get(context.navigation);
  if (!navMetrics) {
    throw new Error("no navigation metrics");
  }
  const metricScore = navMetrics.get(ModelHandlers_exports.PageLoadMetrics.MetricName.LCP);
  const lcpEvent = metricScore?.event;
  if (!lcpEvent || !TraceEvents_exports.isAnyLargestContentfulPaintCandidate(lcpEvent)) {
    return finalize42({ warnings: [InsightWarning.NO_LCP] });
  }
  const docRequest = networkRequests.byId.get(context.navigationId);
  if (!docRequest) {
    return finalize42({ warnings: [InsightWarning.NO_DOCUMENT_REQUEST] });
  }
  const lcpRequest = data31.LargestImagePaint.lcpRequestByNavigationId.get(context.navigationId);
  if (!lcpRequest) {
    return finalize42({ lcpEvent });
  }
  const initiatorUrl = lcpRequest.args.data.initiator?.url;
  const initiatedByMainDoc = lcpRequest?.args.data.initiator?.type === "parser" && docRequest.args.data.url === initiatorUrl;
  const imgPreloadedOrFoundInHTML = lcpRequest?.args.data.isLinkPreload || initiatedByMainDoc;
  const imageFetchPriorityHint = lcpRequest?.args.data.fetchPriorityHint;
  const earliestDiscoveryTime = calculateDocFirstByteTs(docRequest);
  const priorityHintFound = imageFetchPriorityHint === "high";
  const missingPriorityHintLabel = lcpRequest.args.data.isLinkPreload ? i18nString12(UIStrings13.fetchPriorityShouldBeAppliedToImagePreload) : i18nString12(UIStrings13.fetchPriorityShouldBeApplied);
  const lcpNotLazyLoaded = lcpEvent.args.data?.loadingAttr !== "lazy" || lcpRequest.args.data.isLinkPreload;
  return finalize42({
    lcpEvent,
    lcpRequest,
    earliestDiscoveryTimeTs: earliestDiscoveryTime ? Timing_exports.Micro(earliestDiscoveryTime) : void 0,
    checklist: {
      priorityHinted: {
        label: priorityHintFound ? i18nString12(UIStrings13.fetchPriorityApplied) : missingPriorityHintLabel,
        value: priorityHintFound
      },
      requestDiscoverable: { label: i18nString12(UIStrings13.requestDiscoverable), value: imgPreloadedOrFoundInHTML },
      eagerlyLoaded: { label: i18nString12(UIStrings13.lazyLoadNotApplied), value: lcpNotLazyLoaded }
    }
  });
}
function getImageData(model2) {
  if (!model2.lcpRequest || !model2.checklist) {
    return null;
  }
  const shouldIncreasePriorityHint = !model2.checklist.priorityHinted.value;
  const shouldPreloadImage = !model2.checklist.requestDiscoverable.value;
  const shouldRemoveLazyLoading = !model2.checklist.eagerlyLoaded.value;
  const imageLCP = shouldIncreasePriorityHint !== void 0 && shouldPreloadImage !== void 0 && shouldRemoveLazyLoading !== void 0;
  if (!imageLCP) {
    return null;
  }
  const data31 = {
    checklist: model2.checklist,
    request: model2.lcpRequest,
    discoveryDelay: null,
    estimatedSavings: model2.metricSavings?.LCP ?? null
  };
  if (model2.earliestDiscoveryTimeTs && model2.lcpRequest) {
    const discoveryDelay = model2.lcpRequest.ts - model2.earliestDiscoveryTimeTs;
    data31.discoveryDelay = Timing_exports.Micro(discoveryDelay);
  }
  return data31;
}
function createOverlays12(model2) {
  const imageResults = getImageData(model2);
  if (!imageResults?.discoveryDelay) {
    return [];
  }
  const delay = Timing_exports3.traceWindowFromMicroSeconds(Timing_exports.Micro(imageResults.request.ts - imageResults.discoveryDelay), imageResults.request.ts);
  return [
    {
      type: "ENTRY_OUTLINE",
      entry: imageResults.request,
      outlineReason: "ERROR"
    },
    {
      type: "CANDY_STRIPED_TIME_RANGE",
      bounds: delay,
      entry: imageResults.request
    },
    {
      type: "TIMESPAN_BREAKDOWN",
      sections: [{
        bounds: delay,
        // This is overridden in the component.
        label: `${imageResults.discoveryDelay} microseconds`,
        showDuration: false
      }],
      entry: imageResults.request,
      renderLocation: "ABOVE_EVENT"
    }
  ];
}
var UIStrings13, i18nString12;
var init_LCPDiscovery = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/LCPDiscovery.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types2();
    init_Common();
    init_types4();
    UIStrings13 = {
      /**
       * @description Title of an insight that provides details about the LCP metric, and the network requests necessary to load it. Details how the LCP request was discoverable - in other words, the path necessary to load it (ex: network requests, JavaScript)
       */
      title: "LCP request discovery",
      /**
       * @description Description of an insight that provides details about the LCP metric, and the network requests necessary to load it.
       */
      description: "[Optimize LCP](https://developer.chrome.com/docs/performance/insights/lcp-discovery) by making the LCP image discoverable from the HTML immediately, and avoiding lazy-loading",
      /**
       * @description Text to tell the user how long after the earliest discovery time their LCP element loaded.
       * @example {401ms} PH1
       */
      lcpLoadDelay: "LCP image loaded {PH1} after earliest start point.",
      /**
       * @description Text to tell the user that a fetchpriority property value of "high" is applied to the LCP request.
       */
      fetchPriorityApplied: "fetchpriority=high applied",
      /**
       * @description Text to tell the user that a fetchpriority property value of "high" should be applied to the LCP request.
       */
      fetchPriorityShouldBeApplied: "fetchpriority=high should be applied",
      /**
       * @description Text to tell the user that a fetchpriority property value of "high" should be applied to the preload request that loads the LCP image.
       */
      fetchPriorityShouldBeAppliedToImagePreload: "fetchpriority=high should be applied to the image preload request",
      /**
       * @description Text to tell the user that the LCP request is discoverable in the initial document.
       */
      requestDiscoverable: "Request is discoverable in initial document",
      /**
       * @description Text to tell the user that LCP resources should avoid using loading=lazy.
       */
      lazyLoadNotApplied: "LCP resources should not use loading=lazy",
      /**
       * @description Text status indicating that the the Largest Contentful Paint (LCP) metric timing was not found. "LCP" is an acronym and should not be translated.
       */
      noLcp: "No LCP detected",
      /**
       * @description Text status indicating that the Largest Contentful Paint (LCP) metric was text rather than an image. "LCP" is an acronym and should not be translated.
       */
      noLcpResource: "No LCP resource detected because the LCP is not an image"
    };
    i18nString12 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(isLCPDiscoveryInsight, "isLCPDiscoveryInsight");
    __name(finalize42, "finalize");
    __name(generateInsight12, "generateInsight");
    __name(getImageData, "getImageData");
    __name(createOverlays12, "createOverlays");
  }
});

// node_modules/legacy-javascript/legacy-javascript.js
var legacy_javascript_exports = {};
__export(legacy_javascript_exports, {
  detectLegacyJavaScript: () => detectLegacyJavaScript,
  getCoreJsPolyfillData: () => getCoreJsPolyfillData,
  getTransformPatterns: () => getTransformPatterns
});
function buildPolyfillExpression(object, property, coreJs3Module) {
  const qt = /* @__PURE__ */ __name((token) => `['"]${token}['"]`, "qt");
  let expression = "";
  if (object) {
    expression += `${object}\\.${property}\\s?=[^=]`;
  } else {
    expression += `(?:window\\.|[\\s;]+)${property}\\s?=[^=]`;
  }
  if (object) {
    expression += `|${object}\\[${qt(property)}\\]\\s?=[^=]`;
  }
  expression += `|defineProperty\\(${object || "window"},\\s?${qt(property)}`;
  if (object) {
    expression += `|\\(${object},\\s*{${property}:.*},\\s*{${property}`;
  }
  if (object) {
    const objectWithoutPrototype = object.replace(".prototype", "");
    expression += `|{target:${qt(objectWithoutPrototype)}[^;]*},{${property}:`;
  } else {
  }
  expression += `|${coreJs3Module.replaceAll(".", "\\.")}(?:\\.js)?"`;
  return expression;
}
function getCoreJsPolyfillData() {
  return polyfillModuleData.filter((d) => d.corejs).map((d) => {
    return {
      name: d.name,
      coreJs3Module: d.modules[0]
    };
  });
}
function getPolyfillPatterns() {
  const patterns = [];
  for (const { name, coreJs3Module } of getCoreJsPolyfillData()) {
    const parts = name.split(".");
    const object = parts.length > 1 ? parts.slice(0, parts.length - 1).join(".") : null;
    const property = parts[parts.length - 1];
    patterns.push({
      name,
      expression: buildPolyfillExpression(object, property, coreJs3Module)
    });
  }
  return patterns;
}
function getTransformPatterns() {
  const count = /* @__PURE__ */ __name((content, pattern) => {
    if (typeof pattern === "string") {
      return content.split(pattern).length - 1;
    }
    return (content.match(pattern) ?? []).length;
  }, "count");
  return [
    // @babel/plugin-transform-classes
    //
    // input:
    //
    // class MyTestClass {
    //   log() {
    //     console.log(1);
    //   }
    // };
    //
    // output:
    //
    // function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
    // function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
    // function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
    // function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
    // function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
    // let MyTestClass = function () {
    //   function MyTestClass() {
    //     _classCallCheck(this, MyTestClass);
    //   }
    //   return _createClass(MyTestClass, [{
    //     key: "log",
    //     value: function log() {
    //       console.log(1);
    //     }
    //   }]);
    // }();
    {
      name: "@babel/plugin-transform-classes",
      expression: "Cannot call a class as a function",
      estimateBytes: /* @__PURE__ */ __name((content) => {
        return 1e3 + (count(content, "_classCallCheck") - 1) * "_classCallCheck()".length;
      }, "estimateBytes")
    },
    {
      name: "@babel/plugin-transform-regenerator",
      expression: "Generator is already running|regeneratorRuntime",
      // Example of this transform: https://gist.github.com/connorjclark/af8bccfff377ac44efc104a79bc75da2
      // `regeneratorRuntime.awrap` is generated for every usage of `await`, and adds ~80 bytes each.
      estimateBytes: /* @__PURE__ */ __name((content) => {
        return count(content, /regeneratorRuntime\(?\)?\.a?wrap/g) * 80;
      }, "estimateBytes")
    },
    {
      name: "@babel/plugin-transform-spread",
      expression: "Invalid attempt to spread non-iterable instance",
      estimateBytes: /* @__PURE__ */ __name((content) => {
        const per = "_toConsumableArray()".length;
        return 1169 + count(content, /\.apply\(void 0,\s?_toConsumableArray/g) * per;
      }, "estimateBytes")
    }
  ];
}
function estimateWastedBytes(content, matches) {
  const polyfillResults = matches.filter((m) => !m.name.startsWith("@"));
  const transformResults = matches.filter((m) => m.name.startsWith("@"));
  let estimatedWastedBytesFromPolyfills = 0;
  const modulesSeen = /* @__PURE__ */ new Set();
  for (const result of polyfillResults) {
    const modules = graph.dependencies[result.name];
    if (!modules)
      continue;
    for (const module2 of modules) {
      modulesSeen.add(module2);
    }
  }
  estimatedWastedBytesFromPolyfills += [...modulesSeen].reduce((acc, moduleIndex) => {
    return acc + graph.moduleSizes[moduleIndex];
  }, 0);
  estimatedWastedBytesFromPolyfills = Math.min(estimatedWastedBytesFromPolyfills, graph.maxSize);
  let estimatedWastedBytesFromTransforms = 0;
  for (const result of transformResults) {
    const pattern = getTransformPatterns().find((p) => p.name === result.name);
    if (!pattern || !pattern.estimateBytes || !content)
      continue;
    estimatedWastedBytesFromTransforms += pattern.estimateBytes(content);
  }
  const estimatedWastedBytes = estimatedWastedBytesFromPolyfills + estimatedWastedBytesFromTransforms;
  return estimatedWastedBytes;
}
function detectLegacyJavaScript(content, map) {
  if (!content)
    return { matches: [], estimatedByteSavings: 0 };
  let matches = matcher.match(content);
  if (map) {
    for (const { name, modules } of polyfillModuleData) {
      if (matches.some((m) => m.name === name))
        continue;
      const source = map.sourceURLs().find((source2) => modules.some((module2) => {
        return source2.endsWith(`/${module2}.js`) || source2.includes(`node_modules/${module2}/`);
      }));
      if (!source)
        continue;
      const mapping = map.mappings().find((m) => m.sourceURL === source);
      if (mapping) {
        matches.push({ name, line: mapping.lineNumber, column: mapping.columnNumber });
      } else {
        matches.push({ name, line: 0, column: 0 });
      }
    }
  }
  matches = matches.sort((a, b) => a.name > b.name ? 1 : a.name === b.name ? 0 : -1);
  return {
    matches,
    estimatedByteSavings: estimateWastedBytes(content, matches)
  };
}
var polyfill_module_data_default, polyfill_graph_data_default, polyfillModuleData, graph, CodePatternMatcher, matcher;
var init_legacy_javascript = __esm({
  "node_modules/legacy-javascript/legacy-javascript.js"() {
    init_process_global();
    polyfill_module_data_default = [
      {
        name: "focus-visible",
        modules: [
          "focus-visible"
        ]
      },
      {
        name: "Error.prototype.cause",
        modules: [
          "es.error.cause"
        ]
      },
      {
        name: "Array.prototype.at",
        modules: [
          "es.array.at",
          "esnext.array.at"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.concat",
        modules: [
          "es.array.concat"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.copyWithin",
        modules: [
          "es.array.copy-within"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.every",
        modules: [
          "es.array.every"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.fill",
        modules: [
          "es.array.fill"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.filter",
        modules: [
          "es.array.filter"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.find",
        modules: [
          "es.array.find"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.findIndex",
        modules: [
          "es.array.find-index"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.findLast",
        modules: [
          "es.array.find-last",
          "esnext.array.find-last"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.findLastIndex",
        modules: [
          "es.array.find-last-index",
          "esnext.array.find-last-index"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.flat",
        modules: [
          "es.array.flat"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.flatMap",
        modules: [
          "es.array.flat-map"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.forEach",
        modules: [
          "es.array.for-each"
        ],
        corejs: true
      },
      {
        name: "Array.from",
        modules: [
          "es.array.from"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.includes",
        modules: [
          "es.array.includes"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.indexOf",
        modules: [
          "es.array.index-of"
        ],
        corejs: true
      },
      {
        name: "Array.isArray",
        modules: [
          "es.array.is-array"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.join",
        modules: [
          "es.array.join"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.map",
        modules: [
          "es.array.map"
        ],
        corejs: true
      },
      {
        name: "Array.of",
        modules: [
          "es.array.of"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.slice",
        modules: [
          "es.array.slice"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.some",
        modules: [
          "es.array.some"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.sort",
        modules: [
          "es.array.sort"
        ],
        corejs: true
      },
      {
        name: "Array.prototype.unshift",
        modules: [
          "es.array.unshift"
        ],
        corejs: true
      },
      {
        name: "Math.acosh",
        modules: [
          "es.math.acosh"
        ],
        corejs: true
      },
      {
        name: "Math.asinh",
        modules: [
          "es.math.asinh"
        ],
        corejs: true
      },
      {
        name: "Math.atanh",
        modules: [
          "es.math.atanh"
        ],
        corejs: true
      },
      {
        name: "Math.cbrt",
        modules: [
          "es.math.cbrt"
        ],
        corejs: true
      },
      {
        name: "Math.clz32",
        modules: [
          "es.math.clz32"
        ],
        corejs: true
      },
      {
        name: "Math.cosh",
        modules: [
          "es.math.cosh"
        ],
        corejs: true
      },
      {
        name: "Math.expm1",
        modules: [
          "es.math.expm1"
        ],
        corejs: true
      },
      {
        name: "Math.fround",
        modules: [
          "es.math.fround"
        ],
        corejs: true
      },
      {
        name: "Math.hypot",
        modules: [
          "es.math.hypot"
        ],
        corejs: true
      },
      {
        name: "Math.imul",
        modules: [
          "es.math.imul"
        ],
        corejs: true
      },
      {
        name: "Math.log10",
        modules: [
          "es.math.log10"
        ],
        corejs: true
      },
      {
        name: "Math.log1p",
        modules: [
          "es.math.log1p"
        ],
        corejs: true
      },
      {
        name: "Math.log2",
        modules: [
          "es.math.log2"
        ],
        corejs: true
      },
      {
        name: "Math.sign",
        modules: [
          "es.math.sign"
        ],
        corejs: true
      },
      {
        name: "Math.sinh",
        modules: [
          "es.math.sinh"
        ],
        corejs: true
      },
      {
        name: "Math.tanh",
        modules: [
          "es.math.tanh"
        ],
        corejs: true
      },
      {
        name: "Math.trunc",
        modules: [
          "es.math.trunc"
        ],
        corejs: true
      },
      {
        name: "Object.assign",
        modules: [
          "es.object.assign"
        ],
        corejs: true
      },
      {
        name: "Object.create",
        modules: [
          "es.object.create"
        ],
        corejs: true
      },
      {
        name: "Object.entries",
        modules: [
          "es.object.entries"
        ],
        corejs: true
      },
      {
        name: "Object.freeze",
        modules: [
          "es.object.freeze"
        ],
        corejs: true
      },
      {
        name: "Object.fromEntries",
        modules: [
          "es.object.from-entries"
        ],
        corejs: true
      },
      {
        name: "Object.getOwnPropertyDescriptor",
        modules: [
          "es.object.get-own-property-descriptor"
        ],
        corejs: true
      },
      {
        name: "Object.getOwnPropertyDescriptors",
        modules: [
          "es.object.get-own-property-descriptors"
        ],
        corejs: true
      },
      {
        name: "Object.getPrototypeOf",
        modules: [
          "es.object.get-prototype-of"
        ],
        corejs: true
      },
      {
        name: "Object.hasOwn",
        modules: [
          "es.object.has-own",
          "esnext.object.has-own"
        ],
        corejs: true
      },
      {
        name: "Object.is",
        modules: [
          "es.object.is"
        ],
        corejs: true
      },
      {
        name: "Object.isExtensible",
        modules: [
          "es.object.is-extensible"
        ],
        corejs: true
      },
      {
        name: "Object.isFrozen",
        modules: [
          "es.object.is-frozen"
        ],
        corejs: true
      },
      {
        name: "Object.isSealed",
        modules: [
          "es.object.is-sealed"
        ],
        corejs: true
      },
      {
        name: "Object.keys",
        modules: [
          "es.object.keys"
        ],
        corejs: true
      },
      {
        name: "Object.preventExtensions",
        modules: [
          "es.object.prevent-extensions"
        ],
        corejs: true
      },
      {
        name: "Object.seal",
        modules: [
          "es.object.seal"
        ],
        corejs: true
      },
      {
        name: "Object.setPrototypeOf",
        modules: [
          "es.object.set-prototype-of"
        ],
        corejs: true
      },
      {
        name: "Object.values",
        modules: [
          "es.object.values"
        ],
        corejs: true
      },
      {
        name: "Promise.any",
        modules: [
          "es.promise.any",
          "esnext.promise.any"
        ],
        corejs: true
      },
      {
        name: "Reflect.apply",
        modules: [
          "es.reflect.apply"
        ],
        corejs: true
      },
      {
        name: "Reflect.construct",
        modules: [
          "es.reflect.construct"
        ],
        corejs: true
      },
      {
        name: "Reflect.deleteProperty",
        modules: [
          "es.reflect.delete-property"
        ],
        corejs: true
      },
      {
        name: "Reflect.get",
        modules: [
          "es.reflect.get"
        ],
        corejs: true
      },
      {
        name: "Reflect.getOwnPropertyDescriptor",
        modules: [
          "es.reflect.get-own-property-descriptor"
        ],
        corejs: true
      },
      {
        name: "Reflect.getPrototypeOf",
        modules: [
          "es.reflect.get-prototype-of"
        ],
        corejs: true
      },
      {
        name: "Reflect.has",
        modules: [
          "es.reflect.has"
        ],
        corejs: true
      },
      {
        name: "Reflect.isExtensible",
        modules: [
          "es.reflect.is-extensible"
        ],
        corejs: true
      },
      {
        name: "Reflect.ownKeys",
        modules: [
          "es.reflect.own-keys"
        ],
        corejs: true
      },
      {
        name: "Reflect.preventExtensions",
        modules: [
          "es.reflect.prevent-extensions"
        ],
        corejs: true
      },
      {
        name: "Reflect.setPrototypeOf",
        modules: [
          "es.reflect.set-prototype-of"
        ],
        corejs: true
      },
      {
        name: "String.prototype.codePointAt",
        modules: [
          "es.string.code-point-at"
        ],
        corejs: true
      },
      {
        name: "String.prototype.endsWith",
        modules: [
          "es.string.ends-with"
        ],
        corejs: true
      },
      {
        name: "String.fromCodePoint",
        modules: [
          "es.string.from-code-point"
        ],
        corejs: true
      },
      {
        name: "String.prototype.includes",
        modules: [
          "es.string.includes"
        ],
        corejs: true
      },
      {
        name: "String.prototype.matchAll",
        modules: [
          "es.string.match-all",
          "esnext.string.match-all"
        ],
        corejs: true
      },
      {
        name: "String.raw",
        modules: [
          "es.string.raw"
        ],
        corejs: true
      },
      {
        name: "String.prototype.repeat",
        modules: [
          "es.string.repeat"
        ],
        corejs: true
      },
      {
        name: "String.prototype.replaceAll",
        modules: [
          "es.string.replace-all",
          "esnext.string.replace-all"
        ],
        corejs: true
      },
      {
        name: "String.prototype.startsWith",
        modules: [
          "es.string.starts-with"
        ],
        corejs: true
      },
      {
        name: "String.prototype.substr",
        modules: [
          "es.string.substr"
        ],
        corejs: true
      },
      {
        name: "String.prototype.trim",
        modules: [
          "es.string.trim"
        ],
        corejs: true
      },
      {
        name: "String.prototype.trimEnd",
        modules: [
          "es.string.trim-end"
        ],
        corejs: true
      },
      {
        name: "String.prototype.trimStart",
        modules: [
          "es.string.trim-start"
        ],
        corejs: true
      },
      {
        name: "String.prototype.link",
        modules: [
          "es.string.link"
        ],
        corejs: true
      },
      {
        name: "Promise.allSettled",
        modules: [
          "esnext.promise.all-settled"
        ],
        corejs: true
      }
    ];
    polyfill_graph_data_default = {
      moduleSizes: [26070, 498, 282, 294, 281, 467, 161, 236, 229, 765, 546, 339, 1608, 723, 729, 1545, 438, 214, 657, 111, 759, 537, 209, 281, 685, 217, 757, 631, 293, 182, 475, 79, 407, 140, 366, 792, 269, 222, 158, 280, 188, 137, 158, 105, 189, 543, 160, 742, 1436, 88, 904, 146, 314, 375, 183, 1083, 195, 503, 269, 208, 334, 350, 460, 568, 229, 1155, 334, 266, 30, 120, 309, 370, 358, 1952, 1638, 304, 153, 274, 1288, 192, 543, 74, 144, 137, 33, 336, 457, 2122, 535, 711, 1323, 117, 1961, 244, 557, 318, 119, 124, 108, 144, 96, 133, 441, 210, 1627, 1956, 693, 1426, 863, 637, 301, 51, 708, 583, 119, 600, 221, 370, 728, 1085, 552, 629, 125, 1746, 97, 441, 543, 2756, 371, 447, 548, 243, 266, 217, 99, 440, 183, 546, 137, 464, 207, 983, 503, 237, 382, 249, 675, 402, 254, 223, 164, 214, 191, 831, 218, 202, 232, 124, 249, 160, 251, 217, 717, 78, 561, 1627, 256, 386, 225, 432, 499, 394, 364, 445, 634, 667, 177, 346, 470, 663, 142, 588, 414, 617, 1559, 380, 2520, 1040, 417, 289, 238, 220, 214, 303,
      163, 141, 510, 397, 137, 137, 133, 133, 390, 266, 137, 183, 215, 191, 485, 328, 575, 799, 533, 148, 215, 589, 589, 130, 362, 562, 471, 179, 186, 1266, 1456, 521, 1536, 427, 444, 406, 912, 150, 283, 144, 485, 470, 205, 1268, 796, 658, 306, 3751, 814, 146, 2328, 1226, 922, 237, 206, 198, 250, 283, 60, 3e3],
      dependencies: {
        "Array.prototype.at": [0, 5, 69, 105, 106, 116, 164],
        "Array.prototype.concat": [0, 16, 21, 22, 26, 34, 40, 76, 78, 155, 165],
        "Array.prototype.copyWithin": [0, 5, 9, 37, 69, 105, 106, 116, 166],
        "Array.prototype.every": [0, 15, 17, 21, 22, 26, 53, 59, 76, 78, 155, 167],
        "Array.prototype.fill": [0, 5, 10, 69, 105, 106, 116, 168],
        "Array.prototype.filter": [0, 15, 16, 21, 22, 26, 53, 59, 76, 78, 155, 169],
        "Array.prototype.find": [0, 5, 15, 21, 22, 26, 53, 59, 69, 76, 78, 105, 106, 116, 155, 173],
        "Array.prototype.findIndex": [0, 5, 15, 21, 22, 26, 53, 59, 69, 76, 78, 105, 106, 116, 155, 170],
        "Array.prototype.findLast": [0, 5, 14, 53, 59, 69, 105, 106, 116, 172],
        "Array.prototype.findLastIndex": [0, 5, 14, 53, 59, 69, 105, 106, 116, 171],
        "Array.prototype.flat": [0, 21, 22, 26, 40, 50, 53, 59, 76, 78, 155, 175],
        "Array.prototype.flatMap": [0, 21, 22, 26, 40, 50, 53, 59, 76, 78, 155, 174],
        "Array.prototype.forEach": [0, 11, 15, 17, 21, 22, 26, 53, 59, 76, 78, 155, 176],
        "Array.from": [0, 12, 23, 24, 26, 34, 53, 59, 62, 63, 75, 78, 88, 155, 177],
        "Array.prototype.includes": [0, 5, 69, 105, 106, 116, 178],
        "Array.prototype.indexOf": [0, 17, 59, 179],
        "Array.isArray": [0, 76, 180],
        "Array.prototype.join": [0, 17, 181],
        "Array.prototype.map": [0, 15, 16, 21, 22, 26, 53, 59, 76, 78, 155, 182],
        "Array.of": [0, 26, 34, 78, 155, 183],
        "Array.prototype.slice": [0, 16, 19, 26, 34, 76, 78, 155, 184],
        "Array.prototype.some": [0, 15, 17, 21, 22, 26, 53, 59, 76, 78, 155, 185],
        "Array.prototype.sort": [0, 17, 19, 20, 26, 37, 42, 43, 46, 155, 156, 186],
        "Array.prototype.unshift": [0, 18, 37, 40, 76, 187],
        "Math.acosh": [0, 97, 188],
        "Math.asinh": [0, 189],
        "Math.atanh": [0, 190],
        "Math.cbrt": [0, 100, 191],
        "Math.clz32": [0, 192],
        "Math.cosh": [0, 93, 193],
        "Math.expm1": [0, 93, 194],
        "Math.fround": [0, 94, 95, 99, 100, 195],
        "Math.hypot": [0, 196],
        "Math.imul": [0, 197],
        "Math.log10": [0, 96, 198],
        "Math.log1p": [0, 97, 199],
        "Math.log2": [0, 98, 200],
        "Math.sign": [0, 100, 201],
        "Math.sinh": [0, 93, 202],
        "Math.tanh": [0, 93, 203],
        "Math.trunc": [0, 204],
        "Object.assign": [0, 104, 116, 205],
        "Object.create": [0, 69, 105, 106, 116, 206],
        "Object.entries": [0, 29, 112, 116, 119, 207],
        "Object.freeze": [0, 8, 19, 51, 73, 109, 113, 208],
        "Object.fromEntries": [0, 26, 34, 53, 59, 62, 63, 75, 87, 88, 155, 209],
        "Object.getOwnPropertyDescriptor": [0, 210],
        "Object.getOwnPropertyDescriptors": [0, 34, 211],
        "Object.getPrototypeOf": [0, 29, 112, 212],
        "Object.hasOwn": [0, 213],
        "Object.is": [0, 134, 217],
        "Object.isExtensible": [0, 8, 113, 214],
        "Object.isFrozen": [0, 8, 215],
        "Object.isSealed": [0, 8, 216],
        "Object.keys": [0, 116, 218],
        "Object.preventExtensions": [0, 8, 19, 51, 73, 109, 113, 219],
        "Object.seal": [0, 8, 19, 51, 73, 109, 113, 220],
        "Object.setPrototypeOf": [0, 4, 58, 83, 118, 221],
        "Object.values": [0, 29, 112, 116, 119, 222],
        "Promise.any": [0, 24, 26, 47, 53, 59, 62, 63, 75, 87, 88, 102, 122, 123, 124, 125, 155, 224],
        "Reflect.apply": [0, 52, 225],
        "Reflect.construct": [0, 3, 19, 26, 52, 55, 69, 78, 105, 106, 116, 155, 226],
        "Reflect.deleteProperty": [0, 227],
        "Reflect.get": [0, 29, 79, 112, 230],
        "Reflect.getOwnPropertyDescriptor": [0, 228],
        "Reflect.getPrototypeOf": [0, 29, 112, 229],
        "Reflect.has": [0, 231],
        "Reflect.isExtensible": [0, 8, 113, 232],
        "Reflect.ownKeys": [0, 233],
        "Reflect.preventExtensions": [0, 51, 234],
        "Reflect.setPrototypeOf": [0, 4, 58, 83, 118, 235],
        "String.prototype.codePointAt": [0, 26, 141, 155, 156, 236],
        "String.prototype.endsWith": [0, 26, 28, 59, 85, 103, 155, 156, 237],
        "String.fromCodePoint": [0, 238],
        "String.prototype.includes": [0, 26, 28, 85, 103, 155, 156, 239],
        "String.prototype.matchAll": [0, 3, 6, 26, 29, 31, 59, 69, 78, 85, 89, 90, 105, 106, 112, 116, 126, 127, 128, 129, 130, 131, 132, 135, 139, 141, 155, 156, 241],
        "String.raw": [0, 26, 155, 156, 242],
        "String.prototype.repeat": [0, 26, 142, 155, 156, 243],
        "String.prototype.replaceAll": [0, 26, 65, 85, 128, 129, 155, 156, 244],
        "String.prototype.startsWith": [0, 26, 28, 59, 85, 103, 155, 156, 245],
        "String.prototype.substr": [0, 26, 155, 156, 246],
        "String.prototype.trim": [0, 26, 144, 146, 155, 156, 163, 251],
        "String.prototype.trimEnd": [0, 26, 143, 144, 146, 155, 156, 163, 247, 249],
        "String.prototype.trimStart": [0, 26, 144, 145, 146, 155, 156, 163, 248, 250],
        "String.prototype.link": [0, 26, 30, 140, 155, 156, 240],
        "Promise.allSettled": [0, 24, 26, 47, 53, 59, 62, 63, 75, 87, 88, 102, 122, 123, 124, 125, 155, 223, 252],
        "focus-visible": [253]
      },
      maxSize: 155835
    };
    polyfillModuleData = polyfill_module_data_default;
    graph = polyfill_graph_data_default;
    CodePatternMatcher = class {
      static {
        __name(this, "CodePatternMatcher");
      }
      /**
       * @param {Pattern[]} patterns
       */
      constructor(patterns) {
        this.patterns = patterns;
      }
      /**
       * @param {string} code
       * @return {PatternMatchResult[]}
       */
      match(code) {
        if (!this.re) {
          const patternsExpression = this.patterns.map((pattern) => `(${pattern.expression})`).join("|");
          this.re = new RegExp(`(^\r
|\r|
)|${patternsExpression}`, "g");
        }
        this.re.lastIndex = 0;
        const seen = /* @__PURE__ */ new Set();
        const matches = [];
        let result;
        let line = 0;
        let lineBeginsAtIndex = 0;
        while ((result = this.re.exec(code)) !== null) {
          const captureGroups = result.slice(1);
          const [isNewline, ...patternExpressionMatches] = captureGroups;
          if (isNewline) {
            line++;
            lineBeginsAtIndex = result.index + 1;
            continue;
          }
          const pattern = this.patterns[patternExpressionMatches.findIndex(Boolean)];
          if (seen.has(pattern)) {
            continue;
          }
          seen.add(pattern);
          matches.push({
            name: pattern.name,
            line,
            column: result.index - lineBeginsAtIndex
          });
        }
        return matches;
      }
    };
    __name(buildPolyfillExpression, "buildPolyfillExpression");
    __name(getCoreJsPolyfillData, "getCoreJsPolyfillData");
    __name(getPolyfillPatterns, "getPolyfillPatterns");
    __name(getTransformPatterns, "getTransformPatterns");
    __name(estimateWastedBytes, "estimateWastedBytes");
    matcher = new CodePatternMatcher([
      ...getPolyfillPatterns(),
      ...getTransformPatterns()
    ]);
    __name(detectLegacyJavaScript, "detectLegacyJavaScript");
    /**
     * @license
     * Copyright 2025 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
  }
});

// node_modules/@paulirish/trace_engine/third_party/legacy-javascript/legacy-javascript.js
var init_legacy_javascript2 = __esm({
  "node_modules/@paulirish/trace_engine/third_party/legacy-javascript/legacy-javascript.js"() {
    init_process_global();
    init_legacy_javascript();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js
var LegacyJavaScript_exports = {};
__export(LegacyJavaScript_exports, {
  UIStrings: () => UIStrings14,
  createOverlays: () => createOverlays13,
  generateInsight: () => generateInsight13,
  i18nString: () => i18nString13,
  isLegacyJavaScript: () => isLegacyJavaScript
});
function finalize43(partialModel) {
  const requests = [...partialModel.legacyJavaScriptResults.keys()].map((script) => script.request).filter((e) => !!e);
  return {
    insightKey: InsightKeys.LEGACY_JAVASCRIPT,
    strings: UIStrings14,
    title: i18nString13(UIStrings14.title),
    description: i18nString13(UIStrings14.description),
    docs: "https://developer.chrome.com/docs/performance/insights/legacy-javascript",
    category: InsightCategory.ALL,
    state: requests.length ? "fail" : "pass",
    relatedEvents: [...new Set(requests)],
    ...partialModel
  };
}
function isLegacyJavaScript(model2) {
  return model2.insightKey === InsightKeys.LEGACY_JAVASCRIPT;
}
function generateInsight13(data31, context) {
  const scripts = data31.Scripts.scripts.filter((script) => {
    if (script.frame !== context.frameId) {
      return false;
    }
    if (script.url?.startsWith("chrome-extension://")) {
      return false;
    }
    return Timing_exports3.timestampIsInBounds(context.bounds, script.ts) || script.request && Timing_exports3.eventIsInBounds(script.request, context.bounds);
  });
  const legacyJavaScriptResults = /* @__PURE__ */ new Map();
  const wastedBytesByRequestId = /* @__PURE__ */ new Map();
  for (const script of scripts) {
    if (!script.content || script.content.length < BYTE_THRESHOLD) {
      continue;
    }
    const result = detectLegacyJavaScript2(script.content, script.sourceMap);
    if (result.estimatedByteSavings < BYTE_THRESHOLD) {
      continue;
    }
    const compressionRatio = estimateCompressionRatioForScript(script);
    const transferSize = Math.round(result.estimatedByteSavings * compressionRatio);
    result.estimatedByteSavings = transferSize;
    legacyJavaScriptResults.set(script, result);
    if (script.request) {
      const requestId = script.request.args.data.requestId;
      wastedBytesByRequestId.set(requestId, transferSize);
    }
  }
  const sorted2 = new Map([...legacyJavaScriptResults].sort((a, b) => b[1].estimatedByteSavings - a[1].estimatedByteSavings));
  return finalize43({
    legacyJavaScriptResults: sorted2,
    metricSavings: metricSavingsForWastedBytes(wastedBytesByRequestId, context),
    wastedBytes: wastedBytesByRequestId.values().reduce((acc, cur) => acc + cur, 0)
  });
}
function createOverlays13(model2) {
  return [...model2.legacyJavaScriptResults.keys()].map((script) => script.request).filter((e) => !!e).map((request) => {
    return {
      type: "ENTRY_OUTLINE",
      entry: request,
      outlineReason: "ERROR"
    };
  });
}
var detectLegacyJavaScript2, UIStrings14, i18nString13, BYTE_THRESHOLD;
var init_LegacyJavaScript = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js"() {
    init_process_global();
    init_legacy_javascript2();
    init_helpers2();
    init_Common();
    init_types4();
    ({ detectLegacyJavaScript: detectLegacyJavaScript2 } = legacy_javascript_exports);
    UIStrings14 = {
      /**
       * @description Title of an insight that identifies polyfills for modern JavaScript features, and recommends their removal.
       */
      title: "Legacy JavaScript",
      /**
       * @description Description of an insight that identifies polyfills for modern JavaScript features, and recommends their removal.
       */
      description: "Polyfills and transforms enable older browsers to use new JavaScript features. However, many aren't necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/articles/baseline-and-polyfills) features, unless you know you must support older browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://developer.chrome.com/docs/performance/insights/legacy-javascript)",
      /** Label for a column in a data table; entries will be the individual JavaScript scripts. */
      columnScript: "Script",
      /** Label for a column in a data table; entries will be the number of wasted bytes (aka the estimated savings in terms of bytes). */
      columnWastedBytes: "Wasted bytes"
    };
    i18nString13 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    BYTE_THRESHOLD = 5e3;
    __name(finalize43, "finalize");
    __name(isLegacyJavaScript, "isLegacyJavaScript");
    __name(generateInsight13, "generateInsight");
    __name(createOverlays13, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js
var ModernHTTP_exports = {};
__export(ModernHTTP_exports, {
  UIStrings: () => UIStrings15,
  createOverlayForRequest: () => createOverlayForRequest3,
  createOverlays: () => createOverlays14,
  determineHttp1Requests: () => determineHttp1Requests,
  generateInsight: () => generateInsight14,
  i18nString: () => i18nString14,
  isModernHTTPInsight: () => isModernHTTPInsight
});
function isModernHTTPInsight(model2) {
  return model2.insightKey === InsightKeys.MODERN_HTTP;
}
function isMultiplexableStaticAsset(request, entityMappings3, firstPartyEntity) {
  if (!Network_exports.STATIC_RESOURCE_TYPES.has(request.args.data.resourceType)) {
    return false;
  }
  if (request.args.data.decodedBodyLength < 100) {
    const entity = entityMappings3.entityByEvent.get(request);
    if (entity) {
      if (firstPartyEntity?.name === entity.name) {
        return true;
      }
      if (!entity.isUnrecognized) {
        return false;
      }
    }
  }
  return true;
}
function determineHttp1Requests(requests, entityMappings3, firstPartyEntity) {
  const http1Requests = [];
  const groupedByOrigin = /* @__PURE__ */ new Map();
  for (const record of requests) {
    const url = new URL(record.args.data.url);
    if (!isMultiplexableStaticAsset(record, entityMappings3, firstPartyEntity)) {
      continue;
    }
    if (Network_exports.isSyntheticNetworkRequestLocalhost(record)) {
      continue;
    }
    const originRequests = MapUtilities_exports.getWithDefault(groupedByOrigin, url.origin, () => []);
    originRequests.push(record);
  }
  const seenURLs = /* @__PURE__ */ new Set();
  for (const request of requests) {
    if (seenURLs.has(request.args.data.url)) {
      continue;
    }
    if (request.args.data.fromServiceWorker) {
      continue;
    }
    const isOldHttp = /HTTP\/[01][.\d]?/i.test(request.args.data.protocol);
    if (!isOldHttp) {
      continue;
    }
    const url = new URL(request.args.data.url);
    const group = groupedByOrigin.get(url.origin) || [];
    if (group.length < 6) {
      continue;
    }
    seenURLs.add(request.args.data.url);
    http1Requests.push(request);
  }
  return http1Requests;
}
function computeWasteWithGraph(urlsToChange, graph2, simulator) {
  const simulationBefore = simulator.simulate(graph2);
  const originalProtocols = /* @__PURE__ */ new Map();
  graph2.traverse((node) => {
    if (node.type !== "network") {
      return;
    }
    if (!urlsToChange.has(node.request.url)) {
      return;
    }
    originalProtocols.set(node.request.requestId, node.request.protocol);
    node.request.protocol = "h2";
  });
  const simulationAfter = simulator.simulate(graph2);
  graph2.traverse((node) => {
    if (node.type !== "network") {
      return;
    }
    const originalProtocol = originalProtocols.get(node.request.requestId);
    if (originalProtocol === void 0) {
      return;
    }
    node.request.protocol = originalProtocol;
  });
  const savings = simulationBefore.timeInMs - simulationAfter.timeInMs;
  return NumberUtilities_exports.floor(savings, 1 / 10);
}
function computeMetricSavings(http1Requests, context) {
  if (!context.navigation || !context.lantern) {
    return;
  }
  const urlsToChange = new Set(http1Requests.map((r) => r.args.data.url));
  const fcpGraph = context.lantern.metrics.firstContentfulPaint.optimisticGraph;
  const lcpGraph = context.lantern.metrics.largestContentfulPaint.optimisticGraph;
  return {
    FCP: computeWasteWithGraph(urlsToChange, fcpGraph, context.lantern.simulator),
    LCP: computeWasteWithGraph(urlsToChange, lcpGraph, context.lantern.simulator)
  };
}
function finalize44(partialModel) {
  return {
    insightKey: InsightKeys.MODERN_HTTP,
    strings: UIStrings15,
    title: i18nString14(UIStrings15.title),
    description: i18nString14(UIStrings15.description),
    docs: "https://developer.chrome.com/docs/performance/insights/modern-http",
    category: InsightCategory.LCP,
    state: partialModel.http1Requests.length > 0 ? "fail" : "pass",
    ...partialModel,
    relatedEvents: partialModel.http1Requests
  };
}
function generateInsight14(data31, context) {
  const isWithinContext = /* @__PURE__ */ __name((event) => Timing_exports3.eventIsInBounds(event, context.bounds), "isWithinContext");
  const contextRequests = data31.NetworkRequests.byTime.filter(isWithinContext);
  const entityMappings3 = data31.NetworkRequests.entityMappings;
  const firstPartyUrl = context.navigation?.args.data?.documentLoaderURL ?? data31.Meta.mainFrameURL;
  const firstPartyEntity = helpers_exports.getEntityForUrl(firstPartyUrl, entityMappings3);
  const http1Requests = determineHttp1Requests(contextRequests, entityMappings3, firstPartyEntity ?? null);
  return finalize44({
    http1Requests,
    metricSavings: computeMetricSavings(http1Requests, context)
  });
}
function createOverlayForRequest3(request) {
  return {
    type: "ENTRY_OUTLINE",
    entry: request,
    outlineReason: "ERROR"
  };
}
function createOverlays14(model2) {
  return model2.http1Requests.map((req) => createOverlayForRequest3(req)) ?? [];
}
var UIStrings15, i18nString14;
var init_ModernHTTP = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js"() {
    init_process_global();
    init_platform();
    init_handlers();
    init_helpers2();
    init_types4();
    UIStrings15 = {
      /**
       * @description Title of an insight that recommends using HTTP/2 over HTTP/1.1 because of the performance benefits. "HTTP" should not be translated.
       */
      title: "Modern HTTP",
      /**
       * @description Description of an insight that recommends recommends using HTTP/2 over HTTP/1.1 because of the performance benefits. "HTTP" should not be translated.
       */
      description: "HTTP/2 and HTTP/3 offer many benefits over HTTP/1.1, such as multiplexing. [Learn more about using modern HTTP](https://developer.chrome.com/docs/performance/insights/modern-http).",
      /**
       * @description Column header for a table where each cell represents a network request.
       */
      request: "Request",
      /**
       * @description Column header for a table where each cell represents the protocol of a network request.
       */
      protocol: "Protocol",
      /**
       * @description Text explaining that there were not requests that were slowed down by using HTTP/1.1. "HTTP/1.1" should not be translated.
       */
      noOldProtocolRequests: "No requests used HTTP/1.1, or its current use of HTTP/1.1 does not present a significant optimization opportunity. HTTP/1.1 requests are only flagged if six or more static assets originate from the same origin, and they are not served from a local development environment or a third-party source."
    };
    i18nString14 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(isModernHTTPInsight, "isModernHTTPInsight");
    __name(isMultiplexableStaticAsset, "isMultiplexableStaticAsset");
    __name(determineHttp1Requests, "determineHttp1Requests");
    __name(computeWasteWithGraph, "computeWasteWithGraph");
    __name(computeMetricSavings, "computeMetricSavings");
    __name(finalize44, "finalize");
    __name(generateInsight14, "generateInsight");
    __name(createOverlayForRequest3, "createOverlayForRequest");
    __name(createOverlays14, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js
var NetworkDependencyTree_exports = {};
__export(NetworkDependencyTree_exports, {
  ParsedURL: () => ParsedURL,
  TOO_MANY_PRECONNECTS_THRESHOLD: () => TOO_MANY_PRECONNECTS_THRESHOLD,
  UIStrings: () => UIStrings16,
  createOverlays: () => createOverlays15,
  generateInsight: () => generateInsight15,
  generatePreconnectCandidates: () => generatePreconnectCandidates,
  generatePreconnectedOrigins: () => generatePreconnectedOrigins,
  handleLinkResponseHeader: () => handleLinkResponseHeader,
  i18nString: () => i18nString15,
  isNetworkDependencyTreeInsight: () => isNetworkDependencyTreeInsight,
  normalizePath: () => normalizePath,
  schemeIs: () => schemeIs
});
function finalize45(partialModel) {
  return {
    insightKey: InsightKeys.NETWORK_DEPENDENCY_TREE,
    strings: UIStrings16,
    title: i18nString15(UIStrings16.title),
    description: i18nString15(UIStrings16.description),
    docs: "https://developer.chrome.com/docs/performance/insights/network-dependency-tree",
    category: InsightCategory.LCP,
    state: partialModel.fail ? "fail" : "pass",
    ...partialModel
  };
}
function isCritical(request, context) {
  if (request.args.data.requestId === context.navigationId) {
    return true;
  }
  if (request.args.data.isLinkPreload) {
    return false;
  }
  const isIframe = request.args.data.resourceType === "Document" && request.args.data.frame !== context.frameId;
  if (nonCriticalResourceTypes.has(request.args.data.resourceType) || isIframe || // Treat any missed images, primarily favicons, as non-critical resources
  request.args.data.mimeType.startsWith("image/")) {
    return false;
  }
  const initiatorUrl = request.args.data.initiator?.url || Trace_exports.getStackTraceTopCallFrameInEventPayload(request)?.url;
  if (!initiatorUrl) {
    return false;
  }
  const isBlocking = Network_exports.isSyntheticNetworkRequestEventRenderBlocking(request);
  const isHighPriority = Network_exports.isSyntheticNetworkRequestHighPriority(request);
  return isHighPriority || isBlocking;
}
function findMaxLeafNode(node) {
  if (node.children.length === 0) {
    return node;
  }
  let maxLeaf = node.children[0];
  for (const child of node.children) {
    const leaf = findMaxLeafNode(child);
    if (leaf.timeFromInitialRequest > maxLeaf.timeFromInitialRequest) {
      maxLeaf = leaf;
    }
  }
  return maxLeaf;
}
function sortRecursively(nodes) {
  for (const node of nodes) {
    if (node.children.length > 0) {
      node.children.sort((nodeA, nodeB) => {
        const leafA = findMaxLeafNode(nodeA);
        const leafB = findMaxLeafNode(nodeB);
        return leafB.timeFromInitialRequest - leafA.timeFromInitialRequest;
      });
      sortRecursively(node.children);
    }
  }
}
function generateNetworkDependencyTree(context) {
  const rootNodes = [];
  const relatedEvents = /* @__PURE__ */ new Map();
  let maxTime = Timing_exports.Micro(0);
  let fail = false;
  let longestChain = [];
  function addChain(path7) {
    if (path7.length === 0) {
      return;
    }
    if (path7.length >= 2) {
      fail = true;
    }
    const initialRequest = path7[0];
    const lastRequest = path7[path7.length - 1];
    const totalChainTime = Timing_exports.Micro(lastRequest.ts + lastRequest.dur - initialRequest.ts);
    if (totalChainTime > maxTime) {
      maxTime = totalChainTime;
      longestChain = path7;
    }
    let currentNodes = rootNodes;
    for (let depth = 0; depth < path7.length; ++depth) {
      const request = path7[depth];
      let found = currentNodes.find((node) => node.request === request);
      if (!found) {
        const timeFromInitialRequest = Timing_exports.Micro(request.ts + request.dur - initialRequest.ts);
        found = {
          request,
          timeFromInitialRequest,
          children: [],
          relatedRequests: /* @__PURE__ */ new Set()
        };
        currentNodes.push(found);
      }
      path7.forEach((request2) => found?.relatedRequests.add(request2));
      relatedEvents.set(request, depth < 2 ? [] : [i18nString15(UIStrings16.warningDescription)]);
      currentNodes = found.children;
    }
  }
  __name(addChain, "addChain");
  const seenNodes = /* @__PURE__ */ new Set();
  function getNextNodes(node) {
    return node.getDependents().filter((n) => n.getDependencies().every((d) => seenNodes.has(d)));
  }
  __name(getNextNodes, "getNextNodes");
  context.lantern?.graph.traverse((node, traversalPath) => {
    seenNodes.add(node);
    if (node.type !== "network") {
      return;
    }
    const networkNode = node;
    if (!isCritical(networkNode.rawRequest, context)) {
      return;
    }
    const networkPath = traversalPath.filter((node2) => node2.type === "network").reverse().map((node2) => node2.rawRequest);
    if (networkPath.some((request) => !isCritical(request, context))) {
      return;
    }
    if (node.isNonNetworkProtocol) {
      return;
    }
    addChain(networkPath);
  }, getNextNodes);
  if (longestChain.length > 0) {
    let currentNodes = rootNodes;
    for (const request of longestChain) {
      const found = currentNodes.find((node) => node.request === request);
      if (found) {
        found.isLongest = true;
        currentNodes = found.children;
      } else {
        console.error("Some request in the longest chain is not found");
      }
    }
  }
  sortRecursively(rootNodes);
  return {
    rootNodes,
    maxTime,
    fail,
    relatedEvents
  };
}
function getSecurityOrigin(url) {
  const parsedURL = new ParsedURL(url);
  return parsedURL.securityOrigin();
}
function handleLinkResponseHeaderPart(trimmedPart) {
  if (!trimmedPart) {
    return null;
  }
  const urlStart = trimmedPart.indexOf("<");
  const urlEnd = trimmedPart.indexOf(">");
  if (urlStart !== 0 || urlEnd === -1 || urlEnd <= urlStart) {
    return null;
  }
  const url = trimmedPart.substring(urlStart + 1, urlEnd).trim();
  if (!url) {
    return null;
  }
  const paramsString = trimmedPart.substring(urlEnd + 1).trim();
  if (paramsString) {
    const params = paramsString.split(";");
    for (const param of params) {
      const trimmedParam = param.trim();
      if (!trimmedParam) {
        continue;
      }
      const eqIndex = trimmedParam.indexOf("=");
      if (eqIndex === -1) {
        continue;
      }
      const paramName = trimmedParam.substring(0, eqIndex).trim().toLowerCase();
      let paramValue = trimmedParam.substring(eqIndex + 1).trim();
      if (paramValue.startsWith('"') && paramValue.endsWith('"')) {
        paramValue = paramValue.substring(1, paramValue.length - 1);
      }
      if (paramName === "rel" && paramValue === "preconnect") {
        return { url, headerText: trimmedPart };
      }
    }
  }
  return null;
}
function handleLinkResponseHeader(linkHeaderValue) {
  if (!linkHeaderValue) {
    return [];
  }
  const preconnectedOrigins = [];
  for (let i = 0; i < linkHeaderValue.length; ) {
    const firstUrlEnd = linkHeaderValue.indexOf(">", i);
    if (firstUrlEnd === -1) {
      break;
    }
    const commaIndex = linkHeaderValue.indexOf(",", firstUrlEnd);
    const partEnd = commaIndex !== -1 ? commaIndex : linkHeaderValue.length;
    const part = linkHeaderValue.substring(i, partEnd);
    if (partEnd + 1 <= i) {
      console.warn("unexpected infinite loop, bailing");
      break;
    }
    i = partEnd + 1;
    const preconnectedOrigin = handleLinkResponseHeaderPart(part.trim());
    if (preconnectedOrigin) {
      preconnectedOrigins.push(preconnectedOrigin);
    }
  }
  return preconnectedOrigins;
}
function generatePreconnectedOrigins(data31, context, contextRequests, preconnectCandidates) {
  const preconnectedOrigins = [];
  for (const event of data31.NetworkRequests.linkPreconnectEvents) {
    preconnectedOrigins.push({
      node_id: event.args.data.node_id,
      frame: event.args.data.frame,
      url: event.args.data.url,
      // For each origin the page wanted to preconnect to:
      // - if we found no network requests to that origin at all then we issue a unused warning
      unused: !contextRequests.some((request) => getSecurityOrigin(event.args.data.url) === getSecurityOrigin(request.args.data.url)),
      // - else (we found network requests to the same origin) and if some of those network requests is too slow (if
      //   they are preconnect candidates), then we issue a unused warning with crossorigin hint
      crossorigin: preconnectCandidates.some((candidate) => candidate.origin === getSecurityOrigin(event.args.data.url)),
      source: "DOM"
    });
  }
  const documentRequest = data31.NetworkRequests.byId.get(context.navigationId);
  documentRequest?.args.data.responseHeaders?.forEach((header) => {
    if (header.name.toLowerCase() === "link") {
      const preconnectedOriginsFromResponseHeader = handleLinkResponseHeader(header.value);
      preconnectedOriginsFromResponseHeader?.forEach((origin) => preconnectedOrigins.push({
        url: origin.url,
        headerText: origin.headerText,
        request: documentRequest,
        // For each origin the page wanted to preconnect to:
        // - if we found no network requests to that origin at all then we issue a unused warning
        unused: !contextRequests.some((request) => getSecurityOrigin(origin.url) === getSecurityOrigin(request.args.data.url)),
        // - else (we found network requests to the same origin) and if some of those network requests is too slow (if
        //   they are preconnect candidates), then we issue a unused warning with crossorigin hint
        crossorigin: preconnectCandidates.some((candidate) => candidate.origin === getSecurityOrigin(origin.url)),
        source: "ResponseHeader"
      }));
    }
  });
  return preconnectedOrigins;
}
function hasValidTiming(request) {
  return !!request.args.data.timing && request.args.data.timing.connectEnd >= 0 && request.args.data.timing.connectStart >= 0;
}
function hasAlreadyConnectedToOrigin(request) {
  const { timing } = request.args.data;
  if (!timing) {
    return false;
  }
  if (timing.dnsStart === -1 && timing.dnsEnd === -1 && timing.connectStart === -1 && timing.connectEnd === -1) {
    return true;
  }
  if (timing.dnsEnd - timing.dnsStart === 0 && timing.connectEnd - timing.connectStart === 0) {
    return true;
  }
  return false;
}
function socketStartTimeIsBelowThreshold(request, mainResource) {
  const timeSinceMainEnd = Math.max(0, request.args.data.syntheticData.sendStartTime - mainResource.args.data.syntheticData.finishTime);
  return Timing_exports3.microToMilli(timeSinceMainEnd) < PRECONNECT_SOCKET_MAX_IDLE_IN_MS;
}
function candidateRequestsByOrigin(data31, mainResource, contextRequests, lcpGraphURLs) {
  const origins = /* @__PURE__ */ new Map();
  contextRequests.forEach((request) => {
    if (!hasValidTiming(request)) {
      return;
    }
    const initiator = Initiators_exports.getNetworkInitiator(data31, request);
    if (initiator === mainResource) {
      return;
    }
    const url = new URL(request.args.data.url);
    if (url.origin === "null") {
      return;
    }
    const mainOrigin = new URL(mainResource.args.data.url).origin;
    if (url.origin === mainOrigin) {
      return;
    }
    if (!lcpGraphURLs.has(request.args.data.url)) {
      return;
    }
    if (hasAlreadyConnectedToOrigin(request)) {
      return;
    }
    if (!socketStartTimeIsBelowThreshold(request, mainResource)) {
      return;
    }
    const originRequests = MapUtilities_exports.getWithDefault(origins, url.origin, () => []);
    originRequests.push(request);
  });
  return origins;
}
function generatePreconnectCandidates(data31, context, contextRequests) {
  if (!context.lantern) {
    return [];
  }
  const documentRequest = data31.NetworkRequests.byId.get(context.navigationId);
  if (!documentRequest) {
    return [];
  }
  const { rtt, additionalRttByOrigin } = context.lantern.simulator.getOptions();
  const lcpGraph = context.lantern.metrics.largestContentfulPaint.pessimisticGraph;
  const fcpGraph = context.lantern.metrics.firstContentfulPaint.pessimisticGraph;
  const lcpGraphURLs = /* @__PURE__ */ new Set();
  lcpGraph.traverse((node) => {
    if (node.type === "network") {
      lcpGraphURLs.add(node.request.url);
    }
  });
  const fcpGraphURLs = /* @__PURE__ */ new Set();
  fcpGraph.traverse((node) => {
    if (node.type === "network") {
      fcpGraphURLs.add(node.request.url);
    }
  });
  const groupedOrigins = candidateRequestsByOrigin(data31, documentRequest, contextRequests, lcpGraphURLs);
  let maxWastedLcp = Timing_exports.Milli(0);
  let maxWastedFcp = Timing_exports.Milli(0);
  let preconnectCandidates = [];
  groupedOrigins.forEach((requests) => {
    const firstRequestOfOrigin = requests[0];
    if (!firstRequestOfOrigin.args.data.timing) {
      return;
    }
    const firstRequestOfOriginParsedURL = new ParsedURL(firstRequestOfOrigin.args.data.url);
    const origin = firstRequestOfOriginParsedURL.securityOrigin();
    const additionalRtt = additionalRttByOrigin.get(origin) ?? 0;
    let connectionTime = Timing_exports.Milli(rtt + additionalRtt);
    if (firstRequestOfOriginParsedURL.scheme === "https") {
      connectionTime = Timing_exports.Milli(connectionTime * 2);
    }
    const timeBetweenMainResourceAndDnsStart = Timing_exports.Micro(firstRequestOfOrigin.args.data.syntheticData.sendStartTime - documentRequest.args.data.syntheticData.finishTime + Timing_exports3.milliToMicro(firstRequestOfOrigin.args.data.timing.dnsStart));
    const wastedMs = Math.min(connectionTime, Timing_exports3.microToMilli(timeBetweenMainResourceAndDnsStart));
    if (wastedMs < IGNORE_THRESHOLD_IN_MILLISECONDS) {
      return;
    }
    maxWastedLcp = Math.max(wastedMs, maxWastedLcp);
    if (fcpGraphURLs.has(firstRequestOfOrigin.args.data.url)) {
      maxWastedFcp = Math.max(wastedMs, maxWastedFcp);
    }
    preconnectCandidates.push({
      origin,
      wastedMs
    });
  });
  preconnectCandidates = preconnectCandidates.sort((a, b) => b.wastedMs - a.wastedMs);
  return preconnectCandidates.slice(0, TOO_MANY_PRECONNECTS_THRESHOLD);
}
function isNetworkDependencyTreeInsight(model2) {
  return model2.insightKey === InsightKeys.NETWORK_DEPENDENCY_TREE;
}
function generateInsight15(data31, context) {
  if (!context.navigation) {
    return finalize45({
      rootNodes: [],
      maxTime: 0,
      fail: false,
      preconnectedOrigins: [],
      preconnectCandidates: []
    });
  }
  const { rootNodes, maxTime, fail, relatedEvents } = generateNetworkDependencyTree(context);
  const isWithinContext = /* @__PURE__ */ __name((event) => Timing_exports3.eventIsInBounds(event, context.bounds), "isWithinContext");
  const contextRequests = data31.NetworkRequests.byTime.filter(isWithinContext);
  const preconnectCandidates = generatePreconnectCandidates(data31, context, contextRequests);
  const preconnectedOrigins = generatePreconnectedOrigins(data31, context, contextRequests, preconnectCandidates);
  return finalize45({
    rootNodes,
    maxTime,
    fail,
    relatedEvents,
    preconnectedOrigins,
    preconnectCandidates
  });
}
function createOverlays15(model2) {
  function walk(nodes, overlays2) {
    nodes.forEach((node) => {
      overlays2.push({
        type: "ENTRY_OUTLINE",
        entry: node.request,
        outlineReason: "ERROR"
      });
      walk(node.children, overlays2);
    });
  }
  __name(walk, "walk");
  const overlays = [];
  walk(model2.rootNodes, overlays);
  return overlays;
}
function normalizePath(path7) {
  if (path7.indexOf("..") === -1 && path7.indexOf(".") === -1) {
    return path7;
  }
  const segments = (path7[0] === "/" ? path7.substring(1) : path7).split("/");
  const normalizedSegments = [];
  for (const segment of segments) {
    if (segment === ".") {
      continue;
    } else if (segment === "..") {
      normalizedSegments.pop();
    } else {
      normalizedSegments.push(segment);
    }
  }
  let normalizedPath = normalizedSegments.join("/");
  if (path7[0] === "/" && normalizedPath) {
    normalizedPath = "/" + normalizedPath;
  }
  if (normalizedPath[normalizedPath.length - 1] !== "/" && (path7[path7.length - 1] === "/" || segments[segments.length - 1] === "." || segments[segments.length - 1] === "..")) {
    normalizedPath = normalizedPath + "/";
  }
  return normalizedPath;
}
function schemeIs(url, scheme) {
  try {
    return new URL(url).protocol === scheme;
  } catch {
    return false;
  }
}
var UIStrings16, i18nString15, nonCriticalResourceTypes, PRECONNECT_SOCKET_MAX_IDLE_IN_MS, IGNORE_THRESHOLD_IN_MILLISECONDS, TOO_MANY_PRECONNECTS_THRESHOLD, ParsedURL;
var init_NetworkDependencyTree = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js"() {
    init_process_global();
    init_platform();
    init_extras();
    init_helpers2();
    init_types2();
    init_types4();
    UIStrings16 = {
      /**
       * @description Title of an insight that recommends avoiding chaining critical requests.
       */
      title: "Network dependency tree",
      /**
       * @description Description of an insight that recommends avoiding chaining critical requests.
       */
      description: "[Avoid chaining critical requests](https://developer.chrome.com/docs/performance/insights/network-dependency-tree) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.",
      /**
       * @description Description of the warning that recommends avoiding chaining critical requests.
       */
      warningDescription: "Avoid chaining critical requests by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.",
      /**
       * @description Text status indicating that there isn't long chaining critical network requests.
       */
      noNetworkDependencyTree: "No rendering tasks impacted by network dependencies",
      /**
       * @description Text for the maximum critical path latency. This refers to the longest chain of network requests that
       * the browser must download before it can render the page.
       */
      maxCriticalPathLatency: "Max critical path latency:",
      /** Label for a column in a data table; entries will be the network request */
      columnRequest: "Request",
      /** Label for a column in a data table; entries will be the time from main document till current network request. */
      columnTime: "Time",
      /**
       * @description Title of the table of the detected preconnect origins.
       */
      preconnectOriginsTableTitle: "Preconnected origins",
      /**
       * @description Description of the table of the detected preconnect origins.
       */
      preconnectOriginsTableDescription: "[preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints help the browser establish a connection earlier in the page load, saving time when the first request for that origin is made. The following are the origins that the page preconnected to.",
      /**
       * @description Text status indicating that there isn't any preconnected origins.
       */
      noPreconnectOrigins: "no origins were preconnected",
      /**
       * @description A warning message that is shown when found more than 4 preconnected links. "preconnect" should not be translated.
       */
      tooManyPreconnectLinksWarning: "More than 4 `preconnect` connections were found. These should be used sparingly and only to the most important origins.",
      /**
       * @description A warning message that is shown when the user added preconnect for some unnecessary origins. "preconnect" should not be translated.
       */
      unusedWarning: "Unused preconnect. Only use `preconnect` for origins that the page is likely to request.",
      /**
       * @description A warning message that is shown when the user forget to set the `crossorigin` HTML attribute, or setting it to an incorrect value, on the link is a common mistake when adding preconnect links. "preconnect" should not be translated.
       * */
      crossoriginWarning: "Unused preconnect. Check that the `crossorigin` attribute is used properly.",
      /**
       * @description Label for a column in a data table; entries will be the source of the origin.
       */
      columnSource: "Source",
      /**
       * @description Text status indicating that there isn't preconnect candidates.
       */
      noPreconnectCandidates: "No additional origins are good candidates for preconnecting",
      /**
       * @description Title of the table that shows the origins that the page should have preconnected to.
       */
      estSavingTableTitle: "Preconnect candidates",
      /**
       * @description Description of the table that recommends preconnecting to the origins to save time. "preconnect" should not be translated.
       */
      estSavingTableDescription: "Add [preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints to your most important origins, but try to use no more than 4.",
      /**
       * @description Label for a column in a data table; entries will be the origin of a web resource
       */
      columnOrigin: "Origin",
      /**
       * @description Label for a column in a data table; entries will be the number of milliseconds the user could reduce page load by if they implemented the suggestions.
       */
      columnWastedMs: "Est LCP savings"
    };
    i18nString15 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    nonCriticalResourceTypes = /* @__PURE__ */ new Set([
      "Image",
      "XHR",
      "Fetch",
      "EventSource"
    ]);
    PRECONNECT_SOCKET_MAX_IDLE_IN_MS = Timing_exports.Milli(15e3);
    IGNORE_THRESHOLD_IN_MILLISECONDS = Timing_exports.Milli(50);
    TOO_MANY_PRECONNECTS_THRESHOLD = 4;
    __name(finalize45, "finalize");
    __name(isCritical, "isCritical");
    __name(findMaxLeafNode, "findMaxLeafNode");
    __name(sortRecursively, "sortRecursively");
    __name(generateNetworkDependencyTree, "generateNetworkDependencyTree");
    __name(getSecurityOrigin, "getSecurityOrigin");
    __name(handleLinkResponseHeaderPart, "handleLinkResponseHeaderPart");
    __name(handleLinkResponseHeader, "handleLinkResponseHeader");
    __name(generatePreconnectedOrigins, "generatePreconnectedOrigins");
    __name(hasValidTiming, "hasValidTiming");
    __name(hasAlreadyConnectedToOrigin, "hasAlreadyConnectedToOrigin");
    __name(socketStartTimeIsBelowThreshold, "socketStartTimeIsBelowThreshold");
    __name(candidateRequestsByOrigin, "candidateRequestsByOrigin");
    __name(generatePreconnectCandidates, "generatePreconnectCandidates");
    __name(isNetworkDependencyTreeInsight, "isNetworkDependencyTreeInsight");
    __name(generateInsight15, "generateInsight");
    __name(createOverlays15, "createOverlays");
    __name(normalizePath, "normalizePath");
    __name(schemeIs, "schemeIs");
    ParsedURL = class _ParsedURL {
      static {
        __name(this, "ParsedURL");
      }
      isValid;
      url;
      scheme;
      user;
      host;
      port;
      path;
      queryParams;
      fragment;
      folderPathComponents;
      lastPathComponent;
      blobInnerScheme;
      constructor(url) {
        this.isValid = false;
        this.url = url;
        this.scheme = "";
        this.user = "";
        this.host = "";
        this.port = "";
        this.path = "";
        this.queryParams = "";
        this.fragment = "";
        this.folderPathComponents = "";
        this.lastPathComponent = "";
        const isBlobUrl = this.url.startsWith("blob:");
        const urlToMatch = isBlobUrl ? url.substring(5) : url;
        const match = urlToMatch.match(_ParsedURL.urlRegex());
        if (match) {
          this.isValid = true;
          if (isBlobUrl) {
            this.blobInnerScheme = match[2].toLowerCase();
            this.scheme = "blob";
          } else {
            this.scheme = match[2].toLowerCase();
          }
          this.user = match[3] ?? "";
          this.host = match[4] ?? "";
          this.port = match[5] ?? "";
          this.path = match[6] ?? "/";
          this.queryParams = match[7] ?? "";
          this.fragment = match[8] ?? "";
        } else {
          if (this.url.startsWith("data:")) {
            this.scheme = "data";
            return;
          }
          if (this.url.startsWith("blob:")) {
            this.scheme = "blob";
            return;
          }
          if (this.url === "about:blank") {
            this.scheme = "about";
            return;
          }
          this.path = this.url;
        }
        const lastSlashExceptTrailingIndex = this.path.lastIndexOf("/", this.path.length - 2);
        if (lastSlashExceptTrailingIndex !== -1) {
          this.lastPathComponent = this.path.substring(lastSlashExceptTrailingIndex + 1);
        } else {
          this.lastPathComponent = this.path;
        }
        const lastSlashIndex = this.path.lastIndexOf("/");
        if (lastSlashIndex !== -1) {
          this.folderPathComponents = this.path.substring(0, lastSlashIndex);
        }
      }
      static fromString(string) {
        const parsedURL = new _ParsedURL(string.toString());
        if (parsedURL.isValid) {
          return parsedURL;
        }
        return null;
      }
      static preEncodeSpecialCharactersInPath(path7) {
        for (const specialChar of ["%", ";", "#", "?", " "]) {
          path7 = path7.replaceAll(specialChar, encodeURIComponent(specialChar));
        }
        return path7;
      }
      static rawPathToEncodedPathString(path7) {
        const partiallyEncoded = _ParsedURL.preEncodeSpecialCharactersInPath(path7);
        if (path7.startsWith("/")) {
          return new URL(partiallyEncoded, "file:///").pathname;
        }
        return new URL("/" + partiallyEncoded, "file:///").pathname.substr(1);
      }
      /**
       * @param name Must not be encoded
       */
      static encodedFromParentPathAndName(parentPath, name) {
        return _ParsedURL.concatenate(parentPath, "/", _ParsedURL.preEncodeSpecialCharactersInPath(name));
      }
      /**
       * @param name Must not be encoded
       */
      static urlFromParentUrlAndName(parentUrl, name) {
        return _ParsedURL.concatenate(parentUrl, "/", _ParsedURL.preEncodeSpecialCharactersInPath(name));
      }
      static encodedPathToRawPathString(encPath) {
        return decodeURIComponent(encPath);
      }
      static rawPathToUrlString(fileSystemPath) {
        let preEncodedPath = _ParsedURL.preEncodeSpecialCharactersInPath(fileSystemPath.replace(/\\/g, "/"));
        preEncodedPath = preEncodedPath.replace(/\\/g, "/");
        if (!preEncodedPath.startsWith("file://")) {
          if (preEncodedPath.startsWith("/")) {
            preEncodedPath = "file://" + preEncodedPath;
          } else {
            preEncodedPath = "file:///" + preEncodedPath;
          }
        }
        return new URL(preEncodedPath).toString();
      }
      static relativePathToUrlString(relativePath, baseURL) {
        const preEncodedPath = _ParsedURL.preEncodeSpecialCharactersInPath(relativePath.replace(/\\/g, "/"));
        return new URL(preEncodedPath, baseURL).toString();
      }
      static urlToRawPathString(fileURL, isWindows2) {
        console.assert(fileURL.startsWith("file://"), "This must be a file URL.");
        const decodedFileURL = decodeURIComponent(fileURL);
        if (isWindows2) {
          return decodedFileURL.substr("file:///".length).replace(/\//g, "\\");
        }
        return decodedFileURL.substr("file://".length);
      }
      static sliceUrlToEncodedPathString(url, start) {
        return url.substring(start);
      }
      static substr(devToolsPath, from, length) {
        return devToolsPath.substr(from, length);
      }
      static substring(devToolsPath, start, end) {
        return devToolsPath.substring(start, end);
      }
      static prepend(prefix, devToolsPath) {
        return prefix + devToolsPath;
      }
      static concatenate(devToolsPath, ...appendage) {
        return devToolsPath.concat(...appendage);
      }
      static trim(devToolsPath) {
        return devToolsPath.trim();
      }
      static slice(devToolsPath, start, end) {
        return devToolsPath.slice(start, end);
      }
      static join(devToolsPaths, separator) {
        return devToolsPaths.join(separator);
      }
      static split(devToolsPath, separator, limit) {
        return devToolsPath.split(separator, limit);
      }
      static toLowerCase(devToolsPath) {
        return devToolsPath.toLowerCase();
      }
      static isValidUrlString(str) {
        return new _ParsedURL(str).isValid;
      }
      static urlWithoutHash(url) {
        const hashIndex = url.indexOf("#");
        if (hashIndex !== -1) {
          return url.substr(0, hashIndex);
        }
        return url;
      }
      static urlRegex() {
        if (_ParsedURL.urlRegexInstance) {
          return _ParsedURL.urlRegexInstance;
        }
        const schemeRegex = /([A-Za-z][A-Za-z0-9+.-]*):\/\//;
        const userRegex = /(?:([A-Za-z0-9\-._~%!$&'()*+,;=:]*)@)?/;
        const hostRegex = /((?:\[::\d?\])|(?:[^\s\/:]*))/;
        const portRegex = /(?::([\d]+))?/;
        const pathRegex = /(\/[^#?]*)?/;
        const queryRegex = /(?:\?([^#]*))?/;
        const fragmentRegex = /(?:#(.*))?/;
        _ParsedURL.urlRegexInstance = new RegExp("^(" + schemeRegex.source + userRegex.source + hostRegex.source + portRegex.source + ")" + pathRegex.source + queryRegex.source + fragmentRegex.source + "$");
        return _ParsedURL.urlRegexInstance;
      }
      static extractPath(url) {
        const parsedURL = this.fromString(url);
        return parsedURL ? parsedURL.path : "";
      }
      static extractOrigin(url) {
        const parsedURL = this.fromString(url);
        return parsedURL ? parsedURL.securityOrigin() : "";
      }
      static extractExtension(url) {
        url = _ParsedURL.urlWithoutHash(url);
        const indexOfQuestionMark = url.indexOf("?");
        if (indexOfQuestionMark !== -1) {
          url = url.substr(0, indexOfQuestionMark);
        }
        const lastIndexOfSlash = url.lastIndexOf("/");
        if (lastIndexOfSlash !== -1) {
          url = url.substr(lastIndexOfSlash + 1);
        }
        const lastIndexOfDot = url.lastIndexOf(".");
        if (lastIndexOfDot !== -1) {
          url = url.substr(lastIndexOfDot + 1);
          const lastIndexOfPercent = url.indexOf("%");
          if (lastIndexOfPercent !== -1) {
            return url.substr(0, lastIndexOfPercent);
          }
          return url;
        }
        return "";
      }
      static extractName(url) {
        let index = url.lastIndexOf("/");
        const pathAndQuery = index !== -1 ? url.substr(index + 1) : url;
        index = pathAndQuery.indexOf("?");
        return index < 0 ? pathAndQuery : pathAndQuery.substr(0, index);
      }
      static completeURL(baseURL, href) {
        if (href.startsWith("data:") || href.startsWith("blob:") || href.startsWith("javascript:") || href.startsWith("mailto:")) {
          return href;
        }
        const trimmedHref = href.trim();
        const parsedHref = this.fromString(trimmedHref);
        if (parsedHref?.scheme) {
          const securityOrigin2 = parsedHref.securityOrigin();
          const pathText2 = normalizePath(parsedHref.path);
          const queryText2 = parsedHref.queryParams && `?${parsedHref.queryParams}`;
          const fragmentText = parsedHref.fragment && `#${parsedHref.fragment}`;
          return securityOrigin2 + pathText2 + queryText2 + fragmentText;
        }
        const parsedURL = this.fromString(baseURL);
        if (!parsedURL) {
          return null;
        }
        if (parsedURL.isDataURL()) {
          return href;
        }
        if (href.length > 1 && href.charAt(0) === "/" && href.charAt(1) === "/") {
          return parsedURL.scheme + ":" + href;
        }
        const securityOrigin = parsedURL.securityOrigin();
        const pathText = parsedURL.path;
        const queryText = parsedURL.queryParams ? "?" + parsedURL.queryParams : "";
        if (!href.length) {
          return securityOrigin + pathText + queryText;
        }
        if (href.charAt(0) === "#") {
          return securityOrigin + pathText + queryText + href;
        }
        if (href.charAt(0) === "?") {
          return securityOrigin + pathText + href;
        }
        const hrefMatches = href.match(/^[^#?]*/);
        if (!hrefMatches || !href.length) {
          throw new Error("Invalid href");
        }
        let hrefPath = hrefMatches[0];
        const hrefSuffix = href.substring(hrefPath.length);
        if (hrefPath.charAt(0) !== "/") {
          hrefPath = parsedURL.folderPathComponents + "/" + hrefPath;
        }
        return securityOrigin + normalizePath(hrefPath) + hrefSuffix;
      }
      static splitLineAndColumn(string) {
        const beforePathMatch = string.match(_ParsedURL.urlRegex());
        let beforePath = "";
        let pathAndAfter = string;
        if (beforePathMatch) {
          beforePath = beforePathMatch[1];
          pathAndAfter = string.substring(beforePathMatch[1].length);
        }
        const lineColumnRegEx = /(?::(\d+))?(?::(\d+))?$/;
        const lineColumnMatch = lineColumnRegEx.exec(pathAndAfter);
        let lineNumber;
        let columnNumber;
        console.assert(Boolean(lineColumnMatch));
        if (!lineColumnMatch) {
          return { url: string, lineNumber: 0, columnNumber: 0 };
        }
        if (typeof lineColumnMatch[1] === "string") {
          lineNumber = parseInt(lineColumnMatch[1], 10);
          lineNumber = isNaN(lineNumber) ? void 0 : lineNumber - 1;
        }
        if (typeof lineColumnMatch[2] === "string") {
          columnNumber = parseInt(lineColumnMatch[2], 10);
          columnNumber = isNaN(columnNumber) ? void 0 : columnNumber - 1;
        }
        let url = beforePath + pathAndAfter.substring(0, pathAndAfter.length - lineColumnMatch[0].length);
        if (lineColumnMatch[1] === void 0 && lineColumnMatch[2] === void 0) {
          const wasmCodeOffsetRegex = /wasm-function\[\d+\]:0x([a-z0-9]+)$/g;
          const wasmCodeOffsetMatch = wasmCodeOffsetRegex.exec(pathAndAfter);
          if (wasmCodeOffsetMatch && typeof wasmCodeOffsetMatch[1] === "string") {
            url = _ParsedURL.removeWasmFunctionInfoFromURL(url);
            columnNumber = parseInt(wasmCodeOffsetMatch[1], 16);
            columnNumber = isNaN(columnNumber) ? void 0 : columnNumber;
          }
        }
        return { url, lineNumber, columnNumber };
      }
      static removeWasmFunctionInfoFromURL(url) {
        const wasmFunctionRegEx = /:wasm-function\[\d+\]/;
        const wasmFunctionIndex = url.search(wasmFunctionRegEx);
        if (wasmFunctionIndex === -1) {
          return url;
        }
        return _ParsedURL.substring(url, 0, wasmFunctionIndex);
      }
      static beginsWithWindowsDriveLetter(url) {
        return /^[A-Za-z]:/.test(url);
      }
      static beginsWithScheme(url) {
        return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(url);
      }
      static isRelativeURL(url) {
        return !this.beginsWithScheme(url) || this.beginsWithWindowsDriveLetter(url);
      }
      isAboutBlank() {
        return this.url === "about:blank";
      }
      isDataURL() {
        return this.scheme === "data";
      }
      extractDataUrlMimeType() {
        const regexp = /^data:((?<type>\w+)\/(?<subtype>\w+))?(;base64)?,/;
        const match = this.url.match(regexp);
        return {
          type: match?.groups?.type,
          subtype: match?.groups?.subtype
        };
      }
      isBlobURL() {
        return this.url.startsWith("blob:");
      }
      lastPathComponentWithFragment() {
        return this.lastPathComponent + (this.fragment ? "#" + this.fragment : "");
      }
      domain() {
        if (this.isDataURL()) {
          return "data:";
        }
        return this.host + (this.port ? ":" + this.port : "");
      }
      securityOrigin() {
        if (this.isDataURL()) {
          return "data:";
        }
        const scheme = this.isBlobURL() ? this.blobInnerScheme : this.scheme;
        return scheme + "://" + this.domain();
      }
      urlWithoutScheme() {
        if (this.scheme && this.url.startsWith(this.scheme + "://")) {
          return this.url.substring(this.scheme.length + 3);
        }
        return this.url;
      }
      static urlRegexInstance = null;
    };
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/RenderBlocking.js
var RenderBlocking_exports = {};
__export(RenderBlocking_exports, {
  UIStrings: () => UIStrings17,
  createOverlayForRequest: () => createOverlayForRequest4,
  createOverlays: () => createOverlays16,
  generateInsight: () => generateInsight16,
  i18nString: () => i18nString16,
  isRenderBlockingInsight: () => isRenderBlockingInsight
});
function isRenderBlockingInsight(insight) {
  return insight.insightKey === "RenderBlocking";
}
function getNodesAndTimingByRequestId(nodeTimings) {
  const requestIdToNode = /* @__PURE__ */ new Map();
  for (const [node, nodeTiming] of nodeTimings) {
    if (node.type !== "network") {
      continue;
    }
    requestIdToNode.set(node.request.requestId, { node, nodeTiming });
  }
  return requestIdToNode;
}
function estimateSavingsWithGraphs2(deferredIds, lanternContext) {
  const simulator = lanternContext.simulator;
  const fcpGraph = lanternContext.metrics.firstContentfulPaint.optimisticGraph;
  const { nodeTimings } = lanternContext.simulator.simulate(fcpGraph);
  const adjustedNodeTimings = new Map(nodeTimings);
  const totalChildNetworkBytes = 0;
  const minimalFCPGraph = fcpGraph.cloneWithRelationships((node) => {
    const canDeferRequest = deferredIds.has(node.id);
    return !canDeferRequest;
  });
  if (minimalFCPGraph.type !== "network") {
    throw new Error("minimalFCPGraph not a NetworkNode");
  }
  const estimateBeforeInline = Math.max(...Array.from(Array.from(adjustedNodeTimings).map((timing) => timing[1].endTime)));
  const originalTransferSize = minimalFCPGraph.request.transferSize;
  const safeTransferSize = originalTransferSize || 0;
  minimalFCPGraph.request.transferSize = safeTransferSize + totalChildNetworkBytes;
  const estimateAfterInline = simulator.simulate(minimalFCPGraph).timeInMs;
  minimalFCPGraph.request.transferSize = originalTransferSize;
  return Math.round(Math.max(estimateBeforeInline - estimateAfterInline, 0));
}
function hasImageLCP(data31, context) {
  return data31.LargestImagePaint.lcpRequestByNavigationId.has(context.navigationId);
}
function computeSavings(data31, context, renderBlockingRequests) {
  if (!context.lantern) {
    return;
  }
  const nodesAndTimingsByRequestId = getNodesAndTimingByRequestId(context.lantern.metrics.firstContentfulPaint.optimisticEstimate.nodeTimings);
  const metricSavings = { FCP: 0, LCP: 0 };
  const requestIdToWastedMs = /* @__PURE__ */ new Map();
  const deferredNodeIds = /* @__PURE__ */ new Set();
  for (const request of renderBlockingRequests) {
    const nodeAndTiming = nodesAndTimingsByRequestId.get(request.args.data.requestId);
    if (!nodeAndTiming) {
      continue;
    }
    const { node, nodeTiming } = nodeAndTiming;
    node.traverse((node2) => deferredNodeIds.add(node2.id));
    const wastedMs = Math.round(nodeTiming.duration);
    if (wastedMs < MINIMUM_WASTED_MS) {
      continue;
    }
    requestIdToWastedMs.set(node.id, wastedMs);
  }
  if (requestIdToWastedMs.size) {
    metricSavings.FCP = estimateSavingsWithGraphs2(deferredNodeIds, context.lantern);
    if (!hasImageLCP(data31, context)) {
      metricSavings.LCP = metricSavings.FCP;
    }
  }
  return { metricSavings, requestIdToWastedMs };
}
function finalize46(partialModel) {
  return {
    insightKey: InsightKeys.RENDER_BLOCKING,
    strings: UIStrings17,
    title: i18nString16(UIStrings17.title),
    description: i18nString16(UIStrings17.description),
    docs: "https://developer.chrome.com/docs/performance/insights/render-blocking",
    category: InsightCategory.LCP,
    state: partialModel.renderBlockingRequests.length > 0 ? "fail" : "pass",
    ...partialModel
  };
}
function generateInsight16(data31, context) {
  if (!context.navigation) {
    return finalize46({
      renderBlockingRequests: []
    });
  }
  const firstPaintTs = data31.PageLoadMetrics.metricScoresByFrameId.get(context.frameId)?.get(context.navigation)?.get(ModelHandlers_exports.PageLoadMetrics.MetricName.FP)?.event?.ts;
  if (!firstPaintTs) {
    return finalize46({
      renderBlockingRequests: [],
      warnings: [InsightWarning.NO_FP]
    });
  }
  let renderBlockingRequests = [];
  for (const req of data31.NetworkRequests.byTime) {
    if (req.args.data.frame !== context.frameId) {
      continue;
    }
    if (!Network_exports.isSyntheticNetworkRequestEventRenderBlocking(req)) {
      continue;
    }
    if (req.args.data.syntheticData.finishTime > firstPaintTs) {
      continue;
    }
    if (req.args.data.renderBlocking === "in_body_parser_blocking") {
      const priority = req.args.data.priority;
      const isScript = req.args.data.resourceType === "Script";
      const isBlockingScript = isScript && priority === "High";
      if (priority !== "VeryHigh" && !isBlockingScript) {
        continue;
      }
    }
    const navigation2 = Trace_exports.getNavigationForTraceEvent(req, context.frameId, data31.Meta.navigationsByFrameId);
    if (navigation2 === context.navigation) {
      renderBlockingRequests.push(req);
    }
  }
  const savings = computeSavings(data31, context, renderBlockingRequests);
  renderBlockingRequests = renderBlockingRequests.sort((a, b) => {
    return b.dur - a.dur;
  });
  return finalize46({
    relatedEvents: renderBlockingRequests,
    renderBlockingRequests,
    ...savings
  });
}
function createOverlayForRequest4(request) {
  return {
    type: "ENTRY_OUTLINE",
    entry: request,
    outlineReason: "ERROR"
  };
}
function createOverlays16(model2) {
  return model2.renderBlockingRequests.map((request) => createOverlayForRequest4(request));
}
var UIStrings17, i18nString16, MINIMUM_WASTED_MS;
var init_RenderBlocking = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/RenderBlocking.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types4();
    UIStrings17 = {
      /**
       * @description Title of an insight that provides the user with the list of network requests that blocked and therefore slowed down the page rendering and becoming visible to the user.
       */
      title: "Render-blocking requests",
      /**
       * @description Text to describe that there are requests blocking rendering, which may affect LCP.
       */
      description: "Requests are blocking the page's initial render, which may delay LCP. [Deferring or inlining](https://developer.chrome.com/docs/performance/insights/render-blocking) can move these network requests out of the critical path.",
      /**
       * @description Label to describe a network request (that happens to be render-blocking).
       */
      renderBlockingRequest: "Request",
      /**
       * @description Label used for a time duration.
       */
      duration: "Duration",
      /**
       * @description Text status indicating that no requests blocked the initial render of a navigation
       */
      noRenderBlocking: "No render-blocking requests for this navigation"
    };
    i18nString16 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(isRenderBlockingInsight, "isRenderBlockingInsight");
    MINIMUM_WASTED_MS = 50;
    __name(getNodesAndTimingByRequestId, "getNodesAndTimingByRequestId");
    __name(estimateSavingsWithGraphs2, "estimateSavingsWithGraphs");
    __name(hasImageLCP, "hasImageLCP");
    __name(computeSavings, "computeSavings");
    __name(finalize46, "finalize");
    __name(generateInsight16, "generateInsight");
    __name(createOverlayForRequest4, "createOverlayForRequest");
    __name(createOverlays16, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/SlowCSSSelector.js
var SlowCSSSelector_exports = {};
__export(SlowCSSSelector_exports, {
  UIStrings: () => UIStrings18,
  createOverlays: () => createOverlays17,
  generateInsight: () => generateInsight17,
  i18nString: () => i18nString17,
  isSlowCSSSelectorInsight: () => isSlowCSSSelectorInsight
});
function aggregateSelectorStats(data31, context) {
  const selectorMap = /* @__PURE__ */ new Map();
  for (const [event, value] of data31.dataForRecalcStyleEvent) {
    if (event.args.beginData?.frame !== context.frameId) {
      continue;
    }
    if (!Timing_exports3.eventIsInBounds(event, context.bounds)) {
      continue;
    }
    for (const timing of value.timings) {
      const key = timing[SelectorTimingsKey.Selector] + "_" + timing[SelectorTimingsKey.StyleSheetId];
      const findTiming = selectorMap.get(key);
      if (findTiming !== void 0) {
        findTiming[SelectorTimingsKey.Elapsed] += timing[SelectorTimingsKey.Elapsed];
        findTiming[SelectorTimingsKey.FastRejectCount] += timing[SelectorTimingsKey.FastRejectCount];
        findTiming[SelectorTimingsKey.MatchAttempts] += timing[SelectorTimingsKey.MatchAttempts];
        findTiming[SelectorTimingsKey.MatchCount] += timing[SelectorTimingsKey.MatchCount];
      } else {
        selectorMap.set(key, { ...timing });
      }
    }
  }
  return [...selectorMap.values()];
}
function finalize47(partialModel) {
  return {
    insightKey: InsightKeys.SLOW_CSS_SELECTOR,
    strings: UIStrings18,
    title: i18nString17(UIStrings18.title),
    description: i18nString17(UIStrings18.description),
    docs: "https://developer.chrome.com/docs/performance/insights/slow-css-selector",
    category: InsightCategory.ALL,
    state: partialModel.topSelectorElapsedMs && partialModel.topSelectorMatchAttempts ? "informative" : "pass",
    ...partialModel
  };
}
function isSlowCSSSelectorInsight(model2) {
  return model2.insightKey === InsightKeys.SLOW_CSS_SELECTOR;
}
function generateInsight17(data31, context) {
  const selectorStatsData = data31.SelectorStats;
  if (!selectorStatsData) {
    throw new Error("no selector stats data");
  }
  const selectorTimings = aggregateSelectorStats(selectorStatsData, context);
  let totalElapsedUs = 0;
  let totalMatchAttempts = 0;
  let totalMatchCount = 0;
  selectorTimings.map((timing) => {
    totalElapsedUs += timing[SelectorTimingsKey.Elapsed];
    totalMatchAttempts += timing[SelectorTimingsKey.MatchAttempts];
    totalMatchCount += timing[SelectorTimingsKey.MatchCount];
  });
  let topSelectorElapsedMs = null;
  let topSelectorMatchAttempts = null;
  if (selectorTimings.length > 0) {
    topSelectorElapsedMs = selectorTimings.reduce((a, b) => {
      return a[SelectorTimingsKey.Elapsed] > b[SelectorTimingsKey.Elapsed] ? a : b;
    });
    if (topSelectorElapsedMs && topSelectorElapsedMs[SelectorTimingsKey.Elapsed] < slowCSSSelectorThreshold) {
      topSelectorElapsedMs = null;
    }
    topSelectorMatchAttempts = selectorTimings.reduce((a, b) => {
      return a[SelectorTimingsKey.MatchAttempts] > b[SelectorTimingsKey.MatchAttempts] ? a : b;
    });
  }
  return finalize47({
    // TODO: should we identify RecalcStyle events as linked to this insight?
    relatedEvents: [],
    totalElapsedMs: Timing_exports.Milli(totalElapsedUs / 1e3),
    totalMatchAttempts,
    totalMatchCount,
    topSelectorElapsedMs,
    topSelectorMatchAttempts
  });
}
function createOverlays17(_) {
  return [];
}
var UIStrings18, i18nString17, slowCSSSelectorThreshold;
var init_SlowCSSSelector = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/SlowCSSSelector.js"() {
    init_process_global();
    init_helpers2();
    init_TraceEvents();
    init_types2();
    init_types4();
    UIStrings18 = {
      /**
       * @description Title of an insight that provides details about slow CSS selectors.
       */
      title: "CSS Selector costs",
      /**
       * @description Text to describe how to improve the performance of CSS selectors.
       */
      description: "If Recalculate Style costs remain high, selector optimization can reduce them. [Optimize the selectors](https://developer.chrome.com/docs/performance/insights/slow-css-selector) with both high elapsed time and high slow-path %. Simpler selectors, fewer selectors, a smaller DOM, and a shallower DOM will all reduce matching costs.",
      /**
       * @description Column name for count of elements that the engine attempted to match against a style rule
       */
      matchAttempts: "Match attempts",
      /**
       * @description Column name for count of elements that matched a style rule
       */
      matchCount: "Match count",
      /**
       * @description Column name for elapsed time spent computing a style rule
       */
      elapsed: "Elapsed time",
      /**
       * @description Column name for the selectors that took the longest amount of time/effort.
       */
      topSelectors: "Top selectors",
      /**
       * @description Column name for a total sum.
       */
      total: "Total",
      /**
       * @description Text status indicating that no CSS selector data was found.
       */
      enableSelectorData: "No CSS selector data was found. CSS selector stats need to be enabled in the performance panel settings.",
      /**
       * @description top CSS selector when ranked by elapsed time in ms
       */
      topSelectorElapsedTime: "Top selector elapsed time",
      /**
       * @description top CSS selector when ranked by match attempt
       */
      topSelectorMatchAttempt: "Top selector match attempt"
    };
    i18nString17 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    slowCSSSelectorThreshold = 500;
    __name(aggregateSelectorStats, "aggregateSelectorStats");
    __name(finalize47, "finalize");
    __name(isSlowCSSSelectorInsight, "isSlowCSSSelectorInsight");
    __name(generateInsight17, "generateInsight");
    __name(createOverlays17, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js
var ThirdParties_exports2 = {};
__export(ThirdParties_exports2, {
  UIStrings: () => UIStrings19,
  createOverlays: () => createOverlays18,
  createOverlaysForSummary: () => createOverlaysForSummary,
  generateInsight: () => generateInsight18,
  i18nString: () => i18nString18,
  isThirdPartyInsight: () => isThirdPartyInsight
});
function getRelatedEvents(summaries, firstPartyEntity) {
  const relatedEvents = [];
  for (const summary of summaries) {
    if (summary.entity !== firstPartyEntity) {
      relatedEvents.push(...summary.relatedEvents);
    }
  }
  return relatedEvents;
}
function finalize48(partialModel) {
  return {
    insightKey: InsightKeys.THIRD_PARTIES,
    strings: UIStrings19,
    title: i18nString18(UIStrings19.title),
    description: i18nString18(UIStrings19.description),
    docs: "https://developer.chrome.com/docs/performance/insights/third-parties",
    category: InsightCategory.ALL,
    state: partialModel.entitySummaries.find((summary) => summary.entity !== partialModel.firstPartyEntity) ? "informative" : "pass",
    ...partialModel
  };
}
function isThirdPartyInsight(model2) {
  return model2.insightKey === InsightKeys.THIRD_PARTIES;
}
function generateInsight18(data31, context) {
  const entitySummaries = ThirdParties_exports.summarizeByThirdParty(data31, context.bounds);
  const firstPartyUrl = context.navigation?.args.data?.documentLoaderURL ?? data31.Meta.mainFrameURL;
  const firstPartyEntity = import_third_party_web.default.getEntity(firstPartyUrl) || helpers_exports.makeUpEntity(data31.Renderer.entityMappings.createdEntityCache, firstPartyUrl);
  return finalize48({
    relatedEvents: getRelatedEvents(entitySummaries, firstPartyEntity),
    firstPartyEntity,
    entitySummaries
  });
}
function createOverlaysForSummary(summary) {
  const overlays = [];
  for (const event of summary.relatedEvents) {
    if (event.dur === void 0 || event.dur < 1e3) {
      continue;
    }
    const overlay = {
      type: "ENTRY_OUTLINE",
      entry: event,
      outlineReason: "INFO"
    };
    overlays.push(overlay);
  }
  return overlays;
}
function createOverlays18(model2) {
  const overlays = [];
  const summaries = model2.entitySummaries ?? [];
  for (const summary of summaries) {
    if (summary.entity === model2.firstPartyEntity) {
      continue;
    }
    const summaryOverlays = createOverlaysForSummary(summary);
    overlays.push(...summaryOverlays);
  }
  return overlays;
}
var UIStrings19, i18nString18;
var init_ThirdParties2 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js"() {
    init_process_global();
    init_third_party_web();
    init_extras();
    init_handlers();
    init_types4();
    UIStrings19 = {
      /** Title of an insight that provides details about the code on a web page that the user doesn't control (referred to as "third-party code"). */
      title: "3rd parties",
      /**
       * @description Description of a DevTools insight that identifies the code on the page that the user doesn't control.
       * This is displayed after a user expands the section to see more. No character length limits.
       */
      description: "3rd party code can significantly impact load performance. [Reduce and defer loading of 3rd party code](https://developer.chrome.com/docs/performance/insights/third-parties) to prioritize your page's content.",
      /** Label for a table column that displays the name of a third-party provider. */
      columnThirdParty: "3rd party",
      /** Label for a column in a data table; entries will be the download size of a web resource in kilobytes. */
      columnTransferSize: "Transfer size",
      /** Label for a table column that displays how much time each row spent running on the main thread, entries will be the number of milliseconds spent. */
      columnMainThreadTime: "Main thread time",
      /**
       * @description Text block indicating that no third party content was detected on the page
       */
      noThirdParties: "No third parties found"
    };
    i18nString18 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(getRelatedEvents, "getRelatedEvents");
    __name(finalize48, "finalize");
    __name(isThirdPartyInsight, "isThirdPartyInsight");
    __name(generateInsight18, "generateInsight");
    __name(createOverlaysForSummary, "createOverlaysForSummary");
    __name(createOverlays18, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/Viewport.js
var Viewport_exports = {};
__export(Viewport_exports, {
  UIStrings: () => UIStrings20,
  createOverlays: () => createOverlays19,
  generateInsight: () => generateInsight19,
  i18nString: () => i18nString19,
  isViewportInsight: () => isViewportInsight
});
function finalize49(partialModel) {
  return {
    insightKey: InsightKeys.VIEWPORT,
    strings: UIStrings20,
    title: i18nString19(UIStrings20.title),
    description: i18nString19(UIStrings20.description),
    docs: "https://developer.chrome.com/docs/performance/insights/viewport",
    category: InsightCategory.INP,
    state: partialModel.mobileOptimized === false ? "fail" : "pass",
    ...partialModel
  };
}
function isViewportInsight(model2) {
  return model2.insightKey === InsightKeys.VIEWPORT;
}
function generateInsight19(data31, context) {
  const viewportEvent = data31.UserInteractions.parseMetaViewportEvents.find((event) => {
    if (event.args.data.frame !== context.frameId) {
      return false;
    }
    return Timing_exports3.eventIsInBounds(event, context.bounds);
  });
  const compositorEvents = data31.UserInteractions.beginCommitCompositorFrameEvents.filter((event) => {
    if (event.args.frame !== context.frameId) {
      return false;
    }
    if (viewportEvent && event.ts < viewportEvent.ts) {
      return false;
    }
    return Timing_exports3.eventIsInBounds(event, context.bounds);
  });
  if (!compositorEvents.length) {
    return finalize49({
      mobileOptimized: null,
      warnings: [InsightWarning.NO_LAYOUT]
    });
  }
  for (const event of compositorEvents) {
    if (!event.args.is_mobile_optimized) {
      const longPointerInteractions = [...data31.UserInteractions.interactionsOverThreshold.values()].filter((interaction) => ModelHandlers_exports.UserInteractions.categoryOfInteraction(interaction) === "POINTER" && interaction.inputDelay >= 5e4);
      const inputDelay = Math.max(0, ...longPointerInteractions.map((interaction) => interaction.inputDelay)) / 1e3;
      const inpMetricSavings = NumberUtilities_exports.clamp(inputDelay, 0, 300);
      return finalize49({
        mobileOptimized: false,
        viewportEvent,
        longPointerInteractions,
        metricSavings: { INP: inpMetricSavings }
      });
    }
  }
  return finalize49({
    mobileOptimized: true,
    viewportEvent
  });
}
function createOverlays19(model2) {
  if (!model2.longPointerInteractions) {
    return [];
  }
  return model2.longPointerInteractions.map((interaction) => {
    const delay = Math.min(interaction.inputDelay, 300 * 1e3);
    const bounds = Timing_exports3.traceWindowFromMicroSeconds(Timing_exports.Micro(interaction.ts), Timing_exports.Micro(interaction.ts + delay));
    return {
      type: "TIMESPAN_BREAKDOWN",
      entry: interaction,
      sections: [{ bounds, label: i18nString19(UIStrings20.mobileTapDelayLabel), showDuration: true }],
      renderLocation: "ABOVE_EVENT"
    };
  });
}
var UIStrings20, i18nString19;
var init_Viewport = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/Viewport.js"() {
    init_process_global();
    init_platform();
    init_handlers();
    init_helpers2();
    init_types2();
    init_types4();
    UIStrings20 = {
      /** Title of an insight that provides details about if the page's viewport is optimized for mobile viewing. */
      title: "Optimize viewport for mobile",
      /**
       * @description Text to tell the user how a viewport meta element can improve performance. \xa0 is a non-breaking space
       */
      description: "Tap interactions may be [delayed by up to 300 ms](https://developer.chrome.com/docs/performance/insights/viewport) if the viewport is not optimized for mobile.",
      /**
       * @description Text for a label describing the portion of an interaction event that was delayed due to a bad mobile viewport.
       */
      mobileTapDelayLabel: "Mobile tap delay"
    };
    i18nString19 = /* @__PURE__ */ __name((i18nId, values) => ({ i18nId, values }), "i18nString");
    __name(finalize49, "finalize");
    __name(isViewportInsight, "isViewportInsight");
    __name(generateInsight19, "generateInsight");
    __name(createOverlays19, "createOverlays");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/Models.js
var Models_exports = {};
__export(Models_exports, {
  CLSCulprits: () => CLSCulprits_exports,
  Cache: () => Cache_exports,
  CharacterSet: () => CharacterSet_exports,
  DOMSize: () => DOMSize_exports,
  DocumentLatency: () => DocumentLatency_exports,
  DuplicatedJavaScript: () => DuplicatedJavaScript_exports,
  FontDisplay: () => FontDisplay_exports,
  ForcedReflow: () => ForcedReflow_exports,
  INPBreakdown: () => INPBreakdown_exports,
  ImageDelivery: () => ImageDelivery_exports,
  LCPBreakdown: () => LCPBreakdown_exports,
  LCPDiscovery: () => LCPDiscovery_exports,
  LegacyJavaScript: () => LegacyJavaScript_exports,
  ModernHTTP: () => ModernHTTP_exports,
  NetworkDependencyTree: () => NetworkDependencyTree_exports,
  RenderBlocking: () => RenderBlocking_exports,
  SlowCSSSelector: () => SlowCSSSelector_exports,
  ThirdParties: () => ThirdParties_exports2,
  Viewport: () => Viewport_exports
});
var init_Models = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/Models.js"() {
    init_process_global();
    init_Cache();
    init_CharacterSet();
    init_CLSCulprits();
    init_DocumentLatency();
    init_DOMSize();
    init_DuplicatedJavaScript();
    init_FontDisplay();
    init_ForcedReflow();
    init_ImageDelivery();
    init_INPBreakdown();
    init_LCPBreakdown();
    init_LCPDiscovery();
    init_LegacyJavaScript();
    init_ModernHTTP();
    init_NetworkDependencyTree();
    init_RenderBlocking();
    init_SlowCSSSelector();
    init_ThirdParties2();
    init_Viewport();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/insights/insights.js
var init_insights = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/insights/insights.js"() {
    init_process_global();
    init_Cache();
    init_Common();
    init_Models();
    init_ModernHTTP();
    init_Statistics();
    init_types4();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/LanternComputationData.js
function createProcessedNavigation(data31, frameId, navigation2) {
  const scoresByNav = data31.PageLoadMetrics.metricScoresByFrameId.get(frameId);
  if (!scoresByNav) {
    throw new core_exports.LanternError("missing metric scores for frame");
  }
  const scores = scoresByNav.get(navigation2);
  if (!scores) {
    throw new core_exports.LanternError("missing metric scores for specified navigation");
  }
  const getTimestampOrUndefined = /* @__PURE__ */ __name((metric) => {
    const metricScore = scores.get(metric);
    if (!metricScore?.event) {
      return;
    }
    return metricScore.event.ts;
  }, "getTimestampOrUndefined");
  const getTimestamp = /* @__PURE__ */ __name((metric) => {
    const metricScore = scores.get(metric);
    if (!metricScore?.event) {
      throw new core_exports.LanternError(`missing metric: ${metric}`);
    }
    return metricScore.event.ts;
  }, "getTimestamp");
  return {
    timestamps: {
      firstContentfulPaint: getTimestamp(ModelHandlers_exports.PageLoadMetrics.MetricName.FCP),
      largestContentfulPaint: getTimestampOrUndefined(ModelHandlers_exports.PageLoadMetrics.MetricName.LCP)
    }
  };
}
function createParsedUrl(url) {
  if (typeof url === "string") {
    url = new URL(url);
  }
  return {
    scheme: url.protocol.split(":")[0],
    // Intentional, DevTools uses different terminology
    host: url.hostname,
    securityOrigin: url.origin
  };
}
function findWorkerThreads(trace) {
  const workerThreads = /* @__PURE__ */ new Map();
  const workerCreationEvents = ["ServiceWorker thread", "DedicatedWorker thread"];
  for (const event of trace.traceEvents) {
    if (event.name !== "thread_name" || !event.args.name) {
      continue;
    }
    if (!workerCreationEvents.includes(event.args.name)) {
      continue;
    }
    const tids = workerThreads.get(event.pid);
    if (tids) {
      tids.push(event.tid);
    } else {
      workerThreads.set(event.pid, [event.tid]);
    }
  }
  return workerThreads;
}
function createLanternRequest(parsedTrace, workerThreads, request) {
  if (request.args.data.hasResponse && request.args.data.connectionId === void 0) {
    throw new core_exports.LanternError("Trace is too old");
  }
  let url;
  try {
    url = new URL(request.args.data.url);
  } catch {
    return;
  }
  const timing = request.args.data.timing ? {
    // These two timings are not included in the trace.
    workerFetchStart: -1,
    workerRespondWithSettled: -1,
    receiveHeadersStart: -1,
    ...request.args.data.timing
  } : void 0;
  const networkRequestTime = timing ? timing.requestTime * 1e3 : request.args.data.syntheticData.downloadStart / 1e3;
  let fromWorker = false;
  const tids = workerThreads.get(request.pid);
  if (tids?.includes(request.tid)) {
    fromWorker = true;
  }
  if (parsedTrace.Workers.workerIdByThread.has(request.tid)) {
    fromWorker = true;
  }
  const initiator = request.args.data.initiator ?? {
    type: "other"
    /* Protocol.Network.InitiatorType.Other */
  };
  if (request.args.data.stackTrace) {
    const callFrames = request.args.data.stackTrace.map((f) => {
      return {
        scriptId: String(f.scriptId),
        url: f.url,
        lineNumber: f.lineNumber - 1,
        columnNumber: f.columnNumber - 1,
        functionName: f.functionName
      };
    });
    initiator.stack = { callFrames };
  }
  let resourceType = request.args.data.resourceType;
  if (request.args.data.initiator?.fetchType === "xmlhttprequest") {
    resourceType = "XHR";
  } else if (request.args.data.initiator?.fetchType === "fetch") {
    resourceType = "Fetch";
  }
  let resourceSize = request.args.data.decodedBodyLength ?? 0;
  if (url.protocol === "data:" && resourceSize === 0) {
    const commaIndex = url.pathname.indexOf(",");
    if (url.pathname.substring(0, commaIndex).includes(";base64")) {
      resourceSize = atob(url.pathname.substring(commaIndex + 1)).length;
    } else {
      resourceSize = url.pathname.length - commaIndex - 1;
    }
  }
  return {
    rawRequest: request,
    requestId: request.args.data.requestId,
    connectionId: request.args.data.connectionId ?? 0,
    connectionReused: request.args.data.connectionReused ?? false,
    url: request.args.data.url,
    protocol: request.args.data.protocol,
    parsedURL: createParsedUrl(url),
    documentURL: request.args.data.requestingFrameUrl,
    rendererStartTime: request.ts / 1e3,
    networkRequestTime,
    responseHeadersEndTime: request.args.data.syntheticData.downloadStart / 1e3,
    networkEndTime: request.args.data.syntheticData.finishTime / 1e3,
    transferSize: request.args.data.encodedDataLength,
    resourceSize,
    fromDiskCache: request.args.data.syntheticData.isDiskCached,
    fromMemoryCache: request.args.data.syntheticData.isMemoryCached,
    isLinkPreload: request.args.data.isLinkPreload,
    finished: request.args.data.finished,
    failed: request.args.data.failed,
    statusCode: request.args.data.statusCode,
    initiator,
    timing,
    resourceType,
    mimeType: request.args.data.mimeType,
    priority: request.args.data.priority,
    frameId: request.args.data.frame,
    fromWorker,
    serverResponseTime: request.args.data.lrServerResponseTime
  };
}
function chooseInitiatorRequest(request, requestsByURL) {
  if (request.redirectSource) {
    return request.redirectSource;
  }
  const initiatorURL = graph_exports.PageDependencyGraph.getNetworkInitiators(request)[0];
  let candidates = requestsByURL.get(initiatorURL) || [];
  candidates = candidates.filter((c) => {
    return c.responseHeadersEndTime <= request.rendererStartTime && c.finished && !c.failed;
  });
  if (candidates.length > 1) {
    const nonPrefetchCandidates = candidates.filter((cand) => cand.resourceType !== types_exports.NetworkRequestTypes.Other);
    if (nonPrefetchCandidates.length) {
      candidates = nonPrefetchCandidates;
    }
  }
  if (candidates.length > 1) {
    const sameFrameCandidates = candidates.filter((cand) => cand.frameId === request.frameId);
    if (sameFrameCandidates.length) {
      candidates = sameFrameCandidates;
    }
  }
  if (candidates.length > 1 && request.initiator.type === "parser") {
    const documentCandidates = candidates.filter((cand) => cand.resourceType === types_exports.NetworkRequestTypes.Document);
    if (documentCandidates.length) {
      candidates = documentCandidates;
    }
  }
  if (candidates.length > 1) {
    const linkPreloadCandidates = candidates.filter((c) => c.isLinkPreload);
    if (linkPreloadCandidates.length) {
      const nonPreloadCandidates = candidates.filter((c) => !c.isLinkPreload);
      const allPreloaded = nonPreloadCandidates.every((c) => c.fromDiskCache || c.fromMemoryCache);
      if (nonPreloadCandidates.length && allPreloaded) {
        candidates = linkPreloadCandidates;
      }
    }
  }
  return candidates.length === 1 ? candidates[0] : null;
}
function linkInitiators(lanternRequests) {
  const requestsByURL = /* @__PURE__ */ new Map();
  for (const request of lanternRequests) {
    const requests = requestsByURL.get(request.url) || [];
    requests.push(request);
    requestsByURL.set(request.url, requests);
  }
  for (const request of lanternRequests) {
    const initiatorRequest = chooseInitiatorRequest(request, requestsByURL);
    if (initiatorRequest) {
      request.initiatorRequest = initiatorRequest;
    }
  }
}
function createNetworkRequests(trace, data31, startTime = 0, endTime = Number.POSITIVE_INFINITY) {
  const workerThreads = findWorkerThreads(trace);
  const lanternRequestsNoRedirects = [];
  for (const request of data31.NetworkRequests.byTime) {
    if (request.ts >= startTime && request.ts < endTime) {
      const lanternRequest = createLanternRequest(data31, workerThreads, request);
      if (lanternRequest) {
        lanternRequestsNoRedirects.push(lanternRequest);
      }
    }
  }
  const lanternRequests = [];
  for (const request of [...lanternRequestsNoRedirects]) {
    if (!request.rawRequest) {
      continue;
    }
    const redirects = request.rawRequest.args.data.redirects;
    if (!redirects.length) {
      lanternRequests.push(request);
      continue;
    }
    const requestChain = [];
    for (const redirect of redirects) {
      const redirectedRequest = structuredClone(request);
      redirectedRequest.networkRequestTime = redirect.ts / 1e3;
      redirectedRequest.rendererStartTime = redirectedRequest.networkRequestTime;
      redirectedRequest.networkEndTime = (redirect.ts + redirect.dur) / 1e3;
      redirectedRequest.responseHeadersEndTime = redirectedRequest.networkEndTime;
      redirectedRequest.timing = {
        requestTime: redirectedRequest.networkRequestTime / 1e3,
        receiveHeadersStart: redirectedRequest.responseHeadersEndTime,
        receiveHeadersEnd: redirectedRequest.responseHeadersEndTime,
        proxyStart: -1,
        proxyEnd: -1,
        dnsStart: -1,
        dnsEnd: -1,
        connectStart: -1,
        connectEnd: -1,
        sslStart: -1,
        sslEnd: -1,
        sendStart: -1,
        sendEnd: -1,
        workerStart: -1,
        workerReady: -1,
        workerFetchStart: -1,
        workerRespondWithSettled: -1,
        pushStart: -1,
        pushEnd: -1
      };
      redirectedRequest.url = redirect.url;
      redirectedRequest.parsedURL = createParsedUrl(redirect.url);
      redirectedRequest.statusCode = 302;
      redirectedRequest.resourceType = void 0;
      redirectedRequest.transferSize = 400;
      requestChain.push(redirectedRequest);
      lanternRequests.push(redirectedRequest);
    }
    requestChain.push(request);
    lanternRequests.push(request);
    for (let i = 0; i < requestChain.length; i++) {
      const request2 = requestChain[i];
      if (i > 0) {
        request2.redirectSource = requestChain[i - 1];
        request2.redirects = requestChain.slice(0, i);
      }
      if (i !== requestChain.length - 1) {
        request2.redirectDestination = requestChain[i + 1];
      }
    }
    for (let i = 1; i < requestChain.length; i++) {
      requestChain[i].requestId = `${requestChain[i - 1].requestId}:redirect`;
    }
  }
  linkInitiators(lanternRequests);
  return lanternRequests;
}
function collectMainThreadEvents(trace, data31) {
  const Meta = data31.Meta;
  const mainFramePids = Meta.mainFrameNavigations.length ? new Set(Meta.mainFrameNavigations.map((nav) => nav.pid)) : Meta.topLevelRendererIds;
  const rendererPidToTid = /* @__PURE__ */ new Map();
  for (const pid of mainFramePids) {
    const threads = Meta.threadsInProcess.get(pid) ?? [];
    let found = false;
    for (const [tid, thread] of threads) {
      if (thread.args.name === "CrRendererMain") {
        rendererPidToTid.set(pid, tid);
        found = true;
        break;
      }
    }
    if (found) {
      continue;
    }
    for (const [tid, thread] of threads) {
      if (thread.args.name === "CrBrowserMain") {
        rendererPidToTid.set(pid, tid);
        found = true;
        break;
      }
    }
  }
  return trace.traceEvents.filter((e) => rendererPidToTid.get(e.pid) === e.tid);
}
function createGraph(requests, trace, data31, url) {
  const mainThreadEvents = collectMainThreadEvents(trace, data31);
  if (!url) {
    url = {
      requestedUrl: requests[0].url,
      mainDocumentUrl: ""
    };
    let request = requests[0];
    while (request.redirectDestination) {
      request = request.redirectDestination;
    }
    url.mainDocumentUrl = request.url;
  }
  return graph_exports.PageDependencyGraph.createGraph(mainThreadEvents, requests, url);
}
var init_LanternComputationData = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/LanternComputationData.js"() {
    init_process_global();
    init_handlers();
    init_lantern();
    __name(createProcessedNavigation, "createProcessedNavigation");
    __name(createParsedUrl, "createParsedUrl");
    __name(findWorkerThreads, "findWorkerThreads");
    __name(createLanternRequest, "createLanternRequest");
    __name(chooseInitiatorRequest, "chooseInitiatorRequest");
    __name(linkInitiators, "linkInitiators");
    __name(createNetworkRequests, "createNetworkRequests");
    __name(collectMainThreadEvents, "collectMainThreadEvents");
    __name(createGraph, "createGraph");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/Processor.js
var Processor_exports = {};
__export(Processor_exports, {
  TraceParseProgressEvent: () => TraceParseProgressEvent,
  TraceProcessor: () => TraceProcessor2,
  sortHandlers: () => sortHandlers
});
function calculateProgress(value, phase) {
  if (phase === 0.8) {
    return value * (0.8 - 0.2) + 0.2;
  }
  return value * phase;
}
function sortHandlers(traceHandlers) {
  const sortedMap = /* @__PURE__ */ new Map();
  const visited = /* @__PURE__ */ new Set();
  const visitHandler = /* @__PURE__ */ __name((handlerName) => {
    if (sortedMap.has(handlerName)) {
      return;
    }
    if (visited.has(handlerName)) {
      let stackPath = "";
      for (const handler2 of visited) {
        if (stackPath || handler2 === handlerName) {
          stackPath += `${handler2}->`;
        }
      }
      stackPath += handlerName;
      throw new Error(`Found dependency cycle in trace event handlers: ${stackPath}`);
    }
    visited.add(handlerName);
    const handler = traceHandlers[handlerName];
    if (!handler) {
      return;
    }
    const deps17 = handler.deps?.();
    if (deps17) {
      deps17.forEach(visitHandler);
    }
    sortedMap.set(handlerName, handler);
  }, "visitHandler");
  for (const handlerName of Object.keys(traceHandlers)) {
    visitHandler(handlerName);
  }
  return sortedMap;
}
var _a2, TraceParseProgressEvent, TraceProcessor2;
var init_Processor = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/Processor.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_insights();
    init_lantern();
    init_LanternComputationData();
    init_types2();
    TraceParseProgressEvent = class _TraceParseProgressEvent extends Event {
      static {
        __name(this, "TraceParseProgressEvent");
      }
      data;
      static eventName = "traceparseprogress";
      constructor(data31, init2 = { bubbles: true }) {
        super(_TraceParseProgressEvent.eventName, init2);
        this.data = data31;
      }
    };
    __name(calculateProgress, "calculateProgress");
    TraceProcessor2 = class extends EventTarget {
      static {
        __name(this, "TraceProcessor");
      }
      // We force the Meta handler to be enabled, so the TraceHandlers type here is
      // the model handlers the user passes in and the Meta handler.
      #traceHandlers;
      #status = "IDLE";
      #modelConfiguration = Configuration_exports.defaults();
      #data = null;
      #insights = null;
      static createWithAllHandlers() {
        return new _a2(ModelHandlers_exports, Configuration_exports.defaults());
      }
      /**
       * This function is kept for testing with `stub`.
       */
      static getInsightRunners() {
        return { ...Models_exports };
      }
      constructor(traceHandlers, modelConfiguration) {
        super();
        this.#verifyHandlers(traceHandlers);
        this.#traceHandlers = {
          Meta: ModelHandlers_exports.Meta,
          ...traceHandlers
        };
        if (modelConfiguration) {
          this.#modelConfiguration = modelConfiguration;
        }
        this.#passConfigToHandlers();
      }
      #passConfigToHandlers() {
        for (const handler of Object.values(this.#traceHandlers)) {
          if ("handleUserConfig" in handler && handler.handleUserConfig) {
            handler.handleUserConfig(this.#modelConfiguration);
          }
        }
      }
      /**
       * When the user passes in a set of handlers, we want to ensure that we have all
       * the required handlers. Handlers can depend on other handlers, so if the user
       * passes in FooHandler which depends on BarHandler, they must also pass in
       * BarHandler too. This method verifies that all dependencies are met, and
       * throws if not.
       **/
      #verifyHandlers(providedHandlers) {
        if (Object.keys(providedHandlers).length === Object.keys(ModelHandlers_exports).length) {
          return;
        }
        const requiredHandlerKeys = /* @__PURE__ */ new Set();
        for (const [handlerName, handler] of Object.entries(providedHandlers)) {
          requiredHandlerKeys.add(handlerName);
          const deps17 = "deps" in handler ? handler.deps() : [];
          for (const depName of deps17) {
            requiredHandlerKeys.add(depName);
          }
        }
        const providedHandlerKeys = new Set(Object.keys(providedHandlers));
        requiredHandlerKeys.delete("Meta");
        for (const requiredKey of requiredHandlerKeys) {
          if (!providedHandlerKeys.has(requiredKey)) {
            throw new Error(`Required handler ${requiredKey} not provided.`);
          }
        }
      }
      reset() {
        if (this.#status === "PARSING") {
          throw new Error("Trace processor can't reset while parsing.");
        }
        const handlers = Object.values(this.#traceHandlers);
        for (const handler of handlers) {
          handler.reset();
        }
        this.#data = null;
        this.#insights = null;
        this.#status = "IDLE";
      }
      async parse(traceEvents, options) {
        if (this.#status !== "IDLE") {
          throw new Error(`Trace processor can't start parsing when not idle. Current state: ${this.#status}`);
        }
        if (typeof options.isCPUProfile === "undefined" && options.metadata) {
          options.isCPUProfile = options.metadata.dataOrigin === File_exports.DataOrigin.CPU_PROFILE;
        }
        options.logger?.start("total");
        try {
          this.#status = "PARSING";
          options.logger?.start("parse");
          await this.#computeParsedTrace(traceEvents, options);
          options.logger?.end("parse");
          if (this.#data && !options.isCPUProfile) {
            options.logger?.start("insights");
            this.#computeInsights(this.#data, traceEvents, options);
            options.logger?.end("insights");
          }
          this.#status = "FINISHED_PARSING";
        } catch (e) {
          this.#status = "ERRORED_WHILE_PARSING";
          throw e;
        } finally {
          options.logger?.end("total");
        }
      }
      /**
       * Run all the handlers and set the result to `#data`.
       */
      async #computeParsedTrace(traceEvents, options) {
        const eventsPerChunk = 5e4;
        const sortedHandlers = [...sortHandlers(this.#traceHandlers).entries()];
        for (const [, handler] of sortedHandlers) {
          handler.reset();
        }
        options.logger?.start("parse:handleEvent");
        for (let i = 0; i < traceEvents.length; ++i) {
          if (i % eventsPerChunk === 0 && i) {
            const percent = calculateProgress(
              i / traceEvents.length,
              0.2
              /* ProgressPhase.HANDLE_EVENT */
            );
            this.dispatchEvent(new TraceParseProgressEvent({ percent }));
            await new Promise((resolve) => setTimeout(resolve, 0));
          }
          const event = traceEvents[i];
          for (let j = 0; j < sortedHandlers.length; ++j) {
            const [, handler] = sortedHandlers[j];
            handler.handleEvent(event);
          }
        }
        options.logger?.end("parse:handleEvent");
        const finalizeOptions = {
          ...options,
          allTraceEvents: traceEvents
        };
        for (let i = 0; i < sortedHandlers.length; i++) {
          const [name, handler] = sortedHandlers[i];
          if (handler.finalize) {
            options.logger?.start(`parse:${name}:finalize`);
            await new Promise((resolve) => setTimeout(resolve, 0));
            await handler.finalize(finalizeOptions);
            options.logger?.end(`parse:${name}:finalize`);
          }
          const percent = calculateProgress(
            i / sortedHandlers.length,
            0.8
            /* ProgressPhase.FINALIZE */
          );
          this.dispatchEvent(new TraceParseProgressEvent({ percent }));
        }
        options.logger?.start("parse:handler.data()");
        const parsedTrace = {};
        for (const [name, handler] of Object.entries(this.#traceHandlers)) {
          Object.assign(parsedTrace, { [name]: handler.data() });
        }
        options.logger?.end("parse:handler.data()");
        this.dispatchEvent(new TraceParseProgressEvent({
          percent: 1
          /* ProgressPhase.CLONE */
        }));
        this.#data = parsedTrace;
      }
      get data() {
        if (this.#status !== "FINISHED_PARSING") {
          return null;
        }
        return this.#data;
      }
      get insights() {
        if (this.#status !== "FINISHED_PARSING") {
          return null;
        }
        return this.#insights;
      }
      #createLanternContext(data31, traceEvents, frameId, navigation2, options) {
        if (!data31.NetworkRequests || !data31.Workers || !data31.PageLoadMetrics) {
          return;
        }
        if (!data31.NetworkRequests.byTime.length) {
          throw new core_exports.LanternError("No network requests found in trace");
        }
        const navStarts = data31.Meta.navigationsByFrameId.get(frameId);
        const navStartIndex = navStarts?.findIndex((n) => n === navigation2);
        if (!navStarts || navStartIndex === void 0 || navStartIndex === -1) {
          throw new core_exports.LanternError("Could not find navigation start");
        }
        const startTime = navStarts[navStartIndex].ts;
        const endTime = navStartIndex + 1 < navStarts.length ? navStarts[navStartIndex + 1].ts : Number.POSITIVE_INFINITY;
        const boundedTraceEvents = traceEvents.filter((e) => e.ts >= startTime && e.ts < endTime);
        const trace = {
          traceEvents: boundedTraceEvents
        };
        const requests = createNetworkRequests(trace, data31, startTime, endTime);
        const graph2 = createGraph(requests, trace, data31);
        const processedNavigation = createProcessedNavigation(data31, frameId, navigation2);
        const networkAnalysis = core_exports.NetworkAnalyzer.analyze(requests);
        if (!networkAnalysis) {
          return;
        }
        const lanternSettings = {
          // TODO(crbug.com/372674229): if devtools throttling was on, does this network analysis capture
          // that? Do we need to set 'devtools' throttlingMethod?
          networkAnalysis,
          throttlingMethod: "provided",
          ...options.lanternSettings
        };
        const simulator = simulation_exports.Simulator.createSimulator(lanternSettings);
        const computeData = { graph: graph2, simulator, processedNavigation };
        const fcpResult = metrics_exports.FirstContentfulPaint.compute(computeData);
        const lcpResult = metrics_exports.LargestContentfulPaint.compute(computeData, { fcpResult });
        const interactiveResult = metrics_exports.Interactive.compute(computeData, { lcpResult });
        const tbtResult = metrics_exports.TotalBlockingTime.compute(computeData, { fcpResult, interactiveResult });
        const metrics = {
          firstContentfulPaint: fcpResult,
          interactive: interactiveResult,
          largestContentfulPaint: lcpResult,
          totalBlockingTime: tbtResult
        };
        return { requests, graph: graph2, simulator, metrics };
      }
      /**
       * Sort the insight models based on the impact of each insight's estimated savings, additionally weighted by the
       * worst metrics according to field data (if present).
       */
      sortInsightSet(insightSet, metadata) {
        const baselineOrder = {
          INPBreakdown: null,
          LCPBreakdown: null,
          LCPDiscovery: null,
          CLSCulprits: null,
          RenderBlocking: null,
          NetworkDependencyTree: null,
          ImageDelivery: null,
          DocumentLatency: null,
          FontDisplay: null,
          Viewport: null,
          DOMSize: null,
          ThirdParties: null,
          DuplicatedJavaScript: null,
          SlowCSSSelector: null,
          ForcedReflow: null,
          Cache: null,
          CharacterSet: null,
          ModernHTTP: null,
          LegacyJavaScript: null
        };
        const weights = Common_exports.calculateMetricWeightsForSorting(insightSet, metadata);
        const observedLcpMicro = Common_exports.getLCP(insightSet)?.value;
        const observedLcp = observedLcpMicro ? Timing_exports3.microToMilli(observedLcpMicro) : Timing_exports.Milli(0);
        const observedCls = Common_exports.getCLS(insightSet).value;
        const observedInpMicro = Common_exports.getINP(insightSet)?.value;
        const observedInp = observedInpMicro ? Timing_exports3.microToMilli(observedInpMicro) : Timing_exports.Milli(200);
        const observedLcpScore = observedLcp !== void 0 ? Common_exports.evaluateLCPMetricScore(observedLcp) : void 0;
        const observedInpScore = Common_exports.evaluateINPMetricScore(observedInp);
        const observedClsScore = Common_exports.evaluateCLSMetricScore(observedCls);
        const insightToSortingRank = /* @__PURE__ */ new Map();
        for (const [name, insight] of Object.entries(insightSet.model)) {
          const lcp = insight.metricSavings?.LCP ?? 0;
          const inp = insight.metricSavings?.INP ?? 0;
          const cls = insight.metricSavings?.CLS ?? 0;
          const lcpPostSavings = observedLcp !== void 0 ? Math.max(0, observedLcp - lcp) : void 0;
          const inpPostSavings = Math.max(0, observedInp - inp);
          const clsPostSavings = Math.max(0, observedCls - cls);
          let score = 0;
          if (weights.lcp && lcp && observedLcpScore !== void 0 && lcpPostSavings !== void 0) {
            score += weights.lcp * (Common_exports.evaluateLCPMetricScore(lcpPostSavings) - observedLcpScore);
          }
          if (weights.inp && inp && observedInpScore !== void 0) {
            score += weights.inp * (Common_exports.evaluateINPMetricScore(inpPostSavings) - observedInpScore);
          }
          if (weights.cls && cls && observedClsScore !== void 0) {
            score += weights.cls * (Common_exports.evaluateCLSMetricScore(clsPostSavings) - observedClsScore);
          }
          insightToSortingRank.set(name, score);
        }
        const baselineOrderKeys = Object.keys(baselineOrder);
        const orderedKeys = Object.keys(insightSet.model);
        orderedKeys.sort((a, b) => {
          const a1 = baselineOrderKeys.indexOf(a);
          const b1 = baselineOrderKeys.indexOf(b);
          if (a1 >= 0 && b1 >= 0) {
            return a1 - b1;
          }
          if (a1 >= 0) {
            return -1;
          }
          if (b1 >= 0) {
            return 1;
          }
          return 0;
        });
        orderedKeys.sort((a, b) => (insightToSortingRank.get(b) ?? 0) - (insightToSortingRank.get(a) ?? 0));
        const newModel = {};
        for (const key of orderedKeys) {
          const model2 = insightSet.model[key];
          newModel[key] = model2;
        }
        insightSet.model = newModel;
      }
      #computeInsightSet(data31, context) {
        const logger = context.options.logger;
        if (!this.#insights) {
          this.#insights = /* @__PURE__ */ new Map();
        }
        let id, urlString, navigation2;
        if (context.navigation) {
          id = `NAVIGATION_${this.#insights.size}`;
          urlString = data31.Meta.finalDisplayUrlByNavigationId.get(context.navigationId) ?? data31.Meta.mainFrameURL;
          navigation2 = context.navigation;
        } else {
          id = TraceEvents_exports.NO_NAVIGATION;
          urlString = data31.Meta.finalDisplayUrlByNavigationId.get("") ?? data31.Meta.mainFrameURL;
        }
        const insightSetModel = {};
        const insightSetModelErrors = {};
        for (const [name, insight] of Object.entries(_a2.getInsightRunners())) {
          try {
            logger?.start(`insights:${name}`);
            const model2 = insight.generateInsight(data31, context);
            model2.frameId = context.frameId;
            const navId = context.navigation?.args.data?.navigationId;
            if (navId) {
              model2.navigation = context.navigation;
            }
            model2.createOverlays = () => {
              return insight.createOverlays(model2);
            };
            Object.assign(insightSetModel, { [name]: model2 });
          } catch (err) {
            Object.assign(insightSetModelErrors, { [name]: err });
          } finally {
            logger?.end(`insights:${name}`);
          }
        }
        const isNavigation = id === TraceEvents_exports.NO_NAVIGATION;
        const trivialThreshold = Timing_exports3.milliToMicro(Timing_exports.Milli(5e3));
        const everyInsightPasses = Object.values(insightSetModel).every((model2) => model2 && model2.state === "pass");
        const noLcp = !insightSetModel.LCPBreakdown?.lcpEvent;
        const noInp = !insightSetModel.INPBreakdown?.longestInteractionEvent;
        const noLayoutShifts = insightSetModel.CLSCulprits?.shifts?.size === 0;
        const shouldExclude = isNavigation && context.bounds.range < trivialThreshold && everyInsightPasses && noLcp && noInp && noLayoutShifts;
        if (shouldExclude) {
          return;
        }
        let url;
        try {
          url = new URL(urlString);
        } catch {
          return;
        }
        const insightSet = {
          id,
          url,
          navigation: navigation2,
          frameId: context.frameId,
          bounds: context.bounds,
          model: insightSetModel,
          modelErrors: insightSetModelErrors
        };
        this.#insights.set(insightSet.id, insightSet);
        this.sortInsightSet(insightSet, context.options.metadata ?? null);
      }
      /**
       * Run all the insights and set the result to `#insights`.
       */
      #computeInsights(data31, traceEvents, options) {
        this.#insights = /* @__PURE__ */ new Map();
        const navigations = data31.Meta.mainFrameNavigations.filter((navigation2) => navigation2.args.frame && navigation2.args.data?.navigationId);
        this.#computeInsightsForInitialTracePeriod(data31, navigations, options);
        for (const [index, navigation2] of navigations.entries()) {
          const min = navigation2.ts;
          const max = index + 1 < navigations.length ? navigations[index + 1].ts : data31.Meta.traceBounds.max;
          const bounds = Timing_exports3.traceWindowFromMicroSeconds(min, max);
          this.#computeInsightsForNavigation(navigation2, bounds, data31, traceEvents, options);
        }
      }
      /**
       * Computes insights for the period before the first navigation, or for the entire trace if no navigations exist.
       */
      #computeInsightsForInitialTracePeriod(data31, navigations, options) {
        const bounds = navigations.length > 0 ? Timing_exports3.traceWindowFromMicroSeconds(data31.Meta.traceBounds.min, navigations[0].ts) : data31.Meta.traceBounds;
        const context = {
          options,
          bounds,
          frameId: data31.Meta.mainFrameId
          // No navigation or lantern context applies to this initial/no-navigation period.
        };
        this.#computeInsightSet(data31, context);
      }
      /**
       * Computes insights for a specific navigation event.
       */
      #computeInsightsForNavigation(navigation2, bounds, data31, traceEvents, options) {
        const frameId = navigation2.args.frame;
        const navigationId = navigation2.args.data?.navigationId;
        let lantern;
        try {
          options.logger?.start("insights:createLanternContext");
          lantern = this.#createLanternContext(data31, traceEvents, frameId, navigation2, options);
        } catch (e) {
          const expectedErrors = [
            "mainDocumentRequest not found",
            "missing metric scores for main frame",
            "missing metric: FCP",
            "missing metric: LCP",
            "No network requests found in trace",
            "Trace is too old"
          ];
          if (!(e instanceof core_exports.LanternError)) {
            console.error(e);
          } else if (!expectedErrors.some((err) => e.message === err)) {
            console.error(e);
          }
        } finally {
          options.logger?.end("insights:createLanternContext");
        }
        const context = {
          options,
          bounds,
          frameId,
          navigation: navigation2,
          navigationId,
          lantern
        };
        this.#computeInsightSet(data31, context);
      }
    };
    _a2 = TraceProcessor2;
    __name(sortHandlers, "sortHandlers");
  }
});

// node_modules/@paulirish/trace_engine/models/trace/ModelImpl.js
var init_ModelImpl = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/ModelImpl.js"() {
    init_process_global();
    init_platform();
    init_handlers();
    init_helpers2();
    init_Processor();
    init_types2();
  }
});

// node_modules/@paulirish/trace_engine/core/common/common.js
var init_common = __esm({
  "node_modules/@paulirish/trace_engine/core/common/common.js"() {
    init_process_global();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/Styles.js
var EventCategory;
var init_Styles = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/Styles.js"() {
    init_process_global();
    init_handlers();
    init_helpers2();
    init_types2();
    (function(EventCategory2) {
      EventCategory2["DRAWING"] = "drawing";
      EventCategory2["RASTERIZING"] = "rasterizing";
      EventCategory2["LAYOUT"] = "layout";
      EventCategory2["LOADING"] = "loading";
      EventCategory2["EXPERIENCE"] = "experience";
      EventCategory2["SCRIPTING"] = "scripting";
      EventCategory2["MESSAGING"] = "messaging";
      EventCategory2["RENDERING"] = "rendering";
      EventCategory2["PAINTING"] = "painting";
      EventCategory2["GPU"] = "gpu";
      EventCategory2["ASYNC"] = "async";
      EventCategory2["OTHER"] = "other";
      EventCategory2["IDLE"] = "idle";
    })(EventCategory || (EventCategory = {}));
  }
});

// node_modules/@paulirish/trace_engine/models/trace/Name.js
var init_Name = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/Name.js"() {
    init_process_global();
    init_common();
    init_handlers();
    init_Styles();
    init_types2();
  }
});

// node_modules/@paulirish/trace_engine/models/trace/trace.js
var init_trace2 = __esm({
  "node_modules/@paulirish/trace_engine/models/trace/trace.js"() {
    init_process_global();
    init_EntityMapper();
    init_EventsSerializer();
    init_extras();
    init_handlers();
    init_helpers2();
    init_insights();
    init_lantern();
    init_LanternComputationData();
    init_ModelImpl();
    init_Name();
    init_Processor();
    init_Styles();
    init_types2();
  }
});

// core/lib/lantern/lantern.js
var init_lantern2 = __esm({
  "core/lib/lantern/lantern.js"() {
    "use strict";
    init_process_global();
    init_lantern();
    init_trace2();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
  }
});

// core/lib/lantern-trace-saver.js
var init_lantern_trace_saver = __esm({
  "core/lib/lantern-trace-saver.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
  }
});

// core/lib/traces/metric-trace-events.js
var init_metric_trace_events = __esm({
  "core/lib/traces/metric-trace-events.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_trace_processor();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
  }
});

// core/lib/arbitrary-equality-map.js
var ArbitraryEqualityMap;
var init_arbitrary_equality_map = __esm({
  "core/lib/arbitrary-equality-map.js"() {
    "use strict";
    init_process_global();
    init_lodash();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ArbitraryEqualityMap = class _ArbitraryEqualityMap {
      static {
        __name(this, "ArbitraryEqualityMap");
      }
      constructor() {
        this._equalsFn = _ArbitraryEqualityMap.deepEquals;
        this._entries = [];
      }
      /**
       * @param {function(*,*):boolean} equalsFn
       */
      setEqualityFn(equalsFn) {
        this._equalsFn = equalsFn;
      }
      /**
       * @param {*} key
       * @return {boolean}
       */
      has(key) {
        return this._findIndexOf(key) !== -1;
      }
      /**
       * @param {*} key
       * @return {*}
       */
      get(key) {
        const entry = this._entries[this._findIndexOf(key)];
        return entry?.value;
      }
      /**
       * @param {*} key
       * @param {*} value
       */
      set(key, value) {
        let index = this._findIndexOf(key);
        if (index === -1) index = this._entries.length;
        this._entries[index] = { key, value };
      }
      /**
       * @param {*} key
       * @return {number}
       */
      _findIndexOf(key) {
        for (let i = 0; i < this._entries.length; i++) {
          if (this._equalsFn(key, this._entries[i].key)) return i;
        }
        return -1;
      }
      /**
       * Determines whether two objects are deeply equal. Defers to lodash isEqual, but is kept here for
       * easy usage by consumers.
       * See https://lodash.com/docs/4.17.5#isEqual.
       * @param {*} objA
       * @param {*} objB
       * @return {boolean}
       */
      static deepEquals(objA, objB) {
        return isEqual_default(objA, objB);
      }
    };
  }
});

// core/computed/computed-artifact.js
function makeComputedArtifact(computableArtifact, keys2) {
  const request = /* @__PURE__ */ __name((dependencies, context) => {
    const computedName = computableArtifact.name;
    for (const key of keys2 || []) {
      if (dependencies && typeof dependencies === "object" && dependencies[key] === void 0) {
        const err = new Error(`missing required key "${String(key)}" for computed artifact ${computableArtifact.name}`);
        if (isUnderTest) {
          throw err;
        } else {
          lighthouse_logger_default.error(`lh:computed:${computedName}`, err);
        }
      }
    }
    const pickedDependencies = keys2 ? Object.fromEntries(keys2.map((key) => [key, dependencies[key]])) : dependencies;
    const computedCache = (
      /** @type {Map<string, ArbitraryEqualityMap>} */
      context.computedCache
    );
    const cache = computedCache.get(computedName) || new ArbitraryEqualityMap();
    computedCache.set(computedName, cache);
    const computed = cache.get(pickedDependencies);
    if (computed) {
      return computed;
    }
    const status = { msg: `Computing artifact: ${computedName}`, id: `lh:computed:${computedName}` };
    lighthouse_logger_default.time(status, "verbose");
    const artifactPromise = (
      /** @type {ReturnType<C['compute_']>} */
      computableArtifact.compute_(pickedDependencies, context)
    );
    cache.set(pickedDependencies, artifactPromise);
    artifactPromise.then(() => lighthouse_logger_default.timeEnd(status)).catch(() => lighthouse_logger_default.timeEnd(status));
    return artifactPromise;
  }, "request");
  return Object.assign(computableArtifact, { request });
}
var init_computed_artifact = __esm({
  "core/computed/computed-artifact.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_arbitrary_equality_map();
    init_lh_env();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(makeComputedArtifact, "makeComputedArtifact");
  }
});

// node_modules/tldts-icann/dist/cjs/index.js
var require_cjs = __commonJS({
  "node_modules/tldts-icann/dist/cjs/index.js"(exports2) {
    "use strict";
    init_process_global();
    function shareSameDomainSuffix(hostname, vhost) {
      if (hostname.endsWith(vhost)) {
        return hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === ".";
      }
      return false;
    }
    __name(shareSameDomainSuffix, "shareSameDomainSuffix");
    function extractDomainWithSuffix(hostname, publicSuffix) {
      const publicSuffixIndex = hostname.length - publicSuffix.length - 2;
      const lastDotBeforeSuffixIndex = hostname.lastIndexOf(".", publicSuffixIndex);
      if (lastDotBeforeSuffixIndex === -1) {
        return hostname;
      }
      return hostname.slice(lastDotBeforeSuffixIndex + 1);
    }
    __name(extractDomainWithSuffix, "extractDomainWithSuffix");
    function getDomain$1(suffix, hostname, options) {
      if (options.validHosts !== null) {
        const validHosts = options.validHosts;
        for (const vhost of validHosts) {
          if (
            /*@__INLINE__*/
            shareSameDomainSuffix(hostname, vhost)
          ) {
            return vhost;
          }
        }
      }
      let numberOfLeadingDots = 0;
      if (hostname.startsWith(".")) {
        while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === ".") {
          numberOfLeadingDots += 1;
        }
      }
      if (suffix.length === hostname.length - numberOfLeadingDots) {
        return null;
      }
      return (
        /*@__INLINE__*/
        extractDomainWithSuffix(hostname, suffix)
      );
    }
    __name(getDomain$1, "getDomain$1");
    function getDomainWithoutSuffix$1(domain, suffix) {
      return domain.slice(0, -suffix.length - 1);
    }
    __name(getDomainWithoutSuffix$1, "getDomainWithoutSuffix$1");
    function extractHostname(url, urlIsValidHostname) {
      let start = 0;
      let end = url.length;
      let hasUpper = false;
      if (!urlIsValidHostname) {
        if (url.startsWith("data:")) {
          return null;
        }
        while (start < url.length && url.charCodeAt(start) <= 32) {
          start += 1;
        }
        while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {
          end -= 1;
        }
        if (url.charCodeAt(start) === 47 && url.charCodeAt(start + 1) === 47) {
          start += 2;
        } else {
          const indexOfProtocol = url.indexOf(":/", start);
          if (indexOfProtocol !== -1) {
            const protocolSize = indexOfProtocol - start;
            const c0 = url.charCodeAt(start);
            const c1 = url.charCodeAt(start + 1);
            const c2 = url.charCodeAt(start + 2);
            const c3 = url.charCodeAt(start + 3);
            const c4 = url.charCodeAt(start + 4);
            if (protocolSize === 5 && c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112 && c4 === 115) ;
            else if (protocolSize === 4 && c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112) ;
            else if (protocolSize === 3 && c0 === 119 && c1 === 115 && c2 === 115) ;
            else if (protocolSize === 2 && c0 === 119 && c1 === 115) ;
            else {
              for (let i = start; i < indexOfProtocol; i += 1) {
                const lowerCaseCode = url.charCodeAt(i) | 32;
                if (!(lowerCaseCode >= 97 && lowerCaseCode <= 122 || // [a, z]
                lowerCaseCode >= 48 && lowerCaseCode <= 57 || // [0, 9]
                lowerCaseCode === 46 || // '.'
                lowerCaseCode === 45 || // '-'
                lowerCaseCode === 43)) {
                  return null;
                }
              }
            }
            start = indexOfProtocol + 2;
            while (url.charCodeAt(start) === 47) {
              start += 1;
            }
          }
        }
        let indexOfIdentifier = -1;
        let indexOfClosingBracket = -1;
        let indexOfPort = -1;
        for (let i = start; i < end; i += 1) {
          const code = url.charCodeAt(i);
          if (code === 35 || // '#'
          code === 47 || // '/'
          code === 63) {
            end = i;
            break;
          } else if (code === 64) {
            indexOfIdentifier = i;
          } else if (code === 93) {
            indexOfClosingBracket = i;
          } else if (code === 58) {
            indexOfPort = i;
          } else if (code >= 65 && code <= 90) {
            hasUpper = true;
          }
        }
        if (indexOfIdentifier !== -1 && indexOfIdentifier > start && indexOfIdentifier < end) {
          start = indexOfIdentifier + 1;
        }
        if (url.charCodeAt(start) === 91) {
          if (indexOfClosingBracket !== -1) {
            return url.slice(start + 1, indexOfClosingBracket).toLowerCase();
          }
          return null;
        } else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) {
          end = indexOfPort;
        }
      }
      while (end > start + 1 && url.charCodeAt(end - 1) === 46) {
        end -= 1;
      }
      const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;
      if (hasUpper) {
        return hostname.toLowerCase();
      }
      return hostname;
    }
    __name(extractHostname, "extractHostname");
    function isProbablyIpv4(hostname) {
      if (hostname.length < 7) {
        return false;
      }
      if (hostname.length > 15) {
        return false;
      }
      let numberOfDots = 0;
      for (let i = 0; i < hostname.length; i += 1) {
        const code = hostname.charCodeAt(i);
        if (code === 46) {
          numberOfDots += 1;
        } else if (code < 48 || code > 57) {
          return false;
        }
      }
      return numberOfDots === 3 && hostname.charCodeAt(0) !== 46 && hostname.charCodeAt(hostname.length - 1) !== 46;
    }
    __name(isProbablyIpv4, "isProbablyIpv4");
    function isProbablyIpv6(hostname) {
      if (hostname.length < 3) {
        return false;
      }
      let start = hostname.startsWith("[") ? 1 : 0;
      let end = hostname.length;
      if (hostname[end - 1] === "]") {
        end -= 1;
      }
      if (end - start > 39) {
        return false;
      }
      let hasColon = false;
      for (; start < end; start += 1) {
        const code = hostname.charCodeAt(start);
        if (code === 58) {
          hasColon = true;
        } else if (!(code >= 48 && code <= 57 || // 0-9
        code >= 97 && code <= 102 || // a-f
        code >= 65 && code <= 90)) {
          return false;
        }
      }
      return hasColon;
    }
    __name(isProbablyIpv6, "isProbablyIpv6");
    function isIp(hostname) {
      return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);
    }
    __name(isIp, "isIp");
    function isValidAscii(code) {
      return code >= 97 && code <= 122 || code >= 48 && code <= 57 || code > 127;
    }
    __name(isValidAscii, "isValidAscii");
    function isValidHostname(hostname) {
      if (hostname.length > 255) {
        return false;
      }
      if (hostname.length === 0) {
        return false;
      }
      if (
        /*@__INLINE__*/
        !isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot)
        hostname.charCodeAt(0) !== 95
      ) {
        return false;
      }
      let lastDotIndex = -1;
      let lastCharCode = -1;
      const len = hostname.length;
      for (let i = 0; i < len; i += 1) {
        const code = hostname.charCodeAt(i);
        if (code === 46) {
          if (
            // Check that previous label is < 63 bytes long (64 = 63 + '.')
            i - lastDotIndex > 64 || // Check that previous character was not already a '.'
            lastCharCode === 46 || // Check that the previous label does not end with a '-' (dash)
            lastCharCode === 45 || // Check that the previous label does not end with a '_' (underscore)
            lastCharCode === 95
          ) {
            return false;
          }
          lastDotIndex = i;
        } else if (!/*@__INLINE__*/
        (isValidAscii(code) || code === 45 || code === 95)) {
          return false;
        }
        lastCharCode = code;
      }
      return (
        // Check that last label is shorter than 63 chars
        len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character.
        // Since we already checked that the char is a valid hostname character,
        // we only need to check that it's different from '-'.
        lastCharCode !== 45
      );
    }
    __name(isValidHostname, "isValidHostname");
    function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname: extractHostname2 = true, mixedInputs = true, validHosts = null, validateHostname = true }) {
      return {
        allowIcannDomains,
        allowPrivateDomains,
        detectIp,
        extractHostname: extractHostname2,
        mixedInputs,
        validHosts,
        validateHostname
      };
    }
    __name(setDefaultsImpl, "setDefaultsImpl");
    var DEFAULT_OPTIONS = (
      /*@__INLINE__*/
      setDefaultsImpl({})
    );
    function setDefaults(options) {
      if (options === void 0) {
        return DEFAULT_OPTIONS;
      }
      return (
        /*@__INLINE__*/
        setDefaultsImpl(options)
      );
    }
    __name(setDefaults, "setDefaults");
    function getSubdomain$1(hostname, domain) {
      if (domain.length === hostname.length) {
        return "";
      }
      return hostname.slice(0, -domain.length - 1);
    }
    __name(getSubdomain$1, "getSubdomain$1");
    function getEmptyResult() {
      return {
        domain: null,
        domainWithoutSuffix: null,
        hostname: null,
        isIcann: null,
        isIp: null,
        isPrivate: null,
        publicSuffix: null,
        subdomain: null
      };
    }
    __name(getEmptyResult, "getEmptyResult");
    function resetResult(result) {
      result.domain = null;
      result.domainWithoutSuffix = null;
      result.hostname = null;
      result.isIcann = null;
      result.isIp = null;
      result.isPrivate = null;
      result.publicSuffix = null;
      result.subdomain = null;
    }
    __name(resetResult, "resetResult");
    function parseImpl(url, step, suffixLookup2, partialOptions, result) {
      const options = (
        /*@__INLINE__*/
        setDefaults(partialOptions)
      );
      if (typeof url !== "string") {
        return result;
      }
      if (!options.extractHostname) {
        result.hostname = url;
      } else if (options.mixedInputs) {
        result.hostname = extractHostname(url, isValidHostname(url));
      } else {
        result.hostname = extractHostname(url, false);
      }
      if (options.detectIp && result.hostname !== null) {
        result.isIp = isIp(result.hostname);
        if (result.isIp) {
          return result;
        }
      }
      if (options.validateHostname && options.extractHostname && result.hostname !== null && !isValidHostname(result.hostname)) {
        result.hostname = null;
        return result;
      }
      if (step === 0 || result.hostname === null) {
        return result;
      }
      suffixLookup2(result.hostname, options, result);
      if (step === 2 || result.publicSuffix === null) {
        return result;
      }
      result.domain = getDomain$1(result.publicSuffix, result.hostname, options);
      if (step === 3 || result.domain === null) {
        return result;
      }
      result.subdomain = getSubdomain$1(result.hostname, result.domain);
      if (step === 4) {
        return result;
      }
      result.domainWithoutSuffix = getDomainWithoutSuffix$1(result.domain, result.publicSuffix);
      return result;
    }
    __name(parseImpl, "parseImpl");
    function fastPathLookup(hostname, options, out) {
      if (!options.allowPrivateDomains && hostname.length > 3) {
        const last = hostname.length - 1;
        const c3 = hostname.charCodeAt(last);
        const c2 = hostname.charCodeAt(last - 1);
        const c1 = hostname.charCodeAt(last - 2);
        const c0 = hostname.charCodeAt(last - 3);
        if (c3 === 109 && c2 === 111 && c1 === 99 && c0 === 46) {
          out.isIcann = true;
          out.isPrivate = false;
          out.publicSuffix = "com";
          return true;
        } else if (c3 === 103 && c2 === 114 && c1 === 111 && c0 === 46) {
          out.isIcann = true;
          out.isPrivate = false;
          out.publicSuffix = "org";
          return true;
        } else if (c3 === 117 && c2 === 100 && c1 === 101 && c0 === 46) {
          out.isIcann = true;
          out.isPrivate = false;
          out.publicSuffix = "edu";
          return true;
        } else if (c3 === 118 && c2 === 111 && c1 === 103 && c0 === 46) {
          out.isIcann = true;
          out.isPrivate = false;
          out.publicSuffix = "gov";
          return true;
        } else if (c3 === 116 && c2 === 101 && c1 === 110 && c0 === 46) {
          out.isIcann = true;
          out.isPrivate = false;
          out.publicSuffix = "net";
          return true;
        } else if (c3 === 101 && c2 === 100 && c1 === 46) {
          out.isIcann = true;
          out.isPrivate = false;
          out.publicSuffix = "de";
          return true;
        }
      }
      return false;
    }
    __name(fastPathLookup, "fastPathLookup");
    var exceptions = /* @__PURE__ */ (function() {
      const _73 = [1, {}], _74 = [0, { "city": _73 }];
      const exceptions2 = [0, { "ck": [0, { "www": _73 }], "jp": [0, { "kawasaki": _74, "kitakyushu": _74, "kobe": _74, "nagoya": _74, "sapporo": _74, "sendai": _74, "yokohama": _74 }] }];
      return exceptions2;
    })();
    var rules = /* @__PURE__ */ (function() {
      const _75 = [1, {}], _76 = [1, { "com": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "org": _75 }], _77 = [1, { "com": _75, "edu": _75, "gov": _75, "net": _75, "org": _75 }], _78 = [1, { "gov": _75 }], _79 = [0, { "*": _75 }], _80 = [1, { "co": _75, "com": _75, "edu": _75, "gov": _75, "net": _75, "org": _75 }], _81 = [1, { "com": _75, "edu": _75, "net": _75, "org": _75 }], _82 = [1, { "co": _75, "net": _75, "org": _75 }], _83 = [1, { "co": _75, "com": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "nom": _75, "org": _75 }], _84 = [1, { "biz": _75, "com": _75, "edu": _75, "gov": _75, "info": _75, "net": _75, "org": _75 }], _85 = [1, { "gs": _75 }], _86 = [0, { "nes": _75 }], _87 = [1, { "k12": _75, "cc": _75, "lib": _75 }], _88 = [1, { "cc": _75 }], _89 = [1, { "cc": _75, "lib": _75 }];
      const rules2 = [0, { "ac": _76, "ad": _75, "ae": [1, { "ac": _75, "co": _75, "gov": _75, "mil": _75, "net": _75, "org": _75, "sch": _75 }], "aero": [1, { "airline": _75, "airport": _75, "accident-investigation": _75, "accident-prevention": _75, "aerobatic": _75, "aeroclub": _75, "aerodrome": _75, "agents": _75, "air-surveillance": _75, "air-traffic-control": _75, "aircraft": _75, "airtraffic": _75, "ambulance": _75, "association": _75, "author": _75, "ballooning": _75, "broker": _75, "caa": _75, "cargo": _75, "catering": _75, "certification": _75, "championship": _75, "charter": _75, "civilaviation": _75, "club": _75, "conference": _75, "consultant": _75, "consulting": _75, "control": _75, "council": _75, "crew": _75, "design": _75, "dgca": _75, "educator": _75, "emergency": _75, "engine": _75, "engineer": _75, "entertainment": _75, "equipment": _75, "exchange": _75, "express": _75, "federation": _75, "flight": _75, "freight": _75, "fuel": _75, "gliding": _75, "government": _75, "\
groundhandling": _75, "group": _75, "hanggliding": _75, "homebuilt": _75, "insurance": _75, "journal": _75, "journalist": _75, "leasing": _75, "logistics": _75, "magazine": _75, "maintenance": _75, "marketplace": _75, "media": _75, "microlight": _75, "modelling": _75, "navigation": _75, "parachuting": _75, "paragliding": _75, "passenger-association": _75, "pilot": _75, "press": _75, "production": _75, "recreation": _75, "repbody": _75, "res": _75, "research": _75, "rotorcraft": _75, "safety": _75, "scientist": _75, "services": _75, "show": _75, "skydiving": _75, "software": _75, "student": _75, "taxi": _75, "trader": _75, "trading": _75, "trainer": _75, "union": _75, "workinggroup": _75, "works": _75 }], "af": _77, "ag": [1, { "co": _75, "com": _75, "net": _75, "nom": _75, "org": _75 }], "ai": [1, { "com": _75, "net": _75, "off": _75, "org": _75 }], "al": _76, "am": [1, { "co": _75, "com": _75, "commune": _75, "net": _75, "org": _75 }], "ao": [1, { "co": _75, "ed": _75, "edu": _75, "go\
v": _75, "gv": _75, "it": _75, "og": _75, "org": _75, "pb": _75 }], "aq": _75, "ar": [1, { "bet": _75, "com": _75, "coop": _75, "edu": _75, "gob": _75, "gov": _75, "int": _75, "mil": _75, "musica": _75, "mutual": _75, "net": _75, "org": _75, "seg": _75, "senasa": _75, "tur": _75 }], "arpa": [1, { "e164": _75, "home": _75, "in-addr": _75, "ip6": _75, "iris": _75, "uri": _75, "urn": _75 }], "as": _78, "asia": _75, "at": [1, { "ac": [1, { "sth": _75 }], "co": _75, "gv": _75, "or": _75 }], "au": [1, { "asn": _75, "com": _75, "edu": [1, { "act": _75, "catholic": _75, "nsw": _75, "nt": _75, "qld": _75, "sa": _75, "tas": _75, "vic": _75, "wa": _75 }], "gov": [1, { "qld": _75, "sa": _75, "tas": _75, "vic": _75, "wa": _75 }], "id": _75, "net": _75, "org": _75, "conf": _75, "oz": _75, "act": _75, "nsw": _75, "nt": _75, "qld": _75, "sa": _75, "tas": _75, "vic": _75, "wa": _75 }], "aw": [1, { "com": _75 }], "ax": _75, "az": [1, { "biz": _75, "co": _75, "com": _75, "edu": _75, "gov": _75, "info": _75,
      "int": _75, "mil": _75, "name": _75, "net": _75, "org": _75, "pp": _75, "pro": _75 }], "ba": _76, "bb": [1, { "biz": _75, "co": _75, "com": _75, "edu": _75, "gov": _75, "info": _75, "net": _75, "org": _75, "store": _75, "tv": _75 }], "bd": [1, { "ac": _75, "ai": _75, "co": _75, "com": _75, "edu": _75, "gov": _75, "id": _75, "info": _75, "it": _75, "mil": _75, "net": _75, "org": _75, "sch": _75, "tv": _75 }], "be": [1, { "ac": _75 }], "bf": _78, "bg": [1, { "0": _75, "1": _75, "2": _75, "3": _75, "4": _75, "5": _75, "6": _75, "7": _75, "8": _75, "9": _75, "a": _75, "b": _75, "c": _75, "d": _75, "e": _75, "f": _75, "g": _75, "h": _75, "i": _75, "j": _75, "k": _75, "l": _75, "m": _75, "n": _75, "o": _75, "p": _75, "q": _75, "r": _75, "s": _75, "t": _75, "u": _75, "v": _75, "w": _75, "x": _75, "y": _75, "z": _75 }], "bh": _77, "bi": [1, { "co": _75, "com": _75, "edu": _75, "or": _75, "org": _75 }], "biz": _75, "bj": [1, { "africa": _75, "agro": _75, "architectes": _75, "assur": _75, "\
avocats": _75, "co": _75, "com": _75, "eco": _75, "econo": _75, "edu": _75, "info": _75, "loisirs": _75, "money": _75, "net": _75, "org": _75, "ote": _75, "restaurant": _75, "resto": _75, "tourism": _75, "univ": _75 }], "bm": _77, "bn": _77, "bo": [1, { "com": _75, "edu": _75, "gob": _75, "int": _75, "mil": _75, "net": _75, "org": _75, "tv": _75, "web": _75, "academia": _75, "agro": _75, "arte": _75, "blog": _75, "bolivia": _75, "ciencia": _75, "cooperativa": _75, "democracia": _75, "deporte": _75, "ecologia": _75, "economia": _75, "empresa": _75, "indigena": _75, "industria": _75, "info": _75, "medicina": _75, "movimiento": _75, "musica": _75, "natural": _75, "nombre": _75, "noticias": _75, "patria": _75, "plurinacional": _75, "politica": _75, "profesional": _75, "pueblo": _75, "revista": _75, "salud": _75, "tecnologia": _75, "tksat": _75, "transporte": _75, "wiki": _75 }], "br": [1, { "9guacu": _75, "abc": _75, "adm": _75, "adv": _75, "agr": _75, "aju": _75, "am": _75, "anani": _75, "\
aparecida": _75, "api": _75, "app": _75, "arq": _75, "art": _75, "ato": _75, "b": _75, "barueri": _75, "belem": _75, "bet": _75, "bhz": _75, "bib": _75, "bio": _75, "blog": _75, "bmd": _75, "boavista": _75, "bsb": _75, "campinagrande": _75, "campinas": _75, "caxias": _75, "cim": _75, "cng": _75, "cnt": _75, "com": _75, "contagem": _75, "coop": _75, "coz": _75, "cri": _75, "cuiaba": _75, "curitiba": _75, "def": _75, "des": _75, "det": _75, "dev": _75, "ecn": _75, "eco": _75, "edu": _75, "emp": _75, "enf": _75, "eng": _75, "esp": _75, "etc": _75, "eti": _75, "far": _75, "feira": _75, "flog": _75, "floripa": _75, "fm": _75, "fnd": _75, "fortal": _75, "fot": _75, "foz": _75, "fst": _75, "g12": _75, "geo": _75, "ggf": _75, "goiania": _75, "gov": [1, { "ac": _75, "al": _75, "am": _75, "ap": _75, "ba": _75, "ce": _75, "df": _75, "es": _75, "go": _75, "ma": _75, "mg": _75, "ms": _75, "mt": _75, "pa": _75, "pb": _75, "pe": _75, "pi": _75, "pr": _75, "rj": _75, "rn": _75, "ro": _75, "rr": _75, "\
rs": _75, "sc": _75, "se": _75, "sp": _75, "to": _75 }], "gru": _75, "ia": _75, "imb": _75, "ind": _75, "inf": _75, "jab": _75, "jampa": _75, "jdf": _75, "joinville": _75, "jor": _75, "jus": _75, "leg": _75, "leilao": _75, "lel": _75, "log": _75, "londrina": _75, "macapa": _75, "maceio": _75, "manaus": _75, "maringa": _75, "mat": _75, "med": _75, "mil": _75, "morena": _75, "mp": _75, "mus": _75, "natal": _75, "net": _75, "niteroi": _75, "nom": _79, "not": _75, "ntr": _75, "odo": _75, "ong": _75, "org": _75, "osasco": _75, "palmas": _75, "poa": _75, "ppg": _75, "pro": _75, "psc": _75, "psi": _75, "pvh": _75, "qsl": _75, "radio": _75, "rec": _75, "recife": _75, "rep": _75, "ribeirao": _75, "rio": _75, "riobranco": _75, "riopreto": _75, "salvador": _75, "sampa": _75, "santamaria": _75, "santoandre": _75, "saobernardo": _75, "saogonca": _75, "seg": _75, "sjc": _75, "slg": _75, "slz": _75, "social": _75, "sorocaba": _75, "srv": _75, "taxi": _75, "tc": _75, "tec": _75, "teo": _75, "the": _75,
      "tmp": _75, "trd": _75, "tur": _75, "tv": _75, "udi": _75, "vet": _75, "vix": _75, "vlog": _75, "wiki": _75, "xyz": _75, "zlg": _75 }], "bs": _77, "bt": _77, "bv": _75, "bw": [1, { "ac": _75, "co": _75, "gov": _75, "net": _75, "org": _75 }], "by": [1, { "gov": _75, "mil": _75, "com": _75, "of": _75 }], "bz": _80, "ca": [1, { "ab": _75, "bc": _75, "mb": _75, "nb": _75, "nf": _75, "nl": _75, "ns": _75, "nt": _75, "nu": _75, "on": _75, "pe": _75, "qc": _75, "sk": _75, "yk": _75, "gc": _75 }], "cat": _75, "cc": _75, "cd": _78, "cf": _75, "cg": _75, "ch": _75, "ci": [1, { "ac": _75, "xn--aroport-bya": _75, "aéroport": _75, "asso": _75, "co": _75, "com": _75, "ed": _75, "edu": _75, "go": _75, "gouv": _75, "int": _75, "net": _75, "or": _75, "org": _75 }], "ck": _79, "cl": [1, { "co": _75, "gob": _75, "gov": _75, "mil": _75 }], "cm": [1, { "co": _75, "com": _75, "gov": _75, "net": _75 }], "cn": [1, { "ac": _75, "com": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "org": _75, "xn-\
-55qx5d": _75, "公司": _75, "xn--od0alg": _75, "網絡": _75, "xn--io0a7i": _75, "网络": _75, "ah": _75, "bj": _75, "cq": _75, "fj": _75, "gd": _75, "gs": _75, "gx": _75, "gz": _75, "ha": _75, "hb": _75, "he": _75, "hi": _75, "hk": _75, "hl": _75, "hn": _75, "jl": _75, "js": _75, "jx": _75, "ln": _75, "mo": _75, "nm": _75, "nx": _75, "qh": _75, "sc": _75, "sd": _75, "sh": _75, "sn": _75, "sx": _75, "tj": _75, "tw": _75, "xj": _75, "xz": _75, "yn": _75, "zj": _75 }], "co": [1, { "com": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "nom": _75, "org": _75 }], "com": _75, "coop": _75, "cr": [1, { "ac": _75, "co": _75, "ed": _75, "fi": _75, "go": _75, "or": _75, "sa": _75 }], "cu": [1, { "com": _75, "edu": _75, "gob": _75, "inf": _75, "nat": _75, "net": _75, "org": _75 }], "cv": [1, { "com": _75, "edu": _75, "id": _75, "int": _75, "net": _75, "nome": _75, "org": _75, "publ": _75 }], "cw": _81, "cx": _78, "cy": [1, { "ac": _75, "biz": _75, "com": _75, "ekloges": _75, "gov": _75, "\
ltd": _75, "mil": _75, "net": _75, "org": _75, "press": _75, "pro": _75, "tm": _75 }], "cz": _78, "de": _75, "dj": _75, "dk": _75, "dm": _80, "do": [1, { "art": _75, "com": _75, "edu": _75, "gob": _75, "gov": _75, "mil": _75, "net": _75, "org": _75, "sld": _75, "web": _75 }], "dz": [1, { "art": _75, "asso": _75, "com": _75, "edu": _75, "gov": _75, "net": _75, "org": _75, "pol": _75, "soc": _75, "tm": _75 }], "ec": [1, { "abg": _75, "adm": _75, "agron": _75, "arqt": _75, "art": _75, "bar": _75, "chef": _75, "com": _75, "cont": _75, "cpa": _75, "cue": _75, "dent": _75, "dgn": _75, "disco": _75, "doc": _75, "edu": _75, "eng": _75, "esm": _75, "fin": _75, "fot": _75, "gal": _75, "gob": _75, "gov": _75, "gye": _75, "ibr": _75, "info": _75, "k12": _75, "lat": _75, "loj": _75, "med": _75, "mil": _75, "mktg": _75, "mon": _75, "net": _75, "ntr": _75, "odont": _75, "org": _75, "pro": _75, "prof": _75, "psic": _75, "psiq": _75, "pub": _75, "rio": _75, "rrpp": _75, "sal": _75, "tech": _75, "tul": _75,
      "tur": _75, "uio": _75, "vet": _75, "xxx": _75 }], "edu": _75, "ee": [1, { "aip": _75, "com": _75, "edu": _75, "fie": _75, "gov": _75, "lib": _75, "med": _75, "org": _75, "pri": _75, "riik": _75 }], "eg": [1, { "ac": _75, "com": _75, "edu": _75, "eun": _75, "gov": _75, "info": _75, "me": _75, "mil": _75, "name": _75, "net": _75, "org": _75, "sci": _75, "sport": _75, "tv": _75 }], "er": _79, "es": [1, { "com": _75, "edu": _75, "gob": _75, "nom": _75, "org": _75 }], "et": [1, { "biz": _75, "com": _75, "edu": _75, "gov": _75, "info": _75, "name": _75, "net": _75, "org": _75 }], "eu": _75, "fi": [1, { "aland": _75 }], "fj": [1, { "ac": _75, "biz": _75, "com": _75, "edu": _75, "gov": _75, "id": _75, "info": _75, "mil": _75, "name": _75, "net": _75, "org": _75, "pro": _75 }], "fk": _79, "fm": _81, "fo": _75, "fr": [1, { "asso": _75, "com": _75, "gouv": _75, "nom": _75, "prd": _75, "tm": _75, "avoues": _75, "cci": _75, "greta": _75, "huissier-justice": _75 }], "ga": _75, "gb": _75, "gd": [
      1, { "edu": _75, "gov": _75 }], "ge": [1, { "com": _75, "edu": _75, "gov": _75, "net": _75, "org": _75, "pvt": _75, "school": _75 }], "gf": _75, "gg": _82, "gh": [1, { "biz": _75, "com": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "org": _75 }], "gi": [1, { "com": _75, "edu": _75, "gov": _75, "ltd": _75, "mod": _75, "org": _75 }], "gl": [1, { "co": _75, "com": _75, "edu": _75, "net": _75, "org": _75 }], "gm": _75, "gn": [1, { "ac": _75, "com": _75, "edu": _75, "gov": _75, "net": _75, "org": _75 }], "gov": _75, "gp": [1, { "asso": _75, "com": _75, "edu": _75, "mobi": _75, "net": _75, "org": _75 }], "gq": _75, "gr": _77, "gs": _75, "gt": [1, { "com": _75, "edu": _75, "gob": _75, "ind": _75, "mil": _75, "net": _75, "org": _75 }], "gu": [1, { "com": _75, "edu": _75, "gov": _75, "guam": _75, "info": _75, "net": _75, "org": _75, "web": _75 }], "gw": _75, "gy": _80, "hk": [1, { "com": _75, "edu": _75, "gov": _75, "idv": _75, "net": _75, "org": _75, "xn--ciqpn": _75, "个人": _75,
      "xn--gmqw5a": _75, "個人": _75, "xn--55qx5d": _75, "公司": _75, "xn--mxtq1m": _75, "政府": _75, "xn--lcvr32d": _75, "敎育": _75, "xn--wcvs22d": _75, "教育": _75, "xn--gmq050i": _75, "箇人": _75, "xn--uc0atv": _75, "組織": _75, "xn--uc0ay4a": _75, "組织": _75, "xn--od0alg": _75, "網絡": _75, "xn--zf0avx": _75, "網络": _75, "xn--mk0axi": _75, "组織": _75, "xn--tn0ag": _75, "组织": _75, "xn--od0aq3b": _75, "网絡": _75, "xn--io0a7i": _75, "网络": _75 }], "hm": _75, "hn": [1, { "com": _75, "edu": _75, "gob": _75, "mil": _75, "net": _75, "org": _75 }], "hr": [1, { "com": _75, "from": _75, "iz": _75, "name": _75 }], "ht": [1, { "adult": _75, "art": _75, "asso": _75, "com": _75, "coop": _75, "edu": _75, "firm": _75, "gouv": _75, "info": _75, "med": _75, "net": _75, "org": _75, "perso": _75, "pol": _75, "pro": _75, "rel": _75, "shop": _75 }], "hu": [1, { "2000": _75, "agrar": _75, "bolt": _75, "casino": _75, "city": _75, "co": _75, "erotica": _75, "erotika": _75,
      "film": _75, "forum": _75, "games": _75, "hotel": _75, "info": _75, "ingatlan": _75, "jogasz": _75, "konyvelo": _75, "lakas": _75, "media": _75, "news": _75, "org": _75, "priv": _75, "reklam": _75, "sex": _75, "shop": _75, "sport": _75, "suli": _75, "szex": _75, "tm": _75, "tozsde": _75, "utazas": _75, "video": _75 }], "id": [1, { "ac": _75, "biz": _75, "co": _75, "desa": _75, "go": _75, "kop": _75, "mil": _75, "my": _75, "net": _75, "or": _75, "ponpes": _75, "sch": _75, "web": _75, "xn--9tfky": _75, "ᬩᬮᬶ": _75 }], "ie": _78, "il": [1, { "ac": _75, "co": _75, "gov": _75, "idf": _75, "k12": _75, "muni": _75, "net": _75, "org": _75 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _75, "xn--5dbhl8d": _75, "xn--8dbq2a": _75, "xn--hebda8b": _75 }], "ישראל": [1, { "אקדמיה": _75, "ישוב": _75, "צהל": _75, "ממשל": _75 }], "im": [1, { "ac": _75, "co": [1, { "ltd": _75, "plc": _75 }], "com": _75, "net": _75, "org": _75, "tt": _75, "tv": _75 }], "in": [1, { "5g": _75, "\
6g": _75, "ac": _75, "ai": _75, "am": _75, "bank": _75, "bihar": _75, "biz": _75, "business": _75, "ca": _75, "cn": _75, "co": _75, "com": _75, "coop": _75, "cs": _75, "delhi": _75, "dr": _75, "edu": _75, "er": _75, "fin": _75, "firm": _75, "gen": _75, "gov": _75, "gujarat": _75, "ind": _75, "info": _75, "int": _75, "internet": _75, "io": _75, "me": _75, "mil": _75, "net": _75, "nic": _75, "org": _75, "pg": _75, "post": _75, "pro": _75, "res": _75, "travel": _75, "tv": _75, "uk": _75, "up": _75, "us": _75 }], "info": _75, "int": [1, { "eu": _75 }], "io": _83, "iq": _76, "ir": [1, { "ac": _75, "co": _75, "gov": _75, "id": _75, "net": _75, "org": _75, "sch": _75, "xn--mgba3a4f16a": _75, "ایران": _75, "xn--mgba3a4fra": _75, "ايران": _75 }], "is": _75, "it": [1, { "edu": _75, "gov": _75, "abr": _75, "abruzzo": _75, "aosta-valley": _75, "aostavalley": _75, "bas": _75, "basilicata": _75, "cal": _75, "calabria": _75, "cam": _75, "campania": _75, "emilia-romagna": _75, "emiliaromagna": _75,
      "emr": _75, "friuli-v-giulia": _75, "friuli-ve-giulia": _75, "friuli-vegiulia": _75, "friuli-venezia-giulia": _75, "friuli-veneziagiulia": _75, "friuli-vgiulia": _75, "friuliv-giulia": _75, "friulive-giulia": _75, "friulivegiulia": _75, "friulivenezia-giulia": _75, "friuliveneziagiulia": _75, "friulivgiulia": _75, "fvg": _75, "laz": _75, "lazio": _75, "lig": _75, "liguria": _75, "lom": _75, "lombardia": _75, "lombardy": _75, "lucania": _75, "mar": _75, "marche": _75, "mol": _75, "molise": _75, "piedmont": _75, "piemonte": _75, "pmn": _75, "pug": _75, "puglia": _75, "sar": _75, "sardegna": _75, "sardinia": _75, "sic": _75, "sicilia": _75, "sicily": _75, "taa": _75, "tos": _75, "toscana": _75, "trentin-sud-tirol": _75, "xn--trentin-sd-tirol-rzb": _75, "trentin-süd-tirol": _75, "trentin-sudtirol": _75, "xn--trentin-sdtirol-7vb": _75, "trentin-südtirol": _75, "trentin-sued-tirol": _75, "trentin-suedtirol": _75, "trentino": _75, "trentino-a-adige": _75, "trentino-aadige": _75, "tren\
tino-alto-adige": _75, "trentino-altoadige": _75, "trentino-s-tirol": _75, "trentino-stirol": _75, "trentino-sud-tirol": _75, "xn--trentino-sd-tirol-c3b": _75, "trentino-süd-tirol": _75, "trentino-sudtirol": _75, "xn--trentino-sdtirol-szb": _75, "trentino-südtirol": _75, "trentino-sued-tirol": _75, "trentino-suedtirol": _75, "trentinoa-adige": _75, "trentinoaadige": _75, "trentinoalto-adige": _75, "trentinoaltoadige": _75, "trentinos-tirol": _75, "trentinostirol": _75, "trentinosud-tirol": _75, "xn--trentinosd-tirol-rzb": _75, "trentinosüd-tirol": _75, "trentinosudtirol": _75, "xn--trentinosdtirol-7vb": _75, "trentinosüdtirol": _75, "trentinosued-tirol": _75, "trentinosuedtirol": _75, "trentinsud-tirol": _75, "xn--trentinsd-tirol-6vb": _75, "trentinsüd-tirol": _75, "trentinsudtirol": _75, "xn--trentinsdtirol-nsb": _75, "trentinsüdtirol": _75, "trentinsued-tirol": _75, "trentinsuedtirol": _75, "tuscany": _75, "umb": _75, "umbria": _75, "val-d-aosta": _75, "val-daosta": _75, "vald-\
aosta": _75, "valdaosta": _75, "valle-aosta": _75, "valle-d-aosta": _75, "valle-daosta": _75, "valleaosta": _75, "valled-aosta": _75, "valledaosta": _75, "vallee-aoste": _75, "xn--valle-aoste-ebb": _75, "vallée-aoste": _75, "vallee-d-aoste": _75, "xn--valle-d-aoste-ehb": _75, "vallée-d-aoste": _75, "valleeaoste": _75, "xn--valleaoste-e7a": _75, "valléeaoste": _75, "valleedaoste": _75, "xn--valledaoste-ebb": _75, "valléedaoste": _75, "vao": _75, "vda": _75, "ven": _75, "veneto": _75, "ag": _75, "agrigento": _75, "al": _75, "alessandria": _75, "alto-adige": _75, "altoadige": _75, "an": _75, "ancona": _75, "andria-barletta-trani": _75, "andria-trani-barletta": _75, "andriabarlettatrani": _75, "andriatranibarletta": _75, "ao": _75, "aosta": _75, "aoste": _75, "ap": _75, "aq": _75, "aquila": _75, "ar": _75, "arezzo": _75, "ascoli-piceno": _75, "ascolipiceno": _75, "asti": _75, "at": _75, "av": _75, "avellino": _75, "ba": _75, "balsan": _75, "balsan-sudtirol": _75, "xn--balsan-sdtirol-ns\
b": _75, "balsan-südtirol": _75, "balsan-suedtirol": _75, "bari": _75, "barletta-trani-andria": _75, "barlettatraniandria": _75, "belluno": _75, "benevento": _75, "bergamo": _75, "bg": _75, "bi": _75, "biella": _75, "bl": _75, "bn": _75, "bo": _75, "bologna": _75, "bolzano": _75, "bolzano-altoadige": _75, "bozen": _75, "bozen-sudtirol": _75, "xn--bozen-sdtirol-2ob": _75, "bozen-südtirol": _75, "bozen-suedtirol": _75, "br": _75, "brescia": _75, "brindisi": _75, "bs": _75, "bt": _75, "bulsan": _75, "bulsan-sudtirol": _75, "xn--bulsan-sdtirol-nsb": _75, "bulsan-südtirol": _75, "bulsan-suedtirol": _75, "bz": _75, "ca": _75, "cagliari": _75, "caltanissetta": _75, "campidano-medio": _75, "campidanomedio": _75, "campobasso": _75, "carbonia-iglesias": _75, "carboniaiglesias": _75, "carrara-massa": _75, "carraramassa": _75, "caserta": _75, "catania": _75, "catanzaro": _75, "cb": _75, "ce": _75, "cesena-forli": _75, "xn--cesena-forl-mcb": _75, "cesena-forlì": _75, "cesenaforli": _75, "xn--ce\
senaforl-i8a": _75, "cesenaforlì": _75, "ch": _75, "chieti": _75, "ci": _75, "cl": _75, "cn": _75, "co": _75, "como": _75, "cosenza": _75, "cr": _75, "cremona": _75, "crotone": _75, "cs": _75, "ct": _75, "cuneo": _75, "cz": _75, "dell-ogliastra": _75, "dellogliastra": _75, "en": _75, "enna": _75, "fc": _75, "fe": _75, "fermo": _75, "ferrara": _75, "fg": _75, "fi": _75, "firenze": _75, "florence": _75, "fm": _75, "foggia": _75, "forli-cesena": _75, "xn--forl-cesena-fcb": _75, "forlì-cesena": _75, "forlicesena": _75, "xn--forlcesena-c8a": _75, "forlìcesena": _75, "fr": _75, "frosinone": _75, "ge": _75, "genoa": _75, "genova": _75, "go": _75, "gorizia": _75, "gr": _75, "grosseto": _75, "iglesias-carbonia": _75, "iglesiascarbonia": _75, "im": _75, "imperia": _75, "is": _75, "isernia": _75, "kr": _75, "la-spezia": _75, "laquila": _75, "laspezia": _75, "latina": _75, "lc": _75, "le": _75, "lecce": _75, "lecco": _75, "li": _75, "livorno": _75, "lo": _75, "lodi": _75, "lt": _75, "lu": _75, "\
lucca": _75, "macerata": _75, "mantova": _75, "massa-carrara": _75, "massacarrara": _75, "matera": _75, "mb": _75, "mc": _75, "me": _75, "medio-campidano": _75, "mediocampidano": _75, "messina": _75, "mi": _75, "milan": _75, "milano": _75, "mn": _75, "mo": _75, "modena": _75, "monza": _75, "monza-brianza": _75, "monza-e-della-brianza": _75, "monzabrianza": _75, "monzaebrianza": _75, "monzaedellabrianza": _75, "ms": _75, "mt": _75, "na": _75, "naples": _75, "napoli": _75, "no": _75, "novara": _75, "nu": _75, "nuoro": _75, "og": _75, "ogliastra": _75, "olbia-tempio": _75, "olbiatempio": _75, "or": _75, "oristano": _75, "ot": _75, "pa": _75, "padova": _75, "padua": _75, "palermo": _75, "parma": _75, "pavia": _75, "pc": _75, "pd": _75, "pe": _75, "perugia": _75, "pesaro-urbino": _75, "pesarourbino": _75, "pescara": _75, "pg": _75, "pi": _75, "piacenza": _75, "pisa": _75, "pistoia": _75, "pn": _75, "po": _75, "pordenone": _75, "potenza": _75, "pr": _75, "prato": _75, "pt": _75, "pu": _75, "\
pv": _75, "pz": _75, "ra": _75, "ragusa": _75, "ravenna": _75, "rc": _75, "re": _75, "reggio-calabria": _75, "reggio-emilia": _75, "reggiocalabria": _75, "reggioemilia": _75, "rg": _75, "ri": _75, "rieti": _75, "rimini": _75, "rm": _75, "rn": _75, "ro": _75, "roma": _75, "rome": _75, "rovigo": _75, "sa": _75, "salerno": _75, "sassari": _75, "savona": _75, "si": _75, "siena": _75, "siracusa": _75, "so": _75, "sondrio": _75, "sp": _75, "sr": _75, "ss": _75, "xn--sdtirol-n2a": _75, "südtirol": _75, "suedtirol": _75, "sv": _75, "ta": _75, "taranto": _75, "te": _75, "tempio-olbia": _75, "tempioolbia": _75, "teramo": _75, "terni": _75, "tn": _75, "to": _75, "torino": _75, "tp": _75, "tr": _75, "trani-andria-barletta": _75, "trani-barletta-andria": _75, "traniandriabarletta": _75, "tranibarlettaandria": _75, "trapani": _75, "trento": _75, "treviso": _75, "trieste": _75, "ts": _75, "turin": _75, "tv": _75, "ud": _75, "udine": _75, "urbino-pesaro": _75, "urbinopesaro": _75, "va": _75, "varese": _75,
      "vb": _75, "vc": _75, "ve": _75, "venezia": _75, "venice": _75, "verbania": _75, "vercelli": _75, "verona": _75, "vi": _75, "vibo-valentia": _75, "vibovalentia": _75, "vicenza": _75, "viterbo": _75, "vr": _75, "vs": _75, "vt": _75, "vv": _75 }], "je": _82, "jm": _79, "jo": [1, { "agri": _75, "ai": _75, "com": _75, "edu": _75, "eng": _75, "fm": _75, "gov": _75, "mil": _75, "net": _75, "org": _75, "per": _75, "phd": _75, "sch": _75, "tv": _75 }], "jobs": _75, "jp": [1, { "ac": _75, "ad": _75, "co": _75, "ed": _75, "go": _75, "gr": _75, "lg": _75, "ne": _75, "or": _75, "aichi": [1, { "aisai": _75, "ama": _75, "anjo": _75, "asuke": _75, "chiryu": _75, "chita": _75, "fuso": _75, "gamagori": _75, "handa": _75, "hazu": _75, "hekinan": _75, "higashiura": _75, "ichinomiya": _75, "inazawa": _75, "inuyama": _75, "isshiki": _75, "iwakura": _75, "kanie": _75, "kariya": _75, "kasugai": _75, "kira": _75, "kiyosu": _75, "komaki": _75, "konan": _75, "kota": _75, "mihama": _75, "miyoshi": _75, "ni\
shio": _75, "nisshin": _75, "obu": _75, "oguchi": _75, "oharu": _75, "okazaki": _75, "owariasahi": _75, "seto": _75, "shikatsu": _75, "shinshiro": _75, "shitara": _75, "tahara": _75, "takahama": _75, "tobishima": _75, "toei": _75, "togo": _75, "tokai": _75, "tokoname": _75, "toyoake": _75, "toyohashi": _75, "toyokawa": _75, "toyone": _75, "toyota": _75, "tsushima": _75, "yatomi": _75 }], "akita": [1, { "akita": _75, "daisen": _75, "fujisato": _75, "gojome": _75, "hachirogata": _75, "happou": _75, "higashinaruse": _75, "honjo": _75, "honjyo": _75, "ikawa": _75, "kamikoani": _75, "kamioka": _75, "katagami": _75, "kazuno": _75, "kitaakita": _75, "kosaka": _75, "kyowa": _75, "misato": _75, "mitane": _75, "moriyoshi": _75, "nikaho": _75, "noshiro": _75, "odate": _75, "oga": _75, "ogata": _75, "semboku": _75, "yokote": _75, "yurihonjo": _75 }], "aomori": [1, { "aomori": _75, "gonohe": _75, "hachinohe": _75, "hashikami": _75, "hiranai": _75, "hirosaki": _75, "itayanagi": _75, "kuroishi": _75,
      "misawa": _75, "mutsu": _75, "nakadomari": _75, "noheji": _75, "oirase": _75, "owani": _75, "rokunohe": _75, "sannohe": _75, "shichinohe": _75, "shingo": _75, "takko": _75, "towada": _75, "tsugaru": _75, "tsuruta": _75 }], "chiba": [1, { "abiko": _75, "asahi": _75, "chonan": _75, "chosei": _75, "choshi": _75, "chuo": _75, "funabashi": _75, "futtsu": _75, "hanamigawa": _75, "ichihara": _75, "ichikawa": _75, "ichinomiya": _75, "inzai": _75, "isumi": _75, "kamagaya": _75, "kamogawa": _75, "kashiwa": _75, "katori": _75, "katsuura": _75, "kimitsu": _75, "kisarazu": _75, "kozaki": _75, "kujukuri": _75, "kyonan": _75, "matsudo": _75, "midori": _75, "mihama": _75, "minamiboso": _75, "mobara": _75, "mutsuzawa": _75, "nagara": _75, "nagareyama": _75, "narashino": _75, "narita": _75, "noda": _75, "oamishirasato": _75, "omigawa": _75, "onjuku": _75, "otaki": _75, "sakae": _75, "sakura": _75, "shimofusa": _75, "shirako": _75, "shiroi": _75, "shisui": _75, "sodegaura": _75, "sosa": _75, "tako": _75,
      "tateyama": _75, "togane": _75, "tohnosho": _75, "tomisato": _75, "urayasu": _75, "yachimata": _75, "yachiyo": _75, "yokaichiba": _75, "yokoshibahikari": _75, "yotsukaido": _75 }], "ehime": [1, { "ainan": _75, "honai": _75, "ikata": _75, "imabari": _75, "iyo": _75, "kamijima": _75, "kihoku": _75, "kumakogen": _75, "masaki": _75, "matsuno": _75, "matsuyama": _75, "namikata": _75, "niihama": _75, "ozu": _75, "saijo": _75, "seiyo": _75, "shikokuchuo": _75, "tobe": _75, "toon": _75, "uchiko": _75, "uwajima": _75, "yawatahama": _75 }], "fukui": [1, { "echizen": _75, "eiheiji": _75, "fukui": _75, "ikeda": _75, "katsuyama": _75, "mihama": _75, "minamiechizen": _75, "obama": _75, "ohi": _75, "ono": _75, "sabae": _75, "sakai": _75, "takahama": _75, "tsuruga": _75, "wakasa": _75 }], "fukuoka": [1, { "ashiya": _75, "buzen": _75, "chikugo": _75, "chikuho": _75, "chikujo": _75, "chikushino": _75, "chikuzen": _75, "chuo": _75, "dazaifu": _75, "fukuchi": _75, "hakata": _75, "higashi": _75, "hir\
okawa": _75, "hisayama": _75, "iizuka": _75, "inatsuki": _75, "kaho": _75, "kasuga": _75, "kasuya": _75, "kawara": _75, "keisen": _75, "koga": _75, "kurate": _75, "kurogi": _75, "kurume": _75, "minami": _75, "miyako": _75, "miyama": _75, "miyawaka": _75, "mizumaki": _75, "munakata": _75, "nakagawa": _75, "nakama": _75, "nishi": _75, "nogata": _75, "ogori": _75, "okagaki": _75, "okawa": _75, "oki": _75, "omuta": _75, "onga": _75, "onojo": _75, "oto": _75, "saigawa": _75, "sasaguri": _75, "shingu": _75, "shinyoshitomi": _75, "shonai": _75, "soeda": _75, "sue": _75, "tachiarai": _75, "tagawa": _75, "takata": _75, "toho": _75, "toyotsu": _75, "tsuiki": _75, "ukiha": _75, "umi": _75, "usui": _75, "yamada": _75, "yame": _75, "yanagawa": _75, "yukuhashi": _75 }], "fukushima": [1, { "aizubange": _75, "aizumisato": _75, "aizuwakamatsu": _75, "asakawa": _75, "bandai": _75, "date": _75, "fukushima": _75, "furudono": _75, "futaba": _75, "hanawa": _75, "higashi": _75, "hirata": _75, "hirono": _75, "\
iitate": _75, "inawashiro": _75, "ishikawa": _75, "iwaki": _75, "izumizaki": _75, "kagamiishi": _75, "kaneyama": _75, "kawamata": _75, "kitakata": _75, "kitashiobara": _75, "koori": _75, "koriyama": _75, "kunimi": _75, "miharu": _75, "mishima": _75, "namie": _75, "nango": _75, "nishiaizu": _75, "nishigo": _75, "okuma": _75, "omotego": _75, "ono": _75, "otama": _75, "samegawa": _75, "shimogo": _75, "shirakawa": _75, "showa": _75, "soma": _75, "sukagawa": _75, "taishin": _75, "tamakawa": _75, "tanagura": _75, "tenei": _75, "yabuki": _75, "yamato": _75, "yamatsuri": _75, "yanaizu": _75, "yugawa": _75 }], "gifu": [1, { "anpachi": _75, "ena": _75, "gifu": _75, "ginan": _75, "godo": _75, "gujo": _75, "hashima": _75, "hichiso": _75, "hida": _75, "higashishirakawa": _75, "ibigawa": _75, "ikeda": _75, "kakamigahara": _75, "kani": _75, "kasahara": _75, "kasamatsu": _75, "kawaue": _75, "kitagata": _75, "mino": _75, "minokamo": _75, "mitake": _75, "mizunami": _75, "motosu": _75, "nakatsugawa": _75,
      "ogaki": _75, "sakahogi": _75, "seki": _75, "sekigahara": _75, "shirakawa": _75, "tajimi": _75, "takayama": _75, "tarui": _75, "toki": _75, "tomika": _75, "wanouchi": _75, "yamagata": _75, "yaotsu": _75, "yoro": _75 }], "gunma": [1, { "annaka": _75, "chiyoda": _75, "fujioka": _75, "higashiagatsuma": _75, "isesaki": _75, "itakura": _75, "kanna": _75, "kanra": _75, "katashina": _75, "kawaba": _75, "kiryu": _75, "kusatsu": _75, "maebashi": _75, "meiwa": _75, "midori": _75, "minakami": _75, "naganohara": _75, "nakanojo": _75, "nanmoku": _75, "numata": _75, "oizumi": _75, "ora": _75, "ota": _75, "shibukawa": _75, "shimonita": _75, "shinto": _75, "showa": _75, "takasaki": _75, "takayama": _75, "tamamura": _75, "tatebayashi": _75, "tomioka": _75, "tsukiyono": _75, "tsumagoi": _75, "ueno": _75, "yoshioka": _75 }], "hiroshima": [1, { "asaminami": _75, "daiwa": _75, "etajima": _75, "fuchu": _75, "fukuyama": _75, "hatsukaichi": _75, "higashihiroshima": _75, "hongo": _75, "jinsekikogen": _75,
      "kaita": _75, "kui": _75, "kumano": _75, "kure": _75, "mihara": _75, "miyoshi": _75, "naka": _75, "onomichi": _75, "osakikamijima": _75, "otake": _75, "saka": _75, "sera": _75, "seranishi": _75, "shinichi": _75, "shobara": _75, "takehara": _75 }], "hokkaido": [1, { "abashiri": _75, "abira": _75, "aibetsu": _75, "akabira": _75, "akkeshi": _75, "asahikawa": _75, "ashibetsu": _75, "ashoro": _75, "assabu": _75, "atsuma": _75, "bibai": _75, "biei": _75, "bifuka": _75, "bihoro": _75, "biratori": _75, "chippubetsu": _75, "chitose": _75, "date": _75, "ebetsu": _75, "embetsu": _75, "eniwa": _75, "erimo": _75, "esan": _75, "esashi": _75, "fukagawa": _75, "fukushima": _75, "furano": _75, "furubira": _75, "haboro": _75, "hakodate": _75, "hamatonbetsu": _75, "hidaka": _75, "higashikagura": _75, "higashikawa": _75, "hiroo": _75, "hokuryu": _75, "hokuto": _75, "honbetsu": _75, "horokanai": _75, "horonobe": _75, "ikeda": _75, "imakane": _75, "ishikari": _75, "iwamizawa": _75, "iwanai": _75, "kam\
ifurano": _75, "kamikawa": _75, "kamishihoro": _75, "kamisunagawa": _75, "kamoenai": _75, "kayabe": _75, "kembuchi": _75, "kikonai": _75, "kimobetsu": _75, "kitahiroshima": _75, "kitami": _75, "kiyosato": _75, "koshimizu": _75, "kunneppu": _75, "kuriyama": _75, "kuromatsunai": _75, "kushiro": _75, "kutchan": _75, "kyowa": _75, "mashike": _75, "matsumae": _75, "mikasa": _75, "minamifurano": _75, "mombetsu": _75, "moseushi": _75, "mukawa": _75, "muroran": _75, "naie": _75, "nakagawa": _75, "nakasatsunai": _75, "nakatombetsu": _75, "nanae": _75, "nanporo": _75, "nayoro": _75, "nemuro": _75, "niikappu": _75, "niki": _75, "nishiokoppe": _75, "noboribetsu": _75, "numata": _75, "obihiro": _75, "obira": _75, "oketo": _75, "okoppe": _75, "otaru": _75, "otobe": _75, "otofuke": _75, "otoineppu": _75, "oumu": _75, "ozora": _75, "pippu": _75, "rankoshi": _75, "rebun": _75, "rikubetsu": _75, "rishiri": _75, "rishirifuji": _75, "saroma": _75, "sarufutsu": _75, "shakotan": _75, "shari": _75, "shibecha": _75,
      "shibetsu": _75, "shikabe": _75, "shikaoi": _75, "shimamaki": _75, "shimizu": _75, "shimokawa": _75, "shinshinotsu": _75, "shintoku": _75, "shiranuka": _75, "shiraoi": _75, "shiriuchi": _75, "sobetsu": _75, "sunagawa": _75, "taiki": _75, "takasu": _75, "takikawa": _75, "takinoue": _75, "teshikaga": _75, "tobetsu": _75, "tohma": _75, "tomakomai": _75, "tomari": _75, "toya": _75, "toyako": _75, "toyotomi": _75, "toyoura": _75, "tsubetsu": _75, "tsukigata": _75, "urakawa": _75, "urausu": _75, "uryu": _75, "utashinai": _75, "wakkanai": _75, "wassamu": _75, "yakumo": _75, "yoichi": _75 }], "hyogo": [1, { "aioi": _75, "akashi": _75, "ako": _75, "amagasaki": _75, "aogaki": _75, "asago": _75, "ashiya": _75, "awaji": _75, "fukusaki": _75, "goshiki": _75, "harima": _75, "himeji": _75, "ichikawa": _75, "inagawa": _75, "itami": _75, "kakogawa": _75, "kamigori": _75, "kamikawa": _75, "kasai": _75, "kasuga": _75, "kawanishi": _75, "miki": _75, "minamiawaji": _75, "nishinomiya": _75, "nishiwaki": _75,
      "ono": _75, "sanda": _75, "sannan": _75, "sasayama": _75, "sayo": _75, "shingu": _75, "shinonsen": _75, "shiso": _75, "sumoto": _75, "taishi": _75, "taka": _75, "takarazuka": _75, "takasago": _75, "takino": _75, "tamba": _75, "tatsuno": _75, "toyooka": _75, "yabu": _75, "yashiro": _75, "yoka": _75, "yokawa": _75 }], "ibaraki": [1, { "ami": _75, "asahi": _75, "bando": _75, "chikusei": _75, "daigo": _75, "fujishiro": _75, "hitachi": _75, "hitachinaka": _75, "hitachiomiya": _75, "hitachiota": _75, "ibaraki": _75, "ina": _75, "inashiki": _75, "itako": _75, "iwama": _75, "joso": _75, "kamisu": _75, "kasama": _75, "kashima": _75, "kasumigaura": _75, "koga": _75, "miho": _75, "mito": _75, "moriya": _75, "naka": _75, "namegata": _75, "oarai": _75, "ogawa": _75, "omitama": _75, "ryugasaki": _75, "sakai": _75, "sakuragawa": _75, "shimodate": _75, "shimotsuma": _75, "shirosato": _75, "sowa": _75, "suifu": _75, "takahagi": _75, "tamatsukuri": _75, "tokai": _75, "tomobe": _75, "tone": _75, "t\
oride": _75, "tsuchiura": _75, "tsukuba": _75, "uchihara": _75, "ushiku": _75, "yachiyo": _75, "yamagata": _75, "yawara": _75, "yuki": _75 }], "ishikawa": [1, { "anamizu": _75, "hakui": _75, "hakusan": _75, "kaga": _75, "kahoku": _75, "kanazawa": _75, "kawakita": _75, "komatsu": _75, "nakanoto": _75, "nanao": _75, "nomi": _75, "nonoichi": _75, "noto": _75, "shika": _75, "suzu": _75, "tsubata": _75, "tsurugi": _75, "uchinada": _75, "wajima": _75 }], "iwate": [1, { "fudai": _75, "fujisawa": _75, "hanamaki": _75, "hiraizumi": _75, "hirono": _75, "ichinohe": _75, "ichinoseki": _75, "iwaizumi": _75, "iwate": _75, "joboji": _75, "kamaishi": _75, "kanegasaki": _75, "karumai": _75, "kawai": _75, "kitakami": _75, "kuji": _75, "kunohe": _75, "kuzumaki": _75, "miyako": _75, "mizusawa": _75, "morioka": _75, "ninohe": _75, "noda": _75, "ofunato": _75, "oshu": _75, "otsuchi": _75, "rikuzentakata": _75, "shiwa": _75, "shizukuishi": _75, "sumita": _75, "tanohata": _75, "tono": _75, "yahaba": _75, "yam\
ada": _75 }], "kagawa": [1, { "ayagawa": _75, "higashikagawa": _75, "kanonji": _75, "kotohira": _75, "manno": _75, "marugame": _75, "mitoyo": _75, "naoshima": _75, "sanuki": _75, "tadotsu": _75, "takamatsu": _75, "tonosho": _75, "uchinomi": _75, "utazu": _75, "zentsuji": _75 }], "kagoshima": [1, { "akune": _75, "amami": _75, "hioki": _75, "isa": _75, "isen": _75, "izumi": _75, "kagoshima": _75, "kanoya": _75, "kawanabe": _75, "kinko": _75, "kouyama": _75, "makurazaki": _75, "matsumoto": _75, "minamitane": _75, "nakatane": _75, "nishinoomote": _75, "satsumasendai": _75, "soo": _75, "tarumizu": _75, "yusui": _75 }], "kanagawa": [1, { "aikawa": _75, "atsugi": _75, "ayase": _75, "chigasaki": _75, "ebina": _75, "fujisawa": _75, "hadano": _75, "hakone": _75, "hiratsuka": _75, "isehara": _75, "kaisei": _75, "kamakura": _75, "kiyokawa": _75, "matsuda": _75, "minamiashigara": _75, "miura": _75, "nakai": _75, "ninomiya": _75, "odawara": _75, "oi": _75, "oiso": _75, "sagamihara": _75, "samukawa": _75,
      "tsukui": _75, "yamakita": _75, "yamato": _75, "yokosuka": _75, "yugawara": _75, "zama": _75, "zushi": _75 }], "kochi": [1, { "aki": _75, "geisei": _75, "hidaka": _75, "higashitsuno": _75, "ino": _75, "kagami": _75, "kami": _75, "kitagawa": _75, "kochi": _75, "mihara": _75, "motoyama": _75, "muroto": _75, "nahari": _75, "nakamura": _75, "nankoku": _75, "nishitosa": _75, "niyodogawa": _75, "ochi": _75, "okawa": _75, "otoyo": _75, "otsuki": _75, "sakawa": _75, "sukumo": _75, "susaki": _75, "tosa": _75, "tosashimizu": _75, "toyo": _75, "tsuno": _75, "umaji": _75, "yasuda": _75, "yusuhara": _75 }], "kumamoto": [1, { "amakusa": _75, "arao": _75, "aso": _75, "choyo": _75, "gyokuto": _75, "kamiamakusa": _75, "kikuchi": _75, "kumamoto": _75, "mashiki": _75, "mifune": _75, "minamata": _75, "minamioguni": _75, "nagasu": _75, "nishihara": _75, "oguni": _75, "ozu": _75, "sumoto": _75, "takamori": _75, "uki": _75, "uto": _75, "yamaga": _75, "yamato": _75, "yatsushiro": _75 }], "kyoto": [1, { "\
ayabe": _75, "fukuchiyama": _75, "higashiyama": _75, "ide": _75, "ine": _75, "joyo": _75, "kameoka": _75, "kamo": _75, "kita": _75, "kizu": _75, "kumiyama": _75, "kyotamba": _75, "kyotanabe": _75, "kyotango": _75, "maizuru": _75, "minami": _75, "minamiyamashiro": _75, "miyazu": _75, "muko": _75, "nagaokakyo": _75, "nakagyo": _75, "nantan": _75, "oyamazaki": _75, "sakyo": _75, "seika": _75, "tanabe": _75, "uji": _75, "ujitawara": _75, "wazuka": _75, "yamashina": _75, "yawata": _75 }], "mie": [1, { "asahi": _75, "inabe": _75, "ise": _75, "kameyama": _75, "kawagoe": _75, "kiho": _75, "kisosaki": _75, "kiwa": _75, "komono": _75, "kumano": _75, "kuwana": _75, "matsusaka": _75, "meiwa": _75, "mihama": _75, "minamiise": _75, "misugi": _75, "miyama": _75, "nabari": _75, "shima": _75, "suzuka": _75, "tado": _75, "taiki": _75, "taki": _75, "tamaki": _75, "toba": _75, "tsu": _75, "udono": _75, "ureshino": _75, "watarai": _75, "yokkaichi": _75 }], "miyagi": [1, { "furukawa": _75, "higashimatsushim\
a": _75, "ishinomaki": _75, "iwanuma": _75, "kakuda": _75, "kami": _75, "kawasaki": _75, "marumori": _75, "matsushima": _75, "minamisanriku": _75, "misato": _75, "murata": _75, "natori": _75, "ogawara": _75, "ohira": _75, "onagawa": _75, "osaki": _75, "rifu": _75, "semine": _75, "shibata": _75, "shichikashuku": _75, "shikama": _75, "shiogama": _75, "shiroishi": _75, "tagajo": _75, "taiwa": _75, "tome": _75, "tomiya": _75, "wakuya": _75, "watari": _75, "yamamoto": _75, "zao": _75 }], "miyazaki": [1, { "aya": _75, "ebino": _75, "gokase": _75, "hyuga": _75, "kadogawa": _75, "kawaminami": _75, "kijo": _75, "kitagawa": _75, "kitakata": _75, "kitaura": _75, "kobayashi": _75, "kunitomi": _75, "kushima": _75, "mimata": _75, "miyakonojo": _75, "miyazaki": _75, "morotsuka": _75, "nichinan": _75, "nishimera": _75, "nobeoka": _75, "saito": _75, "shiiba": _75, "shintomi": _75, "takaharu": _75, "takanabe": _75, "takazaki": _75, "tsuno": _75 }], "nagano": [1, { "achi": _75, "agematsu": _75, "anan": _75,
      "aoki": _75, "asahi": _75, "azumino": _75, "chikuhoku": _75, "chikuma": _75, "chino": _75, "fujimi": _75, "hakuba": _75, "hara": _75, "hiraya": _75, "iida": _75, "iijima": _75, "iiyama": _75, "iizuna": _75, "ikeda": _75, "ikusaka": _75, "ina": _75, "karuizawa": _75, "kawakami": _75, "kiso": _75, "kisofukushima": _75, "kitaaiki": _75, "komagane": _75, "komoro": _75, "matsukawa": _75, "matsumoto": _75, "miasa": _75, "minamiaiki": _75, "minamimaki": _75, "minamiminowa": _75, "minowa": _75, "miyada": _75, "miyota": _75, "mochizuki": _75, "nagano": _75, "nagawa": _75, "nagiso": _75, "nakagawa": _75, "nakano": _75, "nozawaonsen": _75, "obuse": _75, "ogawa": _75, "okaya": _75, "omachi": _75, "omi": _75, "ookuwa": _75, "ooshika": _75, "otaki": _75, "otari": _75, "sakae": _75, "sakaki": _75, "saku": _75, "sakuho": _75, "shimosuwa": _75, "shinanomachi": _75, "shiojiri": _75, "suwa": _75, "suzaka": _75, "takagi": _75, "takamori": _75, "takayama": _75, "tateshina": _75, "tatsuno": _75, "toga\
kushi": _75, "togura": _75, "tomi": _75, "ueda": _75, "wada": _75, "yamagata": _75, "yamanouchi": _75, "yasaka": _75, "yasuoka": _75 }], "nagasaki": [1, { "chijiwa": _75, "futsu": _75, "goto": _75, "hasami": _75, "hirado": _75, "iki": _75, "isahaya": _75, "kawatana": _75, "kuchinotsu": _75, "matsuura": _75, "nagasaki": _75, "obama": _75, "omura": _75, "oseto": _75, "saikai": _75, "sasebo": _75, "seihi": _75, "shimabara": _75, "shinkamigoto": _75, "togitsu": _75, "tsushima": _75, "unzen": _75 }], "nara": [1, { "ando": _75, "gose": _75, "heguri": _75, "higashiyoshino": _75, "ikaruga": _75, "ikoma": _75, "kamikitayama": _75, "kanmaki": _75, "kashiba": _75, "kashihara": _75, "katsuragi": _75, "kawai": _75, "kawakami": _75, "kawanishi": _75, "koryo": _75, "kurotaki": _75, "mitsue": _75, "miyake": _75, "nara": _75, "nosegawa": _75, "oji": _75, "ouda": _75, "oyodo": _75, "sakurai": _75, "sango": _75, "shimoichi": _75, "shimokitayama": _75, "shinjo": _75, "soni": _75, "takatori": _75, "tawaram\
oto": _75, "tenkawa": _75, "tenri": _75, "uda": _75, "yamatokoriyama": _75, "yamatotakada": _75, "yamazoe": _75, "yoshino": _75 }], "niigata": [1, { "aga": _75, "agano": _75, "gosen": _75, "itoigawa": _75, "izumozaki": _75, "joetsu": _75, "kamo": _75, "kariwa": _75, "kashiwazaki": _75, "minamiuonuma": _75, "mitsuke": _75, "muika": _75, "murakami": _75, "myoko": _75, "nagaoka": _75, "niigata": _75, "ojiya": _75, "omi": _75, "sado": _75, "sanjo": _75, "seiro": _75, "seirou": _75, "sekikawa": _75, "shibata": _75, "tagami": _75, "tainai": _75, "tochio": _75, "tokamachi": _75, "tsubame": _75, "tsunan": _75, "uonuma": _75, "yahiko": _75, "yoita": _75, "yuzawa": _75 }], "oita": [1, { "beppu": _75, "bungoono": _75, "bungotakada": _75, "hasama": _75, "hiji": _75, "himeshima": _75, "hita": _75, "kamitsue": _75, "kokonoe": _75, "kuju": _75, "kunisaki": _75, "kusu": _75, "oita": _75, "saiki": _75, "taketa": _75, "tsukumi": _75, "usa": _75, "usuki": _75, "yufu": _75 }], "okayama": [1, { "akaiwa": _75,
      "asakuchi": _75, "bizen": _75, "hayashima": _75, "ibara": _75, "kagamino": _75, "kasaoka": _75, "kibichuo": _75, "kumenan": _75, "kurashiki": _75, "maniwa": _75, "misaki": _75, "nagi": _75, "niimi": _75, "nishiawakura": _75, "okayama": _75, "satosho": _75, "setouchi": _75, "shinjo": _75, "shoo": _75, "soja": _75, "takahashi": _75, "tamano": _75, "tsuyama": _75, "wake": _75, "yakage": _75 }], "okinawa": [1, { "aguni": _75, "ginowan": _75, "ginoza": _75, "gushikami": _75, "haebaru": _75, "higashi": _75, "hirara": _75, "iheya": _75, "ishigaki": _75, "ishikawa": _75, "itoman": _75, "izena": _75, "kadena": _75, "kin": _75, "kitadaito": _75, "kitanakagusuku": _75, "kumejima": _75, "kunigami": _75, "minamidaito": _75, "motobu": _75, "nago": _75, "naha": _75, "nakagusuku": _75, "nakijin": _75, "nanjo": _75, "nishihara": _75, "ogimi": _75, "okinawa": _75, "onna": _75, "shimoji": _75, "taketomi": _75, "tarama": _75, "tokashiki": _75, "tomigusuku": _75, "tonaki": _75, "urasoe": _75, "uruma": _75,
      "yaese": _75, "yomitan": _75, "yonabaru": _75, "yonaguni": _75, "zamami": _75 }], "osaka": [1, { "abeno": _75, "chihayaakasaka": _75, "chuo": _75, "daito": _75, "fujiidera": _75, "habikino": _75, "hannan": _75, "higashiosaka": _75, "higashisumiyoshi": _75, "higashiyodogawa": _75, "hirakata": _75, "ibaraki": _75, "ikeda": _75, "izumi": _75, "izumiotsu": _75, "izumisano": _75, "kadoma": _75, "kaizuka": _75, "kanan": _75, "kashiwara": _75, "katano": _75, "kawachinagano": _75, "kishiwada": _75, "kita": _75, "kumatori": _75, "matsubara": _75, "minato": _75, "minoh": _75, "misaki": _75, "moriguchi": _75, "neyagawa": _75, "nishi": _75, "nose": _75, "osakasayama": _75, "sakai": _75, "sayama": _75, "sennan": _75, "settsu": _75, "shijonawate": _75, "shimamoto": _75, "suita": _75, "tadaoka": _75, "taishi": _75, "tajiri": _75, "takaishi": _75, "takatsuki": _75, "tondabayashi": _75, "toyonaka": _75, "toyono": _75, "yao": _75 }], "saga": [1, { "ariake": _75, "arita": _75, "fukudomi": _75, "gen\
kai": _75, "hamatama": _75, "hizen": _75, "imari": _75, "kamimine": _75, "kanzaki": _75, "karatsu": _75, "kashima": _75, "kitagata": _75, "kitahata": _75, "kiyama": _75, "kouhoku": _75, "kyuragi": _75, "nishiarita": _75, "ogi": _75, "omachi": _75, "ouchi": _75, "saga": _75, "shiroishi": _75, "taku": _75, "tara": _75, "tosu": _75, "yoshinogari": _75 }], "saitama": [1, { "arakawa": _75, "asaka": _75, "chichibu": _75, "fujimi": _75, "fujimino": _75, "fukaya": _75, "hanno": _75, "hanyu": _75, "hasuda": _75, "hatogaya": _75, "hatoyama": _75, "hidaka": _75, "higashichichibu": _75, "higashimatsuyama": _75, "honjo": _75, "ina": _75, "iruma": _75, "iwatsuki": _75, "kamiizumi": _75, "kamikawa": _75, "kamisato": _75, "kasukabe": _75, "kawagoe": _75, "kawaguchi": _75, "kawajima": _75, "kazo": _75, "kitamoto": _75, "koshigaya": _75, "kounosu": _75, "kuki": _75, "kumagaya": _75, "matsubushi": _75, "minano": _75, "misato": _75, "miyashiro": _75, "miyoshi": _75, "moroyama": _75, "nagatoro": _75, "name\
gawa": _75, "niiza": _75, "ogano": _75, "ogawa": _75, "ogose": _75, "okegawa": _75, "omiya": _75, "otaki": _75, "ranzan": _75, "ryokami": _75, "saitama": _75, "sakado": _75, "satte": _75, "sayama": _75, "shiki": _75, "shiraoka": _75, "soka": _75, "sugito": _75, "toda": _75, "tokigawa": _75, "tokorozawa": _75, "tsurugashima": _75, "urawa": _75, "warabi": _75, "yashio": _75, "yokoze": _75, "yono": _75, "yorii": _75, "yoshida": _75, "yoshikawa": _75, "yoshimi": _75 }], "shiga": [1, { "aisho": _75, "gamo": _75, "higashiomi": _75, "hikone": _75, "koka": _75, "konan": _75, "kosei": _75, "koto": _75, "kusatsu": _75, "maibara": _75, "moriyama": _75, "nagahama": _75, "nishiazai": _75, "notogawa": _75, "omihachiman": _75, "otsu": _75, "ritto": _75, "ryuoh": _75, "takashima": _75, "takatsuki": _75, "torahime": _75, "toyosato": _75, "yasu": _75 }], "shimane": [1, { "akagi": _75, "ama": _75, "gotsu": _75, "hamada": _75, "higashiizumo": _75, "hikawa": _75, "hikimi": _75, "izumo": _75, "kakinoki": _75,
      "masuda": _75, "matsue": _75, "misato": _75, "nishinoshima": _75, "ohda": _75, "okinoshima": _75, "okuizumo": _75, "shimane": _75, "tamayu": _75, "tsuwano": _75, "unnan": _75, "yakumo": _75, "yasugi": _75, "yatsuka": _75 }], "shizuoka": [1, { "arai": _75, "atami": _75, "fuji": _75, "fujieda": _75, "fujikawa": _75, "fujinomiya": _75, "fukuroi": _75, "gotemba": _75, "haibara": _75, "hamamatsu": _75, "higashiizu": _75, "ito": _75, "iwata": _75, "izu": _75, "izunokuni": _75, "kakegawa": _75, "kannami": _75, "kawanehon": _75, "kawazu": _75, "kikugawa": _75, "kosai": _75, "makinohara": _75, "matsuzaki": _75, "minamiizu": _75, "mishima": _75, "morimachi": _75, "nishiizu": _75, "numazu": _75, "omaezaki": _75, "shimada": _75, "shimizu": _75, "shimoda": _75, "shizuoka": _75, "susono": _75, "yaizu": _75, "yoshida": _75 }], "tochigi": [1, { "ashikaga": _75, "bato": _75, "haga": _75, "ichikai": _75, "iwafune": _75, "kaminokawa": _75, "kanuma": _75, "karasuyama": _75, "kuroiso": _75, "mashiko": _75,
      "mibu": _75, "moka": _75, "motegi": _75, "nasu": _75, "nasushiobara": _75, "nikko": _75, "nishikata": _75, "nogi": _75, "ohira": _75, "ohtawara": _75, "oyama": _75, "sakura": _75, "sano": _75, "shimotsuke": _75, "shioya": _75, "takanezawa": _75, "tochigi": _75, "tsuga": _75, "ujiie": _75, "utsunomiya": _75, "yaita": _75 }], "tokushima": [1, { "aizumi": _75, "anan": _75, "ichiba": _75, "itano": _75, "kainan": _75, "komatsushima": _75, "matsushige": _75, "mima": _75, "minami": _75, "miyoshi": _75, "mugi": _75, "nakagawa": _75, "naruto": _75, "sanagochi": _75, "shishikui": _75, "tokushima": _75, "wajiki": _75 }], "tokyo": [1, { "adachi": _75, "akiruno": _75, "akishima": _75, "aogashima": _75, "arakawa": _75, "bunkyo": _75, "chiyoda": _75, "chofu": _75, "chuo": _75, "edogawa": _75, "fuchu": _75, "fussa": _75, "hachijo": _75, "hachioji": _75, "hamura": _75, "higashikurume": _75, "higashimurayama": _75, "higashiyamato": _75, "hino": _75, "hinode": _75, "hinohara": _75, "inagi": _75, "i\
tabashi": _75, "katsushika": _75, "kita": _75, "kiyose": _75, "kodaira": _75, "koganei": _75, "kokubunji": _75, "komae": _75, "koto": _75, "kouzushima": _75, "kunitachi": _75, "machida": _75, "meguro": _75, "minato": _75, "mitaka": _75, "mizuho": _75, "musashimurayama": _75, "musashino": _75, "nakano": _75, "nerima": _75, "ogasawara": _75, "okutama": _75, "ome": _75, "oshima": _75, "ota": _75, "setagaya": _75, "shibuya": _75, "shinagawa": _75, "shinjuku": _75, "suginami": _75, "sumida": _75, "tachikawa": _75, "taito": _75, "tama": _75, "toshima": _75 }], "tottori": [1, { "chizu": _75, "hino": _75, "kawahara": _75, "koge": _75, "kotoura": _75, "misasa": _75, "nanbu": _75, "nichinan": _75, "sakaiminato": _75, "tottori": _75, "wakasa": _75, "yazu": _75, "yonago": _75 }], "toyama": [1, { "asahi": _75, "fuchu": _75, "fukumitsu": _75, "funahashi": _75, "himi": _75, "imizu": _75, "inami": _75, "johana": _75, "kamiichi": _75, "kurobe": _75, "nakaniikawa": _75, "namerikawa": _75, "nanto": _75, "\
nyuzen": _75, "oyabe": _75, "taira": _75, "takaoka": _75, "tateyama": _75, "toga": _75, "tonami": _75, "toyama": _75, "unazuki": _75, "uozu": _75, "yamada": _75 }], "wakayama": [1, { "arida": _75, "aridagawa": _75, "gobo": _75, "hashimoto": _75, "hidaka": _75, "hirogawa": _75, "inami": _75, "iwade": _75, "kainan": _75, "kamitonda": _75, "katsuragi": _75, "kimino": _75, "kinokawa": _75, "kitayama": _75, "koya": _75, "koza": _75, "kozagawa": _75, "kudoyama": _75, "kushimoto": _75, "mihama": _75, "misato": _75, "nachikatsuura": _75, "shingu": _75, "shirahama": _75, "taiji": _75, "tanabe": _75, "wakayama": _75, "yuasa": _75, "yura": _75 }], "yamagata": [1, { "asahi": _75, "funagata": _75, "higashine": _75, "iide": _75, "kahoku": _75, "kaminoyama": _75, "kaneyama": _75, "kawanishi": _75, "mamurogawa": _75, "mikawa": _75, "murayama": _75, "nagai": _75, "nakayama": _75, "nanyo": _75, "nishikawa": _75, "obanazawa": _75, "oe": _75, "oguni": _75, "ohkura": _75, "oishida": _75, "sagae": _75, "sak\
ata": _75, "sakegawa": _75, "shinjo": _75, "shirataka": _75, "shonai": _75, "takahata": _75, "tendo": _75, "tozawa": _75, "tsuruoka": _75, "yamagata": _75, "yamanobe": _75, "yonezawa": _75, "yuza": _75 }], "yamaguchi": [1, { "abu": _75, "hagi": _75, "hikari": _75, "hofu": _75, "iwakuni": _75, "kudamatsu": _75, "mitou": _75, "nagato": _75, "oshima": _75, "shimonoseki": _75, "shunan": _75, "tabuse": _75, "tokuyama": _75, "toyota": _75, "ube": _75, "yuu": _75 }], "yamanashi": [1, { "chuo": _75, "doshi": _75, "fuefuki": _75, "fujikawa": _75, "fujikawaguchiko": _75, "fujiyoshida": _75, "hayakawa": _75, "hokuto": _75, "ichikawamisato": _75, "kai": _75, "kofu": _75, "koshu": _75, "kosuge": _75, "minami-alps": _75, "minobu": _75, "nakamichi": _75, "nanbu": _75, "narusawa": _75, "nirasaki": _75, "nishikatsura": _75, "oshino": _75, "otsuki": _75, "showa": _75, "tabayama": _75, "tsuru": _75, "uenohara": _75, "yamanakako": _75, "yamanashi": _75 }], "xn--ehqz56n": _75, "三重": _75, "xn--1lqs03n": _75,
      "京都": _75, "xn--qqqt11m": _75, "佐賀": _75, "xn--f6qx53a": _75, "兵庫": _75, "xn--djrs72d6uy": _75, "北海道": _75, "xn--mkru45i": _75, "千葉": _75, "xn--0trq7p7nn": _75, "和歌山": _75, "xn--5js045d": _75, "埼玉": _75, "xn--kbrq7o": _75, "大分": _75, "xn--pssu33l": _75, "大阪": _75, "xn--ntsq17g": _75, "奈良": _75, "xn--uisz3g": _75, "宮城": _75, "xn--6btw5a": _75, "宮崎": _75, "xn--1ctwo": _75, "富山": _75, "xn--6orx2r": _75, "山口": _75, "xn--rht61e": _75, "山形": _75, "xn--rht27z": _75, "山梨": _75, "xn--nit225k": _75, "岐阜": _75, "xn--rht3d": _75, "岡山": _75, "xn--djty4k": _75, "岩手": _75, "xn--klty5x": _75, "島根": _75, "xn--kltx9a": _75, "広島": _75, "xn--kltp7d": _75, "徳島": _75, "xn--c3s14m": _75, "愛媛": _75, "xn--vgu402c": _75, "愛知": _75, "xn--efvn9s": _75, "新潟": _75, "xn--1lqs71d": _75, "東京": _75, "xn--4pvxs": _75, "栃木": _75, "xn--uuwu58a": _75, "沖縄": _75, "xn--zbx025d": _75, "滋賀": _75, "xn--8\
pvr4u": _75, "熊本": _75, "xn--5rtp49c": _75, "石川": _75, "xn--ntso0iqx3a": _75, "神奈川": _75, "xn--elqq16h": _75, "福井": _75, "xn--4it168d": _75, "福岡": _75, "xn--klt787d": _75, "福島": _75, "xn--rny31h": _75, "秋田": _75, "xn--7t0a264c": _75, "群馬": _75, "xn--uist22h": _75, "茨城": _75, "xn--8ltr62k": _75, "長崎": _75, "xn--2m4a15e": _75, "長野": _75, "xn--32vp30h": _75, "青森": _75, "xn--4it797k": _75, "静岡": _75, "xn--5rtq34k": _75, "香川": _75, "xn--k7yn95e": _75, "高知": _75, "xn--tor131o": _75, "鳥取": _75, "xn--d5qv7z876c": _75, "鹿児島": _75, "kawasaki": _79, "kitakyushu": _79, "kobe": _79, "nagoya": _79, "sapporo": _79, "sendai": _79, "yokohama": _79 }], "ke": [1, { "ac": _75, "co": _75, "go": _75, "info": _75, "me": _75, "mobi": _75, "ne": _75, "or": _75, "sc": _75 }], "kg": _76, "kh": _77, "ki": _84, "km": [1, { "ass": _75, "com": _75, "edu": _75, "gov": _75, "mil": _75, "nom": _75, "org": _75, "prd": _75, "tm": _75, "asso": _75, "c\
oop": _75, "gouv": _75, "medecin": _75, "notaires": _75, "pharmaciens": _75, "presse": _75, "veterinaire": _75 }], "kn": [1, { "edu": _75, "gov": _75, "net": _75, "org": _75 }], "kp": [1, { "com": _75, "edu": _75, "gov": _75, "org": _75, "rep": _75, "tra": _75 }], "kr": [1, { "ac": _75, "ai": _75, "co": _75, "es": _75, "go": _75, "hs": _75, "io": _75, "it": _75, "kg": _75, "me": _75, "mil": _75, "ms": _75, "ne": _75, "or": _75, "pe": _75, "re": _75, "sc": _75, "busan": _75, "chungbuk": _75, "chungnam": _75, "daegu": _75, "daejeon": _75, "gangwon": _75, "gwangju": _75, "gyeongbuk": _75, "gyeonggi": _75, "gyeongnam": _75, "incheon": _75, "jeju": _75, "jeonbuk": _75, "jeonnam": _75, "seoul": _75, "ulsan": _75 }], "kw": [1, { "com": _75, "edu": _75, "emb": _75, "gov": _75, "ind": _75, "net": _75, "org": _75 }], "ky": _81, "kz": _76, "la": [1, { "com": _75, "edu": _75, "gov": _75, "info": _75, "int": _75, "net": _75, "org": _75, "per": _75 }], "lb": _77, "lc": _80, "li": _75, "lk": [1, { "a\
c": _75, "assn": _75, "com": _75, "edu": _75, "gov": _75, "grp": _75, "hotel": _75, "int": _75, "ltd": _75, "net": _75, "ngo": _75, "org": _75, "sch": _75, "soc": _75, "web": _75 }], "lr": _77, "ls": [1, { "ac": _75, "biz": _75, "co": _75, "edu": _75, "gov": _75, "info": _75, "net": _75, "org": _75, "sc": _75 }], "lt": _78, "lu": _75, "lv": [1, { "asn": _75, "com": _75, "conf": _75, "edu": _75, "gov": _75, "id": _75, "mil": _75, "net": _75, "org": _75 }], "ly": [1, { "com": _75, "edu": _75, "gov": _75, "id": _75, "med": _75, "net": _75, "org": _75, "plc": _75, "sch": _75 }], "ma": [1, { "ac": _75, "co": _75, "gov": _75, "net": _75, "org": _75, "press": _75 }], "mc": [1, { "asso": _75, "tm": _75 }], "md": _75, "me": [1, { "ac": _75, "co": _75, "edu": _75, "gov": _75, "its": _75, "net": _75, "org": _75, "priv": _75 }], "mg": [1, { "co": _75, "com": _75, "edu": _75, "gov": _75, "mil": _75, "nom": _75, "org": _75, "prd": _75 }], "mh": _75, "mil": _75, "mk": [1, { "com": _75, "edu": _75, "g\
ov": _75, "inf": _75, "name": _75, "net": _75, "org": _75 }], "ml": [1, { "ac": _75, "art": _75, "asso": _75, "com": _75, "edu": _75, "gouv": _75, "gov": _75, "info": _75, "inst": _75, "net": _75, "org": _75, "pr": _75, "presse": _75 }], "mm": _79, "mn": [1, { "edu": _75, "gov": _75, "org": _75 }], "mo": _77, "mobi": _75, "mp": _75, "mq": _75, "mr": _78, "ms": _77, "mt": _81, "mu": [1, { "ac": _75, "co": _75, "com": _75, "gov": _75, "net": _75, "or": _75, "org": _75 }], "museum": _75, "mv": [1, { "aero": _75, "biz": _75, "com": _75, "coop": _75, "edu": _75, "gov": _75, "info": _75, "int": _75, "mil": _75, "museum": _75, "name": _75, "net": _75, "org": _75, "pro": _75 }], "mw": [1, { "ac": _75, "biz": _75, "co": _75, "com": _75, "coop": _75, "edu": _75, "gov": _75, "int": _75, "net": _75, "org": _75 }], "mx": [1, { "com": _75, "edu": _75, "gob": _75, "net": _75, "org": _75 }], "my": [1, { "biz": _75, "com": _75, "edu": _75, "gov": _75, "mil": _75, "name": _75, "net": _75, "org": _75 }],
      "mz": [1, { "ac": _75, "adv": _75, "co": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "org": _75 }], "na": [1, { "alt": _75, "co": _75, "com": _75, "gov": _75, "net": _75, "org": _75 }], "name": _75, "nc": [1, { "asso": _75, "nom": _75 }], "ne": _75, "net": _75, "nf": [1, { "arts": _75, "com": _75, "firm": _75, "info": _75, "net": _75, "other": _75, "per": _75, "rec": _75, "store": _75, "web": _75 }], "ng": [1, { "com": _75, "edu": _75, "gov": _75, "i": _75, "mil": _75, "mobi": _75, "name": _75, "net": _75, "org": _75, "sch": _75 }], "ni": [1, { "ac": _75, "biz": _75, "co": _75, "com": _75, "edu": _75, "gob": _75, "in": _75, "info": _75, "int": _75, "mil": _75, "net": _75, "nom": _75, "org": _75, "web": _75 }], "nl": _75, "no": [1, { "fhs": _75, "folkebibl": _75, "fylkesbibl": _75, "idrett": _75, "museum": _75, "priv": _75, "vgs": _75, "dep": _75, "herad": _75, "kommune": _75, "mil": _75, "stat": _75, "aa": _85, "ah": _85, "bu": _85, "fm": _85, "hl": _85, "hm": _85, "jan-\
mayen": _85, "mr": _85, "nl": _85, "nt": _85, "of": _85, "ol": _85, "oslo": _85, "rl": _85, "sf": _85, "st": _85, "svalbard": _85, "tm": _85, "tr": _85, "va": _85, "vf": _85, "akrehamn": _75, "xn--krehamn-dxa": _75, "åkrehamn": _75, "algard": _75, "xn--lgrd-poac": _75, "ålgård": _75, "arna": _75, "bronnoysund": _75, "xn--brnnysund-m8ac": _75, "brønnøysund": _75, "brumunddal": _75, "bryne": _75, "drobak": _75, "xn--drbak-wua": _75, "drøbak": _75, "egersund": _75, "fetsund": _75, "floro": _75, "xn--flor-jra": _75, "florø": _75, "fredrikstad": _75, "hokksund": _75, "honefoss": _75, "xn--hnefoss-q1a": _75, "hønefoss": _75, "jessheim": _75, "jorpeland": _75, "xn--jrpeland-54a": _75, "jørpeland": _75, "kirkenes": _75, "kopervik": _75, "krokstadelva": _75, "langevag": _75, "xn--langevg-jxa": _75, "langevåg": _75, "leirvik": _75, "mjondalen": _75, "xn--mjndalen-64a": _75, "mjøndalen": _75, "mo-i-rana": _75, "mosjoen": _75, "xn--mosjen-eya": _75, "mosjøen": _75, "nesoddtangen": _75,
      "orkanger": _75, "osoyro": _75, "xn--osyro-wua": _75, "osøyro": _75, "raholt": _75, "xn--rholt-mra": _75, "råholt": _75, "sandnessjoen": _75, "xn--sandnessjen-ogb": _75, "sandnessjøen": _75, "skedsmokorset": _75, "slattum": _75, "spjelkavik": _75, "stathelle": _75, "stavern": _75, "stjordalshalsen": _75, "xn--stjrdalshalsen-sqb": _75, "stjørdalshalsen": _75, "tananger": _75, "tranby": _75, "vossevangen": _75, "aarborte": _75, "aejrie": _75, "afjord": _75, "xn--fjord-lra": _75, "åfjord": _75, "agdenes": _75, "akershus": _86, "aknoluokta": _75, "xn--koluokta-7ya57h": _75, "ákŋoluokta": _75, "al": _75, "xn--l-1fa": _75, "ål": _75, "alaheadju": _75, "xn--laheadju-7ya": _75, "álaheadju": _75, "alesund": _75, "xn--lesund-hua": _75, "ålesund": _75, "alstahaug": _75, "alta": _75, "xn--lt-liac": _75, "áltá": _75, "alvdal": _75, "amli": _75, "xn--mli-tla": _75, "åmli": _75, "amot": _75, "xn--mot-tla": _75, "åmot": _75, "andasuolo": _75, "andebu": _75, "andoy": _75, "xn--andy-\
ira": _75, "andøy": _75, "ardal": _75, "xn--rdal-poa": _75, "årdal": _75, "aremark": _75, "arendal": _75, "xn--s-1fa": _75, "ås": _75, "aseral": _75, "xn--seral-lra": _75, "åseral": _75, "asker": _75, "askim": _75, "askoy": _75, "xn--asky-ira": _75, "askøy": _75, "askvoll": _75, "asnes": _75, "xn--snes-poa": _75, "åsnes": _75, "audnedaln": _75, "aukra": _75, "aure": _75, "aurland": _75, "aurskog-holand": _75, "xn--aurskog-hland-jnb": _75, "aurskog-høland": _75, "austevoll": _75, "austrheim": _75, "averoy": _75, "xn--avery-yua": _75, "averøy": _75, "badaddja": _75, "xn--bdddj-mrabd": _75, "bådåddjå": _75, "xn--brum-voa": _75, "bærum": _75, "bahcavuotna": _75, "xn--bhcavuotna-s4a": _75, "báhcavuotna": _75, "bahccavuotna": _75, "xn--bhccavuotna-k7a": _75, "báhccavuotna": _75, "baidar": _75, "xn--bidr-5nac": _75, "báidár": _75, "bajddar": _75, "xn--bjddar-pta": _75, "bájddar": _75, "balat": _75, "xn--blt-elab": _75, "bálát": _75, "balestrand": _75, "ballangen": _75, "bal\
sfjord": _75, "bamble": _75, "bardu": _75, "barum": _75, "batsfjord": _75, "xn--btsfjord-9za": _75, "båtsfjord": _75, "bearalvahki": _75, "xn--bearalvhki-y4a": _75, "bearalváhki": _75, "beardu": _75, "beiarn": _75, "berg": _75, "bergen": _75, "berlevag": _75, "xn--berlevg-jxa": _75, "berlevåg": _75, "bievat": _75, "xn--bievt-0qa": _75, "bievát": _75, "bindal": _75, "birkenes": _75, "bjerkreim": _75, "bjugn": _75, "bodo": _75, "xn--bod-2na": _75, "bodø": _75, "bokn": _75, "bomlo": _75, "xn--bmlo-gra": _75, "bømlo": _75, "bremanger": _75, "bronnoy": _75, "xn--brnny-wuac": _75, "brønnøy": _75, "budejju": _75, "buskerud": _86, "bygland": _75, "bykle": _75, "cahcesuolo": _75, "xn--hcesuolo-7ya35b": _75, "čáhcesuolo": _75, "davvenjarga": _75, "xn--davvenjrga-y4a": _75, "davvenjárga": _75, "davvesiida": _75, "deatnu": _75, "dielddanuorri": _75, "divtasvuodna": _75, "divttasvuotna": _75, "donna": _75, "xn--dnna-gra": _75, "dønna": _75, "dovre": _75, "drammen": _75, "drangedal": _75,
      "dyroy": _75, "xn--dyry-ira": _75, "dyrøy": _75, "eid": _75, "eidfjord": _75, "eidsberg": _75, "eidskog": _75, "eidsvoll": _75, "eigersund": _75, "elverum": _75, "enebakk": _75, "engerdal": _75, "etne": _75, "etnedal": _75, "evenassi": _75, "xn--eveni-0qa01ga": _75, "evenášši": _75, "evenes": _75, "evje-og-hornnes": _75, "farsund": _75, "fauske": _75, "fedje": _75, "fet": _75, "finnoy": _75, "xn--finny-yua": _75, "finnøy": _75, "fitjar": _75, "fjaler": _75, "fjell": _75, "fla": _75, "xn--fl-zia": _75, "flå": _75, "flakstad": _75, "flatanger": _75, "flekkefjord": _75, "flesberg": _75, "flora": _75, "folldal": _75, "forde": _75, "xn--frde-gra": _75, "førde": _75, "forsand": _75, "fosnes": _75, "xn--frna-woa": _75, "fræna": _75, "frana": _75, "frei": _75, "frogn": _75, "froland": _75, "frosta": _75, "froya": _75, "xn--frya-hra": _75, "frøya": _75, "fuoisku": _75, "fuossko": _75, "fusa": _75, "fyresdal": _75, "gaivuotna": _75, "xn--givuotna-8ya": _75, "gáivuotna": _75, "gal\
sa": _75, "xn--gls-elac": _75, "gálsá": _75, "gamvik": _75, "gangaviika": _75, "xn--ggaviika-8ya47h": _75, "gáŋgaviika": _75, "gaular": _75, "gausdal": _75, "giehtavuoatna": _75, "gildeskal": _75, "xn--gildeskl-g0a": _75, "gildeskål": _75, "giske": _75, "gjemnes": _75, "gjerdrum": _75, "gjerstad": _75, "gjesdal": _75, "gjovik": _75, "xn--gjvik-wua": _75, "gjøvik": _75, "gloppen": _75, "gol": _75, "gran": _75, "grane": _75, "granvin": _75, "gratangen": _75, "grimstad": _75, "grong": _75, "grue": _75, "gulen": _75, "guovdageaidnu": _75, "ha": _75, "xn--h-2fa": _75, "hå": _75, "habmer": _75, "xn--hbmer-xqa": _75, "hábmer": _75, "hadsel": _75, "xn--hgebostad-g3a": _75, "hægebostad": _75, "hagebostad": _75, "halden": _75, "halsa": _75, "hamar": _75, "hamaroy": _75, "hammarfeasta": _75, "xn--hmmrfeasta-s4ac": _75, "hámmárfeasta": _75, "hammerfest": _75, "hapmir": _75, "xn--hpmir-xqa": _75, "hápmir": _75, "haram": _75, "hareid": _75, "harstad": _75, "hasvik": _75, "hattfjelldal": _75,
      "haugesund": _75, "hedmark": [0, { "os": _75, "valer": _75, "xn--vler-qoa": _75, "våler": _75 }], "hemne": _75, "hemnes": _75, "hemsedal": _75, "hitra": _75, "hjartdal": _75, "hjelmeland": _75, "hobol": _75, "xn--hobl-ira": _75, "hobøl": _75, "hof": _75, "hol": _75, "hole": _75, "holmestrand": _75, "holtalen": _75, "xn--holtlen-hxa": _75, "holtålen": _75, "hordaland": [0, { "os": _75 }], "hornindal": _75, "horten": _75, "hoyanger": _75, "xn--hyanger-q1a": _75, "høyanger": _75, "hoylandet": _75, "xn--hylandet-54a": _75, "høylandet": _75, "hurdal": _75, "hurum": _75, "hvaler": _75, "hyllestad": _75, "ibestad": _75, "inderoy": _75, "xn--indery-fya": _75, "inderøy": _75, "iveland": _75, "ivgu": _75, "jevnaker": _75, "jolster": _75, "xn--jlster-bya": _75, "jølster": _75, "jondal": _75, "kafjord": _75, "xn--kfjord-iua": _75, "kåfjord": _75, "karasjohka": _75, "xn--krjohka-hwab49j": _75, "kárášjohka": _75, "karasjok": _75, "karlsoy": _75, "karmoy": _75, "xn--karmy-yua": _75, "\
karmøy": _75, "kautokeino": _75, "klabu": _75, "xn--klbu-woa": _75, "klæbu": _75, "klepp": _75, "kongsberg": _75, "kongsvinger": _75, "kraanghke": _75, "xn--kranghke-b0a": _75, "kråanghke": _75, "kragero": _75, "xn--krager-gya": _75, "kragerø": _75, "kristiansand": _75, "kristiansund": _75, "krodsherad": _75, "xn--krdsherad-m8a": _75, "krødsherad": _75, "xn--kvfjord-nxa": _75, "kvæfjord": _75, "xn--kvnangen-k0a": _75, "kvænangen": _75, "kvafjord": _75, "kvalsund": _75, "kvam": _75, "kvanangen": _75, "kvinesdal": _75, "kvinnherad": _75, "kviteseid": _75, "kvitsoy": _75, "xn--kvitsy-fya": _75, "kvitsøy": _75, "laakesvuemie": _75, "xn--lrdal-sra": _75, "lærdal": _75, "lahppi": _75, "xn--lhppi-xqa": _75, "láhppi": _75, "lardal": _75, "larvik": _75, "lavagis": _75, "lavangen": _75, "leangaviika": _75, "xn--leagaviika-52b": _75, "leaŋgaviika": _75, "lebesby": _75, "leikanger": _75, "leirfjord": _75, "leka": _75, "leksvik": _75, "lenvik": _75, "lerdal": _75, "lesja": _75, "levanger": _75,
      "lier": _75, "lierne": _75, "lillehammer": _75, "lillesand": _75, "lindas": _75, "xn--linds-pra": _75, "lindås": _75, "lindesnes": _75, "loabat": _75, "xn--loabt-0qa": _75, "loabát": _75, "lodingen": _75, "xn--ldingen-q1a": _75, "lødingen": _75, "lom": _75, "loppa": _75, "lorenskog": _75, "xn--lrenskog-54a": _75, "lørenskog": _75, "loten": _75, "xn--lten-gra": _75, "løten": _75, "lund": _75, "lunner": _75, "luroy": _75, "xn--lury-ira": _75, "lurøy": _75, "luster": _75, "lyngdal": _75, "lyngen": _75, "malatvuopmi": _75, "xn--mlatvuopmi-s4a": _75, "málatvuopmi": _75, "malselv": _75, "xn--mlselv-iua": _75, "målselv": _75, "malvik": _75, "mandal": _75, "marker": _75, "marnardal": _75, "masfjorden": _75, "masoy": _75, "xn--msy-ula0h": _75, "måsøy": _75, "matta-varjjat": _75, "xn--mtta-vrjjat-k7af": _75, "mátta-várjjat": _75, "meland": _75, "meldal": _75, "melhus": _75, "meloy": _75, "xn--mely-ira": _75, "meløy": _75, "meraker": _75, "xn--merker-kua": _75, "meråker": _75,
      "midsund": _75, "midtre-gauldal": _75, "moareke": _75, "xn--moreke-jua": _75, "moåreke": _75, "modalen": _75, "modum": _75, "molde": _75, "more-og-romsdal": [0, { "heroy": _75, "sande": _75 }], "xn--mre-og-romsdal-qqb": [0, { "xn--hery-ira": _75, "sande": _75 }], "møre-og-romsdal": [0, { "herøy": _75, "sande": _75 }], "moskenes": _75, "moss": _75, "muosat": _75, "xn--muost-0qa": _75, "muosát": _75, "naamesjevuemie": _75, "xn--nmesjevuemie-tcba": _75, "nååmesjevuemie": _75, "xn--nry-yla5g": _75, "nærøy": _75, "namdalseid": _75, "namsos": _75, "namsskogan": _75, "nannestad": _75, "naroy": _75, "narviika": _75, "narvik": _75, "naustdal": _75, "navuotna": _75, "xn--nvuotna-hwa": _75, "návuotna": _75, "nedre-eiker": _75, "nesna": _75, "nesodden": _75, "nesseby": _75, "nesset": _75, "nissedal": _75, "nittedal": _75, "nord-aurdal": _75, "nord-fron": _75, "nord-odal": _75, "norddal": _75, "nordkapp": _75, "nordland": [0, { "bo": _75, "xn--b-5ga": _75, "bø": _75, "heroy": _75, "\
xn--hery-ira": _75, "herøy": _75 }], "nordre-land": _75, "nordreisa": _75, "nore-og-uvdal": _75, "notodden": _75, "notteroy": _75, "xn--nttery-byae": _75, "nøtterøy": _75, "odda": _75, "oksnes": _75, "xn--ksnes-uua": _75, "øksnes": _75, "omasvuotna": _75, "oppdal": _75, "oppegard": _75, "xn--oppegrd-ixa": _75, "oppegård": _75, "orkdal": _75, "orland": _75, "xn--rland-uua": _75, "ørland": _75, "orskog": _75, "xn--rskog-uua": _75, "ørskog": _75, "orsta": _75, "xn--rsta-fra": _75, "ørsta": _75, "osen": _75, "osteroy": _75, "xn--ostery-fya": _75, "osterøy": _75, "ostfold": [0, { "valer": _75 }], "xn--stfold-9xa": [0, { "xn--vler-qoa": _75 }], "østfold": [0, { "våler": _75 }], "ostre-toten": _75, "xn--stre-toten-zcb": _75, "østre-toten": _75, "overhalla": _75, "ovre-eiker": _75, "xn--vre-eiker-k8a": _75, "øvre-eiker": _75, "oyer": _75, "xn--yer-zna": _75, "øyer": _75, "oygarden": _75, "xn--ygarden-p1a": _75, "øygarden": _75, "oystre-slidre": _75, "xn--ystre-slidre-ujb": _75, "\
øystre-slidre": _75, "porsanger": _75, "porsangu": _75, "xn--porsgu-sta26f": _75, "porsáŋgu": _75, "porsgrunn": _75, "rade": _75, "xn--rde-ula": _75, "råde": _75, "radoy": _75, "xn--rady-ira": _75, "radøy": _75, "xn--rlingen-mxa": _75, "rælingen": _75, "rahkkeravju": _75, "xn--rhkkervju-01af": _75, "ráhkkerávju": _75, "raisa": _75, "xn--risa-5na": _75, "ráisa": _75, "rakkestad": _75, "ralingen": _75, "rana": _75, "randaberg": _75, "rauma": _75, "rendalen": _75, "rennebu": _75, "rennesoy": _75, "xn--rennesy-v1a": _75, "rennesøy": _75, "rindal": _75, "ringebu": _75, "ringerike": _75, "ringsaker": _75, "risor": _75, "xn--risr-ira": _75, "risør": _75, "rissa": _75, "roan": _75, "rodoy": _75, "xn--rdy-0nab": _75, "rødøy": _75, "rollag": _75, "romsa": _75, "romskog": _75, "xn--rmskog-bya": _75, "rømskog": _75, "roros": _75, "xn--rros-gra": _75, "røros": _75, "rost": _75, "xn--rst-0na": _75, "røst": _75, "royken": _75, "xn--ryken-vua": _75, "røyken": _75, "royrvik": _75, "xn-\
-ryrvik-bya": _75, "røyrvik": _75, "ruovat": _75, "rygge": _75, "salangen": _75, "salat": _75, "xn--slat-5na": _75, "sálat": _75, "xn--slt-elab": _75, "sálát": _75, "saltdal": _75, "samnanger": _75, "sandefjord": _75, "sandnes": _75, "sandoy": _75, "xn--sandy-yua": _75, "sandøy": _75, "sarpsborg": _75, "sauda": _75, "sauherad": _75, "sel": _75, "selbu": _75, "selje": _75, "seljord": _75, "siellak": _75, "sigdal": _75, "siljan": _75, "sirdal": _75, "skanit": _75, "xn--sknit-yqa": _75, "skánit": _75, "skanland": _75, "xn--sknland-fxa": _75, "skånland": _75, "skaun": _75, "skedsmo": _75, "ski": _75, "skien": _75, "skierva": _75, "xn--skierv-uta": _75, "skiervá": _75, "skiptvet": _75, "skjak": _75, "xn--skjk-soa": _75, "skjåk": _75, "skjervoy": _75, "xn--skjervy-v1a": _75, "skjervøy": _75, "skodje": _75, "smola": _75, "xn--smla-hra": _75, "smøla": _75, "snaase": _75, "xn--snase-nra": _75, "snåase": _75, "snasa": _75, "xn--snsa-roa": _75, "snåsa": _75, "snillfjord": _75, "snoas\
a": _75, "sogndal": _75, "sogne": _75, "xn--sgne-gra": _75, "søgne": _75, "sokndal": _75, "sola": _75, "solund": _75, "somna": _75, "xn--smna-gra": _75, "sømna": _75, "sondre-land": _75, "xn--sndre-land-0cb": _75, "søndre-land": _75, "songdalen": _75, "sor-aurdal": _75, "xn--sr-aurdal-l8a": _75, "sør-aurdal": _75, "sor-fron": _75, "xn--sr-fron-q1a": _75, "sør-fron": _75, "sor-odal": _75, "xn--sr-odal-q1a": _75, "sør-odal": _75, "sor-varanger": _75, "xn--sr-varanger-ggb": _75, "sør-varanger": _75, "sorfold": _75, "xn--srfold-bya": _75, "sørfold": _75, "sorreisa": _75, "xn--srreisa-q1a": _75, "sørreisa": _75, "sortland": _75, "sorum": _75, "xn--srum-gra": _75, "sørum": _75, "spydeberg": _75, "stange": _75, "stavanger": _75, "steigen": _75, "steinkjer": _75, "stjordal": _75, "xn--stjrdal-s1a": _75, "stjørdal": _75, "stokke": _75, "stor-elvdal": _75, "stord": _75, "stordal": _75, "storfjord": _75, "strand": _75, "stranda": _75, "stryn": _75, "sula": _75, "suldal": _75, "sund": _75,
      "sunndal": _75, "surnadal": _75, "sveio": _75, "svelvik": _75, "sykkylven": _75, "tana": _75, "telemark": [0, { "bo": _75, "xn--b-5ga": _75, "bø": _75 }], "time": _75, "tingvoll": _75, "tinn": _75, "tjeldsund": _75, "tjome": _75, "xn--tjme-hra": _75, "tjøme": _75, "tokke": _75, "tolga": _75, "tonsberg": _75, "xn--tnsberg-q1a": _75, "tønsberg": _75, "torsken": _75, "xn--trna-woa": _75, "træna": _75, "trana": _75, "tranoy": _75, "xn--trany-yua": _75, "tranøy": _75, "troandin": _75, "trogstad": _75, "xn--trgstad-r1a": _75, "trøgstad": _75, "tromsa": _75, "tromso": _75, "xn--troms-zua": _75, "tromsø": _75, "trondheim": _75, "trysil": _75, "tvedestrand": _75, "tydal": _75, "tynset": _75, "tysfjord": _75, "tysnes": _75, "xn--tysvr-vra": _75, "tysvær": _75, "tysvar": _75, "ullensaker": _75, "ullensvang": _75, "ulvik": _75, "unjarga": _75, "xn--unjrga-rta": _75, "unjárga": _75, "utsira": _75, "vaapste": _75, "vadso": _75, "xn--vads-jra": _75, "vadsø": _75, "xn--vry-yla5g": _75,
      "værøy": _75, "vaga": _75, "xn--vg-yiab": _75, "vågå": _75, "vagan": _75, "xn--vgan-qoa": _75, "vågan": _75, "vagsoy": _75, "xn--vgsy-qoa0j": _75, "vågsøy": _75, "vaksdal": _75, "valle": _75, "vang": _75, "vanylven": _75, "vardo": _75, "xn--vard-jra": _75, "vardø": _75, "varggat": _75, "xn--vrggt-xqad": _75, "várggát": _75, "varoy": _75, "vefsn": _75, "vega": _75, "vegarshei": _75, "xn--vegrshei-c0a": _75, "vegårshei": _75, "vennesla": _75, "verdal": _75, "verran": _75, "vestby": _75, "vestfold": [0, { "sande": _75 }], "vestnes": _75, "vestre-slidre": _75, "vestre-toten": _75, "vestvagoy": _75, "xn--vestvgy-ixa6o": _75, "vestvågøy": _75, "vevelstad": _75, "vik": _75, "vikna": _75, "vindafjord": _75, "voagat": _75, "volda": _75, "voss": _75 }], "np": _79, "nr": _84, "nu": _75, "nz": [1, { "ac": _75, "co": _75, "cri": _75, "geek": _75, "gen": _75, "govt": _75, "health": _75, "iwi": _75, "kiwi": _75, "maori": _75, "xn--mori-qsa": _75, "māori": _75, "mil": _75, "net": _75,
      "org": _75, "parliament": _75, "school": _75 }], "om": [1, { "co": _75, "com": _75, "edu": _75, "gov": _75, "med": _75, "museum": _75, "net": _75, "org": _75, "pro": _75 }], "onion": _75, "org": _75, "pa": [1, { "abo": _75, "ac": _75, "com": _75, "edu": _75, "gob": _75, "ing": _75, "med": _75, "net": _75, "nom": _75, "org": _75, "sld": _75 }], "pe": [1, { "com": _75, "edu": _75, "gob": _75, "mil": _75, "net": _75, "nom": _75, "org": _75 }], "pf": [1, { "com": _75, "edu": _75, "org": _75 }], "pg": _79, "ph": [1, { "com": _75, "edu": _75, "gov": _75, "i": _75, "mil": _75, "net": _75, "ngo": _75, "org": _75 }], "pk": [1, { "ac": _75, "biz": _75, "com": _75, "edu": _75, "fam": _75, "gkp": _75, "gob": _75, "gog": _75, "gok": _75, "gop": _75, "gos": _75, "gov": _75, "net": _75, "org": _75, "web": _75 }], "pl": [1, { "com": _75, "net": _75, "org": _75, "agro": _75, "aid": _75, "atm": _75, "auto": _75, "biz": _75, "edu": _75, "gmina": _75, "gsm": _75, "info": _75, "mail": _75, "media": _75,
      "miasta": _75, "mil": _75, "nieruchomosci": _75, "nom": _75, "pc": _75, "powiat": _75, "priv": _75, "realestate": _75, "rel": _75, "sex": _75, "shop": _75, "sklep": _75, "sos": _75, "szkola": _75, "targi": _75, "tm": _75, "tourism": _75, "travel": _75, "turystyka": _75, "gov": [1, { "ap": _75, "griw": _75, "ic": _75, "is": _75, "kmpsp": _75, "konsulat": _75, "kppsp": _75, "kwp": _75, "kwpsp": _75, "mup": _75, "mw": _75, "oia": _75, "oirm": _75, "oke": _75, "oow": _75, "oschr": _75, "oum": _75, "pa": _75, "pinb": _75, "piw": _75, "po": _75, "pr": _75, "psp": _75, "psse": _75, "pup": _75, "rzgw": _75, "sa": _75, "sdn": _75, "sko": _75, "so": _75, "sr": _75, "starostwo": _75, "ug": _75, "ugim": _75, "um": _75, "umig": _75, "upow": _75, "uppo": _75, "us": _75, "uw": _75, "uzs": _75, "wif": _75, "wiih": _75, "winb": _75, "wios": _75, "witd": _75, "wiw": _75, "wkz": _75, "wsa": _75, "wskr": _75, "wsse": _75, "wuoz": _75, "wzmiuw": _75, "zp": _75, "zpisdn": _75 }], "augustow": _75, "bab\
ia-gora": _75, "bedzin": _75, "beskidy": _75, "bialowieza": _75, "bialystok": _75, "bielawa": _75, "bieszczady": _75, "boleslawiec": _75, "bydgoszcz": _75, "bytom": _75, "cieszyn": _75, "czeladz": _75, "czest": _75, "dlugoleka": _75, "elblag": _75, "elk": _75, "glogow": _75, "gniezno": _75, "gorlice": _75, "grajewo": _75, "ilawa": _75, "jaworzno": _75, "jelenia-gora": _75, "jgora": _75, "kalisz": _75, "karpacz": _75, "kartuzy": _75, "kaszuby": _75, "katowice": _75, "kazimierz-dolny": _75, "kepno": _75, "ketrzyn": _75, "klodzko": _75, "kobierzyce": _75, "kolobrzeg": _75, "konin": _75, "konskowola": _75, "kutno": _75, "lapy": _75, "lebork": _75, "legnica": _75, "lezajsk": _75, "limanowa": _75, "lomza": _75, "lowicz": _75, "lubin": _75, "lukow": _75, "malbork": _75, "malopolska": _75, "mazowsze": _75, "mazury": _75, "mielec": _75, "mielno": _75, "mragowo": _75, "naklo": _75, "nowaruda": _75, "nysa": _75, "olawa": _75, "olecko": _75, "olkusz": _75, "olsztyn": _75, "opoczno": _75, "opole": _75,
      "ostroda": _75, "ostroleka": _75, "ostrowiec": _75, "ostrowwlkp": _75, "pila": _75, "pisz": _75, "podhale": _75, "podlasie": _75, "polkowice": _75, "pomorskie": _75, "pomorze": _75, "prochowice": _75, "pruszkow": _75, "przeworsk": _75, "pulawy": _75, "radom": _75, "rawa-maz": _75, "rybnik": _75, "rzeszow": _75, "sanok": _75, "sejny": _75, "skoczow": _75, "slask": _75, "slupsk": _75, "sosnowiec": _75, "stalowa-wola": _75, "starachowice": _75, "stargard": _75, "suwalki": _75, "swidnica": _75, "swiebodzin": _75, "swinoujscie": _75, "szczecin": _75, "szczytno": _75, "tarnobrzeg": _75, "tgory": _75, "turek": _75, "tychy": _75, "ustka": _75, "walbrzych": _75, "warmia": _75, "warszawa": _75, "waw": _75, "wegrow": _75, "wielun": _75, "wlocl": _75, "wloclawek": _75, "wodzislaw": _75, "wolomin": _75, "wroclaw": _75, "zachpomor": _75, "zagan": _75, "zarow": _75, "zgora": _75, "zgorzelec": _75 }], "pm": _75, "pn": [1, { "co": _75, "edu": _75, "gov": _75, "net": _75, "org": _75 }], "post": _75,
      "pr": [1, { "biz": _75, "com": _75, "edu": _75, "gov": _75, "info": _75, "isla": _75, "name": _75, "net": _75, "org": _75, "pro": _75, "ac": _75, "est": _75, "prof": _75 }], "pro": [1, { "aaa": _75, "aca": _75, "acct": _75, "avocat": _75, "bar": _75, "cpa": _75, "eng": _75, "jur": _75, "law": _75, "med": _75, "recht": _75 }], "ps": [1, { "com": _75, "edu": _75, "gov": _75, "net": _75, "org": _75, "plo": _75, "sec": _75 }], "pt": [1, { "com": _75, "edu": _75, "gov": _75, "int": _75, "net": _75, "nome": _75, "org": _75, "publ": _75 }], "pw": _78, "py": [1, { "com": _75, "coop": _75, "edu": _75, "gov": _75, "mil": _75, "net": _75, "org": _75 }], "qa": [1, { "com": _75, "edu": _75, "gov": _75, "mil": _75, "name": _75, "net": _75, "org": _75, "sch": _75 }], "re": [1, { "asso": _75, "com": _75 }], "ro": [1, { "arts": _75, "com": _75, "firm": _75, "info": _75, "nom": _75, "nt": _75, "org": _75, "rec": _75, "store": _75, "tm": _75, "www": _75 }], "rs": [1, { "ac": _75, "co": _75, "edu": _75,
      "gov": _75, "in": _75, "org": _75 }], "ru": _75, "rw": [1, { "ac": _75, "co": _75, "coop": _75, "gov": _75, "mil": _75, "net": _75, "org": _75 }], "sa": [1, { "com": _75, "edu": _75, "gov": _75, "med": _75, "net": _75, "org": _75, "pub": _75, "sch": _75 }], "sb": _77, "sc": _77, "sd": [1, { "com": _75, "edu": _75, "gov": _75, "info": _75, "med": _75, "net": _75, "org": _75, "tv": _75 }], "se": [1, { "a": _75, "ac": _75, "b": _75, "bd": _75, "brand": _75, "c": _75, "d": _75, "e": _75, "f": _75, "fh": _75, "fhsk": _75, "fhv": _75, "g": _75, "h": _75, "i": _75, "k": _75, "komforb": _75, "kommunalforbund": _75, "komvux": _75, "l": _75, "lanbib": _75, "m": _75, "n": _75, "naturbruksgymn": _75, "o": _75, "org": _75, "p": _75, "parti": _75, "pp": _75, "press": _75, "r": _75, "s": _75, "t": _75, "tm": _75, "u": _75, "w": _75, "x": _75, "y": _75, "z": _75 }], "sg": _77, "sh": [1, { "com": _75, "gov": _75, "mil": _75, "net": _75, "org": _75 }], "si": _75, "sj": _75, "sk": [1, { "org": _75 }],
      "sl": _77, "sm": _75, "sn": [1, { "art": _75, "com": _75, "edu": _75, "gouv": _75, "org": _75, "univ": _75 }], "so": [1, { "com": _75, "edu": _75, "gov": _75, "me": _75, "net": _75, "org": _75 }], "sr": _75, "ss": [1, { "biz": _75, "co": _75, "com": _75, "edu": _75, "gov": _75, "me": _75, "net": _75, "org": _75, "sch": _75 }], "st": [1, { "co": _75, "com": _75, "consulado": _75, "edu": _75, "embaixada": _75, "mil": _75, "net": _75, "org": _75, "principe": _75, "saotome": _75, "store": _75 }], "su": _75, "sv": [1, { "com": _75, "edu": _75, "gob": _75, "org": _75, "red": _75 }], "sx": _78, "sy": _76, "sz": [1, { "ac": _75, "co": _75, "org": _75 }], "tc": _75, "td": _75, "tel": _75, "tf": _75, "tg": _75, "th": [1, { "ac": _75, "co": _75, "go": _75, "in": _75, "mi": _75, "net": _75, "or": _75 }], "tj": [1, { "ac": _75, "biz": _75, "co": _75, "com": _75, "edu": _75, "go": _75, "gov": _75, "int": _75, "mil": _75, "name": _75, "net": _75, "nic": _75, "org": _75, "test": _75, "web": _75 }],
      "tk": _75, "tl": _78, "tm": _83, "tn": [1, { "com": _75, "ens": _75, "fin": _75, "gov": _75, "ind": _75, "info": _75, "intl": _75, "mincom": _75, "nat": _75, "net": _75, "org": _75, "perso": _75, "tourism": _75 }], "to": _76, "tr": [1, { "av": _75, "bbs": _75, "bel": _75, "biz": _75, "com": _75, "dr": _75, "edu": _75, "gen": _75, "gov": _75, "info": _75, "k12": _75, "kep": _75, "mil": _75, "name": _75, "net": _75, "org": _75, "pol": _75, "tel": _75, "tsk": _75, "tv": _75, "web": _75, "nc": _78 }], "tt": [1, { "biz": _75, "co": _75, "com": _75, "edu": _75, "gov": _75, "info": _75, "mil": _75, "name": _75, "net": _75, "org": _75, "pro": _75 }], "tv": _75, "tw": [1, { "club": _75, "com": _75, "ebiz": _75, "edu": _75, "game": _75, "gov": _75, "idv": _75, "mil": _75, "net": _75, "org": _75 }], "tz": [1, { "ac": _75, "co": _75, "go": _75, "hotel": _75, "info": _75, "me": _75, "mil": _75, "mobi": _75, "ne": _75, "or": _75, "sc": _75, "tv": _75 }], "ua": [1, { "com": _75, "edu": _75, "go\
v": _75, "in": _75, "net": _75, "org": _75, "cherkassy": _75, "cherkasy": _75, "chernigov": _75, "chernihiv": _75, "chernivtsi": _75, "chernovtsy": _75, "ck": _75, "cn": _75, "cr": _75, "crimea": _75, "cv": _75, "dn": _75, "dnepropetrovsk": _75, "dnipropetrovsk": _75, "donetsk": _75, "dp": _75, "if": _75, "ivano-frankivsk": _75, "kh": _75, "kharkiv": _75, "kharkov": _75, "kherson": _75, "khmelnitskiy": _75, "khmelnytskyi": _75, "kiev": _75, "kirovograd": _75, "km": _75, "kr": _75, "kropyvnytskyi": _75, "krym": _75, "ks": _75, "kv": _75, "kyiv": _75, "lg": _75, "lt": _75, "lugansk": _75, "luhansk": _75, "lutsk": _75, "lv": _75, "lviv": _75, "mk": _75, "mykolaiv": _75, "nikolaev": _75, "od": _75, "odesa": _75, "odessa": _75, "pl": _75, "poltava": _75, "rivne": _75, "rovno": _75, "rv": _75, "sb": _75, "sebastopol": _75, "sevastopol": _75, "sm": _75, "sumy": _75, "te": _75, "ternopil": _75, "uz": _75, "uzhgorod": _75, "uzhhorod": _75, "vinnica": _75, "vinnytsia": _75, "vn": _75, "volyn": _75,
      "yalta": _75, "zakarpattia": _75, "zaporizhzhe": _75, "zaporizhzhia": _75, "zhitomir": _75, "zhytomyr": _75, "zp": _75, "zt": _75 }], "ug": [1, { "ac": _75, "co": _75, "com": _75, "edu": _75, "go": _75, "gov": _75, "mil": _75, "ne": _75, "or": _75, "org": _75, "sc": _75, "us": _75 }], "uk": [1, { "ac": _75, "co": _75, "gov": _75, "ltd": _75, "me": _75, "net": _75, "nhs": _75, "org": _75, "plc": _75, "police": _75, "sch": _79 }], "us": [1, { "dni": _75, "isa": _75, "nsn": _75, "ak": _87, "al": _87, "ar": _87, "as": _87, "az": _87, "ca": _87, "co": _87, "ct": _87, "dc": _87, "de": _88, "fl": _87, "ga": _87, "gu": _87, "hi": _89, "ia": _87, "id": _87, "il": _87, "in": _87, "ks": _87, "ky": _87, "la": _87, "ma": [1, { "k12": [1, { "chtr": _75, "paroch": _75, "pvt": _75 }], "cc": _75, "lib": _75 }], "md": _87, "me": _87, "mi": [1, { "k12": _75, "cc": _75, "lib": _75, "ann-arbor": _75, "cog": _75, "dst": _75, "eaton": _75, "gen": _75, "mus": _75, "tec": _75, "washtenaw": _75 }], "mn": _87,
      "mo": _87, "ms": [1, { "k12": _75, "cc": _75 }], "mt": _87, "nc": _87, "nd": _89, "ne": _87, "nh": _87, "nj": _87, "nm": _87, "nv": _87, "ny": _87, "oh": _87, "ok": _87, "or": _87, "pa": _87, "pr": _87, "ri": _89, "sc": _87, "sd": _89, "tn": _87, "tx": _87, "ut": _87, "va": _87, "vi": _87, "vt": _87, "wa": _87, "wi": _87, "wv": _88, "wy": _87 }], "uy": [1, { "com": _75, "edu": _75, "gub": _75, "mil": _75, "net": _75, "org": _75 }], "uz": [1, { "co": _75, "com": _75, "net": _75, "org": _75 }], "va": _75, "vc": _76, "ve": [1, { "arts": _75, "bib": _75, "co": _75, "com": _75, "e12": _75, "edu": _75, "emprende": _75, "firm": _75, "gob": _75, "gov": _75, "ia": _75, "info": _75, "int": _75, "mil": _75, "net": _75, "nom": _75, "org": _75, "rar": _75, "rec": _75, "store": _75, "tec": _75, "web": _75 }], "vg": [1, { "edu": _75 }], "vi": [1, { "co": _75, "com": _75, "k12": _75, "net": _75, "org": _75 }], "vn": [1, { "ac": _75, "ai": _75, "biz": _75, "com": _75, "edu": _75, "gov": _75, "hea\
lth": _75, "id": _75, "info": _75, "int": _75, "io": _75, "name": _75, "net": _75, "org": _75, "pro": _75, "angiang": _75, "bacgiang": _75, "backan": _75, "baclieu": _75, "bacninh": _75, "baria-vungtau": _75, "bentre": _75, "binhdinh": _75, "binhduong": _75, "binhphuoc": _75, "binhthuan": _75, "camau": _75, "cantho": _75, "caobang": _75, "daklak": _75, "daknong": _75, "danang": _75, "dienbien": _75, "dongnai": _75, "dongthap": _75, "gialai": _75, "hagiang": _75, "haiduong": _75, "haiphong": _75, "hanam": _75, "hanoi": _75, "hatinh": _75, "haugiang": _75, "hoabinh": _75, "hue": _75, "hungyen": _75, "khanhhoa": _75, "kiengiang": _75, "kontum": _75, "laichau": _75, "lamdong": _75, "langson": _75, "laocai": _75, "longan": _75, "namdinh": _75, "nghean": _75, "ninhbinh": _75, "ninhthuan": _75, "phutho": _75, "phuyen": _75, "quangbinh": _75, "quangnam": _75, "quangngai": _75, "quangninh": _75, "quangtri": _75, "soctrang": _75, "sonla": _75, "tayninh": _75, "thaibinh": _75, "thainguyen": _75, "\
thanhhoa": _75, "thanhphohochiminh": _75, "thuathienhue": _75, "tiengiang": _75, "travinh": _75, "tuyenquang": _75, "vinhlong": _75, "vinhphuc": _75, "yenbai": _75 }], "vu": _81, "wf": _75, "ws": _77, "yt": _75, "xn--mgbaam7a8h": _75, "امارات": _75, "xn--y9a3aq": _75, "հայ": _75, "xn--54b7fta0cc": _75, "বাংলা": _75, "xn--90ae": _75, "бг": _75, "xn--mgbcpq6gpa1a": _75, "البحرين": _75, "xn--90ais": _75, "бел": _75, "xn--fiqs8s": _75, "中国": _75, "xn--fiqz9s": _75, "中國": _75, "xn--lgbbat1ad8j": _75, "الجزائر": _75, "xn--wgbh1c": _75, "مصر": _75, "xn--e1a4c": _75, "ею": _75, "xn--qxa6a": _75, "ευ": _75, "xn--mgbah1a3hjkrd": _75, "موريتانيا": _75, "xn--node": _75, "გე": _75, "xn--qxam": _75, "ελ": _75, "xn--j6w193g": [1, { "xn--gmqw5a": _75, "xn--55qx5d": _75, "xn--mxtq1m": _75, "xn--wcvs22d": _75, "xn--uc0atv": _75, "xn--od0alg": _75 }], "香港": [1, { "個人": _75, "公司": _75, "政府": _75, "教育": _75, "組織": _75,
      "網絡": _75 }], "xn--2scrj9c": _75, "ಭಾರತ": _75, "xn--3hcrj9c": _75, "ଭାରତ": _75, "xn--45br5cyl": _75, "ভাৰত": _75, "xn--h2breg3eve": _75, "भारतम्": _75, "xn--h2brj9c8c": _75, "भारोत": _75, "xn--mgbgu82a": _75, "ڀارت": _75, "xn--rvc1e0am3e": _75, "ഭാരതം": _75, "xn--h2brj9c": _75, "भारत": _75, "xn--mgbbh1a": _75, "بارت": _75, "xn--mgbbh1a71e": _75, "بھارت": _75, "xn--fpcrj9c3d": _75, "భారత్": _75, "xn--gecrj9c": _75, "ભારત": _75, "xn--s9brj9c": _75, "ਭਾਰਤ": _75, "xn--45brj9c": _75, "ভারত": _75, "xn--xkc2dl3a5ee0h": _75, "இந்தியா": _75, "xn--mgba3a4f16a": _75, "ایران": _75, "xn--mgba3a4fra": _75, "ايران": _75, "xn--mgbtx2b": _75, "عراق": _75, "xn--mgbayh7gpa": _75, "الاردن": _75, "xn--3e0b707e": _75, "한국": _75, "xn--80ao21a": _75, "қаз": _75, "xn--q7ce6a": _75, "ລາວ": _75, "xn--fzc2c9e2c": _75, "ලංකා": _75, "xn--xkc2\
al3hye2a": _75, "இலங்கை": _75, "xn--mgbc0a9azcg": _75, "المغرب": _75, "xn--d1alf": _75, "мкд": _75, "xn--l1acc": _75, "мон": _75, "xn--mix891f": _75, "澳門": _75, "xn--mix082f": _75, "澳门": _75, "xn--mgbx4cd0ab": _75, "مليسيا": _75, "xn--mgb9awbf": _75, "عمان": _75, "xn--mgbai9azgqp6j": _75, "پاکستان": _75, "xn--mgbai9a5eva00b": _75, "پاكستان": _75, "xn--ygbi2ammx": _75, "فلسطين": _75, "xn--90a3ac": [1, { "xn--80au": _75, "xn--90azh": _75, "xn--d1at": _75, "xn--c1avg": _75, "xn--o1ac": _75, "xn--o1ach": _75 }], "срб": [1, { "ак": _75, "обр": _75, "од": _75, "орг": _75, "пр": _75, "упр": _75 }], "xn--p1ai": _75, "рф": _75, "xn--wgbl6a": _75, "قطر": _75, "xn--mgberp4a5d4ar": _75, "السعودية": _75, "xn--mgberp4a5d4a87g": _75, "السعودیة": _75, "xn--mgbqly7c0a67fbc": _75, "السعودیۃ": _75, "xn--mgbqly7cvafr": _75, "السعوديه": _75, "xn--mgbpl2fh": _75, "سودان": _75, "xn--yfro4\
i67o": _75, "新加坡": _75, "xn--clchc0ea0b2g2a9gcd": _75, "சிங்கப்பூர்": _75, "xn--ogbpf8fl": _75, "سورية": _75, "xn--mgbtf8fl": _75, "سوريا": _75, "xn--o3cw4h": [1, { "xn--o3cyx2a": _75, "xn--12co0c3b4eva": _75, "xn--m3ch0j3a": _75, "xn--h3cuzk1di": _75, "xn--12c1fe0br": _75, "xn--12cfi8ixb8l": _75 }], "ไทย": [1, { "ทหาร": _75, "ธุรกิจ": _75, "เน็ต": _75, "รัฐบาล": _75, "ศึกษา": _75, "องค์กร": _75 }], "xn--pgbs0dh": _75, "تونس": _75, "xn--kpry57d": _75, "台灣": _75, "xn--kprw13d": _75, "台湾": _75, "xn--nnx388a": _75, "臺灣": _75, "xn--j1amh": _75, "укр": _75, "xn--mgb2ddes": _75, "اليمن": _75, "xxx": _75, "ye": _76, "za": [0, { "ac": _75, "agric": _75, "alt": _75, "co": _75, "edu": _75, "gov": _75, "grondar": _75, "law": _75, "mil": _75, "net": _75, "ngo": _75, "nic": _75, "nis": _75, "nom": _75, "org": _75, "school": _75, "tm": _75, "web": _75 }], "zm": [1, { "ac": _75,
      "biz": _75, "co": _75, "com": _75, "edu": _75, "gov": _75, "info": _75, "mil": _75, "net": _75, "org": _75, "sch": _75 }], "zw": [1, { "ac": _75, "co": _75, "gov": _75, "mil": _75, "org": _75 }], "aaa": _75, "aarp": _75, "abb": _75, "abbott": _75, "abbvie": _75, "abc": _75, "able": _75, "abogado": _75, "abudhabi": _75, "academy": _75, "accenture": _75, "accountant": _75, "accountants": _75, "aco": _75, "actor": _75, "ads": _75, "adult": _75, "aeg": _75, "aetna": _75, "afl": _75, "africa": _75, "agakhan": _75, "agency": _75, "aig": _75, "airbus": _75, "airforce": _75, "airtel": _75, "akdn": _75, "alibaba": _75, "alipay": _75, "allfinanz": _75, "allstate": _75, "ally": _75, "alsace": _75, "alstom": _75, "amazon": _75, "americanexpress": _75, "americanfamily": _75, "amex": _75, "amfam": _75, "amica": _75, "amsterdam": _75, "analytics": _75, "android": _75, "anquan": _75, "anz": _75, "aol": _75, "apartments": _75, "app": _75, "apple": _75, "aquarelle": _75, "arab": _75, "aramco": _75,
      "archi": _75, "army": _75, "art": _75, "arte": _75, "asda": _75, "associates": _75, "athleta": _75, "attorney": _75, "auction": _75, "audi": _75, "audible": _75, "audio": _75, "auspost": _75, "author": _75, "auto": _75, "autos": _75, "aws": _75, "axa": _75, "azure": _75, "baby": _75, "baidu": _75, "banamex": _75, "band": _75, "bank": _75, "bar": _75, "barcelona": _75, "barclaycard": _75, "barclays": _75, "barefoot": _75, "bargains": _75, "baseball": _75, "basketball": _75, "bauhaus": _75, "bayern": _75, "bbc": _75, "bbt": _75, "bbva": _75, "bcg": _75, "bcn": _75, "beats": _75, "beauty": _75, "beer": _75, "berlin": _75, "best": _75, "bestbuy": _75, "bet": _75, "bharti": _75, "bible": _75, "bid": _75, "bike": _75, "bing": _75, "bingo": _75, "bio": _75, "black": _75, "blackfriday": _75, "blockbuster": _75, "blog": _75, "bloomberg": _75, "blue": _75, "bms": _75, "bmw": _75, "bnpparibas": _75, "boats": _75, "boehringer": _75, "bofa": _75, "bom": _75, "bond": _75, "boo": _75, "book": _75,
      "booking": _75, "bosch": _75, "bostik": _75, "boston": _75, "bot": _75, "boutique": _75, "box": _75, "bradesco": _75, "bridgestone": _75, "broadway": _75, "broker": _75, "brother": _75, "brussels": _75, "build": _75, "builders": _75, "business": _75, "buy": _75, "buzz": _75, "bzh": _75, "cab": _75, "cafe": _75, "cal": _75, "call": _75, "calvinklein": _75, "cam": _75, "camera": _75, "camp": _75, "canon": _75, "capetown": _75, "capital": _75, "capitalone": _75, "car": _75, "caravan": _75, "cards": _75, "care": _75, "career": _75, "careers": _75, "cars": _75, "casa": _75, "case": _75, "cash": _75, "casino": _75, "catering": _75, "catholic": _75, "cba": _75, "cbn": _75, "cbre": _75, "center": _75, "ceo": _75, "cern": _75, "cfa": _75, "cfd": _75, "chanel": _75, "channel": _75, "charity": _75, "chase": _75, "chat": _75, "cheap": _75, "chintai": _75, "christmas": _75, "chrome": _75, "church": _75, "cipriani": _75, "circle": _75, "cisco": _75, "citadel": _75, "citi": _75, "citic": _75, "\
city": _75, "claims": _75, "cleaning": _75, "click": _75, "clinic": _75, "clinique": _75, "clothing": _75, "cloud": _75, "club": _75, "clubmed": _75, "coach": _75, "codes": _75, "coffee": _75, "college": _75, "cologne": _75, "commbank": _75, "community": _75, "company": _75, "compare": _75, "computer": _75, "comsec": _75, "condos": _75, "construction": _75, "consulting": _75, "contact": _75, "contractors": _75, "cooking": _75, "cool": _75, "corsica": _75, "country": _75, "coupon": _75, "coupons": _75, "courses": _75, "cpa": _75, "credit": _75, "creditcard": _75, "creditunion": _75, "cricket": _75, "crown": _75, "crs": _75, "cruise": _75, "cruises": _75, "cuisinella": _75, "cymru": _75, "cyou": _75, "dad": _75, "dance": _75, "data": _75, "date": _75, "dating": _75, "datsun": _75, "day": _75, "dclk": _75, "dds": _75, "deal": _75, "dealer": _75, "deals": _75, "degree": _75, "delivery": _75, "dell": _75, "deloitte": _75, "delta": _75, "democrat": _75, "dental": _75, "dentist": _75, "desi": _75,
      "design": _75, "dev": _75, "dhl": _75, "diamonds": _75, "diet": _75, "digital": _75, "direct": _75, "directory": _75, "discount": _75, "discover": _75, "dish": _75, "diy": _75, "dnp": _75, "docs": _75, "doctor": _75, "dog": _75, "domains": _75, "dot": _75, "download": _75, "drive": _75, "dtv": _75, "dubai": _75, "dupont": _75, "durban": _75, "dvag": _75, "dvr": _75, "earth": _75, "eat": _75, "eco": _75, "edeka": _75, "education": _75, "email": _75, "emerck": _75, "energy": _75, "engineer": _75, "engineering": _75, "enterprises": _75, "epson": _75, "equipment": _75, "ericsson": _75, "erni": _75, "esq": _75, "estate": _75, "eurovision": _75, "eus": _75, "events": _75, "exchange": _75, "expert": _75, "exposed": _75, "express": _75, "extraspace": _75, "fage": _75, "fail": _75, "fairwinds": _75, "faith": _75, "family": _75, "fan": _75, "fans": _75, "farm": _75, "farmers": _75, "fashion": _75, "fast": _75, "fedex": _75, "feedback": _75, "ferrari": _75, "ferrero": _75, "fidelity": _75, "\
fido": _75, "film": _75, "final": _75, "finance": _75, "financial": _75, "fire": _75, "firestone": _75, "firmdale": _75, "fish": _75, "fishing": _75, "fit": _75, "fitness": _75, "flickr": _75, "flights": _75, "flir": _75, "florist": _75, "flowers": _75, "fly": _75, "foo": _75, "food": _75, "football": _75, "ford": _75, "forex": _75, "forsale": _75, "forum": _75, "foundation": _75, "fox": _75, "free": _75, "fresenius": _75, "frl": _75, "frogans": _75, "frontier": _75, "ftr": _75, "fujitsu": _75, "fun": _75, "fund": _75, "furniture": _75, "futbol": _75, "fyi": _75, "gal": _75, "gallery": _75, "gallo": _75, "gallup": _75, "game": _75, "games": _75, "gap": _75, "garden": _75, "gay": _75, "gbiz": _75, "gdn": _75, "gea": _75, "gent": _75, "genting": _75, "george": _75, "ggee": _75, "gift": _75, "gifts": _75, "gives": _75, "giving": _75, "glass": _75, "gle": _75, "global": _75, "globo": _75, "gmail": _75, "gmbh": _75, "gmo": _75, "gmx": _75, "godaddy": _75, "gold": _75, "goldpoint": _75, "gol\
f": _75, "goodyear": _75, "goog": _75, "google": _75, "gop": _75, "got": _75, "grainger": _75, "graphics": _75, "gratis": _75, "green": _75, "gripe": _75, "grocery": _75, "group": _75, "gucci": _75, "guge": _75, "guide": _75, "guitars": _75, "guru": _75, "hair": _75, "hamburg": _75, "hangout": _75, "haus": _75, "hbo": _75, "hdfc": _75, "hdfcbank": _75, "health": _75, "healthcare": _75, "help": _75, "helsinki": _75, "here": _75, "hermes": _75, "hiphop": _75, "hisamitsu": _75, "hitachi": _75, "hiv": _75, "hkt": _75, "hockey": _75, "holdings": _75, "holiday": _75, "homedepot": _75, "homegoods": _75, "homes": _75, "homesense": _75, "honda": _75, "horse": _75, "hospital": _75, "host": _75, "hosting": _75, "hot": _75, "hotel": _75, "hotels": _75, "hotmail": _75, "house": _75, "how": _75, "hsbc": _75, "hughes": _75, "hyatt": _75, "hyundai": _75, "ibm": _75, "icbc": _75, "ice": _75, "icu": _75, "ieee": _75, "ifm": _75, "ikano": _75, "imamat": _75, "imdb": _75, "immo": _75, "immobilien": _75, "\
inc": _75, "industries": _75, "infiniti": _75, "ing": _75, "ink": _75, "institute": _75, "insurance": _75, "insure": _75, "international": _75, "intuit": _75, "investments": _75, "ipiranga": _75, "irish": _75, "ismaili": _75, "ist": _75, "istanbul": _75, "itau": _75, "itv": _75, "jaguar": _75, "java": _75, "jcb": _75, "jeep": _75, "jetzt": _75, "jewelry": _75, "jio": _75, "jll": _75, "jmp": _75, "jnj": _75, "joburg": _75, "jot": _75, "joy": _75, "jpmorgan": _75, "jprs": _75, "juegos": _75, "juniper": _75, "kaufen": _75, "kddi": _75, "kerryhotels": _75, "kerryproperties": _75, "kfh": _75, "kia": _75, "kids": _75, "kim": _75, "kindle": _75, "kitchen": _75, "kiwi": _75, "koeln": _75, "komatsu": _75, "kosher": _75, "kpmg": _75, "kpn": _75, "krd": _75, "kred": _75, "kuokgroup": _75, "kyoto": _75, "lacaixa": _75, "lamborghini": _75, "lamer": _75, "land": _75, "landrover": _75, "lanxess": _75, "lasalle": _75, "lat": _75, "latino": _75, "latrobe": _75, "law": _75, "lawyer": _75, "lds": _75, "l\
ease": _75, "leclerc": _75, "lefrak": _75, "legal": _75, "lego": _75, "lexus": _75, "lgbt": _75, "lidl": _75, "life": _75, "lifeinsurance": _75, "lifestyle": _75, "lighting": _75, "like": _75, "lilly": _75, "limited": _75, "limo": _75, "lincoln": _75, "link": _75, "live": _75, "living": _75, "llc": _75, "llp": _75, "loan": _75, "loans": _75, "locker": _75, "locus": _75, "lol": _75, "london": _75, "lotte": _75, "lotto": _75, "love": _75, "lpl": _75, "lplfinancial": _75, "ltd": _75, "ltda": _75, "lundbeck": _75, "luxe": _75, "luxury": _75, "madrid": _75, "maif": _75, "maison": _75, "makeup": _75, "man": _75, "management": _75, "mango": _75, "map": _75, "market": _75, "marketing": _75, "markets": _75, "marriott": _75, "marshalls": _75, "mattel": _75, "mba": _75, "mckinsey": _75, "med": _75, "media": _75, "meet": _75, "melbourne": _75, "meme": _75, "memorial": _75, "men": _75, "menu": _75, "merck": _75, "merckmsd": _75, "miami": _75, "microsoft": _75, "mini": _75, "mint": _75, "mit": _75, "\
mitsubishi": _75, "mlb": _75, "mls": _75, "mma": _75, "mobile": _75, "moda": _75, "moe": _75, "moi": _75, "mom": _75, "monash": _75, "money": _75, "monster": _75, "mormon": _75, "mortgage": _75, "moscow": _75, "moto": _75, "motorcycles": _75, "mov": _75, "movie": _75, "msd": _75, "mtn": _75, "mtr": _75, "music": _75, "nab": _75, "nagoya": _75, "navy": _75, "nba": _75, "nec": _75, "netbank": _75, "netflix": _75, "network": _75, "neustar": _75, "new": _75, "news": _75, "next": _75, "nextdirect": _75, "nexus": _75, "nfl": _75, "ngo": _75, "nhk": _75, "nico": _75, "nike": _75, "nikon": _75, "ninja": _75, "nissan": _75, "nissay": _75, "nokia": _75, "norton": _75, "now": _75, "nowruz": _75, "nowtv": _75, "nra": _75, "nrw": _75, "ntt": _75, "nyc": _75, "obi": _75, "observer": _75, "office": _75, "okinawa": _75, "olayan": _75, "olayangroup": _75, "ollo": _75, "omega": _75, "one": _75, "ong": _75, "onl": _75, "online": _75, "ooo": _75, "open": _75, "oracle": _75, "orange": _75, "organic": _75, "\
origins": _75, "osaka": _75, "otsuka": _75, "ott": _75, "ovh": _75, "page": _75, "panasonic": _75, "paris": _75, "pars": _75, "partners": _75, "parts": _75, "party": _75, "pay": _75, "pccw": _75, "pet": _75, "pfizer": _75, "pharmacy": _75, "phd": _75, "philips": _75, "phone": _75, "photo": _75, "photography": _75, "photos": _75, "physio": _75, "pics": _75, "pictet": _75, "pictures": _75, "pid": _75, "pin": _75, "ping": _75, "pink": _75, "pioneer": _75, "pizza": _75, "place": _75, "play": _75, "playstation": _75, "plumbing": _75, "plus": _75, "pnc": _75, "pohl": _75, "poker": _75, "politie": _75, "porn": _75, "praxi": _75, "press": _75, "prime": _75, "prod": _75, "productions": _75, "prof": _75, "progressive": _75, "promo": _75, "properties": _75, "property": _75, "protection": _75, "pru": _75, "prudential": _75, "pub": _75, "pwc": _75, "qpon": _75, "quebec": _75, "quest": _75, "racing": _75, "radio": _75, "read": _75, "realestate": _75, "realtor": _75, "realty": _75, "recipes": _75, "r\
ed": _75, "redumbrella": _75, "rehab": _75, "reise": _75, "reisen": _75, "reit": _75, "reliance": _75, "ren": _75, "rent": _75, "rentals": _75, "repair": _75, "report": _75, "republican": _75, "rest": _75, "restaurant": _75, "review": _75, "reviews": _75, "rexroth": _75, "rich": _75, "richardli": _75, "ricoh": _75, "ril": _75, "rio": _75, "rip": _75, "rocks": _75, "rodeo": _75, "rogers": _75, "room": _75, "rsvp": _75, "rugby": _75, "ruhr": _75, "run": _75, "rwe": _75, "ryukyu": _75, "saarland": _75, "safe": _75, "safety": _75, "sakura": _75, "sale": _75, "salon": _75, "samsclub": _75, "samsung": _75, "sandvik": _75, "sandvikcoromant": _75, "sanofi": _75, "sap": _75, "sarl": _75, "sas": _75, "save": _75, "saxo": _75, "sbi": _75, "sbs": _75, "scb": _75, "schaeffler": _75, "schmidt": _75, "scholarships": _75, "school": _75, "schule": _75, "schwarz": _75, "science": _75, "scot": _75, "search": _75, "seat": _75, "secure": _75, "security": _75, "seek": _75, "select": _75, "sener": _75, "serv\
ices": _75, "seven": _75, "sew": _75, "sex": _75, "sexy": _75, "sfr": _75, "shangrila": _75, "sharp": _75, "shell": _75, "shia": _75, "shiksha": _75, "shoes": _75, "shop": _75, "shopping": _75, "shouji": _75, "show": _75, "silk": _75, "sina": _75, "singles": _75, "site": _75, "ski": _75, "skin": _75, "sky": _75, "skype": _75, "sling": _75, "smart": _75, "smile": _75, "sncf": _75, "soccer": _75, "social": _75, "softbank": _75, "software": _75, "sohu": _75, "solar": _75, "solutions": _75, "song": _75, "sony": _75, "soy": _75, "spa": _75, "space": _75, "sport": _75, "spot": _75, "srl": _75, "stada": _75, "staples": _75, "star": _75, "statebank": _75, "statefarm": _75, "stc": _75, "stcgroup": _75, "stockholm": _75, "storage": _75, "store": _75, "stream": _75, "studio": _75, "study": _75, "style": _75, "sucks": _75, "supplies": _75, "supply": _75, "support": _75, "surf": _75, "surgery": _75, "suzuki": _75, "swatch": _75, "swiss": _75, "sydney": _75, "systems": _75, "tab": _75, "taipei": _75,
      "talk": _75, "taobao": _75, "target": _75, "tatamotors": _75, "tatar": _75, "tattoo": _75, "tax": _75, "taxi": _75, "tci": _75, "tdk": _75, "team": _75, "tech": _75, "technology": _75, "temasek": _75, "tennis": _75, "teva": _75, "thd": _75, "theater": _75, "theatre": _75, "tiaa": _75, "tickets": _75, "tienda": _75, "tips": _75, "tires": _75, "tirol": _75, "tjmaxx": _75, "tjx": _75, "tkmaxx": _75, "tmall": _75, "today": _75, "tokyo": _75, "tools": _75, "top": _75, "toray": _75, "toshiba": _75, "total": _75, "tours": _75, "town": _75, "toyota": _75, "toys": _75, "trade": _75, "trading": _75, "training": _75, "travel": _75, "travelers": _75, "travelersinsurance": _75, "trust": _75, "trv": _75, "tube": _75, "tui": _75, "tunes": _75, "tushu": _75, "tvs": _75, "ubank": _75, "ubs": _75, "unicom": _75, "university": _75, "uno": _75, "uol": _75, "ups": _75, "vacations": _75, "vana": _75, "vanguard": _75, "vegas": _75, "ventures": _75, "verisign": _75, "versicherung": _75, "vet": _75, "via\
jes": _75, "video": _75, "vig": _75, "viking": _75, "villas": _75, "vin": _75, "vip": _75, "virgin": _75, "visa": _75, "vision": _75, "viva": _75, "vivo": _75, "vlaanderen": _75, "vodka": _75, "volvo": _75, "vote": _75, "voting": _75, "voto": _75, "voyage": _75, "wales": _75, "walmart": _75, "walter": _75, "wang": _75, "wanggou": _75, "watch": _75, "watches": _75, "weather": _75, "weatherchannel": _75, "webcam": _75, "weber": _75, "website": _75, "wed": _75, "wedding": _75, "weibo": _75, "weir": _75, "whoswho": _75, "wien": _75, "wiki": _75, "williamhill": _75, "win": _75, "windows": _75, "wine": _75, "winners": _75, "wme": _75, "woodside": _75, "work": _75, "works": _75, "world": _75, "wow": _75, "wtc": _75, "wtf": _75, "xbox": _75, "xerox": _75, "xihuan": _75, "xin": _75, "xn--11b4c3d": _75, "कॉम": _75, "xn--1ck2e1b": _75, "セール": _75, "xn--1qqw23a": _75, "佛山": _75, "xn--30rr7y": _75, "慈善": _75, "xn--3bst00m": _75, "集团": _75, "xn--3ds443g": _75, "在线": _75, "\
xn--3pxu8k": _75, "点看": _75, "xn--42c2d9a": _75, "คอม": _75, "xn--45q11c": _75, "八卦": _75, "xn--4gbrim": _75, "موقع": _75, "xn--55qw42g": _75, "公益": _75, "xn--55qx5d": _75, "公司": _75, "xn--5su34j936bgsg": _75, "香格里拉": _75, "xn--5tzm5g": _75, "网站": _75, "xn--6frz82g": _75, "移动": _75, "xn--6qq986b3xl": _75, "我爱你": _75, "xn--80adxhks": _75, "москва": _75, "xn--80aqecdr1a": _75, "католик": _75, "xn--80asehdb": _75, "онлайн": _75, "xn--80aswg": _75, "сайт": _75, "xn--8y0a063a": _75, "联通": _75, "xn--9dbq2a": _75, "קום": _75, "xn--9et52u": _75, "时尚": _75, "xn--9krt00a": _75, "微博": _75, "xn--b4w605ferd": _75, "淡马锡": _75, "xn--bck1b9a5dre4c": _75, "ファッション": _75, "xn--c1avg": _75, "орг": _75, "xn--c2br7g": _75, "नेट": _75, "xn--cck2b3b": _75, "ストア": _75, "xn--cckwcxetd": _75, "アマゾン": _75, "xn--cg4bki": _75, "삼성": _75, "xn--czr694b": _75, "商标": _75, "xn--czrs0t": _75,
      "商店": _75, "xn--czru2d": _75, "商城": _75, "xn--d1acj3b": _75, "дети": _75, "xn--eckvdtc9d": _75, "ポイント": _75, "xn--efvy88h": _75, "新闻": _75, "xn--fct429k": _75, "家電": _75, "xn--fhbei": _75, "كوم": _75, "xn--fiq228c5hs": _75, "中文网": _75, "xn--fiq64b": _75, "中信": _75, "xn--fjq720a": _75, "娱乐": _75, "xn--flw351e": _75, "谷歌": _75, "xn--fzys8d69uvgm": _75, "電訊盈科": _75, "xn--g2xx48c": _75, "购物": _75, "xn--gckr3f0f": _75, "クラウド": _75, "xn--gk3at1e": _75, "通販": _75, "xn--hxt814e": _75, "网店": _75, "xn--i1b6b1a6a2e": _75, "संगठन": _75, "xn--imr513n": _75, "餐厅": _75, "xn--io0a7i": _75, "网络": _75, "xn--j1aef": _75, "ком": _75, "xn--jlq480n2rg": _75, "亚马逊": _75, "xn--jvr189m": _75, "食品": _75, "xn--kcrx77d1x4a": _75, "飞利浦": _75, "xn--kput3i": _75, "手机": _75, "xn--mgba3a3ejt": _75, "ارامكو": _75, "xn--mgba7c0bbn0a": _75, "العليان": _75, "xn--mgbab2bd": _75, "بازار": _75,
      "xn--mgbca7dzdo": _75, "ابوظبي": _75, "xn--mgbi4ecexp": _75, "كاثوليك": _75, "xn--mgbt3dhd": _75, "همراه": _75, "xn--mk1bu44c": _75, "닷컴": _75, "xn--mxtq1m": _75, "政府": _75, "xn--ngbc5azd": _75, "شبكة": _75, "xn--ngbe9e0a": _75, "بيتك": _75, "xn--ngbrx": _75, "عرب": _75, "xn--nqv7f": _75, "机构": _75, "xn--nqv7fs00ema": _75, "组织机构": _75, "xn--nyqy26a": _75, "健康": _75, "xn--otu796d": _75, "招聘": _75, "xn--p1acf": _75, "рус": _75, "xn--pssy2u": _75, "大拿": _75, "xn--q9jyb4c": _75, "みんな": _75, "xn--qcka1pmc": _75, "グーグル": _75, "xn--rhqv96g": _75, "世界": _75, "xn--rovu88b": _75, "書籍": _75, "xn--ses554g": _75, "网址": _75, "xn--t60b56a": _75, "닷넷": _75, "xn--tckwe": _75, "コム": _75, "xn--tiq49xqyj": _75, "天主教": _75, "xn--unup4y": _75, "游戏": _75, "xn--vermgensberater-ctb": _75, "vermögensberater": _75, "xn--vermgensberatung-pwb": _75, "vermögensberatung": _75, "xn--vhquv": _75, "企业": _75,
      "xn--vuq861b": _75, "信息": _75, "xn--w4r85el8fhu5dnra": _75, "嘉里大酒店": _75, "xn--w4rs40l": _75, "嘉里": _75, "xn--xhq521b": _75, "广东": _75, "xn--zfr164b": _75, "政务": _75, "xyz": _75, "yachts": _75, "yahoo": _75, "yamaxun": _75, "yandex": _75, "yodobashi": _75, "yoga": _75, "yokohama": _75, "you": _75, "youtube": _75, "yun": _75, "zappos": _75, "zara": _75, "zero": _75, "zip": _75, "zone": _75, "zuerich": _75 }];
      return rules2;
    })();
    function lookupInTrie(parts, trie, index) {
      let result = null;
      let node = trie;
      while (node !== void 0) {
        if (node[0] === 1) {
          result = {
            index: index + 1
          };
        }
        if (index === -1) {
          break;
        }
        const succ = node[1];
        node = Object.prototype.hasOwnProperty.call(succ, parts[index]) ? succ[parts[index]] : succ["*"];
        index -= 1;
      }
      return result;
    }
    __name(lookupInTrie, "lookupInTrie");
    function suffixLookup(hostname, options, out) {
      var _a3;
      if (fastPathLookup(hostname, options, out)) {
        return;
      }
      const hostnameParts = hostname.split(".");
      const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1);
      if (exceptionMatch !== null) {
        out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join(".");
        return;
      }
      const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1);
      if (rulesMatch !== null) {
        out.publicSuffix = hostnameParts.slice(rulesMatch.index).join(".");
        return;
      }
      out.publicSuffix = (_a3 = hostnameParts[hostnameParts.length - 1]) !== null && _a3 !== void 0 ? _a3 : null;
    }
    __name(suffixLookup, "suffixLookup");
    var RESULT = getEmptyResult();
    function parse(url, options = {}) {
      return parseImpl(url, 5, suffixLookup, options, getEmptyResult());
    }
    __name(parse, "parse");
    function getHostname(url, options = {}) {
      resetResult(RESULT);
      return parseImpl(url, 0, suffixLookup, options, RESULT).hostname;
    }
    __name(getHostname, "getHostname");
    function getPublicSuffix(url, options = {}) {
      resetResult(RESULT);
      return parseImpl(url, 2, suffixLookup, options, RESULT).publicSuffix;
    }
    __name(getPublicSuffix, "getPublicSuffix");
    function getDomain2(url, options = {}) {
      resetResult(RESULT);
      return parseImpl(url, 3, suffixLookup, options, RESULT).domain;
    }
    __name(getDomain2, "getDomain");
    function getSubdomain(url, options = {}) {
      resetResult(RESULT);
      return parseImpl(url, 4, suffixLookup, options, RESULT).subdomain;
    }
    __name(getSubdomain, "getSubdomain");
    function getDomainWithoutSuffix(url, options = {}) {
      resetResult(RESULT);
      return parseImpl(url, 5, suffixLookup, options, RESULT).domainWithoutSuffix;
    }
    __name(getDomainWithoutSuffix, "getDomainWithoutSuffix");
    exports2.getDomain = getDomain2;
    exports2.getDomainWithoutSuffix = getDomainWithoutSuffix;
    exports2.getHostname = getHostname;
    exports2.getPublicSuffix = getPublicSuffix;
    exports2.getSubdomain = getSubdomain;
    exports2.parse = parse;
  }
});

// core/lib/lh-error.js
var UIStrings21, str_, LHERROR_SENTINEL, ERROR_SENTINEL, LighthouseError, ERRORS;
var init_lh_error = __esm({
  "core/lib/lh-error.js"() {
    "use strict";
    init_process_global();
    init_i18n();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings21 = {
      /**
       * @description Error message explaining that the Lighthouse run was not able to collect screenshots through Chrome.
       * @example {NO_SPEEDLINE_FRAMES} errorCode
       * */
      didntCollectScreenshots: `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 performance trace was not able to be recorded for the Lighthouse run.
       * @example {NO_TRACING_STARTED} errorCode
       * */
      badTraceRecording: "Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})",
      /**
       * @description Error message explaining that the First Contentful Paint metric was not seen during the page load.
       * @example {NO_FCP} errorCode
       * */
      noFcp: "The page did not paint any content. Please ensure you keep the browser window in the foreground during the load and try again. ({errorCode})",
      /**
       * @description Error message explaining that the Largest Contentful Paint metric was not seen during the page load.
       * @example {NO_LCP} errorCode
       * */
      noLcp: "The page did not display content that qualifies as a Largest Contentful Paint (LCP). Ensure the page has a valid LCP element and then try again. ({errorCode})",
      /**
       * @description Error message explaining that the page loaded too slowly to perform a Lighthouse run.
       * @example {NO_TTI_CPU_IDLE_PERIOD} errorCode
       * */
      pageLoadTookTooLong: "Your page took too long to load. Please follow the opportunities in the report to reduce your page load time, and then try re-running Lighthouse. ({errorCode})",
      /** Error message explaining that Lighthouse could not load the requested URL and the steps that might be taken to fix the unreliability. */
      pageLoadFailed: "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.",
      /**
       * @description Error message explaining that Lighthouse could not load the requested URL and the steps that might be taken to fix the unreliability.
       * @example {404} statusCode
       * */
      pageLoadFailedWithStatusCode: "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. (Status code: {statusCode})",
      /**
       * @description Error message explaining that Lighthouse could not load the requested URL and the steps that might be taken to fix the unreliability.
       * @example {FAILED_DOCUMENT_REQUEST} errorDetails
       * */
      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})",
      /**
       * @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.
       * @example {net::ERR_CERT_DATE_INVALID} securityMessages
       * */
      pageLoadFailedInsecure: "The URL you have provided does not have a valid security certificate. {securityMessages}",
      /** Error message explaining that Chrome prevented the page from loading and displayed an interstitial screen instead, so the URL cannot be accessed. */
      pageLoadFailedInterstitial: "Chrome prevented page load with an interstitial. Make sure you are testing the correct URL and that the server is properly responding to all requests.",
      /** Error message explaining that Chrome has encountered an error during the Lighthouse run, and that Chrome should be restarted. */
      internalChromeError: "An internal Chrome error occurred. Please restart Chrome and try re-running Lighthouse.",
      /** Error message explaining that fetching the resources of the webpage has taken longer than the maximum time. */
      requestContentTimeout: "Fetching resource content has exceeded the allotted time",
      /**
       * @description Error message explaining that the webpage is non-HTML, so audits are ill-defined.
       * @example {application/xml} mimeType
       * */
      notHtml: "The page provided is not HTML (served as MIME type {mimeType}).",
      /** Error message explaining that the provided URL Lighthouse points to is not valid, and cannot be loaded. */
      urlInvalid: "The URL you have provided appears to be invalid.",
      /**
       * @description Error message explaining that the Chrome Devtools protocol has exceeded the maximum timeout allowed.
       * @example {Network.enable} protocolMethod
       * */
      protocolTimeout: "Waiting for DevTools protocol response has exceeded the allotted time. (Method: {protocolMethod})",
      /** Error message explaining that the requested page could not be resolved by the DNS server. */
      dnsFailure: "DNS servers could not resolve the provided domain.",
      /** Error message explaining that Lighthouse couldn't complete because the page has stopped responding to its instructions. */
      pageLoadFailedHung: "Lighthouse was unable to reliably load the URL you requested because the page stopped responding.",
      /** Error message explaining that Lighthouse timed out while waiting for the initial connection to the Chrome Devtools protocol. */
      criTimeout: "Timeout waiting for initial Debugger Protocol connection.",
      /**
       * @description Error message explaining that a resource that was required for testing was never collected. "artifactName" will be replaced with the name of the resource that wasn't collected.
       * @example {MainDocumentContent} artifactName
       * */
      missingRequiredArtifact: "Required {artifactName} gatherer did not run.",
      /**
       * @description Error message explaining that there was an error while trying to collect a resource that was required for testing. "artifactName" will be replaced with the name of the resource that wasn't collected; "errorMessage" will be replaced with a string description of the error that occurred.
       * @example {MainDocumentContent} artifactName
       * @example {Could not find main document} errorMessage
       * */
      erroredRequiredArtifact: "Required {artifactName} gatherer encountered an error: {errorMessage}",
      /**
       * @description Error message explaining that a feature is unavailable due to an old version of Chrome. "featureName" will be replaced by the name of the feature which is not supported.
       * @example {Largest Contentful Paint} featureName
       * */
      oldChromeDoesNotSupportFeature: "This version of Chrome is too old to support '{featureName}'. Use a newer version to see full results.",
      /** Error message explaining that the browser tab that Lighthouse is inspecting has crashed. */
      targetCrashed: "Browser tab has unexpectedly crashed."
    };
    str_ = createIcuMessageFn({ url: "core/lib/lh-error.js" }.url, UIStrings21);
    LHERROR_SENTINEL = "__LighthouseErrorSentinel";
    ERROR_SENTINEL = "__ErrorSentinel";
    LighthouseError = class _LighthouseError extends Error {
      static {
        __name(this, "LighthouseError");
      }
      /**
       * @param {LighthouseErrorDefinition} errorDefinition
       * @param {Record<string, string|undefined>=} properties
       * @param {LHErrorOptions=} options
       */
      constructor(errorDefinition, properties, options) {
        super(errorDefinition.code, options);
        this.name = "LighthouseError";
        this.code = errorDefinition.code;
        this.friendlyMessage = str_(errorDefinition.message, { errorCode: this.code, ...properties });
        this.lhrRuntimeError = !!errorDefinition.lhrRuntimeError;
        if (properties) Object.assign(this, properties);
        Error.captureStackTrace(this, _LighthouseError);
      }
      /**
       * @param {string} method
       * @param {{message: string, data?: string|undefined}} protocolError
       * @return {Error|LighthouseError}
       */
      static fromProtocolMessage(method, protocolError) {
        const matchedErrorDefinition = Object.values(_LighthouseError.errors).filter((e) => e.pattern).find((e) => e.pattern && e.pattern.test(protocolError.message));
        if (matchedErrorDefinition) {
          return new _LighthouseError(matchedErrorDefinition);
        }
        let errMsg = `(${method}): ${protocolError.message}`;
        if (protocolError.data) errMsg += ` (${protocolError.data})`;
        const error = new Error(`Protocol error ${errMsg}`);
        return Object.assign(error, { protocolMethod: method, protocolError: protocolError.message });
      }
      /**
       * A JSON.stringify replacer to serialize LighthouseErrors and (as a fallback) Errors.
       * Returns a simplified version of the error object that can be reconstituted
       * as a copy of the original error at parse time.
       * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter
       * @param {Error|LighthouseError} err
       * @return {SerializedBaseError|SerializedLighthouseError}
       */
      static stringifyReplacer(err) {
        if (err instanceof _LighthouseError) {
          const { name, code, message, friendlyMessage, lhrRuntimeError, stack, cause, ...properties } = err;
          return {
            sentinel: LHERROR_SENTINEL,
            code,
            stack,
            cause,
            properties: (
              /** @type {{ [p: string]: string | undefined }} */
              properties
            )
          };
        }
        if (err instanceof Error) {
          const { message, stack, cause } = err;
          const code = err.code;
          return {
            sentinel: ERROR_SENTINEL,
            message,
            code,
            stack,
            cause
          };
        }
        throw new Error("Invalid value for LighthouseError stringification");
      }
      /**
       * A JSON.parse reviver. If any value passed in is a serialized Error or
       * LighthouseError, the error is recreated as the original object. Otherwise, the
       * value is passed through unchanged.
       * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter
       * @param {string} key
       * @param {any} possibleError
       * @return {any}
       */
      static parseReviver(key, possibleError) {
        if (typeof possibleError === "object" && possibleError !== null) {
          if (possibleError.sentinel === LHERROR_SENTINEL) {
            const { code, stack, cause, properties } = (
              /** @type {SerializedLighthouseError} */
              possibleError
            );
            const errorDefinition = _LighthouseError.errors[
              /** @type {keyof typeof ERRORS} */
              code
            ];
            const lhError = new _LighthouseError(errorDefinition, properties, { cause });
            lhError.stack = stack;
            return lhError;
          }
          if (possibleError.sentinel === ERROR_SENTINEL) {
            const { message, code, stack, cause } = (
              /** @type {SerializedBaseError} */
              possibleError
            );
            const opts = cause ? { cause } : void 0;
            const error = new Error(message, opts);
            Object.assign(error, { code, stack });
            return error;
          }
        }
        return possibleError;
      }
    };
    ERRORS = {
      // Screenshot/speedline errors
      NO_SPEEDLINE_FRAMES: {
        code: "NO_SPEEDLINE_FRAMES",
        message: UIStrings21.didntCollectScreenshots,
        lhrRuntimeError: true
      },
      SPEEDINDEX_OF_ZERO: {
        code: "SPEEDINDEX_OF_ZERO",
        message: UIStrings21.didntCollectScreenshots,
        lhrRuntimeError: true
      },
      NO_SCREENSHOTS: {
        code: "NO_SCREENSHOTS",
        message: UIStrings21.didntCollectScreenshots,
        lhrRuntimeError: true
      },
      INVALID_SPEEDLINE: {
        code: "INVALID_SPEEDLINE",
        message: UIStrings21.didntCollectScreenshots,
        lhrRuntimeError: true
      },
      // Trace parsing errors
      NO_TRACING_STARTED: {
        code: "NO_TRACING_STARTED",
        message: UIStrings21.badTraceRecording,
        lhrRuntimeError: true
      },
      NO_RESOURCE_REQUEST: {
        code: "NO_RESOURCE_REQUEST",
        message: UIStrings21.badTraceRecording,
        lhrRuntimeError: true
      },
      NO_NAVSTART: {
        code: "NO_NAVSTART",
        message: UIStrings21.badTraceRecording,
        lhrRuntimeError: true
      },
      NO_FCP: {
        code: "NO_FCP",
        message: UIStrings21.noFcp,
        lhrRuntimeError: true
      },
      NO_DCL: {
        code: "NO_DCL",
        message: UIStrings21.badTraceRecording,
        lhrRuntimeError: true
      },
      NO_FMP: {
        code: "NO_FMP",
        message: UIStrings21.badTraceRecording
      },
      NO_LCP: {
        code: "NO_LCP",
        message: UIStrings21.noLcp
      },
      NO_LCP_ALL_FRAMES: {
        code: "NO_LCP_ALL_FRAMES",
        message: UIStrings21.noLcp
      },
      UNSUPPORTED_OLD_CHROME: {
        code: "UNSUPPORTED_OLD_CHROME",
        message: UIStrings21.oldChromeDoesNotSupportFeature
      },
      // TTI calculation failures
      NO_TTI_CPU_IDLE_PERIOD: { code: "NO_TTI_CPU_IDLE_PERIOD", message: UIStrings21.pageLoadTookTooLong },
      NO_TTI_NETWORK_IDLE_PERIOD: {
        code: "NO_TTI_NETWORK_IDLE_PERIOD",
        message: UIStrings21.pageLoadTookTooLong
      },
      // Page load failures
      NO_DOCUMENT_REQUEST: {
        code: "NO_DOCUMENT_REQUEST",
        message: UIStrings21.pageLoadFailed,
        lhrRuntimeError: true
      },
      /* Used when DevTools reports loading failed. Usually an internal (Chrome) issue.
       * Requries an additional `errorDetails` field for translation.
       */
      FAILED_DOCUMENT_REQUEST: {
        code: "FAILED_DOCUMENT_REQUEST",
        message: UIStrings21.pageLoadFailedWithDetails,
        lhrRuntimeError: true
      },
      /* Used when status code is 4xx or 5xx.
       * Requires an additional `statusCode` field for translation.
       */
      ERRORED_DOCUMENT_REQUEST: {
        code: "ERRORED_DOCUMENT_REQUEST",
        message: UIStrings21.pageLoadFailedWithStatusCode,
        lhrRuntimeError: true
      },
      /* Used when security error prevents page load.
       * Requires an additional `securityMessages` field for translation.
       */
      INSECURE_DOCUMENT_REQUEST: {
        code: "INSECURE_DOCUMENT_REQUEST",
        message: UIStrings21.pageLoadFailedInsecure,
        lhrRuntimeError: true
      },
      /* Used when any Chrome interstitial error prevents page load.
       */
      CHROME_INTERSTITIAL_ERROR: {
        code: "CHROME_INTERSTITIAL_ERROR",
        message: UIStrings21.pageLoadFailedInterstitial,
        lhrRuntimeError: true
      },
      /* Used when the page stopped responding and did not finish loading. */
      PAGE_HUNG: {
        code: "PAGE_HUNG",
        message: UIStrings21.pageLoadFailedHung,
        lhrRuntimeError: true
      },
      /* Used when the page is non-HTML. */
      NOT_HTML: {
        code: "NOT_HTML",
        message: UIStrings21.notHtml,
        lhrRuntimeError: true
      },
      // Protocol internal failures
      TRACING_ALREADY_STARTED: {
        code: "TRACING_ALREADY_STARTED",
        message: UIStrings21.internalChromeError,
        pattern: /Tracing.*started/,
        lhrRuntimeError: true
      },
      PARSING_PROBLEM: {
        code: "PARSING_PROBLEM",
        message: UIStrings21.internalChromeError,
        pattern: /Parsing problem/,
        lhrRuntimeError: true
      },
      READ_FAILED: {
        code: "READ_FAILED",
        message: UIStrings21.internalChromeError,
        pattern: /Read failed/,
        lhrRuntimeError: true
      },
      // URL parsing failures
      INVALID_URL: {
        code: "INVALID_URL",
        message: UIStrings21.urlInvalid
      },
      /* Protocol timeout failures
       * Requires an additional `protocolMethod` field for translation.
       */
      PROTOCOL_TIMEOUT: {
        code: "PROTOCOL_TIMEOUT",
        message: UIStrings21.protocolTimeout,
        lhrRuntimeError: true
      },
      // DNS failure on main document (no resolution, timed out, etc)
      DNS_FAILURE: {
        code: "DNS_FAILURE",
        message: UIStrings21.dnsFailure,
        lhrRuntimeError: true
      },
      /** A timeout in the initial connection to the debugger protocol. */
      CRI_TIMEOUT: {
        code: "CRI_TIMEOUT",
        message: UIStrings21.criTimeout,
        lhrRuntimeError: true
      },
      /**
       * Error internal to Runner used when an artifact required for an audit is missing.
       * Requires an additional `artifactName` field for translation.
      */
      MISSING_REQUIRED_ARTIFACT: {
        code: "MISSING_REQUIRED_ARTIFACT",
        message: UIStrings21.missingRequiredArtifact
      },
      /**
       * Error internal to Runner used when an artifact required for an audit was an error.
       * Requires additional `artifactName` and `errorMessage` fields for translation.
      */
      ERRORED_REQUIRED_ARTIFACT: {
        code: "ERRORED_REQUIRED_ARTIFACT",
        message: UIStrings21.erroredRequiredArtifact
      },
      /** The page has crashed and will no longer respond to 99% of CDP commmands. */
      TARGET_CRASHED: {
        code: "TARGET_CRASHED",
        message: UIStrings21.targetCrashed,
        lhrRuntimeError: true
      }
      // Hey! When adding a new error type, update lighthouse-result.proto too.
      // Only necessary for runtime errors, which come from artifacts or pageLoadErrors.
    };
    LighthouseError.errors = ERRORS;
    LighthouseError.NO_ERROR = "NO_ERROR";
    LighthouseError.UNKNOWN_ERROR = "UNKNOWN_ERROR";
  }
});

// core/lib/url-utils.js
function rewriteChromeInternalUrl(url) {
  if (!url || !url.startsWith("chrome://")) return url;
  if (url.endsWith("/")) url = url.replace(/\/$/, "");
  return url.replace(/^chrome:\/\/chrome\//, "chrome://");
}
var import_tldts_icann, allowedProtocols, SECURE_SCHEMES, SECURE_LOCALHOST_DOMAINS2, NON_NETWORK_SCHEMES3, UrlUtils2, url_utils_default;
var init_url_utils = __esm({
  "core/lib/url-utils.js"() {
    "use strict";
    init_process_global();
    import_tldts_icann = __toESM(require_cjs(), 1);
    init_util();
    init_lh_error();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    allowedProtocols = [
      "https:",
      "http:",
      "chrome:",
      "chrome-extension:"
    ];
    SECURE_SCHEMES = [
      "data",
      "https",
      "wss",
      "blob",
      "chrome",
      "chrome-extension",
      "about",
      "filesystem"
    ];
    SECURE_LOCALHOST_DOMAINS2 = ["localhost", "127.0.0.1"];
    NON_NETWORK_SCHEMES3 = [
      "blob",
      // @see https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
      "data",
      // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
      "intent",
      // @see https://developer.chrome.com/docs/multidevice/android/intents/
      "file",
      // @see https://en.wikipedia.org/wiki/File_URI_scheme
      "filesystem",
      // @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystem
      "chrome-extension"
    ];
    __name(rewriteChromeInternalUrl, "rewriteChromeInternalUrl");
    UrlUtils2 = class _UrlUtils {
      static {
        __name(this, "UrlUtils");
      }
      /**
       * @param {string} url
       * @return {boolean}
       */
      static isValid(url) {
        try {
          new URL(url);
          return true;
        } catch (e) {
          return false;
        }
      }
      /**
       * @param {string} urlA
       * @param {string} urlB
       * @return {boolean}
       */
      static hostsMatch(urlA, urlB) {
        try {
          return new URL(urlA).host === new URL(urlB).host;
        } catch (e) {
          return false;
        }
      }
      /**
       * @param {string} urlA
       * @param {string} urlB
       * @return {boolean}
       */
      static originsMatch(urlA, urlB) {
        try {
          return new URL(urlA).origin === new URL(urlB).origin;
        } catch (e) {
          return false;
        }
      }
      /**
       * @param {string} url
       * @return {?string}
       */
      static getOrigin(url) {
        try {
          const urlInfo = new URL(url);
          if (urlInfo.protocol === "chrome-extension:") {
            return Util.getChromeExtensionOrigin(url);
          }
          return urlInfo.host && urlInfo.origin || null;
        } catch (e) {
          return null;
        }
      }
      /**
       * Returns a primary domain for provided hostname (e.g. www.example.com -> example.com).
       * @param {string|URL} url hostname or URL object
       * @return {string}
       */
      static getRootDomain(url) {
        const parsedUrl = Util.createOrReturnURL(url);
        return (0, import_tldts_icann.getDomain)(parsedUrl.href) || parsedUrl.hostname;
      }
      /**
       * Check if rootDomains matches
       *
       * @param {string|URL} urlA
       * @param {string|URL} urlB
       */
      static rootDomainsMatch(urlA, urlB) {
        let urlAInfo;
        let urlBInfo;
        try {
          urlAInfo = Util.createOrReturnURL(urlA);
          urlBInfo = Util.createOrReturnURL(urlB);
        } catch (err) {
          return false;
        }
        if (!urlAInfo.hostname || !urlBInfo.hostname) {
          return false;
        }
        const urlARootDomain = _UrlUtils.getRootDomain(urlAInfo);
        const urlBRootDomain = _UrlUtils.getRootDomain(urlBInfo);
        return urlARootDomain === urlBRootDomain;
      }
      /**
       * @param {string} url
       * @param {{numPathParts: number, preserveQuery: boolean, preserveHost: boolean}=} options
       * @return {string}
       */
      static getURLDisplayName(url, options) {
        return Util.getURLDisplayName(new URL(url), options);
      }
      /**
       * Limits data URIs to 100 characters, returns all other strings untouched.
       * @param {string} url
       * @return {string}
       */
      static elideDataURI(url) {
        try {
          const parsed = new URL(url);
          return parsed.protocol === "data:" ? Util.truncate(url, 100) : url;
        } catch (e) {
          return url;
        }
      }
      /**
       * Determine if url1 equals url2, ignoring URL fragments.
       * @param {string} url1
       * @param {string} url2
       * @return {boolean}
       */
      static equalWithExcludedFragments(url1, url2) {
        [url1, url2] = [url1, url2].map(rewriteChromeInternalUrl);
        try {
          const urla = new URL(url1);
          urla.hash = "";
          const urlb = new URL(url2);
          urlb.hash = "";
          return urla.href === urlb.href;
        } catch (e) {
          return false;
        }
      }
      /**
       * Determine if the url has a protocol that we're able to test
       * @param {string} url
       * @return {boolean}
       */
      static isProtocolAllowed(url) {
        try {
          const parsed = new URL(url);
          return allowedProtocols.includes(parsed.protocol);
        } catch (e) {
          return false;
        }
      }
      /**
       * Is the host localhost-enough to satisfy the "secure context" definition
       * https://github.com/GoogleChrome/lighthouse/pull/11766#discussion_r582340683
       * @param {string} hostname Either a `new URL(url).hostname` or a `networkRequest.parsedUrl.host`
       * @return {boolean}
       */
      static isLikeLocalhost(hostname) {
        return SECURE_LOCALHOST_DOMAINS2.includes(hostname) || hostname.endsWith(".localhost");
      }
      /**
       * @param {NetworkRequest['parsedURL']['scheme']} scheme
       * @return {boolean}
       */
      static isSecureScheme(scheme) {
        return SECURE_SCHEMES.includes(scheme);
      }
      /**
       * Use `NetworkRequest.isNonNetworkRequest(req)` if working with a request.
       * Note: the `protocol` field from CDP can be 'h2', 'http', (not 'https'!) or it'll be url's scheme.
       *   https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/protocol/network_handler.cc;l=598-611;drc=56d4a9a9deb30be73adcee8737c73bcb2a5ab64f
       * However, a `new URL(href).protocol` has a colon suffix.
       *   https://url.spec.whatwg.org/#dom-url-protocol
       * A URL's `scheme` is specced as the `protocol` sans-colon, but isn't exposed on a URL object.
       * This method can take all 3 of these string types as a parameter.
       * @param {NetworkRequest['protocol'] | URL['protocol']} protocol Either a networkRequest's `protocol` per CDP or a `new URL(href).protocol`
       * @return {boolean}
       */
      static isNonNetworkProtocol(protocol) {
        const urlScheme = protocol.includes(":") ? protocol.slice(0, protocol.indexOf(":")) : protocol;
        return NON_NETWORK_SCHEMES3.includes(urlScheme);
      }
      /**
       * @param {string} src
       * @return {string|undefined}
       */
      static guessMimeType(src) {
        let url;
        try {
          url = new URL(src);
        } catch {
          return void 0;
        }
        if (url.protocol === "data:") {
          const match2 = url.pathname.match(/^(image\/(png|jpeg|svg\+xml|webp|gif|avif))[;,]/);
          if (!match2) return void 0;
          return match2[1];
        }
        const match = url.pathname.toLowerCase().match(/\.(png|jpeg|jpg|svg|webp|gif|avif)$/);
        if (!match) return void 0;
        const ext = match[1];
        if (ext === "svg") return "image/svg+xml";
        if (ext === "jpg") return "image/jpeg";
        return `image/${ext}`;
      }
      /**
       * @param {string|undefined} url
       * @return {string}
       */
      static normalizeUrl(url) {
        if (url && this.isValid(url) && this.isProtocolAllowed(url)) {
          return new URL(url).href;
        } else {
          throw new LighthouseError(LighthouseError.errors.INVALID_URL);
        }
      }
    };
    UrlUtils2.INVALID_URL_DEBUG_STRING = "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.";
    url_utils_default = UrlUtils2;
  }
});

// core/lib/network-request.js
var HEADER_TCP, HEADER_SSL, HEADER_REQ, HEADER_RES, HEADER_TOTAL, HEADER_FETCHED_SIZE, HEADER_PROTOCOL_IS_H2, RESOURCE_TYPES, NetworkRequest;
var init_network_request = __esm({
  "core/lib/network-request.js"() {
    "use strict";
    init_process_global();
    init_lh();
    init_lantern2();
    init_url_utils();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    HEADER_TCP = "X-TCPMs";
    HEADER_SSL = "X-SSLMs";
    HEADER_REQ = "X-RequestMs";
    HEADER_RES = "X-ResponseMs";
    HEADER_TOTAL = "X-TotalMs";
    HEADER_FETCHED_SIZE = "X-TotalFetchedSize";
    HEADER_PROTOCOL_IS_H2 = "X-ProtocolIsH2";
    RESOURCE_TYPES = {
      XHR: "XHR",
      Fetch: "Fetch",
      EventSource: "EventSource",
      Script: "Script",
      Stylesheet: "Stylesheet",
      Image: "Image",
      Media: "Media",
      Font: "Font",
      Document: "Document",
      TextTrack: "TextTrack",
      WebSocket: "WebSocket",
      Other: "Other",
      Manifest: "Manifest",
      SignedExchange: "SignedExchange",
      Ping: "Ping",
      Preflight: "Preflight",
      CSPViolationReport: "CSPViolationReport",
      Prefetch: "Prefetch",
      FedCM: "FedCM"
    };
    NetworkRequest = class _NetworkRequest {
      static {
        __name(this, "NetworkRequest");
      }
      constructor() {
        this.requestId = "";
        this.connectionId = 0;
        this.connectionReused = false;
        this.url = "";
        this.protocol = "";
        this.isSecure = false;
        this.isValid = false;
        this.parsedURL = /** @type {ParsedURL} */
        { scheme: "" };
        this.documentURL = "";
        this.rendererStartTime = -1;
        this.networkRequestTime = -1;
        this.responseHeadersEndTime = -1;
        this.networkEndTime = -1;
        this.transferSize = 0;
        this.responseHeadersTransferSize = 0;
        this.resourceSize = 0;
        this.fromDiskCache = false;
        this.fromMemoryCache = false;
        this.fromPrefetchCache = false;
        this.lrStatistics = void 0;
        this.finished = false;
        this.requestMethod = "";
        this.statusCode = -1;
        this.redirectSource = void 0;
        this.redirectDestination = void 0;
        this.redirects = void 0;
        this.failed = false;
        this.localizedFailDescription = "";
        this.initiator = { type: "other" };
        this.timing = void 0;
        this.resourceType = void 0;
        this.mimeType = "";
        this.priority = "Low";
        this.initiatorRequest = void 0;
        this.responseHeaders = [];
        this.responseHeadersText = "";
        this.fetchedViaServiceWorker = false;
        this.frameId = "";
        this.sessionId = void 0;
        this.sessionTargetType = void 0;
        this.fromWorker = false;
        this.isLinkPreload = false;
      }
      /**
       * @return {boolean}
       */
      hasErrorStatusCode() {
        return this.statusCode >= 400;
      }
      /**
       * @param {NetworkRequest} initiatorRequest
       */
      setInitiatorRequest(initiatorRequest) {
        this.initiatorRequest = initiatorRequest;
      }
      /**
       * @param {LH.Crdp.Network.RequestWillBeSentEvent} data
       */
      onRequestWillBeSent(data31) {
        this.requestId = data31.requestId;
        let url;
        try {
          url = new URL(data31.request.url);
        } catch (e) {
          return;
        }
        this.url = data31.request.url;
        this.documentURL = data31.documentURL;
        this.parsedURL = {
          scheme: url.protocol.split(":")[0],
          // Intentional, DevTools uses different terminology
          host: url.hostname,
          securityOrigin: url.origin
        };
        this.isSecure = url_utils_default.isSecureScheme(this.parsedURL.scheme);
        this.rendererStartTime = data31.timestamp * 1e3;
        this.networkRequestTime = this.rendererStartTime;
        this.responseHeadersEndTime = this.rendererStartTime;
        this.requestMethod = data31.request.method;
        this.initiator = data31.initiator;
        this.resourceType = data31.type && RESOURCE_TYPES[data31.type];
        this.priority = data31.request.initialPriority;
        this.frameId = data31.frameId;
        this.isLinkPreload = data31.initiator.type === "preload" || !!data31.request.isLinkPreload;
        this.isValid = true;
      }
      onRequestServedFromCache() {
        this.fromMemoryCache = true;
      }
      /**
       * @param {LH.Crdp.Network.ResponseReceivedEvent} data
       */
      onResponseReceived(data31) {
        this._onResponse(data31.response, data31.timestamp, data31.type);
        this._updateProtocolForLightrider();
        this.frameId = data31.frameId;
      }
      /**
       * @param {LH.Crdp.Network.ResponseReceivedExtraInfoEvent} data
       */
      onResponseReceivedExtraInfo(data31) {
        this.responseHeadersText = data31.headersText || "";
      }
      /**
       * @param {LH.Crdp.Network.DataReceivedEvent} data
       */
      onDataReceived(data31) {
        this.resourceSize += data31.dataLength;
        if (data31.encodedDataLength !== -1) {
          this.transferSize += data31.encodedDataLength;
        }
      }
      /**
       * @param {LH.Crdp.Network.LoadingFinishedEvent} data
       */
      onLoadingFinished(data31) {
        if (this.finished) return;
        this.finished = true;
        this.networkEndTime = data31.timestamp * 1e3;
        if (data31.encodedDataLength >= 0) {
          this.transferSize = data31.encodedDataLength;
        }
        this._updateResponseHeadersEndTimeIfNecessary();
        this._updateTransferSizeForLightrider();
        this._updateTimingsForLightrider();
      }
      /**
       * @param {LH.Crdp.Network.LoadingFailedEvent} data
       */
      onLoadingFailed(data31) {
        if (this.finished) return;
        this.finished = true;
        this.networkEndTime = data31.timestamp * 1e3;
        this.failed = true;
        this.resourceType = data31.type && RESOURCE_TYPES[data31.type];
        this.localizedFailDescription = data31.errorText;
        this._updateResponseHeadersEndTimeIfNecessary();
        this._updateTransferSizeForLightrider();
        this._updateTimingsForLightrider();
      }
      /**
       * @param {LH.Crdp.Network.ResourceChangedPriorityEvent} data
       */
      onResourceChangedPriority(data31) {
        this.priority = data31.newPriority;
      }
      /**
       * @param {LH.Crdp.Network.RequestWillBeSentEvent} data
       */
      onRedirectResponse(data31) {
        if (!data31.redirectResponse) throw new Error("Missing redirectResponse data");
        this._onResponse(data31.redirectResponse, data31.timestamp, data31.type);
        this.resourceType = void 0;
        this.finished = true;
        this.networkEndTime = data31.timestamp * 1e3;
        this._updateResponseHeadersEndTimeIfNecessary();
      }
      /**
       * @param {string|undefined} sessionId
       */
      setSession(sessionId) {
        this.sessionId = sessionId;
      }
      get isOutOfProcessIframe() {
        return this.sessionTargetType === "iframe";
      }
      /**
       * @param {LH.Crdp.Network.Response} response
       * @param {number} timestamp in seconds
       * @param {LH.Crdp.Network.ResponseReceivedEvent['type']=} resourceType
       */
      _onResponse(response, timestamp, resourceType) {
        this.url = response.url;
        this.connectionId = response.connectionId;
        this.connectionReused = response.connectionReused;
        if (response.protocol) this.protocol = response.protocol;
        this.responseTimestamp = timestamp * 1e3;
        this.transferSize = response.encodedDataLength;
        this.responseHeadersTransferSize = response.encodedDataLength;
        if (typeof response.fromDiskCache === "boolean") this.fromDiskCache = response.fromDiskCache;
        if (typeof response.fromPrefetchCache === "boolean") {
          this.fromPrefetchCache = response.fromPrefetchCache;
        }
        this.statusCode = response.status;
        this.timing = response.timing;
        if (resourceType) this.resourceType = RESOURCE_TYPES[resourceType];
        this.mimeType = response.mimeType;
        this.responseHeaders = _NetworkRequest._headersDictToHeadersArray(response.headers);
        this.fetchedViaServiceWorker = !!response.fromServiceWorker;
        if (this.fromMemoryCache) this.timing = void 0;
        if (this.timing) this._recomputeTimesWithResourceTiming(this.timing);
      }
      /**
       * Resolve differences between conflicting timing signals. Based on the property setters in DevTools.
       * @see https://github.com/ChromeDevTools/devtools-frontend/blob/56a99365197b85c24b732ac92b0ac70feed80179/front_end/sdk/NetworkRequest.js#L485-L502
       * @param {LH.Crdp.Network.ResourceTiming} timing
       */
      _recomputeTimesWithResourceTiming(timing) {
        if (timing.requestTime === -1 || timing.receiveHeadersEnd === -1) return;
        this.networkRequestTime = timing.requestTime * 1e3;
        const headersReceivedTime = this.networkRequestTime + timing.receiveHeadersEnd;
        this.responseHeadersEndTime = headersReceivedTime;
        if (this.responseTimestamp !== void 0) {
          this.responseHeadersEndTime = Math.min(this.responseHeadersEndTime, this.responseTimestamp);
        }
        this.responseHeadersEndTime = Math.max(this.responseHeadersEndTime, this.networkRequestTime);
        this.networkEndTime = Math.max(this.networkEndTime, this.responseHeadersEndTime);
      }
      /**
       * Update responseHeadersEndTime to the networkEndTime if networkEndTime is earlier.
       * A response can't be received after the entire request finished.
       */
      _updateResponseHeadersEndTimeIfNecessary() {
        this.responseHeadersEndTime = Math.min(this.networkEndTime, this.responseHeadersEndTime);
      }
      /**
       * LR loses transfer size information, but passes it in the 'X-TotalFetchedSize' header.
       * 'X-TotalFetchedSize' is the canonical transfer size in LR. Nothing should supersede it.
       *
       * The total length of the encoded data is spread out among multiple events. The sum of the
       * values in onResponseReceived and all the onDataReceived events typically equals the value
       * seen on the onLoadingFinished event. In <1% of cases we see the values differ. As we process
       * onResponseReceived and onDataReceived we accumulate the total encodedDataLength. When we
       * process onLoadingFinished, we override the accumulated total. We do this so that if the
       * request is aborted or fails, we still get a value via the accumulation.
       *
       * In Lightrider, due to instrumentation limitations, our values for encodedDataLength are bogus
       * and not valid. However the resource's true encodedDataLength/transferSize is shared via a
       * special response header, X-TotalFetchedSize. In this situation, we read this value from
       * responseReceived, use it for the transferSize and ignore the encodedDataLength values in
       * both dataReceived and loadingFinished.
       */
      _updateTransferSizeForLightrider() {
        if (!global.isLightrider) return;
        const totalFetchedSize = this.responseHeaders.find((item) => item.name === HEADER_FETCHED_SIZE);
        if (!totalFetchedSize) return;
        const floatValue = parseFloat(totalFetchedSize.value);
        if (isNaN(floatValue)) return;
        this.transferSize = floatValue;
      }
      /**
       * LR loses protocol information.
       */
      _updateProtocolForLightrider() {
        if (!global.isLightrider) return;
        if (this.responseHeaders.some((item) => item.name === HEADER_PROTOCOL_IS_H2)) {
          this.protocol = "h2";
        }
      }
      /**
       * LR gets additional, accurate timing information from its underlying fetch infrastructure.  This
       * is passed in via X-Headers similar to 'X-TotalFetchedSize'.
       */
      _updateTimingsForLightrider() {
        if (!global.isLightrider) return;
        const totalHeader = this.responseHeaders.find((item) => item.name === HEADER_TOTAL);
        if (!totalHeader) return;
        let totalMs = parseInt(totalHeader.value);
        const TCPMsHeader = this.responseHeaders.find((item) => item.name === HEADER_TCP);
        const SSLMsHeader = this.responseHeaders.find((item) => item.name === HEADER_SSL);
        const requestMsHeader = this.responseHeaders.find((item) => item.name === HEADER_REQ);
        const responseMsHeader = this.responseHeaders.find((item) => item.name === HEADER_RES);
        const TCPMs = TCPMsHeader ? Math.max(0, parseInt(TCPMsHeader.value)) : 0;
        const SSLMs = SSLMsHeader ? Math.max(0, parseInt(SSLMsHeader.value)) : 0;
        const requestMs = requestMsHeader ? Math.max(0, parseInt(requestMsHeader.value)) : 0;
        const responseMs = responseMsHeader ? Math.max(0, parseInt(responseMsHeader.value)) : 0;
        if (Number.isNaN(TCPMs + requestMs + responseMs + totalMs)) {
          return;
        }
        if (TCPMs + requestMs + responseMs !== totalMs) {
          const delta = Math.abs(TCPMs + requestMs + responseMs - totalMs);
          if (delta >= 25) return;
          totalMs = TCPMs + requestMs + responseMs;
        }
        if (SSLMs > TCPMs) {
          return;
        }
        this.lrStatistics = {
          endTimeDeltaMs: this.networkEndTime - (this.networkRequestTime + totalMs),
          TCPMs,
          requestMs,
          responseMs
        };
        this.serverResponseTime = responseMs;
      }
      /**
       * Convert the requestId to backend-version by removing the `:redirect` portion
       *
       * @param {string} requestId
       * @return {string}
       */
      static getRequestIdForBackend(requestId) {
        return requestId.replace(/(:redirect)+$/, "");
      }
      /**
       * Based on DevTools NetworkManager.
       * @see https://github.com/ChromeDevTools/devtools-frontend/blob/3415ee28e86a3f4bcc2e15b652d22069938df3a6/front_end/sdk/NetworkManager.js#L285-L297
       * @param {LH.Crdp.Network.Headers} headersDict
       * @return {Array<HeaderEntry>}
       */
      static _headersDictToHeadersArray(headersDict) {
        const result = [];
        for (const name of Object.keys(headersDict)) {
          const values = headersDict[name].split("\n");
          for (let i = 0; i < values.length; ++i) {
            result.push({ name, value: values[i] });
          }
        }
        return result;
      }
      static get TYPES() {
        return RESOURCE_TYPES;
      }
      /**
       * @param {NetworkRequest} record
       * @return {Lantern.Types.NetworkRequest<NetworkRequest>}
       */
      static asLanternNetworkRequest(record) {
        let timing = record.timing;
        let serverResponseTime;
        if (global.isLightrider && record.lrStatistics) {
          if (record.protocol.startsWith("h3")) {
            timing = {
              connectStart: 0,
              connectEnd: record.lrStatistics.TCPMs
            };
          } else {
            timing = {
              connectStart: 0,
              sslStart: record.lrStatistics.TCPMs / 2,
              connectEnd: record.lrStatistics.TCPMs,
              sslEnd: record.lrStatistics.TCPMs
            };
            serverResponseTime = record.lrStatistics.requestMs;
          }
        }
        record.fromWorker = record.sessionTargetType === "worker";
        return {
          rawRequest: record,
          ...record,
          timing,
          serverResponseTime
        };
      }
      /**
       * @param {Pick<NetworkRequest, 'protocol'|'parsedURL'>} record
       * @return {boolean}
       */
      static isNonNetworkRequest(record) {
        return url_utils_default.isNonNetworkProtocol(record.protocol) || // But `protocol` can fail to be populated if the request fails, so fallback to scheme.
        url_utils_default.isNonNetworkProtocol(record.parsedURL.scheme);
      }
      /**
       * Technically there's not alignment on URLs that create "secure connections" vs "secure contexts"
       * https://github.com/GoogleChrome/lighthouse/pull/11766#discussion_r582340683
       * But for our purposes, we don't need to worry too much.
       * @param {NetworkRequest} record
       * @return {boolean}
       */
      static isSecureRequest(record) {
        return url_utils_default.isSecureScheme(record.parsedURL.scheme) || url_utils_default.isSecureScheme(record.protocol) || url_utils_default.isLikeLocalhost(record.parsedURL.host) || _NetworkRequest.isHstsRequest(record);
      }
      /**
       * Returns whether the network request was an HSTS redirect request.
       * @param {NetworkRequest} record
       * @return {boolean}
       */
      static isHstsRequest(record) {
        const destination = record.redirectDestination;
        if (!destination) return false;
        const reasonHeader = record.responseHeaders.find((header) => header.name === "Non-Authoritative-Reason");
        const reason = reasonHeader?.value;
        return reason === "HSTS" && _NetworkRequest.isSecureRequest(destination);
      }
      /**
       * Returns whether the network request was sent encoded.
       * @param {NetworkRequest} record
       * @return {boolean}
       */
      static isContentEncoded(record) {
        const patterns = global.isLightrider ? [
          /^x-original-content-encoding$/i
        ] : [
          /^content-encoding$/i,
          /^x-content-encoding-over-network$/i
        ];
        const compressionTypes = ["gzip", "br", "deflate", "zstd"];
        return record.responseHeaders.some(
          (header) => patterns.some((p) => header.name.match(p)) && compressionTypes.includes(header.value)
        );
      }
      /**
       * Resource size is almost always the right one to be using because of the below:
       *     `transferSize = resourceSize + headers.length`.
       * HOWEVER, there are some cases where an image is compressed again over the network and transfer size
       * is smaller (see https://github.com/GoogleChrome/lighthouse/pull/4968).
       * Use the min of the two numbers to be safe.
       * `tranferSize` of cached records is 0
       * @param {NetworkRequest} networkRecord
       * @return {number}
       */
      static getResourceSizeOnNetwork(networkRecord) {
        return Math.min(networkRecord.resourceSize || 0, networkRecord.transferSize || Infinity);
      }
    };
    NetworkRequest.HEADER_TCP = HEADER_TCP;
    NetworkRequest.HEADER_SSL = HEADER_SSL;
    NetworkRequest.HEADER_REQ = HEADER_REQ;
    NetworkRequest.HEADER_RES = HEADER_RES;
    NetworkRequest.HEADER_TOTAL = HEADER_TOTAL;
    NetworkRequest.HEADER_FETCHED_SIZE = HEADER_FETCHED_SIZE;
    NetworkRequest.HEADER_PROTOCOL_IS_H2 = HEADER_PROTOCOL_IS_H2;
  }
});

// core/lib/network-recorder.js
import { EventEmitter as EventEmitter2 } from "events";
var RequestEventEmitter, NetworkRecorder;
var init_network_recorder = __esm({
  "core/lib/network-recorder.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_lh();
    init_lantern2();
    init_network_request();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    RequestEventEmitter = /** @type {RequestEmitter} */
    EventEmitter2;
    NetworkRecorder = class _NetworkRecorder extends RequestEventEmitter {
      static {
        __name(this, "NetworkRecorder");
      }
      /**
       * Creates an instance of NetworkRecorder.
       */
      constructor() {
        super();
        this._records = [];
        this._recordsById = /* @__PURE__ */ new Map();
      }
      /**
       * Returns the array of raw network request data without finalizing the initiator and
       * redirect chain.
       * @return {Array<NetworkRequest>}
       */
      getRawRecords() {
        return Array.from(this._records);
      }
      /**
       * Listener for the DevTools SDK NetworkManager's RequestStarted event, which includes both
       * web socket and normal request creation.
       * @param {NetworkRequest} request
       * @private
       */
      onRequestStarted(request) {
        this._records.push(request);
        this._recordsById.set(request.requestId, request);
        this.emit("requeststarted", request);
      }
      /**
       * Listener for the DevTools SDK NetworkManager's RequestFinished event, which includes
       * request finish, failure, and redirect, as well as the closing of web sockets.
       * @param {NetworkRequest} request
       * @private
       */
      onRequestFinished(request) {
        this.emit("requestfinished", request);
      }
      // The below methods proxy network data into the NetworkRequest object which mimics the
      // DevTools SDK network layer.
      /**
       * @param {{params: LH.Crdp.Network.RequestWillBeSentEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onRequestWillBeSent(event) {
        const data31 = event.params;
        const originalRequest = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!originalRequest) {
          const request = new NetworkRequest();
          request.onRequestWillBeSent(data31);
          request.sessionId = event.sessionId;
          request.sessionTargetType = event.targetType;
          this.onRequestStarted(request);
          lighthouse_logger_default.verbose("network", `request will be sent to ${request.url}`);
          return;
        }
        if (!data31.redirectResponse) {
          return;
        }
        const modifiedData = {
          ...data31,
          // Copy over the initiator as well to match DevTools behavior
          initiator: originalRequest.initiator,
          requestId: `${originalRequest.requestId}:redirect`
        };
        const redirectedRequest = new NetworkRequest();
        redirectedRequest.onRequestWillBeSent(modifiedData);
        originalRequest.onRedirectResponse(data31);
        lighthouse_logger_default.verbose("network", `${originalRequest.url} redirected to ${redirectedRequest.url}`);
        originalRequest.redirectDestination = redirectedRequest;
        redirectedRequest.redirectSource = originalRequest;
        this.onRequestStarted(redirectedRequest);
        this.onRequestFinished(originalRequest);
      }
      /**
       * @param {{params: LH.Crdp.Network.RequestServedFromCacheEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onRequestServedFromCache(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        lighthouse_logger_default.verbose("network", `${request.url} served from cache`);
        request.onRequestServedFromCache();
      }
      /**
       * @param {{params: LH.Crdp.Network.ResponseReceivedEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onResponseReceived(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        lighthouse_logger_default.verbose("network", `${request.url} response received`);
        request.onResponseReceived(data31);
      }
      /**
       * @param {{params: LH.Crdp.Network.ResponseReceivedExtraInfoEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onResponseReceivedExtraInfo(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        lighthouse_logger_default.verbose("network", `${request.url} response received extra info`);
        request.onResponseReceivedExtraInfo(data31);
      }
      /**
       * @param {{params: LH.Crdp.Network.DataReceivedEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onDataReceived(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        lighthouse_logger_default.verbose("network", `${request.url} data received`);
        request.onDataReceived(data31);
      }
      /**
       * @param {{params: LH.Crdp.Network.LoadingFinishedEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onLoadingFinished(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        lighthouse_logger_default.verbose("network", `${request.url} loading finished`);
        request.onLoadingFinished(data31);
        this.onRequestFinished(request);
      }
      /**
       * @param {{params: LH.Crdp.Network.LoadingFailedEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onLoadingFailed(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        lighthouse_logger_default.verbose("network", `${request.url} loading failed`);
        request.onLoadingFailed(data31);
        this.onRequestFinished(request);
      }
      /**
       * @param {{params: LH.Crdp.Network.ResourceChangedPriorityEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event
       */
      onResourceChangedPriority(event) {
        const data31 = event.params;
        const request = this._findRealRequestAndSetSession(
          data31.requestId,
          event.targetType,
          event.sessionId
        );
        if (!request) return;
        request.onResourceChangedPriority(data31);
      }
      /**
       * Routes network events to their handlers, so we can construct networkRecords
       * @param {LH.Protocol.RawEventMessage} event
       */
      dispatch(event) {
        switch (event.method) {
          case "Network.requestWillBeSent":
            return this.onRequestWillBeSent(event);
          case "Network.requestServedFromCache":
            return this.onRequestServedFromCache(event);
          case "Network.responseReceived":
            return this.onResponseReceived(event);
          case "Network.responseReceivedExtraInfo":
            return this.onResponseReceivedExtraInfo(event);
          case "Network.dataReceived":
            return this.onDataReceived(event);
          case "Network.loadingFinished":
            return this.onLoadingFinished(event);
          case "Network.loadingFailed":
            return this.onLoadingFailed(event);
          case "Network.resourceChangedPriority":
            return this.onResourceChangedPriority(event);
          default:
            return;
        }
      }
      /**
       * Redirected requests all have identical requestIds over the protocol. Once a request has been
       * redirected all future messages referrencing that requestId are about the new destination, not
       * the original. This method is a helper for finding the real request object to which the current
       * message is referring.
       *
       * @param {string} requestId
       * @param {LH.Protocol.TargetType} targetType
       * @param {string|undefined} sessionId
       * @return {NetworkRequest|undefined}
       */
      _findRealRequestAndSetSession(requestId, targetType, sessionId) {
        let request = this._recordsById.get(requestId);
        if (!request || !request.isValid) return void 0;
        while (request.redirectDestination) {
          request = request.redirectDestination;
        }
        request.setSession(sessionId);
        request.sessionTargetType = targetType;
        return request;
      }
      /**
       * @param {NetworkRequest} record The record to find the initiator of
       * @param {Map<string, NetworkRequest[]>} recordsByURL
       * @return {NetworkRequest|null}
       * @private
       */
      static _chooseInitiatorRequest(record, recordsByURL) {
        if (record.redirectSource) {
          return record.redirectSource;
        }
        const lanternReq = NetworkRequest.asLanternNetworkRequest(record);
        const initiatorURL = graph_exports.PageDependencyGraph.getNetworkInitiators(lanternReq)[0];
        let candidates = recordsByURL.get(initiatorURL) || [];
        candidates = candidates.filter((c) => {
          return c.responseHeadersEndTime <= record.rendererStartTime && c.finished && !c.failed;
        });
        if (candidates.length > 1) {
          const nonPrefetchCandidates = candidates.filter(
            (cand) => cand.resourceType !== NetworkRequest.TYPES.Other
          );
          if (nonPrefetchCandidates.length) {
            candidates = nonPrefetchCandidates;
          }
        }
        if (candidates.length > 1) {
          const sameFrameCandidates = candidates.filter((cand) => cand.frameId === record.frameId);
          if (sameFrameCandidates.length) {
            candidates = sameFrameCandidates;
          }
        }
        if (candidates.length > 1 && record.initiator.type === "parser") {
          const documentCandidates = candidates.filter((cand) => cand.resourceType === NetworkRequest.TYPES.Document);
          if (documentCandidates.length) {
            candidates = documentCandidates;
          }
        }
        if (candidates.length > 1) {
          const linkPreloadCandidates = candidates.filter((c) => c.isLinkPreload);
          if (linkPreloadCandidates.length) {
            const nonPreloadCandidates = candidates.filter((c) => !c.isLinkPreload);
            const allPreloaded = nonPreloadCandidates.every((c) => c.fromDiskCache || c.fromMemoryCache);
            if (nonPreloadCandidates.length && allPreloaded) {
              candidates = linkPreloadCandidates;
            }
          }
        }
        return candidates.length === 1 ? candidates[0] : null;
      }
      /**
       * Construct network records from a log of devtools protocol messages.
       * @param {LH.DevtoolsLog} devtoolsLog
       * @return {Array<LH.Artifacts.NetworkRequest>}
       */
      static recordsFromLogs(devtoolsLog) {
        const networkRecorder = new _NetworkRecorder();
        devtoolsLog.forEach((message) => networkRecorder.dispatch(message));
        const records = networkRecorder.getRawRecords().filter((record) => record.isValid);
        const recordsByURL = /* @__PURE__ */ new Map();
        for (const record of records) {
          const records2 = recordsByURL.get(record.url) || [];
          records2.push(record);
          recordsByURL.set(record.url, records2);
        }
        for (const record of records) {
          const initiatorRequest = _NetworkRecorder._chooseInitiatorRequest(record, recordsByURL);
          if (initiatorRequest) {
            record.setInitiatorRequest(initiatorRequest);
          }
          let finalRecord = record;
          while (finalRecord.redirectDestination) finalRecord = finalRecord.redirectDestination;
          if (finalRecord === record || finalRecord.redirects) continue;
          const redirects = [];
          for (let redirect = finalRecord.redirectSource; redirect; redirect = redirect.redirectSource) {
            redirects.unshift(redirect);
          }
          finalRecord.redirects = redirects;
        }
        return records;
      }
    };
  }
});

// core/computed/network-records.js
var NetworkRecords, NetworkRecordsComputed;
var init_network_records = __esm({
  "core/computed/network-records.js"() {
    "use strict";
    init_process_global();
    init_lh();
    init_computed_artifact();
    init_network_recorder();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    NetworkRecords = class {
      static {
        __name(this, "NetworkRecords");
      }
      /**
       * @param {LH.DevtoolsLog} devtoolsLog
       * @return {Promise<Array<LH.Artifacts.NetworkRequest>>} networkRecords
       */
      static async compute_(devtoolsLog) {
        return NetworkRecorder.recordsFromLogs(devtoolsLog);
      }
    };
    NetworkRecordsComputed = makeComputedArtifact(NetworkRecords, null);
  }
});

// core/computed/network-analysis.js
var NetworkAnalysis, NetworkAnalysisComputed;
var init_network_analysis = __esm({
  "core/computed/network-analysis.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_lantern2();
    init_computed_artifact();
    init_network_records();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    NetworkAnalysis = class {
      static {
        __name(this, "NetworkAnalysis");
      }
      /**
       * @param {LH.DevtoolsLog} devtoolsLog
       * @param {LH.Artifacts.ComputedContext} context
       * @return {Promise<LH.Artifacts.NetworkAnalysis>}
       */
      static async compute_(devtoolsLog, context) {
        const records = await NetworkRecordsComputed.request(devtoolsLog, context);
        const analysis = core_exports.NetworkAnalyzer.analyze(
          records
        );
        if (!analysis) {
          lighthouse_logger_default.error("NetworkAnalysis", "Network analysis failed due to lack of transfer data");
          return {
            throughput: 0,
            rtt: Number.POSITIVE_INFINITY,
            additionalRttByOrigin: /* @__PURE__ */ new Map(),
            serverResponseTimeByOrigin: /* @__PURE__ */ new Map()
          };
        }
        return analysis;
      }
    };
    NetworkAnalysisComputed = makeComputedArtifact(NetworkAnalysis, null);
  }
});

// core/computed/load-simulator.js
var LoadSimulator, LoadSimulatorComputed;
var init_load_simulator = __esm({
  "core/computed/load-simulator.js"() {
    "use strict";
    init_process_global();
    init_computed_artifact();
    init_lantern2();
    init_network_analysis();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    LoadSimulator = class {
      static {
        __name(this, "LoadSimulator");
      }
      /**
       * @param {{devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings']}} data
       * @param {LH.Artifacts.ComputedContext} context
       * @return {Promise<LH.Gatherer.Simulation.Simulator>}
       */
      static async compute_(data31, context) {
        const networkAnalysis = await NetworkAnalysisComputed.request(data31.devtoolsLog, context);
        return simulation_exports.Simulator.createSimulator({ ...data31.settings, networkAnalysis });
      }
      /**
       * @param {LH.Artifacts.NetworkAnalysis} networkAnalysis
       * @return {LH.PrecomputedLanternData}
       */
      static convertAnalysisToSaveableLanternData(networkAnalysis) {
        const lanternData = { additionalRttByOrigin: {}, serverResponseTimeByOrigin: {} };
        for (const [origin, value] of networkAnalysis.additionalRttByOrigin.entries()) {
          if (origin.startsWith("http")) lanternData.additionalRttByOrigin[origin] = value;
        }
        for (const [origin, value] of networkAnalysis.serverResponseTimeByOrigin.entries()) {
          if (origin.startsWith("http")) lanternData.serverResponseTimeByOrigin[origin] = value;
        }
        return lanternData;
      }
    };
    LoadSimulatorComputed = makeComputedArtifact(LoadSimulator, ["devtoolsLog", "settings"]);
  }
});

// core/lib/asset-saver.js
import fs from "fs";
import path3 from "path";
import stream from "stream";
import { createGzip, gunzipSync } from "zlib";
async function writeJson(contents, path7, gzip) {
  const writeStream = fs.createWriteStream(gzip ? path7 + ".gz" : path7);
  if (gzip) {
    await stream.promises.pipeline(contents, createGzip(), writeStream);
  } else {
    await stream.promises.pipeline(contents, writeStream);
  }
}
function readJson(filename, reviver) {
  if (fs.existsSync(filename + ".gz")) {
    filename = filename + ".gz";
  }
  if (!filename.endsWith(".json.gz")) {
    return JSON.parse(fs.readFileSync(filename, "utf8"), reviver);
  }
  const buffer = gunzipSync(fs.readFileSync(filename));
  return JSON.parse(buffer.toString("utf8"), reviver);
}
function endsWithSuffix(filename, suffix) {
  return filename.endsWith(suffix) || filename.endsWith(suffix + ".gz");
}
function loadArtifacts(basePath) {
  lighthouse_logger_default.log("Reading artifacts from disk:", basePath);
  if (!fs.existsSync(basePath)) {
    throw new Error("No saved artifacts found at " + basePath);
  }
  const artifacts = readJson(path3.join(basePath, artifactsFilename), LighthouseError.parseReviver);
  const filenames = fs.readdirSync(basePath);
  filenames.filter((f) => endsWithSuffix(f, devtoolsFilename)).forEach((filename) => {
    const devtoolsLog = readJson(path3.join(basePath, filename));
    if (filename.startsWith(devtoolsFilename)) {
      artifacts.DevtoolsLog = devtoolsLog;
    } else if (filename.startsWith(errorPrefix)) {
      artifacts.DevtoolsLogError = devtoolsLog;
    }
  });
  filenames.filter((f) => endsWithSuffix(f, traceFilename)).forEach((filename) => {
    let trace = readJson(path3.join(basePath, filename));
    if (Array.isArray(trace)) {
      trace = { traceEvents: trace };
    }
    if (filename.startsWith(traceFilename)) {
      artifacts.Trace = trace;
    } else if (filename.startsWith(errorPrefix)) {
      artifacts.TraceError = trace;
    }
  });
  if (Array.isArray(artifacts.Timing)) {
    artifacts.Timing.forEach((entry) => entry.gather = true);
  }
  return artifacts;
}
function stringifyReplacer(key, value) {
  if (value instanceof Error) {
    return LighthouseError.stringifyReplacer(value);
  }
  return value;
}
async function saveArtifacts(artifacts, basePath, options = {}) {
  const status = { msg: "Saving artifacts", id: "lh:assetSaver:saveArtifacts" };
  lighthouse_logger_default.time(status);
  fs.mkdirSync(basePath, { recursive: true });
  const filenames = fs.readdirSync(basePath);
  for (const filename of filenames) {
    const isPreviousFile = filename.endsWith(traceFilename) || filename.endsWith(devtoolsFilename) || filename.endsWith(traceFilename + ".gz") || filename.endsWith(devtoolsFilename + ".gz") || filename === artifactsFilename || filename === artifactsFilename + ".gz";
    if (isPreviousFile) {
      fs.unlinkSync(`${basePath}/${filename}`);
    }
  }
  const {
    DevtoolsLog: DevtoolsLog2,
    Trace: Trace2,
    DevtoolsLogError,
    TraceError,
    ...restArtifacts
  } = artifacts;
  if (Trace2) {
    await saveTrace(Trace2, `${basePath}/${traceFilename}`, options);
  }
  if (TraceError) {
    await saveTrace(TraceError, `${basePath}/${errorPrefix}${traceFilename}`, options);
  }
  if (DevtoolsLog2) {
    await saveDevtoolsLog(
      DevtoolsLog2,
      `${basePath}/${devtoolsFilename}`,
      options
    );
  }
  if (DevtoolsLogError) {
    await saveDevtoolsLog(
      DevtoolsLogError,
      `${basePath}/${errorPrefix}${devtoolsFilename}`,
      options
    );
  }
  const restArtifactsString = JSON.stringify(restArtifacts, stringifyReplacer, 2);
  await writeJson(function* () {
    yield restArtifactsString;
    yield "\n";
  }, `${basePath}/${artifactsFilename}`, !!options.gzip);
  lighthouse_logger_default.log("Artifacts saved to disk in folder:", basePath);
  lighthouse_logger_default.timeEnd(status);
}
function saveLhr(lhr, basePath) {
  fs.writeFileSync(`${basePath}/lhr.report.json`, JSON.stringify(lhr, null, 2));
}
function* arrayOfObjectsJsonGenerator(arrayOfObjects) {
  const ITEMS_PER_ITERATION = 500;
  yield "[\n";
  if (arrayOfObjects.length > 0) {
    const itemsIterator = arrayOfObjects[Symbol.iterator]();
    const firstItem = itemsIterator.next().value;
    yield `  ${JSON.stringify(firstItem)}`;
    let itemsRemaining = ITEMS_PER_ITERATION;
    let itemsJSON = "";
    for (const item of itemsIterator) {
      itemsJSON += `,
  ${JSON.stringify(item)}`;
      itemsRemaining--;
      if (itemsRemaining === 0) {
        yield itemsJSON;
        itemsRemaining = ITEMS_PER_ITERATION;
        itemsJSON = "";
      }
    }
    yield itemsJSON;
  }
  yield "\n]";
}
function* traceJsonGenerator(traceData) {
  const { traceEvents, ...rest } = traceData;
  yield "{\n";
  yield '"traceEvents": ';
  yield* arrayOfObjectsJsonGenerator(traceEvents);
  for (const [key, value] of Object.entries(rest)) {
    yield `,
"${key}": ${JSON.stringify(value, null, 2)}`;
  }
  yield "}\n";
}
function saveTrace(traceData, traceFilename2, options = {}) {
  const traceIter = traceJsonGenerator(traceData);
  return writeJson(traceIter, traceFilename2, !!options.gzip);
}
function saveDevtoolsLog(devtoolsLog, devtoolLogFilename, options = {}) {
  return writeJson(function* () {
    yield* arrayOfObjectsJsonGenerator(devtoolsLog);
    yield "\n";
  }, devtoolLogFilename, !!options.gzip);
}
var artifactsFilename, traceFilename, devtoolsFilename, errorPrefix;
var init_asset_saver = __esm({
  "core/lib/asset-saver.js"() {
    "use strict";
    init_process_global();
    init_url();
    init_lighthouse_logger();
    init_lantern2();
    init_lantern_trace_saver();
    init_metric_trace_events();
    init_network_analysis();
    init_load_simulator();
    init_lh_error();
    init_root2();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    artifactsFilename = "artifacts.json";
    traceFilename = "trace.json";
    devtoolsFilename = "devtoolslog.json";
    errorPrefix = "pageLoadError.";
    __name(writeJson, "writeJson");
    __name(readJson, "readJson");
    __name(endsWithSuffix, "endsWithSuffix");
    __name(loadArtifacts, "loadArtifacts");
    __name(stringifyReplacer, "stringifyReplacer");
    __name(saveArtifacts, "saveArtifacts");
    __name(saveLhr, "saveLhr");
    __name(arrayOfObjectsJsonGenerator, "arrayOfObjectsJsonGenerator");
    __name(traceJsonGenerator, "traceJsonGenerator");
    __name(saveTrace, "saveTrace");
    __name(saveDevtoolsLog, "saveDevtoolsLog");
  }
});

// core/config/constants.js
var constants_exports = {};
__export(constants_exports, {
  defaultSettings: () => defaultSettings,
  nonSimulatedSettingsOverrides: () => nonSimulatedSettingsOverrides,
  screenEmulationMetrics: () => screenEmulationMetrics,
  throttling: () => throttling2,
  userAgents: () => userAgents
});
var throttling2, MOTOGPOWER_EMULATION_METRICS, DESKTOP_EMULATION_METRICS, screenEmulationMetrics, MOTOG4_USERAGENT, DESKTOP_USERAGENT, userAgents, defaultSettings, nonSimulatedSettingsOverrides;
var init_constants = __esm({
  "core/config/constants.js"() {
    "use strict";
    init_process_global();
    init_lantern2();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    throttling2 = simulation_exports.Constants.throttling;
    MOTOGPOWER_EMULATION_METRICS = {
      mobile: true,
      width: 412,
      height: 823,
      // This value has some interesting ramifications for image-size-responsive, see:
      // https://github.com/GoogleChrome/lighthouse/issues/10741#issuecomment-626903508
      deviceScaleFactor: 1.75,
      disabled: false
    };
    DESKTOP_EMULATION_METRICS = {
      mobile: false,
      width: 1350,
      height: 940,
      deviceScaleFactor: 1,
      disabled: false
    };
    screenEmulationMetrics = {
      mobile: MOTOGPOWER_EMULATION_METRICS,
      desktop: DESKTOP_EMULATION_METRICS
    };
    MOTOG4_USERAGENT = "Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36";
    DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36";
    userAgents = {
      mobile: MOTOG4_USERAGENT,
      desktop: DESKTOP_USERAGENT
    };
    defaultSettings = {
      output: "json",
      maxWaitForFcp: 30 * 1e3,
      maxWaitForLoad: 45 * 1e3,
      pauseAfterFcpMs: 1e3,
      pauseAfterLoadMs: 1e3,
      networkQuietThresholdMs: 1e3,
      cpuQuietThresholdMs: 1e3,
      formFactor: "mobile",
      throttling: throttling2.mobileSlow4G,
      throttlingMethod: "simulate",
      screenEmulation: screenEmulationMetrics.mobile,
      emulatedUserAgent: userAgents.mobile,
      auditMode: false,
      gatherMode: false,
      clearStorageTypes: ["file_systems", "shader_cache", "service_workers", "cache_storage"],
      disableStorageReset: false,
      debugNavigation: false,
      channel: "node",
      usePassiveGathering: false,
      disableFullPageScreenshot: false,
      skipAboutBlank: false,
      blankPage: "about:blank",
      ignoreStatusCode: false,
      // the following settings have no defaults but we still want ensure that `key in settings`
      // in config will work in a typechecked way
      locale: "en-US",
      // actual default determined by Config using lib/i18n
      blockedUrlPatterns: null,
      additionalTraceCategories: null,
      extraHeaders: null,
      precomputedLanternData: null,
      onlyAudits: null,
      onlyCategories: null,
      skipAudits: null
    };
    nonSimulatedSettingsOverrides = {
      pauseAfterFcpMs: 5250,
      pauseAfterLoadMs: 5250,
      networkQuietThresholdMs: 5250,
      cpuQuietThresholdMs: 5250
    };
  }
});

// core/config/default-config.js
var UIStrings22, str_2, defaultConfig, default_config_default;
var init_default_config = __esm({
  "core/config/default-config.js"() {
    "use strict";
    init_process_global();
    init_lh();
    init_constants();
    init_i18n();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings22 = {
      /** Title of the Performance category of audits. Equivalent to 'Web performance', this term is inclusive of all web page speed and loading optimization topics. Also used as a label of a score gauge; try to limit to 20 characters. */
      performanceCategoryTitle: "Performance",
      /** Title of the speed metrics section of the Performance category. Within this section are various speed metrics which quantify the pageload performance into values presented in seconds and milliseconds. */
      metricGroupTitle: "Metrics",
      /** Title of the insights section of the Performance category. Within this section are various insights to give developers tips on how to improve the performance of their page. */
      insightsGroupTitle: "Insights",
      /** Description of the insights section of the Performance category. Within this section are various insights to give developers tips on how to improve the performance of their page. */
      insightsGroupDescription: "These insights are also available in the Chrome DevTools Performance Panel - [record a trace](https://developer.chrome.com/docs/devtools/performance/reference) to view more detailed information.",
      /** Title of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the time of the first initial render of the webpage. */
      firstPaintImprovementsGroupTitle: "First Paint Improvements",
      /** Description of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the time of the first initial render of the webpage. */
      firstPaintImprovementsGroupDescription: "The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint",
      /** Title of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the overall loading performance of their web page. */
      overallImprovementsGroupTitle: "Overall Improvements",
      /** Description of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the overall loading performance of their web page. */
      overallImprovementsGroupDescription: "Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index",
      /** Title 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. */
      diagnosticsGroupTitle: "Diagnostics",
      /** Description of the diagnostics section of the Performance category. Within this section are audits with non-imperative titles that provide more detail on a web page's load performance characteristics. Within this section, the user may read the details and deduce additional actions they could take to improve performance. */
      diagnosticsGroupDescription: "More information about the performance of your application. These numbers don't [directly affect](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) the Performance score.",
      /** Title of the Accessibility category of audits. This section contains audits focused on making web content accessible to all users. Also used as a label of a score gauge; try to limit to 20 characters. */
      a11yCategoryTitle: "Accessibility",
      /** Description of the Accessibility category. This is displayed at the top of a list of audits focused on making web content accessible to all users. No character length limits. 'improve the accessibility of your web app' and 'manual testing' become link texts to additional documentation. */
      a11yCategoryDescription: "These checks highlight opportunities to [improve the accessibility of your web app](https://developer.chrome.com/docs/lighthouse/accessibility/). Automatic detection can only detect a subset of issues and does not guarantee the accessibility of your web app, so [manual testing](https://web.dev/articles/how-to-review) is also encouraged.",
      /** Description of the Accessibility manual checks category. This description is displayed above a list of accessibility audits that currently have no automated test and so must be verified manually by the user. No character length limits. 'conducting an accessibility review' becomes link text to additional documentation. */
      a11yCategoryManualDescription: "These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://web.dev/articles/how-to-review).",
      /** Title of the best practices section of the Accessibility category. Within this section are audits with descriptive titles that highlight common accessibility best practices. */
      a11yBestPracticesGroupTitle: "Best practices",
      /** Description of the best practices section within the Accessibility category. Within this section are audits with descriptive titles that highlight common accessibility best practices. */
      a11yBestPracticesGroupDescription: "These items highlight common accessibility best practices.",
      /** Title of the color contrast section within the Accessibility category. Within this section are audits with descriptive titles that highlight the color and vision aspects of the page's accessibility that are passing or failing. */
      a11yColorContrastGroupTitle: "Contrast",
      /** Description of the color contrast section within the Accessibility category. Within this section are audits with descriptive titles that highlight the color and vision aspects of the page's accessibility that are passing or failing. */
      a11yColorContrastGroupDescription: "These are opportunities to improve the legibility of your content.",
      /** Title of the HTML element naming section within the Accessibility category. Within this section are audits with descriptive titles that highlight if the non-textual HTML elements on the page have names discernible by a screen reader. */
      a11yNamesLabelsGroupTitle: "Names and labels",
      /** Description of the HTML element naming section within the Accessibility category. Within this section are audits with descriptive titles that highlight if the non-textual HTML elements on the page have names discernible by a screen reader. */
      a11yNamesLabelsGroupDescription: "These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader.",
      /** Title of the navigation section within the Accessibility category. Within this section are audits with descriptive titles that highlight opportunities to improve keyboard navigation. */
      a11yNavigationGroupTitle: "Navigation",
      /** Description of the navigation section within the Accessibility category. Within this section are audits with descriptive titles that highlight opportunities to improve keyboard navigation. */
      a11yNavigationGroupDescription: "These are opportunities to improve keyboard navigation in your application.",
      /** Title of the ARIA validity section within the Accessibility category. Within this section are audits with descriptive titles that highlight if whether all the aria-* HTML attributes have been used properly. */
      a11yAriaGroupTitle: "ARIA",
      /** Description of the ARIA validity section within the Accessibility category. Within this section are audits with descriptive titles that highlight if whether all the aria-* HTML attributes have been used properly. */
      a11yAriaGroupDescription: "These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader.",
      /** Title of the language section within the Accessibility category. Within this section are audits with descriptive titles that highlight if the language has been annotated in the correct HTML attributes on the page. */
      a11yLanguageGroupTitle: "Internationalization and localization",
      /** Description of the language section within the Accessibility category. Within this section are audits with descriptive titles that highlight if the language has been annotated in the correct HTML attributes on the page. */
      a11yLanguageGroupDescription: "These are opportunities to improve the interpretation of your content by users in different locales.",
      /** Title of the navigation section within the Accessibility category. Within this section are audits with descriptive titles that highlight opportunities to provide alternative content for audio and video. */
      a11yAudioVideoGroupTitle: "Audio and video",
      /** Description of the navigation section within the Accessibility category. Within this section are audits with descriptive titles that highlight opportunities to provide alternative content for audio and video. */
      a11yAudioVideoGroupDescription: "These are opportunities to provide alternative content for audio and video. This may improve the experience for users with hearing or vision impairments.",
      /** 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. */
      a11yTablesListsVideoGroupTitle: "Tables and lists",
      /** Description 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. */
      a11yTablesListsVideoGroupDescription: "These are opportunities to improve the experience of reading tabular or list data using assistive technology, like a screen reader.",
      /** 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. */
      seoCategoryTitle: "SEO",
      /** Description of the Search Engine Optimization (SEO) category. This is displayed at the top of a list of audits focused on optimizing a website for indexing by search engines. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      seoCategoryDescription: "These checks ensure that your page is following basic search engine optimization advice. There are many additional factors Lighthouse does not score here that may affect your search ranking, including performance on [Core Web Vitals](https://web.dev/explore/vitals). [Learn more about Google Search Essentials](https://support.google.com/webmasters/answer/35769).",
      /** Description of the Search Engine Optimization (SEO) manual checks category, the additional validators must be run by hand in order to check all SEO best practices. This is displayed at the top of a list of manually run audits focused on optimizing a website for indexing by search engines. No character length limits. */
      seoCategoryManualDescription: "Run these additional validators on your site to check additional SEO best practices.",
      /** 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. */
      seoMobileGroupTitle: "Mobile Friendly",
      /** 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. */
      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 how to make pages mobile-friendly](https://developers.google.com/search/mobile-sites/).",
      /** 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. */
      seoContentGroupTitle: "Content Best Practices",
      /** 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. */
      seoContentGroupDescription: "Format your HTML in a way that enables crawlers to better understand your app’s content.",
      /** 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. */
      seoCrawlingGroupTitle: "Crawling and Indexing",
      /** 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. */
      seoCrawlingGroupDescription: "To appear in search results, crawlers need access to your app.",
      /** Title of the Best Practices category of audits. This is displayed at the top of a list of audits focused on topics related to following web development best practices and accepted guidelines. Also used as a label of a score gauge; try to limit to 20 characters. */
      bestPracticesCategoryTitle: "Best Practices",
      /** Title of the Trust & Safety group of audits. This is displayed at the top of a list of audits focused on maintaining user trust and protecting security in web development. */
      bestPracticesTrustSafetyGroupTitle: "Trust and Safety",
      /** Title of the User Experience group of the Best Practices category. Within this section are the audits related to the end user's experience of the webpage. */
      bestPracticesUXGroupTitle: "User Experience",
      /** Title of the Browser Compatibility group of the Best Practices category. Within this section are the audits related to whether the page is interpreted consistently by browsers. */
      bestPracticesBrowserCompatGroupTitle: "Browser Compatibility",
      /** Title of the General group of the Best Practices category. Within this section are the audits that don't belong to a specific group but are of general interest. */
      bestPracticesGeneralGroupTitle: "General"
    };
    str_2 = createIcuMessageFn({ url: "core/config/default-config.js" }.url, UIStrings22);
    defaultConfig = {
      settings: defaultSettings,
      artifacts: [
        // Artifacts which can be depended on come first.
        { id: "DevtoolsLog", gatherer: "devtools-log" },
        { id: "Trace", gatherer: "trace" },
        { id: "Accessibility", gatherer: "accessibility" },
        { id: "AnchorElements", gatherer: "anchor-elements" },
        { id: "ConsoleMessages", gatherer: "console-messages" },
        { id: "CSSUsage", gatherer: "css-usage" },
        { id: "Doctype", gatherer: "dobetterweb/doctype" },
        { id: "Inputs", gatherer: "inputs" },
        { id: "IFrameElements", gatherer: "iframe-elements" },
        { id: "ImageElements", gatherer: "image-elements" },
        { id: "InspectorIssues", gatherer: "inspector-issues" },
        { id: "JsUsage", gatherer: "js-usage" },
        { id: "LinkElements", gatherer: "link-elements" },
        { id: "MainDocumentContent", gatherer: "main-document-content" },
        { id: "MetaElements", gatherer: "meta-elements" },
        { id: "NetworkUserAgent", gatherer: "network-user-agent" },
        { id: "RobotsTxt", gatherer: "seo/robots-txt" },
        { id: "Scripts", gatherer: "scripts" },
        { id: "SourceMaps", gatherer: "source-maps" },
        { id: "Stacks", gatherer: "stacks" },
        { id: "Stylesheets", gatherer: "stylesheets" },
        { id: "TraceElements", gatherer: "trace-elements" },
        { id: "ViewportDimensions", gatherer: "viewport-dimensions" },
        // FullPageScreenshot comes at the end so all other node analysis is captured.
        { id: "FullPageScreenshot", gatherer: "full-page-screenshot" },
        // BFCacheFailures comes at the very end because it can perform a page navigation.
        { id: "BFCacheFailures", gatherer: "bf-cache-failures" }
      ],
      audits: [
        "is-on-https",
        "redirects-http",
        "metrics/first-contentful-paint",
        "metrics/largest-contentful-paint",
        "metrics/speed-index",
        "screenshot-thumbnails",
        "final-screenshot",
        "metrics/total-blocking-time",
        "metrics/max-potential-fid",
        "metrics/cumulative-layout-shift",
        "metrics/interaction-to-next-paint",
        "errors-in-console",
        "server-response-time",
        "metrics/interactive",
        "user-timings",
        "redirects",
        "image-aspect-ratio",
        "image-size-responsive",
        "deprecations",
        "third-party-cookies",
        "mainthread-work-breakdown",
        "bootup-time",
        "diagnostics",
        "network-requests",
        "network-rtt",
        "network-server-latency",
        "main-thread-tasks",
        "metrics",
        "resource-summary",
        "layout-shifts",
        "long-tasks",
        "non-composited-animations",
        "unsized-images",
        "valid-source-maps",
        "csp-xss",
        "has-hsts",
        "origin-isolation",
        "clickjacking-mitigation",
        "trusted-types-xss",
        "script-treemap-data",
        "accessibility/accesskeys",
        "accessibility/aria-allowed-attr",
        "accessibility/aria-allowed-role",
        "accessibility/aria-command-name",
        "accessibility/aria-conditional-attr",
        "accessibility/aria-deprecated-role",
        "accessibility/aria-dialog-name",
        "accessibility/aria-hidden-body",
        "accessibility/aria-hidden-focus",
        "accessibility/aria-input-field-name",
        "accessibility/aria-meter-name",
        "accessibility/aria-progressbar-name",
        "accessibility/aria-prohibited-attr",
        "accessibility/aria-required-attr",
        "accessibility/aria-required-children",
        "accessibility/aria-required-parent",
        "accessibility/aria-roles",
        "accessibility/aria-text",
        "accessibility/aria-toggle-field-name",
        "accessibility/aria-tooltip-name",
        "accessibility/aria-treeitem-name",
        "accessibility/aria-valid-attr-value",
        "accessibility/aria-valid-attr",
        "accessibility/button-name",
        "accessibility/bypass",
        "accessibility/color-contrast",
        "accessibility/definition-list",
        "accessibility/dlitem",
        "accessibility/document-title",
        "accessibility/duplicate-id-aria",
        "accessibility/empty-heading",
        "accessibility/form-field-multiple-labels",
        "accessibility/frame-title",
        "accessibility/heading-order",
        "accessibility/html-has-lang",
        "accessibility/html-lang-valid",
        "accessibility/html-xml-lang-mismatch",
        "accessibility/identical-links-same-purpose",
        "accessibility/image-alt",
        "accessibility/image-redundant-alt",
        "accessibility/input-button-name",
        "accessibility/input-image-alt",
        "accessibility/label-content-name-mismatch",
        "accessibility/label",
        "accessibility/landmark-one-main",
        "accessibility/link-name",
        "accessibility/link-in-text-block",
        "accessibility/list",
        "accessibility/listitem",
        "accessibility/meta-refresh",
        "accessibility/meta-viewport",
        "accessibility/object-alt",
        "accessibility/select-name",
        "accessibility/skip-link",
        "accessibility/tabindex",
        "accessibility/table-duplicate-name",
        "accessibility/table-fake-caption",
        "accessibility/target-size",
        "accessibility/td-has-header",
        "accessibility/td-headers-attr",
        "accessibility/th-has-data-cells",
        "accessibility/valid-lang",
        "accessibility/video-caption",
        "accessibility/manual/custom-controls-labels",
        "accessibility/manual/custom-controls-roles",
        "accessibility/manual/focus-traps",
        "accessibility/manual/focusable-controls",
        "accessibility/manual/interactive-element-affordance",
        "accessibility/manual/logical-tab-order",
        "accessibility/manual/managed-focus",
        "accessibility/manual/offscreen-content-hidden",
        "accessibility/manual/use-landmarks",
        "accessibility/manual/visual-order-follows-dom",
        "accessibility/autocomplete-valid",
        "accessibility/presentation-role-conflict",
        "accessibility/svg-img-alt",
        "byte-efficiency/total-byte-weight",
        "byte-efficiency/unminified-css",
        "byte-efficiency/unminified-javascript",
        "byte-efficiency/unused-css-rules",
        "byte-efficiency/unused-javascript",
        "dobetterweb/doctype",
        "dobetterweb/charset",
        "dobetterweb/geolocation-on-start",
        "dobetterweb/inspector-issues",
        "dobetterweb/js-libraries",
        "dobetterweb/notification-on-start",
        "dobetterweb/paste-preventing-inputs",
        "baseline",
        "seo/meta-description",
        "seo/http-status-code",
        "seo/link-text",
        "seo/crawlable-anchors",
        "seo/is-crawlable",
        "seo/robots-txt",
        "seo/hreflang",
        "seo/canonical",
        "seo/manual/structured-data",
        "bf-cache",
        "insights/cache-insight",
        "insights/cls-culprits-insight",
        "insights/document-latency-insight",
        "insights/dom-size-insight",
        "insights/duplicated-javascript-insight",
        "insights/font-display-insight",
        "insights/forced-reflow-insight",
        "insights/image-delivery-insight",
        "insights/inp-breakdown-insight",
        "insights/lcp-breakdown-insight",
        "insights/lcp-discovery-insight",
        "insights/legacy-javascript-insight",
        "insights/modern-http-insight",
        "insights/network-dependency-tree-insight",
        "insights/render-blocking-insight",
        "insights/third-parties-insight",
        "insights/viewport-insight"
      ],
      groups: {
        "metrics": {
          title: str_2(UIStrings22.metricGroupTitle)
        },
        "insights": {
          title: str_2(UIStrings22.insightsGroupTitle),
          description: str_2(UIStrings22.insightsGroupDescription)
        },
        "diagnostics": {
          title: str_2(UIStrings22.diagnosticsGroupTitle),
          description: str_2(UIStrings22.diagnosticsGroupDescription)
        },
        "a11y-best-practices": {
          title: str_2(UIStrings22.a11yBestPracticesGroupTitle),
          description: str_2(UIStrings22.a11yBestPracticesGroupDescription)
        },
        "a11y-color-contrast": {
          title: str_2(UIStrings22.a11yColorContrastGroupTitle),
          description: str_2(UIStrings22.a11yColorContrastGroupDescription)
        },
        "a11y-names-labels": {
          title: str_2(UIStrings22.a11yNamesLabelsGroupTitle),
          description: str_2(UIStrings22.a11yNamesLabelsGroupDescription)
        },
        "a11y-navigation": {
          title: str_2(UIStrings22.a11yNavigationGroupTitle),
          description: str_2(UIStrings22.a11yNavigationGroupDescription)
        },
        "a11y-aria": {
          title: str_2(UIStrings22.a11yAriaGroupTitle),
          description: str_2(UIStrings22.a11yAriaGroupDescription)
        },
        "a11y-language": {
          title: str_2(UIStrings22.a11yLanguageGroupTitle),
          description: str_2(UIStrings22.a11yLanguageGroupDescription)
        },
        "a11y-audio-video": {
          title: str_2(UIStrings22.a11yAudioVideoGroupTitle),
          description: str_2(UIStrings22.a11yAudioVideoGroupDescription)
        },
        "a11y-tables-lists": {
          title: str_2(UIStrings22.a11yTablesListsVideoGroupTitle),
          description: str_2(UIStrings22.a11yTablesListsVideoGroupDescription)
        },
        "seo-mobile": {
          title: str_2(UIStrings22.seoMobileGroupTitle),
          description: str_2(UIStrings22.seoMobileGroupDescription)
        },
        "seo-content": {
          title: str_2(UIStrings22.seoContentGroupTitle),
          description: str_2(UIStrings22.seoContentGroupDescription)
        },
        "seo-crawl": {
          title: str_2(UIStrings22.seoCrawlingGroupTitle),
          description: str_2(UIStrings22.seoCrawlingGroupDescription)
        },
        "best-practices-trust-safety": {
          title: str_2(UIStrings22.bestPracticesTrustSafetyGroupTitle)
        },
        "best-practices-ux": {
          title: str_2(UIStrings22.bestPracticesUXGroupTitle)
        },
        "best-practices-browser-compat": {
          title: str_2(UIStrings22.bestPracticesBrowserCompatGroupTitle)
        },
        "best-practices-general": {
          title: str_2(UIStrings22.bestPracticesGeneralGroupTitle)
        },
        // Group for audits that should not be displayed.
        "hidden": { title: "" }
      },
      categories: {
        "performance": {
          title: str_2(UIStrings22.performanceCategoryTitle),
          supportedModes: ["navigation", "timespan", "snapshot"],
          auditRefs: [
            { id: "first-contentful-paint", weight: 10, group: "metrics", acronym: "FCP" },
            { id: "largest-contentful-paint", weight: 25, group: "metrics", acronym: "LCP" },
            { id: "total-blocking-time", weight: 30, group: "metrics", acronym: "TBT" },
            { id: "cumulative-layout-shift", weight: 25, group: "metrics", acronym: "CLS" },
            { id: "speed-index", weight: 10, group: "metrics", acronym: "SI" },
            { id: "interaction-to-next-paint", weight: 0, group: "metrics", acronym: "INP" },
            // Insight audits.
            { id: "cache-insight", weight: 0, group: "insights" },
            { id: "cls-culprits-insight", weight: 0, group: "insights" },
            { id: "document-latency-insight", weight: 0, group: "insights" },
            { id: "dom-size-insight", weight: 0, group: "insights" },
            { id: "duplicated-javascript-insight", weight: 0, group: "insights" },
            { id: "font-display-insight", weight: 0, group: "insights" },
            { id: "forced-reflow-insight", weight: 0, group: "insights" },
            { id: "image-delivery-insight", weight: 0, group: "insights" },
            { id: "inp-breakdown-insight", weight: 0, group: "insights" },
            { id: "lcp-breakdown-insight", weight: 0, group: "insights" },
            { id: "lcp-discovery-insight", weight: 0, group: "insights" },
            { id: "legacy-javascript-insight", weight: 0, group: "insights" },
            { id: "modern-http-insight", weight: 0, group: "insights" },
            { id: "network-dependency-tree-insight", weight: 0, group: "insights" },
            { id: "render-blocking-insight", weight: 0, group: "insights" },
            { id: "third-parties-insight", weight: 0, group: "insights" },
            { id: "viewport-insight", weight: 0, group: "insights" },
            // These are our "invisible" metrics. Not displayed, but still in the LHR.
            { id: "interactive", weight: 0, group: "hidden", acronym: "TTI" },
            { id: "max-potential-fid", weight: 0, group: "hidden" },
            { id: "unminified-css", weight: 0, group: "diagnostics" },
            { id: "unminified-javascript", weight: 0, group: "diagnostics" },
            { id: "unused-css-rules", weight: 0, group: "diagnostics" },
            { id: "unused-javascript", weight: 0, group: "diagnostics" },
            { id: "total-byte-weight", weight: 0, group: "diagnostics" },
            { id: "user-timings", weight: 0, group: "diagnostics" },
            { id: "bootup-time", weight: 0, group: "diagnostics" },
            { id: "mainthread-work-breakdown", weight: 0, group: "diagnostics" },
            { id: "long-tasks", weight: 0, group: "diagnostics" },
            { id: "non-composited-animations", weight: 0, group: "diagnostics" },
            { id: "unsized-images", weight: 0, group: "diagnostics" },
            { id: "bf-cache", weight: 0, group: "diagnostics" },
            // Audits past this point contain useful data but are not displayed with other audits.
            { id: "network-requests", weight: 0, group: "hidden" },
            { id: "network-rtt", weight: 0, group: "hidden" },
            { id: "network-server-latency", weight: 0, group: "hidden" },
            { id: "main-thread-tasks", weight: 0, group: "hidden" },
            { id: "diagnostics", weight: 0, group: "hidden" },
            { id: "metrics", weight: 0, group: "hidden" },
            { id: "screenshot-thumbnails", weight: 0, group: "hidden" },
            { id: "final-screenshot", weight: 0, group: "hidden" },
            { id: "script-treemap-data", weight: 0, group: "hidden" },
            { id: "resource-summary", weight: 0, group: "hidden" },
            { id: "redirects", weight: 0, group: "hidden" },
            { id: "server-response-time", weight: 0, group: "hidden" },
            { id: "layout-shifts", weight: 0, group: "hidden" }
          ]
        },
        "accessibility": {
          title: str_2(UIStrings22.a11yCategoryTitle),
          description: str_2(UIStrings22.a11yCategoryDescription),
          manualDescription: str_2(UIStrings22.a11yCategoryManualDescription),
          supportedModes: ["navigation", "snapshot"],
          // Audit weights weights are derived from the axe-core "Impact",
          // with adjustments based on axe-core "Tags":
          //
          // ┌────────────┬───────────────────────────────────────────────┐
          // │ Impact     │ Weight Based on Tags                          │
          // │            ├──────────────┬─────────────────┬──────────────┤
          // │            │  wcag A+AA   │  best-practice  │ experimental │
          // │            │ (ex: wcag2aa)│ (w/o wcag tag)  │              │
          // ├────────────┼──────────────┼─────────────────┼──────────────┤
          // │ Minor      │       1      │        0        │      0       │
          // │ Moderate   │       3      │        3        │      0       │
          // │ Serious    │       7      │        7        │      0       │
          // │ Critical   │      10      │       10        │      0       │
          // └────────────┴──────────────┴─────────────────┴──────────────┘
          //
          // Notes:
          //  • Experimental rules always have weight 0
          //  • Best practice rules only affect scores when tagged with wcagA+AA
          //    and are moderate, serious, or critical.
          //
          // To find the latest axe-core Impact and Tag values:
          //   1. Browse to https://dequeuniversity.com/rules/axe/html.
          //   2. Click on the latest rule set (ex: https://dequeuniversity.com/rules/axe/html/4.10)
          //   3. Review the tables
          auditRefs: [
            { id: "accesskeys", weight: 7, group: "a11y-navigation" },
            // Serious, best-practice
            { id: "aria-allowed-attr", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-command-name", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-conditional-attr", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-deprecated-role", weight: 1, group: "a11y-aria" },
            // Minor, wcag2a
            { id: "aria-dialog-name", weight: 7, group: "a11y-aria" },
            // Serious, best-practice
            { id: "aria-hidden-body", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-hidden-focus", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-input-field-name", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-meter-name", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-progressbar-name", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-prohibited-attr", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-required-attr", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-required-children", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-required-parent", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-roles", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-text", weight: 7, group: "a11y-aria" },
            // Serious, best-practice
            { id: "aria-toggle-field-name", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-tooltip-name", weight: 7, group: "a11y-aria" },
            // Serious, wcag2a
            { id: "aria-treeitem-name", weight: 7, group: "a11y-aria" },
            // Serious, best-practice
            { id: "aria-valid-attr-value", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "aria-valid-attr", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "button-name", weight: 10, group: "a11y-names-labels" },
            // Critical, wcag2a
            { id: "bypass", weight: 7, group: "a11y-navigation" },
            // Serious, wcag2a
            { id: "color-contrast", weight: 7, group: "a11y-color-contrast" },
            // Serious, wcag2aa
            { id: "definition-list", weight: 7, group: "a11y-tables-lists" },
            // Serious, wcag2a
            { id: "dlitem", weight: 7, group: "a11y-tables-lists" },
            // Serious, wcag2a
            { id: "document-title", weight: 7, group: "a11y-names-labels" },
            // Serious, wcag2a
            { id: "duplicate-id-aria", weight: 10, group: "a11y-aria" },
            // Critical, wcag2a
            { id: "form-field-multiple-labels", weight: 3, group: "a11y-names-labels" },
            // Moderate, wcag2a
            { id: "frame-title", weight: 7, group: "a11y-names-labels" },
            // Serious, wcag2a
            { id: "heading-order", weight: 3, group: "a11y-navigation" },
            // Moderate, best-practice
            { id: "html-has-lang", weight: 7, group: "a11y-language" },
            // Serious, wcag2a
            { id: "html-lang-valid", weight: 7, group: "a11y-language" },
            // Serious, wcag2a
            { id: "html-xml-lang-mismatch", weight: 3, group: "a11y-language" },
            // Moderate, wcag2a
            { id: "image-alt", weight: 10, group: "a11y-names-labels" },
            // Critical, wcag2a
            { id: "input-button-name", weight: 10, group: "a11y-names-labels" },
            // Critical, wcag2a
            { id: "input-image-alt", weight: 10, group: "a11y-names-labels" },
            // Critical, wcag2a
            { id: "label", weight: 10, group: "a11y-names-labels" },
            // Critical, wcag2a
            { id: "link-in-text-block", weight: 7, group: "a11y-color-contrast" },
            // Serious, wcag2a
            { id: "link-name", weight: 7, group: "a11y-names-labels" },
            // Serious, wcag2a
            { id: "list", weight: 7, group: "a11y-tables-lists" },
            // Serious, wcag2a
            { id: "listitem", weight: 7, group: "a11y-tables-lists" },
            // Serious, wcag2a
            { id: "meta-refresh", weight: 10, group: "a11y-best-practices" },
            // Critical, wcag2a
            { id: "meta-viewport", weight: 10, group: "a11y-best-practices" },
            // Critical, wcag2aa
            { id: "object-alt", weight: 7, group: "a11y-names-labels" },
            // Serious, wcag2a
            { id: "select-name", weight: 10, group: "a11y-names-labels" },
            // Critical, wcag2a
            { id: "skip-link", weight: 3, group: "a11y-names-labels" },
            // Moderate, best-practice
            { id: "tabindex", weight: 7, group: "a11y-navigation" },
            // Serious, best-practice
            { id: "target-size", weight: 7, group: "a11y-best-practices" },
            // Serious, wcag22aa
            { id: "td-headers-attr", weight: 7, group: "a11y-tables-lists" },
            // Serious, wcag2a
            { id: "th-has-data-cells", weight: 7, group: "a11y-tables-lists" },
            // Serious, wcag2a
            { id: "valid-lang", weight: 7, group: "a11y-language" },
            // Serious, wcag2aa
            { id: "video-caption", weight: 10, group: "a11y-audio-video" },
            // Critical, wcag2a
            { id: "landmark-one-main", weight: 3, group: "a11y-best-practices" },
            // Moderate, best-practice
            { id: "autocomplete-valid", weight: 1, group: "a11y-best-practices" },
            // Informational
            { id: "presentation-role-conflict", weight: 1, group: "a11y-best-practices" },
            // Informational
            { id: "svg-img-alt", weight: 1, group: "a11y-best-practices" },
            // Informational
            // Manual audits
            { id: "focusable-controls", weight: 0 },
            { id: "interactive-element-affordance", weight: 0 },
            { id: "logical-tab-order", weight: 0 },
            { id: "visual-order-follows-dom", weight: 0 },
            { id: "focus-traps", weight: 0 },
            { id: "managed-focus", weight: 0 },
            { id: "use-landmarks", weight: 0 },
            { id: "offscreen-content-hidden", weight: 0 },
            { id: "custom-controls-labels", weight: 0 },
            { id: "custom-controls-roles", weight: 0 },
            // Low-impact best-practices
            { id: "table-duplicate-name", weight: 0, group: "a11y-best-practices" },
            // Minor, best-practice
            { id: "empty-heading", weight: 0, group: "a11y-best-practices" },
            // Minor, best-practice
            { id: "aria-allowed-role", weight: 0, group: "a11y-best-practices" },
            // Minor, best-practice
            { id: "image-redundant-alt", weight: 0, group: "a11y-names-labels" },
            // Minor, best-practice
            // WCAG AAA
            { id: "identical-links-same-purpose", weight: 0, group: "a11y-best-practices" },
            // Minor, wcag2aaa
            // Hidden audits (ie. experimental)
            { id: "label-content-name-mismatch", weight: 0, group: "hidden" },
            // Serious, experimental
            { id: "table-fake-caption", weight: 0, group: "hidden" },
            // Serious, experimental
            { id: "td-has-header", weight: 0, group: "hidden" }
            // Critical, experimental
          ]
        },
        "best-practices": {
          title: str_2(UIStrings22.bestPracticesCategoryTitle),
          supportedModes: ["navigation", "timespan", "snapshot"],
          auditRefs: [
            // Trust & Safety
            { id: "is-on-https", weight: 5, group: "best-practices-trust-safety" },
            { id: "redirects-http", weight: 1, group: "best-practices-trust-safety" },
            { id: "geolocation-on-start", weight: 1, group: "best-practices-trust-safety" },
            { id: "notification-on-start", weight: 1, group: "best-practices-trust-safety" },
            { id: "csp-xss", weight: 0, group: "best-practices-trust-safety" },
            { id: "has-hsts", weight: 0, group: "best-practices-trust-safety" },
            { id: "origin-isolation", weight: 0, group: "best-practices-trust-safety" },
            { id: "clickjacking-mitigation", weight: 0, group: "best-practices-trust-safety" },
            { id: "trusted-types-xss", weight: 0, group: "best-practices-trust-safety" },
            // User Experience
            { id: "paste-preventing-inputs", weight: 3, group: "best-practices-ux" },
            { id: "image-aspect-ratio", weight: 1, group: "best-practices-ux" },
            { id: "image-size-responsive", weight: 1, group: "best-practices-ux" },
            // Browser Compatibility
            { id: "doctype", weight: 1, group: "best-practices-browser-compat" },
            { id: "charset", weight: 1, group: "best-practices-browser-compat" },
            { id: "baseline", weight: 0, group: "best-practices-browser-compat" },
            // General Group
            { id: "js-libraries", weight: 0, group: "best-practices-general" },
            { id: "deprecations", weight: 5, group: "best-practices-general" },
            { id: "third-party-cookies", weight: 5, group: "best-practices-general" },
            { id: "errors-in-console", weight: 1, group: "best-practices-general" },
            { id: "valid-source-maps", weight: 0, group: "best-practices-general" },
            { id: "inspector-issues", weight: 1, group: "best-practices-general" }
          ]
        },
        "seo": {
          title: str_2(UIStrings22.seoCategoryTitle),
          description: str_2(UIStrings22.seoCategoryDescription),
          manualDescription: str_2(UIStrings22.seoCategoryManualDescription),
          supportedModes: ["navigation", "snapshot"],
          auditRefs: [
            // Should be at least 31% of the score, such that this audit failing
            // results in the SEO category failing.
            // Solve for w:
            //    w / (w + T) >= 0.31
            // where T is the sum of all the other weights.
            { id: "is-crawlable", weight: 93 / 23, group: "seo-crawl" },
            { id: "document-title", weight: 1, group: "seo-content" },
            { id: "meta-description", weight: 1, group: "seo-content" },
            { id: "http-status-code", weight: 1, group: "seo-crawl" },
            { id: "link-text", weight: 1, group: "seo-content" },
            { id: "crawlable-anchors", 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" },
            // Manual audits
            { id: "structured-data", weight: 0 }
          ]
        }
      }
    };
    Object.defineProperty(defaultConfig, "UIStrings", {
      enumerable: false,
      get: /* @__PURE__ */ __name(() => UIStrings22, "get")
    });
    default_config_default = defaultConfig;
  }
});

// core/config/validation.js
function isValidArtifactDependency(dependent, dependency) {
  const levels = { timespan: 0, snapshot: 1, navigation: 2 };
  const dependentLevel = Math.min(...dependent.instance.meta.supportedModes.map((l) => levels[l]));
  const dependencyLevel = Math.min(...dependency.instance.meta.supportedModes.map((l) => levels[l]));
  if (dependentLevel === levels.timespan) return dependencyLevel === levels.timespan;
  if (dependentLevel === levels.snapshot) return dependencyLevel === levels.snapshot;
  return true;
}
function assertValidPluginName(config5, pluginName) {
  const parts = pluginName.split("/");
  if (parts.length === 2) {
    pluginName = parts[1];
  }
  if (!pluginName.startsWith("lighthouse-plugin-")) {
    throw new Error(`plugin name '${pluginName}' does not start with 'lighthouse-plugin-'`);
  }
  if (config5.categories?.[pluginName]) {
    throw new Error(`plugin name '${pluginName}' not allowed because it is the id of a category already found in config`);
  }
}
function assertValidArtifact(artifactDefn) {
  const gatherer = artifactDefn.gatherer.instance;
  if (typeof gatherer.meta !== "object") {
    throw new Error(`Gatherer for ${artifactDefn.id} did not provide a meta object.`);
  }
  if (gatherer.meta.supportedModes.length === 0) {
    throw new Error(`Gatherer for ${artifactDefn.id} did not support any gather modes.`);
  }
  if (typeof gatherer.getArtifact !== "function" || gatherer.getArtifact === base_gatherer_default.prototype.getArtifact) {
    throw new Error(`Gatherer for ${artifactDefn.id} did not define a "getArtifact" method.`);
  }
}
function assertValidAudit(auditDefinition) {
  const { implementation, path: auditPath } = auditDefinition;
  const auditName = auditPath || 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 (!isStringOrIcuMessage(implementation.meta.title)) {
    throw new Error(`${auditName} has no meta.title property, or the property is not a string.`);
  }
  const scoreDisplayMode = implementation.meta.scoreDisplayMode || Audit.SCORING_MODES.BINARY;
  if (!isStringOrIcuMessage(implementation.meta.failureTitle) && scoreDisplayMode === Audit.SCORING_MODES.BINARY) {
    throw new Error(`${auditName} has no meta.failureTitle and should.`);
  }
  if (!isStringOrIcuMessage(implementation.meta.description)) {
    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 assertValidCategories(categories, audits, groups) {
  if (!categories) {
    return;
  }
  const auditsKeyedById = new Map((audits || []).map((audit) => {
    return [audit.implementation.meta.id, audit];
  }));
  Object.keys(categories).forEach((categoryId) => {
    categories[categoryId].auditRefs.forEach((auditRef, index) => {
      if (!auditRef.id) {
        throw new Error(`missing an audit id at ${categoryId}[${index}]`);
      }
      const audit = auditsKeyedById.get(auditRef.id);
      if (!audit) {
        throw new Error(`could not find ${auditRef.id} audit for category ${categoryId}`);
      }
      const auditImpl = audit.implementation;
      const isManual = auditImpl.meta.scoreDisplayMode === "manual";
      if (categoryId === "accessibility" && !auditRef.group && !isManual) {
        throw new Error(`${auditRef.id} accessibility audit does not have a group`);
      }
      if (auditRef.weight > 0 && isManual) {
        throw new Error(`${auditRef.id} is manual but has a positive weight`);
      }
      if (auditRef.group && (!groups || !groups[auditRef.group])) {
        throw new Error(`${auditRef.id} references unknown group ${auditRef.group}`);
      }
    });
  });
}
function assertValidSettings(settings) {
  if (!settings.formFactor) {
    throw new Error(`\`settings.formFactor\` must be defined as 'mobile' or 'desktop'. See https://github.com/GoogleChrome/lighthouse/blob/main/docs/emulation.md`);
  }
  if (!settings.screenEmulation.disabled) {
    if (settings.screenEmulation.mobile !== (settings.formFactor === "mobile")) {
      throw new Error(`Screen emulation mobile setting (${settings.screenEmulation.mobile}) does not match formFactor setting (${settings.formFactor}). See https://github.com/GoogleChrome/lighthouse/blob/main/docs/emulation.md`);
    }
  }
  const skippedAndOnlyAuditId = settings.skipAudits?.find((auditId) => settings.onlyAudits?.includes(auditId));
  if (skippedAndOnlyAuditId) {
    throw new Error(`${skippedAndOnlyAuditId} appears in both skipAudits and onlyAudits`);
  }
}
function assertValidArtifacts(artifactDefns) {
  const availableArtifacts = /* @__PURE__ */ new Set();
  for (const artifact of artifactDefns) {
    assertValidArtifact(artifact);
    if (availableArtifacts.has(artifact.id)) {
      throw new Error(`Config defined multiple artifacts with id '${artifact.id}'`);
    }
    availableArtifacts.add(artifact.id);
    if (!artifact.dependencies) continue;
    for (const [dependencyKey, { id: dependencyId }] of Object.entries(artifact.dependencies)) {
      if (availableArtifacts.has(dependencyId)) continue;
      throwInvalidDependencyOrder(artifact.id, dependencyKey);
    }
  }
}
function assertValidConfig(resolvedConfig) {
  assertValidArtifacts(resolvedConfig.artifacts || []);
  for (const auditDefn of resolvedConfig.audits || []) {
    assertValidAudit(auditDefn);
  }
  assertValidCategories(resolvedConfig.categories, resolvedConfig.audits, resolvedConfig.groups);
  assertValidSettings(resolvedConfig.settings);
}
function throwInvalidDependencyOrder(artifactId, dependencyKey) {
  throw new Error(
    [
      `Failed to find dependency "${dependencyKey}" for "${artifactId}" artifact`,
      `Check that...`,
      `  1. A gatherer exposes a matching Symbol that satisfies "${dependencyKey}".`,
      `  2. "${dependencyKey}" is configured to run before "${artifactId}"`
    ].join("\n")
  );
}
function throwInvalidArtifactDependency(artifactId, dependencyKey) {
  throw new Error(
    [
      `Dependency "${dependencyKey}" for "${artifactId}" artifact is invalid.`,
      `The dependency must be collected before the dependent.`
    ].join("\n")
  );
}
var init_validation = __esm({
  "core/config/validation.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_base_gatherer();
    init_i18n();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(isValidArtifactDependency, "isValidArtifactDependency");
    __name(assertValidPluginName, "assertValidPluginName");
    __name(assertValidArtifact, "assertValidArtifact");
    __name(assertValidAudit, "assertValidAudit");
    __name(assertValidCategories, "assertValidCategories");
    __name(assertValidSettings, "assertValidSettings");
    __name(assertValidArtifacts, "assertValidArtifacts");
    __name(assertValidConfig, "assertValidConfig");
    __name(throwInvalidDependencyOrder, "throwInvalidDependencyOrder");
    __name(throwInvalidArtifactDependency, "throwInvalidArtifactDependency");
  }
});

// core/config/filters.js
function getAuditIdsInCategories(allCategories, onlyCategories) {
  if (!allCategories) return /* @__PURE__ */ new Set();
  onlyCategories = onlyCategories || Object.keys(allCategories);
  const categories = onlyCategories.map((categoryId) => allCategories[categoryId]);
  const auditRefs = categories.flatMap((category) => category?.auditRefs || []);
  return new Set(auditRefs.map((auditRef) => auditRef.id));
}
function filterArtifactsByAvailableAudits(artifacts, audits) {
  if (!artifacts) return null;
  if (!audits) return artifacts;
  const artifactsById = new Map(artifacts.map((artifact) => [artifact.id, artifact]));
  const artifactIdsToKeep = /* @__PURE__ */ new Set([
    ...filterResistantArtifactIds,
    ...audits.flatMap((audit) => audit.implementation.meta.requiredArtifacts)
  ]);
  let previousSize = 0;
  while (previousSize !== artifactIdsToKeep.size) {
    previousSize = artifactIdsToKeep.size;
    for (const artifactId of artifactIdsToKeep) {
      const artifact = artifactsById.get(artifactId);
      if (!artifact) continue;
      if (!artifact.dependencies) continue;
      for (const dep of Object.values(artifact.dependencies)) {
        artifactIdsToKeep.add(dep.id);
      }
    }
  }
  return artifacts.filter((artifact) => artifactIdsToKeep.has(artifact.id));
}
function filterArtifactsByGatherMode(artifacts, mode) {
  if (!artifacts) return null;
  return artifacts.filter((artifact) => {
    return artifact.gatherer.instance.meta.supportedModes.includes(mode);
  });
}
function filterAuditsByAvailableArtifacts(audits, availableArtifacts) {
  if (!audits) return null;
  const availableArtifactIds = new Set(
    availableArtifacts.map((artifact) => artifact.id).concat(baseArtifactKeys)
  );
  return audits.filter((audit) => {
    const meta = audit.implementation.meta;
    return meta.requiredArtifacts.every((id) => availableArtifactIds.has(id));
  });
}
function filterAuditsByGatherMode(audits, mode) {
  if (!audits) return null;
  return audits.filter((audit) => {
    const meta = audit.implementation.meta;
    return !meta.supportedModes || meta.supportedModes.includes(mode);
  });
}
function filterCategoriesByGatherMode(categories, mode) {
  if (!categories) return null;
  const categoriesToKeep = Object.entries(categories).filter(([_, category]) => {
    return !category.supportedModes || category.supportedModes.includes(mode);
  });
  return Object.fromEntries(categoriesToKeep);
}
function filterCategoriesByExplicitFilters(categories, onlyCategories) {
  if (!categories || !onlyCategories) return categories;
  const categoriesToKeep = Object.entries(categories).filter(([categoryId]) => onlyCategories.includes(categoryId));
  return Object.fromEntries(categoriesToKeep);
}
function errorOnUnknownOnlyCategories(allCategories, onlyCategories) {
  if (!onlyCategories) return;
  const unknown = onlyCategories.filter((c) => !allCategories?.[c]);
  if (unknown.length) {
    throw new Error(`unrecognized category in 'onlyCategories': ${unknown.join(", ")}`);
  }
}
function filterCategoriesByAvailableAudits(categories, availableAudits) {
  if (!categories) return categories;
  const availableAuditIdToMeta = new Map(
    availableAudits.map((audit) => [audit.implementation.meta.id, audit.implementation.meta])
  );
  const categoryEntries = Object.entries(categories).map(([categoryId, category]) => {
    const filteredCategory = {
      ...category,
      auditRefs: category.auditRefs.filter((ref) => availableAuditIdToMeta.has(ref.id))
    };
    const didFilter = filteredCategory.auditRefs.length < category.auditRefs.length;
    const hasOnlyManualAudits = filteredCategory.auditRefs.every((ref) => {
      const meta = availableAuditIdToMeta.get(ref.id);
      if (!meta) return false;
      return meta.scoreDisplayMode === Audit.SCORING_MODES.MANUAL;
    });
    if (didFilter && hasOnlyManualAudits) filteredCategory.auditRefs = [];
    return [categoryId, filteredCategory];
  }).filter((entry) => typeof entry[1] === "object" && entry[1].auditRefs.length);
  return Object.fromEntries(categoryEntries);
}
function filterConfigByGatherMode(resolvedConfig, mode) {
  const artifacts = filterArtifactsByGatherMode(resolvedConfig.artifacts, mode);
  const supportedAudits = filterAuditsByGatherMode(resolvedConfig.audits, mode);
  const audits = filterAuditsByAvailableArtifacts(supportedAudits, artifacts || []);
  const supportedCategories = filterCategoriesByGatherMode(resolvedConfig.categories, mode);
  const categories = filterCategoriesByAvailableAudits(supportedCategories, audits || []);
  return {
    ...resolvedConfig,
    artifacts,
    audits,
    categories
  };
}
function filterConfigByExplicitFilters(resolvedConfig, filters) {
  const { onlyAudits, onlyCategories, skipAudits } = filters;
  if (onlyAudits && !onlyAudits.length) {
    throw new Error(`onlyAudits cannot be an empty array.`);
  }
  if (onlyCategories && !onlyCategories.length) {
    throw new Error(`onlyCategories cannot be an empty array.`);
  }
  errorOnUnknownOnlyCategories(resolvedConfig.categories, onlyCategories);
  let baseAuditIds = getAuditIdsInCategories(resolvedConfig.categories, void 0);
  if (onlyCategories) {
    baseAuditIds = getAuditIdsInCategories(resolvedConfig.categories, onlyCategories);
  } else if (onlyAudits) {
    baseAuditIds = /* @__PURE__ */ new Set();
  } else if (!resolvedConfig.categories || !Object.keys(resolvedConfig.categories).length) {
    baseAuditIds = new Set(resolvedConfig.audits?.map((audit) => audit.implementation.meta.id));
  }
  const auditIdsToKeep = new Set(
    [
      ...baseAuditIds,
      // Start with our base audits.
      ...onlyAudits || [],
      // Additionally include the opt-in audits from `onlyAudits`.
      ...filterResistantAuditIds
      // Always include any filter-resistant audits.
    ].filter((auditId) => !skipAudits || !skipAudits.includes(auditId))
  );
  const audits = auditIdsToKeep.size && resolvedConfig.audits ? resolvedConfig.audits.filter((audit) => auditIdsToKeep.has(audit.implementation.meta.id)) : resolvedConfig.audits;
  const availableCategories = filterCategoriesByAvailableAudits(resolvedConfig.categories, audits || []);
  const categories = filterCategoriesByExplicitFilters(availableCategories, onlyCategories);
  let artifacts = filterArtifactsByAvailableAudits(resolvedConfig.artifacts, audits);
  if (artifacts && resolvedConfig.settings.disableFullPageScreenshot) {
    artifacts = artifacts.filter(({ id }) => id !== "FullPageScreenshot");
  }
  return {
    ...resolvedConfig,
    artifacts,
    audits,
    categories
  };
}
var baseArtifactKeySource, baseArtifactKeys, filterResistantAuditIds, filterResistantArtifactIds;
var init_filters = __esm({
  "core/config/filters.js"() {
    "use strict";
    init_process_global();
    init_audit();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    baseArtifactKeySource = {
      fetchTime: "",
      LighthouseRunWarnings: "",
      BenchmarkIndex: "",
      HostDPR: "",
      settings: "",
      Timing: "",
      URL: "",
      PageLoadError: "",
      HostFormFactor: "",
      HostUserAgent: "",
      HostProduct: "",
      GatherContext: ""
    };
    baseArtifactKeys = Object.keys(baseArtifactKeySource);
    filterResistantAuditIds = [];
    filterResistantArtifactIds = ["Stacks", "NetworkUserAgent", "FullPageScreenshot"];
    __name(getAuditIdsInCategories, "getAuditIdsInCategories");
    __name(filterArtifactsByAvailableAudits, "filterArtifactsByAvailableAudits");
    __name(filterArtifactsByGatherMode, "filterArtifactsByGatherMode");
    __name(filterAuditsByAvailableArtifacts, "filterAuditsByAvailableArtifacts");
    __name(filterAuditsByGatherMode, "filterAuditsByGatherMode");
    __name(filterCategoriesByGatherMode, "filterCategoriesByGatherMode");
    __name(filterCategoriesByExplicitFilters, "filterCategoriesByExplicitFilters");
    __name(errorOnUnknownOnlyCategories, "errorOnUnknownOnlyCategories");
    __name(filterCategoriesByAvailableAudits, "filterCategoriesByAvailableAudits");
    __name(filterConfigByGatherMode, "filterConfigByGatherMode");
    __name(filterConfigByExplicitFilters, "filterConfigByExplicitFilters");
  }
});

// core/config/config-plugin.js
function isArrayOfUnknownObjects(arr) {
  return Array.isArray(arr) && arr.every(isObjectOfUnknownProperties);
}
function isObjectOfUnknownProperties(val) {
  return typeof val === "object" && val !== null && !Array.isArray(val);
}
function objectIsGatherMode(str) {
  if (typeof str !== "string") return false;
  return str === "navigation" || str === "timespan" || str === "snapshot";
}
function isArrayOfGatherModes(arr) {
  if (!Array.isArray(arr)) return false;
  return arr.every(objectIsGatherMode);
}
function assertNoExcessProperties(obj, pluginName, objectName = "") {
  if (objectName) {
    objectName += " ";
  }
  const invalidKeys = Object.keys(obj);
  if (invalidKeys.length > 0) {
    const keys2 = invalidKeys.join(", ");
    throw new Error(`${pluginName} has unrecognized ${objectName}properties: [${keys2}]`);
  }
}
var ConfigPlugin, config_plugin_default;
var init_config_plugin = __esm({
  "core/config/config-plugin.js"() {
    "use strict";
    init_process_global();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(isArrayOfUnknownObjects, "isArrayOfUnknownObjects");
    __name(isObjectOfUnknownProperties, "isObjectOfUnknownProperties");
    __name(objectIsGatherMode, "objectIsGatherMode");
    __name(isArrayOfGatherModes, "isArrayOfGatherModes");
    __name(assertNoExcessProperties, "assertNoExcessProperties");
    ConfigPlugin = class _ConfigPlugin {
      static {
        __name(this, "ConfigPlugin");
      }
      /**
       * Extract and validate the list of AuditDefns added by the plugin (or undefined
       * if no additional audits are being added by the plugin).
       * @param {unknown} auditsJson
       * @param {string} pluginName
       * @return {Array<{path: string}>|undefined}
       */
      static _parseAuditsList(auditsJson, pluginName) {
        if (auditsJson === void 0) {
          return void 0;
        } else if (!isArrayOfUnknownObjects(auditsJson)) {
          throw new Error(`${pluginName} has an invalid audits array.`);
        }
        return auditsJson.map((auditDefnJson) => {
          const { path: path7, ...invalidRest } = auditDefnJson;
          assertNoExcessProperties(invalidRest, pluginName, "audit");
          if (typeof path7 !== "string") {
            throw new Error(`${pluginName} has a missing audit path.`);
          }
          return {
            path: path7
          };
        });
      }
      /**
       * Extract and validate the list of category AuditRefs added by the plugin.
       * @param {unknown} auditRefsJson
       * @param {string} pluginName
       * @return {Array<LH.Config.AuditRefJson>}
       */
      static _parseAuditRefsList(auditRefsJson, pluginName) {
        if (!isArrayOfUnknownObjects(auditRefsJson)) {
          throw new Error(`${pluginName} has no valid auditsRefs.`);
        }
        return auditRefsJson.map((auditRefJson) => {
          const { id, weight, group, ...invalidRest } = auditRefJson;
          assertNoExcessProperties(invalidRest, pluginName, "auditRef");
          if (typeof id !== "string") {
            throw new Error(`${pluginName} has an invalid auditRef id.`);
          }
          if (typeof weight !== "number") {
            throw new Error(`${pluginName} has an invalid auditRef weight.`);
          }
          if (typeof group !== "string" && typeof group !== "undefined") {
            throw new Error(`${pluginName} has an invalid auditRef group.`);
          }
          const prependedGroup = group ? `${pluginName}-${group}` : group;
          return {
            id,
            weight,
            group: prependedGroup
          };
        });
      }
      /**
       * Extract and validate the category added by the plugin.
       * @param {unknown} categoryJson
       * @param {string} pluginName
       * @return {LH.Config.CategoryJson}
       */
      static _parseCategory(categoryJson, pluginName) {
        if (!isObjectOfUnknownProperties(categoryJson)) {
          throw new Error(`${pluginName} has no valid category.`);
        }
        const {
          title,
          description,
          manualDescription,
          auditRefs: auditRefsJson,
          supportedModes,
          ...invalidRest
        } = categoryJson;
        assertNoExcessProperties(invalidRest, pluginName, "category");
        if (!isStringOrIcuMessage(title)) {
          throw new Error(`${pluginName} has an invalid category tile.`);
        }
        if (!isStringOrIcuMessage(description) && description !== void 0) {
          throw new Error(`${pluginName} has an invalid category description.`);
        }
        if (!isStringOrIcuMessage(manualDescription) && manualDescription !== void 0) {
          throw new Error(`${pluginName} has an invalid category manualDescription.`);
        }
        if (!isArrayOfGatherModes(supportedModes) && supportedModes !== void 0) {
          throw new Error(
            `${pluginName} supportedModes must be an array, valid array values are "navigation", "timespan", and "snapshot".`
          );
        }
        const auditRefs = _ConfigPlugin._parseAuditRefsList(auditRefsJson, pluginName);
        return {
          title,
          auditRefs,
          description,
          manualDescription,
          supportedModes
        };
      }
      /**
       * Extract and validate groups JSON added by the plugin.
       * @param {unknown} groupsJson
       * @param {string} pluginName
       * @return {Record<string, LH.Config.GroupJson>|undefined}
       */
      static _parseGroups(groupsJson, pluginName) {
        if (groupsJson === void 0) {
          return void 0;
        }
        if (!isObjectOfUnknownProperties(groupsJson)) {
          throw new Error(`${pluginName} groups json is not defined as an object.`);
        }
        const groups = Object.entries(groupsJson);
        const parsedGroupsJson = {};
        groups.forEach(([groupId, groupJson]) => {
          if (!isObjectOfUnknownProperties(groupJson)) {
            throw new Error(`${pluginName} has a group not defined as an object.`);
          }
          const { title, description, ...invalidRest } = groupJson;
          assertNoExcessProperties(invalidRest, pluginName, "group");
          if (!isStringOrIcuMessage(title)) {
            throw new Error(`${pluginName} has an invalid group title.`);
          }
          if (!isStringOrIcuMessage(description) && description !== void 0) {
            throw new Error(`${pluginName} has an invalid group description.`);
          }
          parsedGroupsJson[`${pluginName}-${groupId}`] = {
            title,
            description
          };
        });
        return parsedGroupsJson;
      }
      /**
       * Extracts and validates a config from the provided plugin input, throwing
       * if it deviates from the expected object shape.
       * @param {unknown} pluginJson
       * @param {string} pluginName
       * @return {LH.Config}
       */
      static parsePlugin(pluginJson, pluginName) {
        pluginJson = JSON.parse(JSON.stringify(pluginJson));
        if (!isObjectOfUnknownProperties(pluginJson)) {
          throw new Error(`${pluginName} is not defined as an object.`);
        }
        const {
          audits: pluginAuditsJson,
          category: pluginCategoryJson,
          groups: pluginGroupsJson,
          ...invalidRest
        } = pluginJson;
        assertNoExcessProperties(invalidRest, pluginName);
        return {
          audits: _ConfigPlugin._parseAuditsList(pluginAuditsJson, pluginName),
          categories: {
            [pluginName]: _ConfigPlugin._parseCategory(pluginCategoryJson, pluginName)
          },
          groups: _ConfigPlugin._parseGroups(pluginGroupsJson, pluginName)
        };
      }
    };
    config_plugin_default = ConfigPlugin;
  }
});

// core/lib/axe.js
var require2, axeSource;
var init_axe = __esm({
  "core/lib/axe.js"() {
    "use strict";
    init_process_global();
    init_module();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    require2 = /* @__PURE__ */ createRequire({ url: "core/lib/axe.js" }.url);
    axeSource = `/*! axe v4.11.4
 * Copyright (c) 2015 - 2026 Deque Systems, Inc.
 *
 * Your use of this Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This entire copyright notice must appear in every copy of this file you
 * distribute or in any file that contains substantial portions of this source
 * code.
 */
!function e(t){var r=t,n=t.document;function a(e){return(a="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})(e)}var o=o||{},i=(o.version="4.11.4","function"==typeof define&&define.amd&&define("axe-core",[],(function(){return o})),"object"===("undefined"==typeof module?"undefined":a(module))&&module.exports&&"function"==typeof e.toString&&(o.source="("+e.toString()+')(typeof window === "object" ? window : this);',module.exports=o),"function"==typeof t.getComputedStyle&&(t.axe=o),["precision","format","inGamut"]),l=["space"],u=["algorithm"],s=["method"],c=["maxDeltaE","deltaEMethod","steps","maxSteps"],d=["node"],p=["relatedNodes"],f=["node"],m=["variant"],h=["matches"],g=["chromium"],v=["noImplicit"],b=["noPresentational"],y=["node"],w=["environmentData"],D=["environmentData"],x=["environmentData"],E=["environmentData"],A=["environmentD\
ata"];function F(e,t,r){return(t=Y(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function C(e,t,r){var n;return N()?Reflect.construct.apply(null,arguments):((n=[null]).push.apply(n,t),t=new(e.bind.apply(e,n)),r&&S(t,r.prototype),t)}function k(e,t){if(null==e)return{};var r,n=((e,t)=>{if(null==e)return{};var r,n={};for(r in e)!{}.hasOwnProperty.call(e,r)||-1!==t.indexOf(r)||(n[r]=e[r]);return n})(e,t);if(Object.getOwnPropertySymbols)for(var a=Object.getOwnPropertySymbols(e),o=0;o<a.length;o++)r=a[o],-1===t.indexOf(r)&&{}.propertyIsEnumerable.call(e,r)&&(n[r]=e[r]);return n}function R(e,t,r){t=T(t);var n=e;if((t=N()?Reflect.construct(t,r||[],T(e).constructor):t.apply(e,r))&&("object"==a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");if(void 0!==(t=n))return t;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}function N(){t\
ry{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(N=function(){return!!e})()}function T(e){return(T=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&S(e,t)}function S(e,t){return(S=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(){return(_=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r,n=arguments[t];for(r in n)!{}.hasOwnProperty.call(n,r)||(e[r]=n[r])}return e}).apply(null,arguments)}function M(e){return(e=>{if(Array.isArray(e))return Z(e)})(e)||P(e)||X(e)||(()=>{throw new TypeError("Invalid attempt to s\
pread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")})()}function P(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function I(e,t,r){j(e,t),t.set(e,r)}function B(e,t){j(e,t),t.add(e)}function j(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function L(e,t){return e.get(z(e,t))}function q(e,t,r){e.set(z(e,t),r)}function z(e,t,r){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:r;throw new TypeError("Private element is not present on this object")}function V(e,t){return $(e)||((e,t)=>{var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,l=[],u=!0,s=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=o.call(r)).done)&&(l.push(n.value),l.length!==t);u=!0);}catch(e){s=!0,a=e}finally{try{if(!u&&null!=r.return&&(i=r.ret\
urn(),Object(i)!==i))return}finally{if(s)throw a}}return l}})(e,t)||X(e,t)||G()}function G(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function $(e){if(Array.isArray(e))return e}function H(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function U(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,Y(n.key),n)}}function W(e,t,r){return t&&U(e.prototype,t),r&&U(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function Y(e){return e=((e,t)=>{if("object"!=a(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0===r)return String(e);if(r=r.call(e,"string"),"object"==a(r))throw new TypeError("@@toPrimitive must return a primitive value.");return r})(e),"symbol"==a(e)?e:e+""}function K(e,t){var r,n,a,o,i="undefined"!=typeof Symbol&&e[Symbol.\
iterator]||e["@@iterator"];if(i)return a=!(n=!0),{s:function(){i=i.call(e)},n:function(){var e=i.next();return n=e.done,e},e:function(e){a=!0,r=e},f:function(){try{n||null==i.return||i.return()}finally{if(a)throw r}}};if(Array.isArray(e)||(i=X(e))||t&&e&&"number"==typeof e.length)return i&&(e=i),o=0,{s:t=function(){},n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:t};throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function X(e,t){var r;if(e)return"string"==typeof e?Z(e,t):"Map"===(r="Object"===(r={}.toString.call(e).slice(8,-1))&&e.constructor?e.constructor.name:r)||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Z(e,t):void 0}function Z(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function a(e){return(a="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})(e)}var J,Q,ee,te,re,ne,ae,oe,ie,le,ue=void 0;function se(e,t){return function(){return t||e((t={exports:{}}).exports,t),t.exports}}function ce(e,t){for(var r in t)me(e,r,{get:t[r],enumerable:!0})}function de(e){return function(e,t,r){if(t&&"object"===a(t)||"function"==typeof t){var n,o=K(ve(t));try{for(o.s();!(n=o.n()).done;)(()=>{var a=n.value;ge.call(e,a)||"default"===a||me(e,a,{get:function(){return t[a]},enumerable:!(r=be(t,a))||r.enumerable})})()}catch(e){o.e(e)}finally{o.f()}}return e}((t=me(null!=e?fe(he(e)):{},"default",e&&e.__esModule&&"default"in e?{get:function(){return e.default},enumerable:!0}:{value:e,enumerable:!0}),me(t,"__esModule",{value:!0})),e);var t}function pe(e,t,r){(t="symbol"!==a(t)?t+"":t)in e?me(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r}var fe=Object.create,me=Object.defineProperty\
,he=Object.getPrototypeOf,ge=Object.prototype.hasOwnProperty,ve=Object.getOwnPropertyNames,be=Object.getOwnPropertyDescriptor,ye=se((function(e,o){var i;i=function(){function e(e){return"function"==typeof e}var o=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,l=void 0,u=void 0,s=function(e,t){h[i]=e,h[i+1]=t,2===(i+=2)&&(u?u(g):w())},c=void 0!==t?t:void 0,d=(d=c||{}).MutationObserver||d.WebKitMutationObserver,p="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),f="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function m(){var e=setTimeout;return function(){return e(g,1)}}var h=new Array(1e3);function g(){for(var e=0;e<i;e+=2)(0,h[e])(h[e+1]),h[e]=void 0,h[e+1]=void 0;i=0}var v,b,y,w=void 0;function D(e,t){var r,n=this,a=new this.constructor(A),o=(void 0===a[E]&&B(a),n._state);return o?(r=arguments[o-1],s((function(){return P(o,a,r,\
n._result)}))):_(n,a,e,t),a}function x(e){var t;return e&&"object"===a(e)&&e.constructor===this?e:(N(t=new this(A),e),t)}w=p?function(){return process.nextTick(g)}:d?(b=0,p=new d(g),y=n.createTextNode(""),p.observe(y,{characterData:!0}),function(){y.data=b=++b%2}):f?((v=new MessageChannel).port1.onmessage=g,function(){return v.port2.postMessage(0)}):(void 0===c?function(){try{var e=Function("return this")().require("vertx");return void 0!==(l=e.runOnLoop||e.runOnContext)?function(){l(g)}:m()}catch(e){return m()}}:m)();var E=Math.random().toString(36).substring(2);function A(){}var F=void 0,C=1,k=2;function R(t,r,n){var a,o;r.constructor===t.constructor&&n===D&&r.constructor.resolve===x?(a=t,(o=r)._state===C?O(a,o._result):o._state===k?S(a,o._result):_(o,void 0,(function(e){return N(a,e)}),(function(e){return S(a,e)}))):void 0!==n&&e(n)?function(e,t,r){s((function(e){var n=!1,a=((e,t,r,n)=>{try{e.call(t,r,n)}catch(e){return e}})(r,t,(function(r){n||(n=!0,(t!==r?N:O)(e,r))}),(function(t)\
{n||(n=!0,S(e,t))}),e._label);!n&&a&&(n=!0,S(e,a))}),e)}(t,r,n):O(t,r)}function N(e,t){if(e===t)S(e,new TypeError("You cannot resolve a promise with itself"));else if(n=a(r=t),null===r||"object"!==n&&"function"!==n)O(e,t);else{r=void 0;try{r=t.then}catch(t){return void S(e,t)}R(e,t,r)}var r,n}function T(e){e._onerror&&e._onerror(e._result),M(e)}function O(e,t){e._state===F&&(e._result=t,e._state=C,0!==e._subscribers.length)&&s(M,e)}function S(e,t){e._state===F&&(e._state=k,e._result=t,s(T,e))}function _(e,t,r,n){var a=e._subscribers,o=a.length;e._onerror=null,a[o]=t,a[o+C]=r,a[o+k]=n,0===o&&e._state&&s(M,e)}function M(e){var t=e._subscribers,r=e._state;if(0!==t.length){for(var n,a=void 0,o=e._result,i=0;i<t.length;i+=3)n=t[i],a=t[i+r],n?P(r,n,a,o):a(o);e._subscribers.length=0}}function P(t,r,n,a){var o=e(n),i=void 0,l=void 0,u=!0;if(o){try{i=n(a)}catch(t){u=!1,l=t}if(r===i)return void S(r,new TypeError("A promises callback cannot return that same promise."))}else i=a;r._state===F&&(o&&\
u?N(r,i):!1===u?S(r,l):t===C?O(r,i):t===k&&S(r,i))}var I=0;function B(e){e[E]=I++,e._state=void 0,e._result=void 0,e._subscribers=[]}L.prototype._enumerate=function(e){for(var t=0;this._state===F&&t<e.length;t++)this._eachEntry(e[t],t)},L.prototype._eachEntry=function(e,t){var r=this._instanceConstructor,n=r.resolve;if(n===x){var a,o=void 0,i=void 0,l=!1;try{o=e.then}catch(t){l=!0,i=t}o===D&&e._state!==F?this._settledAt(e._state,t,e._result):"function"!=typeof o?(this._remaining--,this._result[t]=e):r===q?(a=new r(A),l?S(a,i):R(a,e,o),this._willSettleAt(a,t)):this._willSettleAt(new r((function(t){return t(e)})),t)}else this._willSettleAt(n(e),t)},L.prototype._settledAt=function(e,t,r){var n=this.promise;n._state===F&&(this._remaining--,e===k?S(n,r):this._result[t]=r),0===this._remaining&&O(n,this._result)},L.prototype._willSettleAt=function(e,t){var r=this;_(e,void 0,(function(e){return r._settledAt(C,t,e)}),(function(e){return r._settledAt(k,t,e)}))};var j=L;function L(e,t){this._inst\
anceConstructor=e,this.promise=new e(A),this.promise[E]||B(this.promise),o(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0!==this.length&&(this.length=this.length||0,this._enumerate(t),0!==this._remaining)||O(this.promise,this._result)):S(this.promise,new Error("Array Methods must be provided an Array"))}z.prototype.catch=function(e){return this.then(null,e)},z.prototype.finally=function(t){var r=this.constructor;return e(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)};var q=z;function z(e){if(this[E]=I++,this._result=this._state=void 0,this._subscribers=[],A!==e){if("function"!=typeof e)throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof z))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be calle\
d as a function.");var t=this;try{e((function(e){N(t,e)}),(function(e){S(t,e)}))}catch(e){S(t,e)}}}return q.prototype.then=D,q.all=function(e){return new j(this,e).promise},q.race=function(e){var t=this;return o(e)?new t((function(r,n){for(var a=e.length,o=0;o<a;o++)t.resolve(e[o]).then(r,n)})):new t((function(e,t){return t(new TypeError("You must pass an array to race."))}))},q.resolve=x,q.reject=function(e){var t=new this(A);return S(t,e),t},q._setScheduler=function(e){u=e},q._setAsap=function(e){s=e},q._asap=s,q.polyfill=function(){var e=void 0;if(void 0!==r)e=r;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 n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if("[object Promise]"===n&&!t.cast)return}e.Promise=q},q.Promise=q},"object"===a(e)&&void 0!==o?o.exports=i():"function"==typeof define&&define.amd?define(i)\
:e.ES6Promise=i()})),we=se((function(e){var t,r,n=1e5,o=(t=Object.prototype.toString,r=Object.prototype.hasOwnProperty,{Class:function(e){return t.call(e).replace(/^\\[object *|\\]$/g,"")},HasProperty:function(e,t){return t in e},HasOwnProperty:function(e,t){return r.call(e,t)},IsCallable:function(e){return"function"==typeof e},ToInt32:function(e){return e>>0},ToUint32:function(e){return e>>>0}}),i=Math.LN2,l=Math.abs,u=Math.floor,s=Math.log,c=Math.min,d=Math.pow,p=Math.round;function f(e,t,r){return e<t?t:r<e?r:e}var m,h,g,v,b,y,w,D,x,E,A,F=Object.getOwnPropertyNames||function(e){if(e!==Object(e))throw new TypeError("Object.getOwnPropertyNames called on non-object");var t,r=[];for(t in e)o.HasOwnProperty(e,t)&&r.push(t);return r};function C(e){if(F&&m)for(var t=F(e),r=0;r<t.length;r+=1)m(e,t[r],{value:e[t[r]],writable:!1,enumerable:!1,configurable:!1})}function k(e){if(m){if(e.length>n)throw new RangeError("Array too large for polyfill");for(var t=0;t<e.length;t+=1)(t=>{m(e,t,{get:funct\
ion(){return e._getter(t)},set:function(r){e._setter(t,r)},enumerable:!0,configurable:!1})})(t)}}function R(e,t){return e<<(t=32-t)>>t}function N(e,t){return e<<(t=32-t)>>>t}function T(e){return N(e[0],8)}function O(e,t,r){var n,a,o,p,f,m,h,g=(1<<t-1)-1;function v(e){var t=u(e);return(e=e-t)<.5||!(.5<e||t%2)?t:t+1}for(e!=e?(a=(1<<t)-1,o=d(2,r-1),n=0):e===1/0||e===-1/0?(a=(1<<t)-1,n=e<(o=0)?1:0):0===e?n=1/e==-1/(o=a=0)?1:0:(n=e<0,(e=l(e))>=d(2,1-g)?(a=c(u(s(e)/i),1023),2<=(o=v(e/d(2,a)*d(2,r)))/d(2,r)&&(a+=1,o=1),g<a?(a=(1<<t)-1,o=0):(a+=g,o-=d(2,r))):(a=0,o=v(e/d(2,1-g-r)))),f=[],p=r;p;--p)f.push(o%2?1:0),o=u(o/2);for(p=t;p;--p)f.push(a%2?1:0),a=u(a/2);for(f.push(n?1:0),f.reverse(),m=f.join(""),h=[];m.length;)h.push(parseInt(m.substring(0,8),2)),m=m.substring(8);return h}function S(e,t,r){for(var n,a,o,i,l,u,s=[],c=e.length;c;--c)for(a=e[c-1],n=8;n;--n)s.push(a%2?1:0),a>>=1;return s.reverse(),u=s.join(""),o=(1<<t-1)-1,i=parseInt(u.substring(0,1),2)?-1:1,l=parseInt(u.substring(1,1+t),2)\
,u=parseInt(u.substring(1+t),2),l===(1<<t)-1?0===u?1/0*i:NaN:0<l?i*d(2,l-o)*(1+u/d(2,r)):0!==u?i*d(2,-(o-1))*(u/d(2,r)):i<0?-0:0}function _(e){if((e=o.ToInt32(e))<0)throw new RangeError("ArrayBuffer size is not a small enough positive integer");var t;for(this.byteLength=e,this._bytes=[],this._bytes.length=e,t=0;t<this.byteLength;t+=1)this._bytes[t]=0;C(this)}function M(){}function P(e,t,r){var n=function(e,t,r){var i,l,u,s;if(arguments.length&&"number"!=typeof e)if("object"===a(e)&&e.constructor===n)for(this.length=(i=e).length,this.byteLength=this.length*this.BYTES_PER_ELEMENT,this.buffer=new _(this.byteLength),u=this.byteOffset=0;u<this.length;u+=1)this._setter(u,i._getter(u));else if("object"!==a(e)||e instanceof _||"ArrayBuffer"===o.Class(e)){if("object"!==a(e)||!(e instanceof _||"ArrayBuffer"===o.Class(e)))throw new TypeError("Unexpected argument type(s)");if(this.buffer=e,this.byteOffset=o.ToUint32(t),this.byteOffset>this.buffer.byteLength)throw new RangeError("byteOffset out of \
range");if(this.byteOffset%this.BYTES_PER_ELEMENT)throw new RangeError("ArrayBuffer length minus the byteOffset is not a multiple of the element size.");if(arguments.length<3){if(this.byteLength=this.buffer.byteLength-this.byteOffset,this.byteLength%this.BYTES_PER_ELEMENT)throw new RangeError("length of buffer minus byteOffset not a multiple of the element size");this.length=this.byteLength/this.BYTES_PER_ELEMENT}else this.length=o.ToUint32(r),this.byteLength=this.length*this.BYTES_PER_ELEMENT;if(this.byteOffset+this.byteLength>this.buffer.byteLength)throw new RangeError("byteOffset and length reference an area beyond the end of the buffer")}else for(this.length=o.ToUint32((l=e).length),this.byteLength=this.length*this.BYTES_PER_ELEMENT,this.buffer=new _(this.byteLength),u=this.byteOffset=0;u<this.length;u+=1)s=l[u],this._setter(u,Number(s));else{if(this.length=o.ToInt32(e),r<0)throw new RangeError("ArrayBufferView size is not a small enough positive integer");this.byteLength=this.leng\
th*this.BYTES_PER_ELEMENT,this.buffer=new _(this.byteLength),this.byteOffset=0}this.constructor=n,C(this),k(this)};return(n.prototype=new M).BYTES_PER_ELEMENT=e,n.prototype._pack=t,n.prototype._unpack=r,n.BYTES_PER_ELEMENT=e,n.prototype.get=n.prototype._getter=function(e){if(arguments.length<1)throw new SyntaxError("Not enough arguments");if(!((e=o.ToUint32(e))>=this.length)){for(var t=[],r=0,n=this.byteOffset+e*this.BYTES_PER_ELEMENT;r<this.BYTES_PER_ELEMENT;r+=1,n+=1)t.push(this.buffer._bytes[n]);return this._unpack(t)}},n.prototype._setter=function(e,t){if(arguments.length<2)throw new SyntaxError("Not enough arguments");if((e=o.ToUint32(e))<this.length)for(var r=this._pack(t),n=0,a=this.byteOffset+e*this.BYTES_PER_ELEMENT;n<this.BYTES_PER_ELEMENT;n+=1,a+=1)this.buffer._bytes[a]=r[n]},n.prototype.set=function(e,t){if(arguments.length<1)throw new SyntaxError("Not enough arguments");var r,n,i,l,u,s,c,d,p,f;if("object"===a(e)&&e.constructor===this.constructor){if(r=e,(i=o.ToUint32(t))+r\
.length>this.length)throw new RangeError("Offset plus length of array is out of range");if(d=this.byteOffset+i*this.BYTES_PER_ELEMENT,p=r.length*this.BYTES_PER_ELEMENT,r.buffer===this.buffer){for(f=[],u=0,s=r.byteOffset;u<p;u+=1,s+=1)f[u]=r.buffer._bytes[s];for(u=0,c=d;u<p;u+=1,c+=1)this.buffer._bytes[c]=f[u]}else for(u=0,s=r.byteOffset,c=d;u<p;u+=1,s+=1,c+=1)this.buffer._bytes[c]=r.buffer._bytes[s]}else{if("object"!==a(e)||void 0===e.length)throw new TypeError("Unexpected argument type(s)");if(l=o.ToUint32((n=e).length),(i=o.ToUint32(t))+l>this.length)throw new RangeError("Offset plus length of array is out of range");for(u=0;u<l;u+=1)s=n[u],this._setter(i+u,Number(s))}},n.prototype.subarray=function(e,t){return e=o.ToInt32(e),t=o.ToInt32(t),arguments.length<1&&(e=0),arguments.length<2&&(t=this.length),e<0&&(e=this.length+e),t<0&&(t=this.length+t),e=f(e,0,this.length),t=(t=f(t,0,this.length))-e,new this.constructor(this.buffer,this.byteOffset+e*this.BYTES_PER_ELEMENT,t=t<0?0:t)},n}fun\
ction I(e,t){return o.IsCallable(e.get)?e.get(t):e[t]}function B(t,r,n){if(0===arguments.length)t=new e.ArrayBuffer(0);else if(!(t instanceof e.ArrayBuffer||"ArrayBuffer"===o.Class(t)))throw new TypeError("TypeError");if(this.buffer=t||new e.ArrayBuffer(0),this.byteOffset=o.ToUint32(r),this.byteOffset>this.buffer.byteLength)throw new RangeError("byteOffset out of range");if(this.byteLength=arguments.length<3?this.buffer.byteLength-this.byteOffset:o.ToUint32(n),this.byteOffset+this.byteLength>this.buffer.byteLength)throw new RangeError("byteOffset and length reference an area beyond the end of the buffer");C(this)}function j(t){return function(r,n){if((r=o.ToUint32(r))+t.BYTES_PER_ELEMENT>this.byteLength)throw new RangeError("Array index out of range");r+=this.byteOffset;for(var a=new e.Uint8Array(this.buffer,r,t.BYTES_PER_ELEMENT),i=[],l=0;l<t.BYTES_PER_ELEMENT;l+=1)i.push(I(a,l));return Boolean(n)===Boolean(A)&&i.reverse(),I(new t(new e.Uint8Array(i).buffer),0)}}function L(t){return f\
unction(r,n,a){if((r=o.ToUint32(r))+t.BYTES_PER_ELEMENT>this.byteLength)throw new RangeError("Array index out of range");n=new t([n]);for(var i=new e.Uint8Array(n.buffer),l=[],u=0;u<t.BYTES_PER_ELEMENT;u+=1)l.push(I(i,u));Boolean(a)===Boolean(A)&&l.reverse(),new e.Uint8Array(this.buffer,r,t.BYTES_PER_ELEMENT).set(l)}}m=Object.defineProperty&&(()=>{try{return Object.defineProperty({},"x",{}),1}catch(e){}})()?Object.defineProperty:function(e,t,r){if(!e===Object(e))throw new TypeError("Object.defineProperty called on non-object");return o.HasProperty(r,"get")&&Object.prototype.__defineGetter__&&Object.prototype.__defineGetter__.call(e,t,r.get),o.HasProperty(r,"set")&&Object.prototype.__defineSetter__&&Object.prototype.__defineSetter__.call(e,t,r.set),o.HasProperty(r,"value")&&(e[t]=r.value),e},e.ArrayBuffer=e.ArrayBuffer||_,E=P(1,(function(e){return[255&e]}),(function(e){return R(e[0],8)})),h=P(1,(function(e){return[255&e]}),T),g=P(1,(function(e){return[(e=p(Number(e)))<0?0:255<e?255:255&\
e]}),T),v=P(2,(function(e){return[e>>8&255,255&e]}),(function(e){return R(e[0]<<8|e[1],16)})),b=P(2,(function(e){return[e>>8&255,255&e]}),(function(e){return N(e[0]<<8|e[1],16)})),y=P(4,(function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}),(function(e){return R(e[0]<<24|e[1]<<16|e[2]<<8|e[3],32)})),w=P(4,(function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}),(function(e){return N(e[0]<<24|e[1]<<16|e[2]<<8|e[3],32)})),D=P(4,(function(e){return O(e,8,23)}),(function(e){return S(e,8,23)})),x=P(8,(function(e){return O(e,11,52)}),(function(e){return S(e,11,52)})),e.Int8Array=e.Int8Array||E,e.Uint8Array=e.Uint8Array||h,e.Uint8ClampedArray=e.Uint8ClampedArray||g,e.Int16Array=e.Int16Array||v,e.Uint16Array=e.Uint16Array||b,e.Int32Array=e.Int32Array||y,e.Uint32Array=e.Uint32Array||w,e.Float32Array=e.Float32Array||D,e.Float64Array=e.Float64Array||x,E=new e.Uint16Array([4660]),A=18===I(new e.Uint8Array(E.buffer),0),B.prototype.getUint8=j(e.Uint8Array),B.prototype.getInt8=j(e.Int8Array),B.pr\
ototype.getUint16=j(e.Uint16Array),B.prototype.getInt16=j(e.Int16Array),B.prototype.getUint32=j(e.Uint32Array),B.prototype.getInt32=j(e.Int32Array),B.prototype.getFloat32=j(e.Float32Array),B.prototype.getFloat64=j(e.Float64Array),B.prototype.setUint8=L(e.Uint8Array),B.prototype.setInt8=L(e.Int8Array),B.prototype.setUint16=L(e.Uint16Array),B.prototype.setInt16=L(e.Int16Array),B.prototype.setUint32=L(e.Uint32Array),B.prototype.setInt32=L(e.Int32Array),B.prototype.setFloat32=L(e.Float32Array),B.prototype.setFloat64=L(e.Float64Array),e.DataView=e.DataView||B})),De=se((function(e){function n(){if(void 0===this)throw new TypeError("Constructor WeakMap requires 'new'");if(c(this,"_id","_WeakMap_"+i()+"."+i()),0<arguments.length)throw new TypeError("WeakMap iterable is not supported")}function o(e,t){if(!l(e)||!u.call(e,"_id"))throw new TypeError(t+" method called on incompatible receiver "+a(e))}function i(){return Math.random().toString().substring(2)}function l(e){return Object(e)===e}var u\
,s,c;(e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:void 0!==t?t:void 0!==r?r:e).WeakMap||(u=Object.prototype.hasOwnProperty,s=Object.defineProperty&&(()=>{try{return 1===Object.defineProperty({},"x",{value:1}).x}catch(e){}})(),e.WeakMap=((c=function(e,t,r){s?Object.defineProperty(e,t,{configurable:!0,writable:!0,value:r}):e[t]=r})(n.prototype,"delete",(function(e){var t;return o(this,"delete"),!!l(e)&&!(!(t=e[this._id])||t[0]!==e||(delete e[this._id],0))})),c(n.prototype,"get",(function(e){var t;return o(this,"get"),l(e)&&(t=e[this._id])&&t[0]===e?t[1]:void 0})),c(n.prototype,"has",(function(e){var t;return o(this,"has"),!!l(e)&&!(!(t=e[this._id])||t[0]!==e)})),c(n.prototype,"set",(function(e,t){var r;if(o(this,"set"),l(e))return(r=e[this._id])&&r[0]===e?r[1]=t:c(e,this._id,[e,t]),this;throw new TypeError("Invalid value used as weak map key")})),c(n,"_polyfill",!0),n))})),xe=se((function(e,n){function o(e){return e&&e.Math===Math&&e}n.exports=o("object"==("\
undefined"==typeof globalThis?"undefined":a(globalThis))&&globalThis)||o("object"==(void 0===t?"undefined":a(t))&&t)||o("object"==("undefined"==typeof self?"undefined":a(self))&&self)||o("object"==(void 0===r?"undefined":a(r))&&r)||o("object"==a(e)&&e)||function(){return this}()||Function("return this")()})),Ee=se((function(e,t){t.exports=function(e){try{return!!e()}catch(e){return!0}}})),Ae=se((function(e,t){var r=Ee();t.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))})),Fe=se((function(e,t){var r=Ae(),n=Function.prototype,o=n.apply,i=n.call;t.exports="object"==("undefined"==typeof Reflect?"undefined":a(Reflect))&&Reflect.apply||(r?i.bind(o):function(){return i.apply(o,arguments)})})),Ce=se((function(e,t){var r=Ae(),n=(a=Function.prototype).call,a=r&&a.bind.bind(n,n);t.exports=r?a:function(e){return function(){return n.apply(e,arguments)}}})),ke=se((function(e,t){var r=Ce(),n=r({}.toString),a=r("".slice);t.exports=function(\
e){return a(n(e),8,-1)}})),Re=se((function(e,t){var r=ke(),n=Ce();t.exports=function(e){if("Function"===r(e))return n(e)}})),Ne=se((function(e,t){var r="object"==(void 0===n?"undefined":a(n))&&n.all;t.exports=void 0===r&&void 0!==r?function(e){return"function"==typeof e||e===r}:function(e){return"function"==typeof e}})),Te=se((function(e,t){var r=Ee();t.exports=!r((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))})),Oe=se((function(e,t){var r=Ae(),n=Function.prototype.call;t.exports=r?n.bind(n):function(){return n.apply(n,arguments)}})),Se=se((function(e){var t={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,n=r&&!t.call({1:2},1);e.f=n?function(e){return!!(e=r(this,e))&&e.enumerable}:t})),_e=se((function(e,t){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}})),Me=se((function(e,t){var r=Ce(),n=Ee(),a=ke(),o=Object,i=r("".split);t.exports=n((function(){return!o("z").propertyIsEnumerable(0)}))?funct\
ion(e){return"String"===a(e)?i(e,""):o(e)}:o})),Pe=se((function(e,t){t.exports=function(e){return null==e}})),Ie=se((function(e,t){var r=Pe(),n=TypeError;t.exports=function(e){if(r(e))throw new n("Can't call method on "+e);return e}})),Be=se((function(e,t){var r=Me(),n=Ie();t.exports=function(e){return r(n(e))}})),je=se((function(e,t){var r=Ne();t.exports=function(e){return"object"==a(e)?null!==e:r(e)}})),Le=se((function(e,t){t.exports={}})),qe=se((function(e,t){function r(e){return o(e)?e:void 0}var n=Le(),a=xe(),o=Ne();t.exports=function(e,t){return arguments.length<2?r(n[e])||r(a[e]):n[e]&&n[e][t]||a[e]&&a[e][t]}})),ze=se((function(e,t){var r=Ce();t.exports=r({}.isPrototypeOf)})),Ve=se((function(e,t){var r=(r=xe().navigator)&&r.userAgent;t.exports=r?String(r):""})),Ge=se((function(e,t){var r,n,a=xe(),o=Ve(),i=a.process;a=a.Deno;!(n=(a=(i=i&&i.versions||a&&a.version)&&i.v8)?0<(r=a.split("."))[0]&&r[0]<4?1:+(r[0]+r[1]):n)&&o&&(!(r=o.match(/Edge\\/(\\d+)/))||74<=r[1])&&(r=o.match(/Chrome\
\\/(\\d+)/))&&(n=+r[1]),t.exports=n})),$e=se((function(e,t){var r=Ge(),n=Ee(),a=xe().String;t.exports=!!Object.getOwnPropertySymbols&&!n((function(){var e=Symbol("symbol detection");return!a(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))})),He=se((function(e,t){var r=$e();t.exports=r&&!Symbol.sham&&"symbol"==a(Symbol.iterator)})),Ue=se((function(e,t){var r=qe(),n=Ne(),o=ze(),i=He(),l=Object;t.exports=i?function(e){return"symbol"==a(e)}:function(e){var t=r("Symbol");return n(t)&&o(t.prototype,l(e))}})),We=se((function(e,t){var r=String;t.exports=function(e){try{return r(e)}catch(e){return"Object"}}})),Ye=se((function(e,t){var r=Ne(),n=We(),a=TypeError;t.exports=function(e){if(r(e))return e;throw new a(n(e)+" is not a function")}})),Ke=se((function(e,t){var r=Ye(),n=Pe();t.exports=function(e,t){return e=e[t],n(e)?void 0:r(e)}})),Xe=se((function(e,t){var r=Oe(),n=Ne(),a=je(),o=TypeError;t.exports=function(e,t){var i,l;if("string"===t&&n(i=e.toString)&&!a(l=r(i,e)))return l;if(n\
(i=e.valueOf)&&!a(l=r(i,e)))return l;if("string"!==t&&n(i=e.toString)&&!a(l=r(i,e)))return l;throw new o("Can't convert object to primitive value")}})),Ze=se((function(e,t){t.exports=!0})),Je=se((function(e,t){var r=xe(),n=Object.defineProperty;t.exports=function(e,t){try{n(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}})),Qe=se((function(e,t){var r=Ze(),n=xe(),a=Je(),o="__core-js_shared__";((t=t.exports=n[o]||a(o,{})).versions||(t.versions=[])).push({version:"3.48.0",mode:r?"pure":"global",copyright:"© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.",license:"https://github.com/zloirock/core-js/blob/v3.48.0/LICENSE",source:"https://github.com/zloirock/core-js"})})),et=se((function(e,t){var r=Qe();t.exports=function(e,t){return r[e]||(r[e]=t||{})}})),tt=se((function(e,t){var r=Ie(),n=Object;t.exports=function(e){return n(r(e))}})),rt=se((function(e,t){var r=Ce(),n=tt(),a=r({}.hasOwnProperty);t.exports=Object.has\
Own||function(e,t){return a(n(e),t)}})),nt=se((function(e,t){var r=Ce(),n=0,a=Math.random(),o=r(1.1.toString);t.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+o(++n+a,36)}})),at=se((function(e,t){var r=xe(),n=et(),a=rt(),o=nt(),i=$e(),l=He(),u=r.Symbol,s=n("wks"),c=l?u.for||u:u&&u.withoutSetter||o;t.exports=function(e){return a(s,e)||(s[e]=i&&a(u,e)?u[e]:c("Symbol."+e)),s[e]}})),ot=se((function(e,t){var r=Oe(),n=je(),a=Ue(),o=Ke(),i=Xe(),l=at(),u=TypeError,s=l("toPrimitive");t.exports=function(e,t){if(!n(e)||a(e))return e;var l=o(e,s);if(l){if(l=r(l,e,t=void 0===t?"default":t),!n(l)||a(l))return l;throw new u("Can't convert object to primitive value")}return i(e,t=void 0===t?"number":t)}})),it=se((function(e,t){var r=ot(),n=Ue();t.exports=function(e){return e=r(e,"string"),n(e)?e:e+""}})),lt=se((function(e,t){var r=xe(),n=je(),a=r.document,o=n(a)&&n(a.createElement);t.exports=function(e){return o?a.createElement(e):{}}})),ut=se((function(e,t){var r=Te(),n=Ee(),a=lt();t.expo\
rts=!r&&!n((function(){return 7!==Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))})),st=se((function(e){var t=Te(),r=Oe(),n=Se(),a=_e(),o=Be(),i=it(),l=rt(),u=ut(),s=Object.getOwnPropertyDescriptor;e.f=t?s:function(e,t){if(e=o(e),t=i(t),u)try{return s(e,t)}catch(e){}if(l(e,t))return a(!r(n.f,e,t),e[t])}})),ct=se((function(e,t){function r(e,t){return(e=l[i(e)])===s||e!==u&&(a(t)?n(t):!!t)}var n=Ee(),a=Ne(),o=/#|\\.prototype\\./,i=r.normalize=function(e){return String(e).replace(o,".").toLowerCase()},l=r.data={},u=r.NATIVE="N",s=r.POLYFILL="P";t.exports=r})),dt=se((function(e,t){var r=Re(),n=Ye(),a=Ae(),o=r(r.bind);t.exports=function(e,t){return n(e),void 0===t?e:a?o(e,t):function(){return e.apply(t,arguments)}}})),pt=se((function(e,t){var r=Te(),n=Ee();t.exports=r&&n((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))})),ft=se((function(e,t){var r=je(),n=String,a=TypeError;t.exports=function(e){if(r(e))return e;\
throw new a(n(e)+" is not an object")}})),mt=se((function(e){var t=Te(),r=ut(),n=pt(),a=ft(),o=it(),i=TypeError,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,s="enumerable",c="configurable",d="writable";e.f=t?n?function(e,t,r){var n;return a(e),t=o(t),a(r),"function"==typeof e&&"prototype"===t&&"value"in r&&d in r&&!r[d]&&(n=u(e,t))&&n[d]&&(e[t]=r.value,r={configurable:(c in r?r:n)[c],enumerable:(s in r?r:n)[s],writable:!1}),l(e,t,r)}:l:function(e,t,n){if(a(e),t=o(t),a(n),r)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw new i("Accessors not supported");return"value"in n&&(e[t]=n.value),e}})),ht=se((function(e,t){var r=Te(),n=mt(),a=_e();t.exports=r?function(e,t,r){return n.f(e,t,a(1,r))}:function(e,t,r){return e[t]=r,e}})),gt=se((function(e,t){function r(e){function t(r,n,a){if(this instanceof t){switch(arguments.length){case 0:return new e;case 1:return new e(r);case 2:return new e(r,n)}return new e(r,n,a)}return o(e,this,arguments)}return t.prototype=e.protot\
ype,t}var n=xe(),o=Fe(),i=Re(),l=Ne(),u=st().f,s=ct(),c=Le(),d=dt(),p=ht(),f=rt();Qe(),t.exports=function(e,t){var o,m,h,g,v,b,y=e.target,w=e.global,D=e.stat,x=e.proto,E=w?n:D?n[y]:n[y]&&n[y].prototype,A=w?c:c[y]||p(c,y,{})[y],F=A.prototype;for(m in t)v=!(o=s(w?m:y+(D?".":"#")+m,e.forced))&&E&&f(E,m),g=A[m],v&&(b=e.dontCallGetSet?(b=u(E,m))&&b.value:E[m]),h=v&&b?b:t[m],(o||x||a(g)!=a(h))&&(v=e.bind&&v?d(h,n):e.wrap&&v?r(h):x&&l(h)?i(h):h,(e.sham||h&&h.sham||g&&g.sham)&&p(v,"sham",!0),p(A,m,v),x)&&(f(c,g=y+"Prototype")||p(c,g,{}),p(c[g],m,h),e.real)&&F&&(o||!F[m])&&p(F,m,h)}})),vt=se((function(){gt()({target:"Object",stat:!0},{hasOwn:rt()})})),bt=se((function(e,t){vt();var r=Le();t.exports=r.Object.hasOwn})),yt=se((function(e,t){var r=bt();t.exports=r})),wt=se((function(e,t){var r=yt();t.exports=r})),Dt=se((function(e,t){var r=et(),n=nt(),a=r("keys");t.exports=function(e){return a[e]||(a[e]=n(e))}})),xt=se((function(e,t){var r=Ee();t.exports=!r((function(){function e(){}return e.prototy\
pe.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))})),Et=se((function(e,t){var r=rt(),n=Ne(),a=tt(),o=Dt(),i=xt(),l=o("IE_PROTO"),u=Object,s=u.prototype;t.exports=i?u.getPrototypeOf:function(e){var t;e=a(e);return r(e,l)?e[l]:(t=e.constructor,n(t)&&e instanceof t?t.prototype:e instanceof u?s:null)}})),At=se((function(e,t){var r=Math.ceil,n=Math.floor;t.exports=Math.trunc||function(e){return(0<(e=+e)?n:r)(e)}})),Ft=se((function(e,t){var r=At();t.exports=function(e){return(e=+e)!=e||0==e?0:r(e)}})),Ct=se((function(e,t){var r=Ft(),n=Math.max,a=Math.min;t.exports=function(e,t){return(e=r(e))<0?n(e+t,0):a(e,t)}})),kt=se((function(e,t){var r=Ft(),n=Math.min;t.exports=function(e){return 0<(e=r(e))?n(e,9007199254740991):0}})),Rt=se((function(e,t){var r=kt();t.exports=function(e){return r(e.length)}})),Nt=se((function(e,t){function r(e){return function(t,r,i){var l=n(t),u=o(l);if(0!==u){var s,c=a(i,u);if(e&&r!=r){for(;c<u;)if((s=l[c++])!=s)return!0}else for(;c<u;c++)if((e||c in l\
)&&l[c]===r)return e||c||0}return!e&&-1}}var n=Be(),a=Ct(),o=Rt();t.exports={includes:r(!0),indexOf:r(!1)}})),Tt=se((function(e,t){t.exports={}})),Ot=se((function(e,t){var r=Ce(),n=rt(),a=Be(),o=Nt().indexOf,i=Tt(),l=r([].push);t.exports=function(e,t){var r,u=a(e),s=0,c=[];for(r in u)!n(i,r)&&n(u,r)&&l(c,r);for(;t.length>s;)!n(u,r=t[s++])||~o(c,r)||l(c,r);return c}})),St=se((function(e,t){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]})),_t=se((function(e,t){var r=Ot(),n=St();t.exports=Object.keys||function(e){return r(e,n)}})),Mt=se((function(e,t){function r(e){return function(t){for(var r,a=u(t),o=l(a),p=d&&null===i(a),f=o.length,m=0,h=[];m<f;)r=o[m++],n&&!(p?r in a:s(a,r))||c(h,e?[r,a[r]]:a[r]);return h}}var n=Te(),a=Ee(),o=Ce(),i=Et(),l=_t(),u=Be(),s=o(Se().f),c=o([].push),d=n&&a((function(){var e=Object.create(null);return e[2]=2,!s(e,2)}));t.exports={entries:r(!0),values:r(!1)}})),Pt=se((function(){var e=gt(\
),t=Mt().values;e({target:"Object",stat:!0},{values:function(e){return t(e)}})})),It=se((function(e,t){Pt();var r=Le();t.exports=r.Object.values})),Bt=se((function(e,t){var r=It();t.exports=r})),jt=se((function(e,t){var r=Bt();t.exports=r})),Lt=se((function(e,t){var r={};r[at()("toStringTag")]="z",t.exports="[object z]"===String(r)})),qt=se((function(e,t){var r=Lt(),n=Ne(),a=ke(),o=at()("toStringTag"),i=Object,l="Arguments"===a(function(){return arguments}());t.exports=r?a:function(e){var t;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(t=((e,t)=>{try{return e[t]}catch(e){}})(e=i(e),o))?t:l?a(e):"Object"===(t=a(e))&&n(e.callee)?"Arguments":t}})),zt=se((function(e,t){var r=qt(),n=String;t.exports=function(e){if("Symbol"===r(e))throw new TypeError("Cannot convert a Symbol value to a string");return n(e)}})),Vt=se((function(e,t){function r(e){return function(t,r){t=o(i(t)),r=a(r);var n,c=t.length;return r<0||c<=r?e?"":void 0:(n=u(t,r))<55296||56319<n||r+1===c||(c=u(t,r+1))\
<56320||57343<c?e?l(t,r):n:e?s(t,r,r+2):c-56320+(n-55296<<10)+65536}}var n=Ce(),a=Ft(),o=zt(),i=Ie(),l=n("".charAt),u=n("".charCodeAt),s=n("".slice);t.exports={codeAt:r(!1),charAt:r(!0)}})),Gt=se((function(e,t){var r=xe(),n=Ne();r=r.WeakMap;t.exports=n(r)&&/native code/.test(String(r))})),$t=se((function(e,t){var r,n,a,o,i=Gt(),l=xe(),u=je(),s=ht(),c=rt(),d=Qe(),p=Dt(),f=Tt(),m="Object already initialized",h=l.TypeError,g=(l=l.WeakMap,i||d.state?((a=d.state||(d.state=new l)).get=a.get,a.has=a.has,a.set=a.set,r=function(e,t){if(a.has(e))throw new h(m);return t.facade=e,a.set(e,t),t},n=function(e){return a.get(e)||{}},function(e){return a.has(e)}):(f[o=p("state")]=!0,r=function(e,t){if(c(e,o))throw new h(m);return t.facade=e,s(e,o,t),t},n=function(e){return c(e,o)?e[o]:{}},function(e){return c(e,o)}));t.exports={set:r,get:n,has:g,enforce:function(e){return g(e)?n(e):r(e,{})},getterFor:function(e){return function(t){if(u(t)&&(t=n(t)).type===e)return t;throw new h("Incompatible receiver, "\
+e+" required")}}}})),Ht=se((function(e,t){var r=Te(),n=rt(),a=Function.prototype,o=r&&Object.getOwnPropertyDescriptor,i=(n=n(a,"name"))&&"something"===function(){}.name;r=n&&(!r||o(a,"name").configurable);t.exports={EXISTS:n,PROPER:i,CONFIGURABLE:r}})),Ut=se((function(e){var t=Te(),r=pt(),n=mt(),a=ft(),o=Be(),i=_t();e.f=t&&!r?Object.defineProperties:function(e,t){a(e);for(var r,l=o(t),u=i(t),s=u.length,c=0;c<s;)n.f(e,r=u[c++],l[r]);return e}})),Wt=se((function(e,t){var r=qe();t.exports=r("document","documentElement")})),Yt=se((function(e,t){function r(){}var a,o=ft(),i=Ut(),l=St(),u=Tt(),s=Wt(),c=lt(),d=Dt(),p="prototype",f="script",m=d("IE_PROTO"),h=function(e){return"<"+f+">"+e+"</"+f+">"},g=function(){try{a=new ActiveXObject("htmlfile")}catch(e){}g=void 0===n||n.domain&&a?function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t}(a):(e=c("iframe"),t="java"+f+":",e.style.display="none",s.appendChild(e),e.src=String(t),(t=e.contentWindow.document).open(),t.writ\
e(h("document.F=Object")),t.close(),t.F);for(var e,t,r=l.length;r--;)delete g[p][l[r]];return g()};u[m]=!0,t.exports=Object.create||function(e,t){var n;return null!==e?(r[p]=o(e),n=new r,r[p]=null,n[m]=e):n=g(),void 0===t?n:i.f(n,t)}})),Kt=se((function(e,t){var r=ht();t.exports=function(e,t,n,a){return a&&a.enumerable?e[t]=n:r(e,t,n),e}})),Xt=se((function(e,t){var r,n,a=Ee(),o=Ne(),i=je(),l=Yt(),u=Et(),s=Kt(),c=at(),d=Ze(),p=c("iterator");c=!1;[].keys&&("next"in(n=[].keys())?(u=u(u(n)))!==Object.prototype&&(r=u):c=!0),!i(r)||a((function(){var e={};return r[p].call(e)!==e}))?r={}:d&&(r=l(r)),o(r[p])||s(r,p,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:c}})),Zt=se((function(e,t){var r=Lt(),n=qt();t.exports=r?{}.toString:function(){return"[object "+n(this)+"]"}})),Jt=se((function(e,t){var r=Lt(),n=mt().f,a=ht(),o=rt(),i=Zt(),l=at()("toStringTag");t.exports=function(e,t,u,s){(u=u?e:e&&e.prototype)&&(o(u,l)||n(u,l,{configurable:!0,value:t}),s)&&!r&&a(u,"to\
String",i)}})),Qt=se((function(e,t){t.exports={}})),er=se((function(e,t){function r(){return this}var n=Xt().IteratorPrototype,a=Yt(),o=_e(),i=Jt(),l=Qt();t.exports=function(e,t,u,s){return t+=" Iterator",e.prototype=a(n,{next:o(+!s,u)}),i(e,t,!1,!0),l[t]=r,e}})),tr=se((function(e,t){var r=Ce(),n=Ye();t.exports=function(e,t,a){try{return r(n(Object.getOwnPropertyDescriptor(e,t)[a]))}catch(e){}}})),rr=se((function(e,t){var r=je();t.exports=function(e){return r(e)||null===e}})),nr=se((function(e,t){var r=rr(),n=String,a=TypeError;t.exports=function(e){if(r(e))return e;throw new a("Can't set "+n(e)+" as a prototype")}})),ar=se((function(e,t){var r=tr(),n=je(),a=Ie(),o=nr();t.exports=Object.setPrototypeOf||("__proto__"in{}?(()=>{var e,t=!1,i={};try{(e=r(Object.prototype,"__proto__","set"))(i,[]),t=i instanceof Array}catch(i){}return function(r,i){return a(r),o(i),n(r)&&(t?e(r,i):r.__proto__=i),r}})():void 0)})),or=se((function(e,t){function r(){return this}var n=gt(),a=Oe(),o=Ze(),i=Ht(),l\
=Ne(),u=er(),s=Et(),c=ar(),d=Jt(),p=ht(),f=Kt(),m=at(),h=Qt(),g=Xt(),v=i.PROPER,b=i.CONFIGURABLE,y=g.IteratorPrototype,w=g.BUGGY_SAFARI_ITERATORS,D=m("iterator"),x="values",E="entries";t.exports=function(e,t,i,m,g,A,F){function C(e){if(e===g&&S)return S;if(!w&&e&&e in T)return T[e];switch(e){case"keys":case x:case E:return function(){return new i(this,e)}}return function(){return new i(this)}}u(i,t,m);m=t+" Iterator";var k,R,N=!1,T=e.prototype,O=T[D]||T["@@iterator"]||g&&T[g],S=!w&&O||C(g),_="Array"===t&&T.entries||O;if(_&&(_=s(_.call(new e)))!==Object.prototype&&_.next&&(o||s(_)===y||(c?c(_,y):l(_[D])||f(_,D,r)),d(_,m,!0,!0),o)&&(h[m]=r),v&&g===x&&O&&O.name!==x&&(!o&&b?p(T,"name",x):(N=!0,S=function(){return a(O,this)})),g)if(k={values:C(x),keys:A?S:C("keys"),entries:C(E)},F)for(R in k)!w&&!N&&R in T||f(T,R,k[R]);else n({target:t,proto:!0,forced:w||N},k);return o&&!F||T[D]===S||f(T,D,S,{name:g}),h[t]=S,k}})),ir=se((function(e,t){t.exports=function(e,t){return{value:e,done:t}}})),lr=se\
((function(){var e=Vt().charAt,t=zt(),r=$t(),n=or(),a=ir(),o="String Iterator",i=r.set,l=r.getterFor(o);n(String,"String",(function(e){i(this,{type:o,string:t(e),index:0})}),(function(){var t=l(this),r=t.string,n=t.index;return n>=r.length?a(void 0,!0):(r=e(r,n),t.index+=r.length,a(r,!1))}))})),ur=se((function(e,t){var r=Oe(),n=ft(),a=Ke();t.exports=function(e,t,o){var i,l;n(e);try{if(!(i=a(e,"return"))){if("throw"===t)throw o;return o}i=r(i,e)}catch(e){l=!0,i=e}if("throw"===t)throw o;if(l)throw i;return n(i),o}})),sr=se((function(e,t){var r=ft(),n=ur();t.exports=function(e,t,a,o){try{return o?t(r(a)[0],a[1]):t(a)}catch(t){n(e,"throw",t)}}})),cr=se((function(e,t){var r=at(),n=Qt(),a=r("iterator"),o=Array.prototype;t.exports=function(e){return void 0!==e&&(n.Array===e||o[a]===e)}})),dr=se((function(e,t){var r=Ce(),n=Ne(),a=Qe(),o=r(Function.toString);n(a.inspectSource)||(a.inspectSource=function(e){return o(e)}),t.exports=a.inspectSource})),pr=se((function(e,t){function r(){}function n(\
e){if(!l(e))return!1;try{return d(r,[],e),!0}catch(e){return!1}}function a(e){if(!l(e))return!1;switch(u(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return m||!!f(p,c(e))}catch(e){return!0}}var o=Ce(),i=Ee(),l=Ne(),u=qt(),s=qe(),c=dr(),d=s("Reflect","construct"),p=/^\\s*(?:class|function)\\b/,f=o(p.exec),m=!p.test(r);a.sham=!0,t.exports=!d||i((function(){var e;return n(n.call)||!n(Object)||!n((function(){e=!0}))||e}))?a:n})),fr=se((function(e,t){var r=Te(),n=mt(),a=_e();t.exports=function(e,t,o){r?n.f(e,t,a(0,o)):e[t]=o}})),mr=se((function(e,t){var r=ke();t.exports=Array.isArray||function(e){return"Array"===r(e)}})),hr=se((function(e,t){var r=Te(),n=mr(),a=TypeError,o=Object.getOwnPropertyDescriptor;r=r&&!function(){if(void 0!==this)return 1;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();t.exports=r?function(e,t){if(n(e)&&!o(e,"length").writable)throw new a("Cannot set read only .lengt\
h");return e.length=t}:function(e,t){return e.length=t}})),gr=se((function(e,t){var r=qt(),n=Ke(),a=Pe(),o=Qt(),i=at()("iterator");t.exports=function(e){if(!a(e))return n(e,i)||n(e,"@@iterator")||o[r(e)]}})),vr=se((function(e,t){var r=Oe(),n=Ye(),a=ft(),o=We(),i=gr(),l=TypeError;t.exports=function(e,t){if(t=arguments.length<2?i(e):t,n(t))return a(r(t,e));throw new l(o(e)+" is not iterable")}})),br=se((function(e,t){var r=dt(),n=Oe(),a=tt(),o=sr(),i=cr(),l=pr(),u=Rt(),s=fr(),c=hr(),d=vr(),p=gr(),f=Array;t.exports=function(e){var t,m,h,g,v,b,y,w=a(e),D=(e=l(this),1<(y=arguments.length)?arguments[1]:void 0),x=void 0!==D,E=0;if(!(y=(x&&(D=r(D,2<y?arguments[2]:void 0)),p(w)))||this===f&&i(y))for(t=u(w),m=e?new this(t):f(t);E<t;E++)b=x?D(w[E],E):w[E],s(m,E,b);else for(m=e?new this:[],v=(g=d(w,y)).next;!(h=n(v,g)).done;E++)b=x?o(g,D,[h.value,E],!0):h.value,s(m,E,b);return c(m,E),m}})),yr=se((function(e,t){var r,n,a=at()("iterator"),o=!1;try{r=0,(n={next:function(){return{done:!!r++}},return:f\
unction(){o=!0}})[a]=function(){return this},Array.from(n,(function(){throw 2}))}catch(e){}t.exports=function(e,t){try{if(!t&&!o)return!1}catch(e){return!1}var r=!1;try{var n={};n[a]=function(){return{next:function(){return{done:r=!0}}}},e(n)}catch(e){}return r}})),wr=se((function(){var e=gt(),t=br();e({target:"Array",stat:!0,forced:!yr()((function(e){Array.from(e)}))},{from:t})})),Dr=se((function(e,t){lr(),wr();var r=Le();t.exports=r.Array.from})),xr=se((function(e,t){var r=Dr();t.exports=r})),Er=se((function(e,t){var r=xr();t.exports=r})),Ar=se((function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isIdentStart=function(e){return"a"<=e&&e<="z"||"A"<=e&&e<="Z"||"-"===e||"_"===e},e.isIdent=function(e){return"a"<=e&&e<="z"||"A"<=e&&e<="Z"||"0"<=e&&e<="9"||"-"===e||"_"===e},e.isHex=function(e){return"a"<=e&&e<="f"||"A"<=e&&e<="F"||"0"<=e&&e<="9"},e.escapeIdentifier=function(t){for(var r=t.length,n="",a=0;a<r;){var o=t.charAt(a);if(e.identSpecialChars[o])n+="\\\\"+o;else if("_"===o\
||"-"===o||"A"<=o&&o<="Z"||"a"<=o&&o<="z"||0!==a&&"0"<=o&&o<="9")n+=o;else{if(55296==(63488&(o=o.charCodeAt(0)))){var i=t.charCodeAt(a++);if(55296!=(64512&o)||56320!=(64512&i))throw Error("UCS-2(decode): illegal sequence");o=((1023&o)<<10)+(1023&i)+65536}n+="\\\\"+o.toString(16)+" "}a++}return n},e.escapeStr=function(t){for(var r,n=t.length,a="",o=0;o<n;){var i=t.charAt(o);'"'===i?i='\\\\"':"\\\\"===i?i="\\\\\\\\":void 0!==(r=e.strReplacementsRev[i])&&(i=r),a+=i,o++}return'"'+a+'"'},e.identSpecialChars={"!":!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},e.strReplacementsRev={"\\n":"\\\\n","\\r":"\\\\r","\\t":"\\\\t","\\f":"\\\\f","\\v":"\\\\v"},e.singleQuoteEscapeChars={n:"\\n",r:"\\r",t:"\\t",f:"\\f","\\\\":"\\\\","'":"'"},e.doubleQuotesEscapeChars={n:"\\n",r:"\\r",t:"\\t",f:"\\f","\\\\":"\\\\",'"':'"'}})),Fr=se((function(e){Object.defineProperty(e,"__esModule",{value:!0});va\
r t=Ar();e.parseCssSelector=function(e,r,n,a,o,i){var l=e.length,u="";function s(n,a){var o="";for(r++,u=e.charAt(r);r<l;){if(u===n)return r++,o;var i;if("\\\\"===u)if(r++,(u=e.charAt(r))===n)o+=n;else if(void 0!==(i=a[u]))o+=i;else{if(t.isHex(u)){var s=u;for(r++,u=e.charAt(r);t.isHex(u);)s+=u,r++,u=e.charAt(r);" "===u&&(r++,u=e.charAt(r)),o+=String.fromCharCode(parseInt(s,16));continue}o+=u}else o+=u;r++,u=e.charAt(r)}return o}function c(){var n="";for(u=e.charAt(r);r<l;){if(!t.isIdent(u)){if("\\\\"!==u)return n;if(l<=++r)throw Error("Expected symbol but end of file reached.");if(u=e.charAt(r),!t.identSpecialChars[u]&&t.isHex(u)){var a=u;for(r++,u=e.charAt(r);t.isHex(u);)a+=u,r++,u=e.charAt(r);" "===u&&(r++,u=e.charAt(r)),n+=String.fromCharCode(parseInt(a,16));continue}}n+=u,r++,u=e.charAt(r)}return n}function d(){for(u=e.charAt(r);" "===u||"\\t"===u||"\\n"===u||"\\r"===u||"\\f"===u;)r++,u=e.charAt(r)}function p(){var t=f();if(!t)return null;var n=t;for(u=e.charAt(r);","===u;){if(r++,d(),"sel\
ectors"!==n.type&&(n={type:"selectors",selectors:[t]}),!(t=f()))throw Error('Rule expected after ",".');n.selectors.push(t)}return n}function f(){d();var t={type:"ruleSet"},n=m();if(!n)return null;for(var a=t;n&&(n.type="rule",a.rule=n,a=n,d(),u=e.charAt(r),!(l<=r||","===u||")"===u));)if(o[u]){var i=u;if(r++,d(),!(n=m()))throw Error('Rule expected after "'+i+'".');n.nestingOperator=i}else(n=m())&&(n.nestingOperator=null);return t}function m(){for(var o=null;r<l;)if("*"===(u=e.charAt(r)))r++,(o=o||{}).tagName="*";else if(t.isIdentStart(u)||"\\\\"===u)(o=o||{}).tagName=c();else if("."===u)r++,((o=o||{}).classNames=o.classNames||[]).push(c());else if("#"===u)r++,(o=o||{}).id=c();else if("["===u){r++,d();var f={name:c()};if(d(),"]"===u)r++;else{var m="";if(a[u]&&(m=u,r++,u=e.charAt(r)),l<=r)throw Error('Expected "=" but end of file reached.');if("="!==u)throw Error('Expected "=" but "'+u+'" found.');f.operator=m+"=",r++,d();var h="";if(f.valueType="string",'"'===u)h=s('"',t.doubleQuotesEscap\
eChars);else if("'"===u)h=s("'",t.singleQuoteEscapeChars);else if(i&&"$"===u)r++,h=c(),f.valueType="substitute";else{for(;r<l&&"]"!==u;)h+=u,r++,u=e.charAt(r);h=h.trim()}if(d(),l<=r)throw Error('Expected "]" but end of file reached.');if("]"!==u)throw Error('Expected "]" but "'+u+'" found.');r++,f.value=h}((o=o||{}).attrs=o.attrs||[]).push(f)}else{if(":"!==u)break;if(r++,f={name:m=c()},"("===u){r++;var g="";if(d(),"selector"===n[m])f.valueType="selector",g=p();else{if(f.valueType=n[m]||"string",'"'===u)g=s('"',t.doubleQuotesEscapeChars);else if("'"===u)g=s("'",t.singleQuoteEscapeChars);else if(i&&"$"===u)r++,g=c(),f.valueType="substitute";else{for(;r<l&&")"!==u;)g+=u,r++,u=e.charAt(r);g=g.trim()}d()}if(l<=r)throw Error('Expected ")" but end of file reached.');if(")"!==u)throw Error('Expected ")" but "'+u+'" found.');r++,f.value=g}((o=o||{}).pseudos=o.pseudos||[]).push(f)}return o}var h=p();if(r<l)throw Error('Rule expected but "'+e.charAt(r)+'" found.');return h}})),Cr=se((function(e){\
Object.defineProperty(e,"__esModule",{value:!0});var t=Ar();e.renderEntity=function e(r){var n="";switch(r.type){case"ruleSet":for(var a=r.rule,o=[];a;)a.nestingOperator&&o.push(a.nestingOperator),o.push(e(a)),a=a.rule;n=o.join(" ");break;case"selectors":n=r.selectors.map(e).join(", ");break;case"rule":r.tagName&&(n="*"===r.tagName?"*":t.escapeIdentifier(r.tagName)),r.id&&(n+="#"+t.escapeIdentifier(r.id)),r.classNames&&(n+=r.classNames.map((function(e){return"."+t.escapeIdentifier(e)})).join("")),r.attrs&&(n+=r.attrs.map((function(e){return"operator"in e?"substitute"===e.valueType?"["+t.escapeIdentifier(e.name)+e.operator+"$"+e.value+"]":"["+t.escapeIdentifier(e.name)+e.operator+t.escapeStr(e.value)+"]":"["+t.escapeIdentifier(e.name)+"]"})).join("")),r.pseudos&&(n+=r.pseudos.map((function(r){return r.valueType?"selector"===r.valueType?":"+t.escapeIdentifier(r.name)+"("+e(r.value)+")":"substitute"===r.valueType?":"+t.escapeIdentifier(r.name)+"($"+r.value+")":"numeric"===r.valueType?":"+\
t.escapeIdentifier(r.name)+"("+r.value+")":":"+t.escapeIdentifier(r.name)+"("+t.escapeIdentifier(r.value)+")":":"+t.escapeIdentifier(r.name)})).join(""));break;default:throw Error('Unknown entity type: "'+r.type+'".')}return n}})),kr=se((function(e){Object.defineProperty(e,"__esModule",{value:!0});var t=Fr(),r=Cr();function n(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}n.prototype.registerSelectorPseudos=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)this.pseudos[n[r]]="selector";return this},n.prototype.unregisterSelectorPseudos=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)delete this.pseudos[n[r]];return this},n.prototype.registerNumericPseudos=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)this.pseudos[n[r]]="numeric";return this},n.prototype.unregisterNumericPseudos=fun\
ction(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)delete this.pseudos[n[r]];return this},n.prototype.registerNestingOperators=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)this.ruleNestingOperators[n[r]]=!0;return this},n.prototype.unregisterNestingOperators=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)delete this.ruleNestingOperators[n[r]];return this},n.prototype.registerAttrEqualityMods=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)this.attrEqualityMods[n[r]]=!0;return this},n.prototype.unregisterAttrEqualityMods=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e;r<n.length;r++)delete this.attrEqualityMods[n[r]];return this},n.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},n.prototype.disableSubstitutes=function\
(){return this.substitutesEnabled=!1,this},n.prototype.parse=function(e){return t.parseCssSelector(e,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled)},n.prototype.render=function(e){return r.renderEntity(e).trim()},e.CssSelectorParser=n})),Rr=se((function(e,n){var o={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};if("object"!==("undefined"==typeof globalThis?"undefined":a(globalThis))\
)try{Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__}catch(e){t.globalThis=function(){if("undefined"!=typeof self)return self;if(void 0!==t)return t;if(void 0!==r)return r;if(void 0!==this)return this;throw new Error("Unable to locate global \`this\`")}()}o.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})):""}},void 0!==n&&n.exports?n.exports=o:"function"==typeof define&&define.amd?define((function(){return o})):globalThis.doT=o;var i={append:{start:"'+(",end:")+'",startencode:"'+encodeHTML("},split:{start:"';out+=(",end:");out+='",startencode:"';out+=encodeHTML("}},l=/$^/;function u(e){return e.replace(/\\\\('|\\\\)/g,"$1").replace(/[\\r\\t\\n]/g," ")}o.template=function(e,t,r){var n,a,s=(t=t||o.temp\
lateSettings).append?i.append:i.split,c=0;r=t.use||t.define?function e(t,r,n){return("string"==typeof r?r:r.toString()).replace(t.define||l,(function(e,r,a,o){return(r=0===r.indexOf("def.")?r.substring(4):r)in n||(":"===a?(t.defineParams&&o.replace(t.defineParams,(function(e,t,a){n[r]={arg:t,text:a}})),r in n||(n[r]=o)):new Function("def","def['"+r+"']="+o)(n)),""})).replace(t.use||l,(function(r,a){return t.useParams&&(a=a.replace(t.useParams,(function(e,t,r,a){var o;if(n[r]&&n[r].arg&&a)return o=(r+":"+a).replace(/'|\\\\/g,"_"),n.__exp=n.__exp||{},n.__exp[o]=n[r].text.replace(new RegExp("(^|[^\\\\w$])"+n[r].arg+"([^\\\\w$])","g"),"$1"+a+"$2"),t+"def.__exp['"+o+"']"}))),(a=new Function("def","return "+a)(n))&&e(t,a,n)}))}(t,e,r||{}):e,r=("var out='"+(t.strip?r.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g," ").replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,""):r).replace(/'|\\\\/g,"\\\\$&").replace(t.interpolate||l,(function(e,t){return s.start+u(t)+s.end})).replace(t.encode||l,(function(e,t){return n=!0,s.sta\
rtencode+u(t)+s.end})).replace(t.conditional||l,(function(e,t,r){return t?r?"';}else if("+u(r)+"){out+='":"';}else{out+='":r?"';if("+u(r)+"){out+='":"';}out+='"})).replace(t.iterate||l,(function(e,t,r,n){return t?(c+=1,a=n||"i"+c,t=u(t),"';var arr"+c+"="+t+";if(arr"+c+"){var "+r+","+a+"=-1,l"+c+"=arr"+c+".length-1;while("+a+"<l"+c+"){"+r+"=arr"+c+"["+a+"+=1];out+='"):"';} } out+='"})).replace(t.evaluate||l,(function(e,t){return"';"+u(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||!globalThis||globalThis._encodeHTML||(globalThis._encodeHTML=o.encodeHTMLSource(t.doNotSkipEncoded)),r="var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : ("+o.encodeHTMLSource.toString()+"("+(t.doNotSkipEncoded||"")+"));"+r);try{return new Function(t.varname,r)}catch(e){throw"undefined"!=typeof console&&console.log("Could not create a template function: "+r),e}},o.\
compile=function(e,t){return o.template(e,null,t)}})),Nr=se((function(e,t){t.exports=function(){}})),Tr=se((function(e,t){var r=Nr()();t.exports=function(e){return e!==r&&null!==e}})),Or=se((function(e,t){var r=Tr(),n=Array.prototype.forEach,a=Object.create;t.exports=function(e){var t=a(null);return n.call(arguments,(function(e){if(r(e)){var n,a=Object(e),o=t;for(n in a)o[n]=a[n]}})),t}})),Sr=se((function(e,t){t.exports=function(){var e=Math.sign;return"function"==typeof e&&1===e(10)&&-1===e(-20)}})),_r=se((function(e,t){t.exports=function(e){return e=Number(e),isNaN(e)||0===e?e:0<e?1:-1}})),Mr=se((function(e,t){t.exports=Sr()()?Math.sign:_r()})),Pr=se((function(e,t){var r=Mr(),n=Math.abs,a=Math.floor;t.exports=function(e){return isNaN(e)?0:0!==(e=Number(e))&&isFinite(e)?r(e)*a(n(e)):e}})),Ir=se((function(e,t){var r=Pr(),n=Math.max;t.exports=function(e){return n(0,r(e))}})),Br=se((function(e,t){var r=Ir();t.exports=function(e,t,n){return isNaN(e)?0<=t?n&&t?t-1:t:1:!1!==e&&r(e)}})),jr=s\
e((function(e,t){t.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}})),Lr=se((function(e,t){var r=Tr();t.exports=function(e){if(r(e))return e;throw new TypeError("Cannot use null or undefined")}})),qr=se((function(e,t){var r=jr(),n=Lr(),a=Function.prototype.bind,o=Function.prototype.call,i=Object.keys,l=Object.prototype.propertyIsEnumerable;t.exports=function(e,t){return function(u,s){var c,d=arguments[2],p=arguments[3];return u=Object(n(u)),r(s),c=i(u),p&&c.sort("function"==typeof p?a.call(p,u):void 0),"function"!=typeof e&&(e=c[e]),o.call(e,c,(function(e,r){return l.call(u,e)?o.call(s,d,u[e],e,u,r):t}))}}})),zr=se((function(e,t){t.exports=qr()("forEach")})),Vr=se((function(){})),Gr=se((function(e,t){t.exports=function(){var e=Object.assign;return"function"==typeof e&&(e(e={foo:"raz"},{bar:"dwa"},{trzy:"trzy"}),e.foo+e.bar+e.trzy==="razdwatrzy")}})),$r=se((function(e,t){t.exports=function(){try{return Object.keys("primitive"),!0}catch(e\
){return!1}}})),Hr=se((function(e,t){var r=Tr(),n=Object.keys;t.exports=function(e){return n(r(e)?Object(e):e)}})),Ur=se((function(e,t){t.exports=$r()()?Object.keys:Hr()})),Wr=se((function(e,t){var r=Ur(),n=Lr(),a=Math.max;t.exports=function(e,t){var o,i,l,u=a(arguments.length,2);for(e=Object(n(e)),l=function(r){try{e[r]=t[r]}catch(r){o=o||r}},i=1;i<u;++i)r(t=arguments[i]).forEach(l);if(void 0!==o)throw o;return e}})),Yr=se((function(e,t){t.exports=Gr()()?Object.assign:Wr()})),Kr=se((function(e,t){var r=Tr(),n={function:!0,object:!0};t.exports=function(e){return r(e)&&n[a(e)]||!1}})),Xr=se((function(e,t){var r=Yr(),n=Kr(),a=Tr(),o=Error.captureStackTrace;t.exports=function(e){e=new Error(e);var i=arguments[1],l=arguments[2];return a(l)||n(i)&&(l=i,i=null),a(l)&&r(e,l),a(i)&&(e.code=i),o&&o(e,t.exports),e}})),Zr=se((function(e,t){var r=Lr(),n=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.getOwnPropertySymbols;t.exports=function(e,t){var l,\
u=Object(r(t));if(e=Object(r(e)),o(u).forEach((function(r){try{n(e,r,a(t,r))}catch(r){l=r}})),"function"==typeof i&&i(u).forEach((function(r){try{n(e,r,a(t,r))}catch(r){l=r}})),void 0!==l)throw l;return e}})),Jr=se((function(e,t){function r(e,t){return t}var n,a,o,i,l,u=Ir();try{Object.defineProperty(r,"length",{configurable:!0,writable:!1,enumerable:!1,value:1})}catch(e){}1===r.length?(n={configurable:!0,writable:!1,enumerable:!1},a=Object.defineProperty,t.exports=function(e,t){return t=u(t),e.length===t?e:(n.value=t,a(e,"length",n))}):(i=Zr(),l=[],o=function(e){var t,r=0;if(l[e])return l[e];for(t=[];e--;)t.push("a"+(++r).toString(36));return new Function("fn","return function ("+t.join(", ")+") { return fn.apply(this, arguments); };")},t.exports=function(e,t){if(t=u(t),e.length===t)return e;t=o(t)(e);try{i(t,e)}catch(e){}return t})})),Qr=se((function(e,t){t.exports=function(e){return null!=e}})),en=se((function(e,t){var r=Qr(),n={object:!0,function:!0,undefined:!0};t.exports=function\
(e){return!!r(e)&&hasOwnProperty.call(n,a(e))}})),tn=se((function(e,t){var r=en();t.exports=function(e){if(!r(e))return!1;try{return!!e.constructor&&e.constructor.prototype===e}catch(e){return!1}}})),rn=se((function(e,t){var r=tn();t.exports=function(e){if("function"!=typeof e)return!1;if(!hasOwnProperty.call(e,"length"))return!1;try{if("number"!=typeof e.length)return!1;if("function"!=typeof e.call)return!1;if("function"!=typeof e.apply)return!1}catch(e){return!1}return!r(e)}})),nn=se((function(e,t){var r=rn(),n=/^\\s*class[\\s{/}]/,a=Function.prototype.toString;t.exports=function(e){return!!r(e)&&!n.test(a.call(e))}})),an=se((function(e,t){var r="razdwatrzy";t.exports=function(){return"function"==typeof r.contains&&!0===r.contains("dwa")&&!1===r.contains("foo")}})),on=se((function(e,t){var r=String.prototype.indexOf;t.exports=function(e){return-1<r.call(this,e,arguments[1])}})),ln=se((function(e,t){t.exports=an()()?String.prototype.contains:on()})),un=se((function(e,t){var r=Qr(),n=nn(\
),a=Yr(),o=Or(),i=ln();(t.exports=function(e,t){var n,l,u,s;return arguments.length<2||"string"!=typeof e?(s=t,t=e,e=null):s=arguments[2],r(e)?(n=i.call(e,"c"),l=i.call(e,"e"),u=i.call(e,"w")):l=!(n=u=!0),e={value:t,configurable:n,enumerable:l,writable:u},s?a(o(s),e):e}).gs=function(e,t,l){var u,s;return"string"!=typeof e?(s=l,l=t,t=e,e=null):s=arguments[3],r(t)?n(t)?r(l)?n(l)||(s=l,l=void 0):l=void 0:(s=t,t=l=void 0):t=void 0,e=r(e)?(u=i.call(e,"c"),i.call(e,"e")):!(u=!0),t={get:t,set:l,configurable:u,enumerable:e},s?a(o(s),t):t}})),sn=se((function(e,t){var r=un(),n=jr(),o=Function.prototype.apply,i=Function.prototype.call,l=Object.create,u=Object.defineProperty,s=Object.defineProperties,c=Object.prototype.hasOwnProperty,d={configurable:!0,enumerable:!1,writable:!0},p=function(e,t){var r;return n(t),c.call(this,"__ee__")?r=this.__ee__:(r=d.value=l(null),u(this,"__ee__",d),d.value=null),r[e]?"object"===a(r[e])?r[e].push(t):r[e]=[r[e],t]:r[e]=t,this},f=function(e,t){var r,a;return n(t),\
a=this,p.call(this,e,r=function(){m.call(a,e,r),o.call(t,this,arguments)}),r.__eeOnceListener__=t,this},m=function(e,t){var r,o,i,l;if(n(t),c.call(this,"__ee__")&&(r=this.__ee__)[e])if("object"===a(o=r[e]))for(l=0;i=o[l];++l)i!==t&&i.__eeOnceListener__!==t||(2===o.length?r[e]=o[l?0:1]:o.splice(l,1));else o!==t&&o.__eeOnceListener__!==t||delete r[e];return this},h=function(e){var t,r,n,l,u;if(c.call(this,"__ee__")&&(l=this.__ee__[e]))if("object"===a(l)){for(r=arguments.length,u=new Array(r-1),t=1;t<r;++t)u[t-1]=arguments[t];for(l=l.slice(),t=0;n=l[t];++t)o.call(n,this,u)}else switch(arguments.length){case 1:i.call(l,this);break;case 2:i.call(l,this,arguments[1]);break;case 3:i.call(l,this,arguments[1],arguments[2]);break;default:for(r=arguments.length,u=new Array(r-1),t=1;t<r;++t)u[t-1]=arguments[t];o.call(l,this,u)}},g={on:p,once:f,off:m,emit:h},v={on:r(p),once:r(f),off:r(m),emit:r(h)},b=s({},v);t.exports=e=function(e){return null==e?l(b):s(Object(e),v)},e.methods=g})),cn=se((function(\
e,t){t.exports=function(){var e,t=Array.from;return"function"==typeof t&&(e=t(t=["raz","dwa"]),Boolean(e&&e!==t&&"dwa"===e[1]))}})),dn=se((function(e,t){t.exports=function(){return"object"===("undefined"==typeof globalThis?"undefined":a(globalThis))&&!!globalThis&&globalThis.Array===Array}})),pn=se((function(e,r){function n(){if("object"===("undefined"==typeof self?"undefined":a(self))&&self)return self;if("object"===(void 0===t?"undefined":a(t))&&t)return t;throw new Error("Unable to resolve global \`this\`")}r.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,"__global__",{get:function(){return this},configurable:!0})}catch(e){return n()}try{return __global__||n()}finally{delete Object.prototype.__global__}}()})),fn=se((function(e,t){t.exports=dn()()?globalThis:pn()})),mn=se((function(e,t){var r=fn(),n={object:!0,symbol:!0};t.exports=function(){var e,t=r.Symbol;if("function"!=typeof t)return!1;e=t("test symbol");try{String(e)}catch(e){return!1}return!!n[\
a(t.iterator)]&&!!n[a(t.toPrimitive)]&&!!n[a(t.toStringTag)]}})),hn=se((function(e,t){t.exports=function(e){return!!e&&("symbol"===a(e)||!!e.constructor&&"Symbol"===e.constructor.name&&"Symbol"===e[e.constructor.toStringTag])}})),gn=se((function(e,t){var r=hn();t.exports=function(e){if(r(e))return e;throw new TypeError(e+" is not a symbol")}})),vn=se((function(e,t){var r=un(),n=Object.create,a=Object.defineProperty,o=Object.prototype,i=n(null);t.exports=function(e){for(var t,n,l=0;i[e+(l||"")];)++l;return i[e+=l||""]=!0,a(o,t="@@"+e,r.gs(null,(function(e){n||(n=!0,a(this,t,r(e)),n=!1)}))),t}})),bn=se((function(e,t){var r=un(),n=fn().Symbol;t.exports=function(e){return Object.defineProperties(e,{hasInstance:r("",n&&n.hasInstance||e("hasInstance")),isConcatSpreadable:r("",n&&n.isConcatSpreadable||e("isConcatSpreadable")),iterator:r("",n&&n.iterator||e("iterator")),match:r("",n&&n.match||e("match")),replace:r("",n&&n.replace||e("replace")),search:r("",n&&n.search||e("search")),species:r("\
",n&&n.species||e("species")),split:r("",n&&n.split||e("split")),toPrimitive:r("",n&&n.toPrimitive||e("toPrimitive")),toStringTag:r("",n&&n.toStringTag||e("toStringTag")),unscopables:r("",n&&n.unscopables||e("unscopables"))})}})),yn=se((function(e,t){var r=un(),n=gn(),a=Object.create(null);t.exports=function(e){return Object.defineProperties(e,{for:r((function(t){return a[t]||(a[t]=e(String(t)))})),keyFor:r((function(e){for(var t in n(e),a)if(a[t]===e)return t}))})}})),wn=se((function(e,t){var r,n,o,i=un(),l=gn(),u=fn().Symbol,s=vn(),c=bn(),d=yn(),p=Object.create,f=Object.defineProperties,m=Object.defineProperty;if("function"==typeof u)try{String(u()),o=!0}catch(e){}else u=null;n=function(e){if(this instanceof n)throw new TypeError("Symbol is not a constructor");return r(e)},t.exports=r=function e(t){var r;if(this instanceof e)throw new TypeError("Symbol is not a constructor");return o?u(t):(r=p(n.prototype),t=void 0===t?"":String(t),f(r,{__description__:i("",t),__name__:i("",s(t))}))}\
,c(r),d(r),f(n.prototype,{constructor:i(r),toString:i("",(function(){return this.__name__}))}),f(r.prototype,{toString:i((function(){return"Symbol ("+l(this).__description__+")"})),valueOf:i((function(){return l(this)}))}),m(r.prototype,r.toPrimitive,i("",(function(){var e=l(this);return"symbol"===a(e)?e:e.toString()}))),m(r.prototype,r.toStringTag,i("c","Symbol")),m(n.prototype,r.toStringTag,i("c",r.prototype[r.toStringTag])),m(n.prototype,r.toPrimitive,i("c",r.prototype[r.toPrimitive]))})),Dn=se((function(e,t){t.exports=mn()()?fn().Symbol:wn()})),xn=se((function(e,t){var r=Object.prototype.toString,n=r.call(function(){return arguments}());t.exports=function(e){return r.call(e)===n}})),En=se((function(e,t){var r=Object.prototype.toString,n=RegExp.prototype.test.bind(/^[object [A-Za-z0-9]*Function]$/);t.exports=function(e){return"function"==typeof e&&n(r.call(e))}})),An=se((function(e,t){var r=Object.prototype.toString,n=r.call("");t.exports=function(e){return"string"==typeof e||e&&"ob\
ject"===a(e)&&(e instanceof String||r.call(e)===n)||!1}})),Fn=se((function(e,t){var r=Dn().iterator,n=xn(),a=En(),o=Ir(),i=jr(),l=Lr(),u=Tr(),s=An(),c=Array.isArray,d=Function.prototype.call,p={configurable:!0,enumerable:!0,writable:!0,value:null},f=Object.defineProperty;t.exports=function(e){var t,m,h,g,v,b,y,w,D,x,E=arguments[1],A=arguments[2];if(e=Object(l(e)),u(E)&&i(E),this&&this!==Array&&a(this))t=this;else{if(!E){if(n(e))return 1!==(v=e.length)?Array.apply(null,e):((g=new Array(1))[0]=e[0],g);if(c(e)){for(g=new Array(v=e.length),m=0;m<v;++m)g[m]=e[m];return g}}g=[]}if(!c(e))if(void 0!==(D=e[r])){for(y=i(D).call(e),t&&(g=new t),w=y.next(),m=0;!w.done;)x=E?d.call(E,A,w.value,m):w.value,t?(p.value=x,f(g,m,p)):g[m]=x,w=y.next(),++m;v=m}else if(s(e)){for(v=e.length,t&&(g=new t),h=m=0;m<v;++m)x=e[m],m+1<v&&55296<=(b=x.charCodeAt(0))&&b<=56319&&(x+=e[++m]),x=E?d.call(E,A,x,h):x,t?(p.value=x,f(g,h,p)):g[h]=x,++h;v=h}if(void 0===v)for(v=o(e.length),t&&(g=new t(v)),m=0;m<v;++m)x=E?d.call(\
E,A,e[m],m):e[m],t?(p.value=x,f(g,m,p)):g[m]=x;return t&&(p.value=null,g.length=v),g}})),Cn=se((function(e,t){t.exports=cn()()?Array.from:Fn()})),kn=se((function(e,t){var r=Cn(),n=Array.isArray;t.exports=function(e){return n(e)?e:r(e)}})),Rn=se((function(e,t){var r=kn(),n=Tr(),a=jr(),o=Array.prototype.slice,i=function(e){return this.map((function(t,r){return t?t(e[r]):e[r]})).concat(o.call(e,this.length))};t.exports=function(e){return(e=r(e)).forEach((function(e){n(e)&&a(e)})),i.bind(e)}})),Nn=se((function(e,t){var r=jr();t.exports=function(e){var t;return"function"==typeof e?{set:e,get:e}:(t={get:r(e.get)},void 0!==e.set?(t.set=r(e.set),e.delete&&(t.delete=r(e.delete)),e.clear&&(t.clear=r(e.clear))):t.set=t.get,t)}})),Tn=se((function(e,t){var r=Xr(),n=Jr(),a=un(),o=sn().methods,i=Rn(),l=Nn(),u=Function.prototype.apply,s=Function.prototype.call,c=Object.create,d=Object.defineProperties,p=o.on,f=o.emit;t.exports=function(e,t,o){var m,h,g,v,b,y,w,D,x,E,A,F=c(null),C=!1!==t?t:isNaN(e.leng\
th)?1:e.length;return o.normalizer&&(E=l(o.normalizer),h=E.get,g=E.set,v=E.delete,b=E.clear),null!=o.resolvers&&(A=i(o.resolvers)),E=h?n((function(t){var n,a,o=arguments;if(A&&(o=A(o)),null!==(n=h(o))&&hasOwnProperty.call(F,n))return w&&m.emit("get",n,o,this),F[n];if(a=1===o.length?s.call(e,this,o[0]):u.call(e,this,o),null===n){if(null!==(n=h(o)))throw r("Circular invocation","CIRCULAR_INVOCATION");n=g(o)}else if(hasOwnProperty.call(F,n))throw r("Circular invocation","CIRCULAR_INVOCATION");return F[n]=a,D&&m.emit("set",n,null,a),a}),C):0===t?function(){var t;if(hasOwnProperty.call(F,"data"))return w&&m.emit("get","data",arguments,this),F.data;if(t=arguments.length?u.call(e,this,arguments):s.call(e,this),hasOwnProperty.call(F,"data"))throw r("Circular invocation","CIRCULAR_INVOCATION");return F.data=t,D&&m.emit("set","data",null,t),t}:function(t){var n,a=arguments;if(A&&(a=A(arguments)),n=String(a[0]),hasOwnProperty.call(F,n))return w&&m.emit("get",n,a,this),F[n];if(a=1===a.length?s.cal\
l(e,this,a[0]):u.call(e,this,a),hasOwnProperty.call(F,n))throw r("Circular invocation","CIRCULAR_INVOCATION");return F[n]=a,D&&m.emit("set",n,null,a),a},m={original:e,memoized:E,profileName:o.profileName,get:function(e){return A&&(e=A(e)),h?h(e):String(e[0])},has:function(e){return hasOwnProperty.call(F,e)},delete:function(e){var t;hasOwnProperty.call(F,e)&&(v&&v(e),t=F[e],delete F[e],x)&&m.emit("delete",e,t)},clear:function(){var e=F;b&&b(),F=c(null),m.emit("clear",e)},on:function(e,t){return"get"===e?w=!0:"set"===e?D=!0:"delete"===e&&(x=!0),p.call(this,e,t)},emit:f,updateEnv:function(){e=m.original}},o=h?n((function(e){var t=arguments;A&&(t=A(t)),null!==(t=h(t))&&m.delete(t)}),C):0===t?function(){return m.delete("data")}:function(e){return A&&(e=A(arguments)[0]),m.delete(e)},C=n((function(){var e=arguments;return 0===t?F.data:(A&&(e=A(e)),e=h?h(e):String(e[0]),F[e])})),y=n((function(){var e=arguments;return 0===t?m.has("data"):(A&&(e=A(e)),null!==(e=h?h(e):String(e[0]))&&m.has(e))}))\
,d(E,{__memoized__:a(!0),delete:a(o),clear:a(m.clear),_get:a(C),_has:a(y)}),m}})),On=se((function(e,t){var r=jr(),n=zr(),a=Vr(),o=Tn(),i=Br();t.exports=function e(t){var l,u,s;if(r(t),(l=Object(arguments[1])).async&&l.promise)throw new Error("Options 'async' and 'promise' cannot be used together");return hasOwnProperty.call(t,"__memoized__")&&!l.force?t:(u=i(l.length,t.length,l.async&&a.async),s=o(t,u,l),n(a,(function(e,t){l[t]&&e(l[t],s,l)})),e.__profiler__&&e.__profiler__(s),s.updateEnv(),s.memoized)}})),Sn=se((function(e,t){t.exports=function(e){var t,r,n=e.length;if(!n)return"";for(t=String(e[r=0]);--n;)t+=""+e[++r];return t}})),_n=se((function(e,t){t.exports=function(e){return e?function(t){for(var r=String(t[0]),n=0,a=e;--a;)r+=""+t[++n];return r}:function(){return""}}})),Mn=se((function(e,t){t.exports=function(){var e=Number.isNaN;return"function"==typeof e&&!e({})&&e(NaN)&&!e(34)}})),Pn=se((function(e,t){t.exports=function(e){return e!=e}})),In=se((function(e,t){t.exports=Mn\
()()?Number.isNaN:Pn()})),Bn=se((function(e,t){var r=In(),n=Ir(),a=Lr(),o=Array.prototype.indexOf,i=Object.prototype.hasOwnProperty,l=Math.abs,u=Math.floor;t.exports=function(e){var t,s,c;if(!r(e))return o.apply(this,arguments);for(s=n(a(this).length),e=arguments[1],t=e=isNaN(e)?0:0<=e?u(e):n(this.length)-u(l(e));t<s;++t)if(i.call(this,t)&&(c=this[t],r(c)))return t;return-1}})),jn=se((function(e,t){var r=Bn(),n=Object.create;t.exports=function(){var e=0,t=[],a=n(null);return{get:function(e){var n,a=0,o=t,i=e.length;if(0===i)return o[i]||null;if(o=o[i]){for(;a<i-1;){if(-1===(n=r.call(o[0],e[a])))return null;o=o[1][n],++a}return-1===(n=r.call(o[0],e[a]))?null:o[1][n]||null}return null},set:function(n){var o,i=0,l=t,u=n.length;if(0===u)l[u]=++e;else{for(l[u]||(l[u]=[[],[]]),l=l[u];i<u-1;)-1===(o=r.call(l[0],n[i]))&&(o=l[0].push(n[i])-1,l[1].push([[],[]])),l=l[1][o],++i;-1===(o=r.call(l[0],n[i]))&&(o=l[0].push(n[i])-1),l[1][o]=++e}return a[e]=n,e},delete:function(e){var n,o=0,i=t,l=a[e],u=\
l.length,s=[];if(0===u)delete i[u];else if(i=i[u]){for(;o<u-1;){if(-1===(n=r.call(i[0],l[o])))return;s.push(i,n),i=i[1][n],++o}if(-1===(n=r.call(i[0],l[o])))return;for(e=i[1][n],i[0].splice(n,1),i[1].splice(n,1);!i[0].length&&s.length;)n=s.pop(),(i=s.pop())[0].splice(n,1),i[1].splice(n,1)}delete a[e]},clear:function(){t=[],a=n(null)}}}})),Ln=se((function(e,t){var r=Bn();t.exports=function(){var e=0,t=[],n=[];return{get:function(e){return-1===(e=r.call(t,e[0]))?null:n[e]},set:function(r){return t.push(r[0]),n.push(++e),e},delete:function(e){-1!==(e=r.call(n,e))&&(t.splice(e,1),n.splice(e,1))},clear:function(){t=[],n=[]}}}})),qn=se((function(e,t){var r=Bn(),n=Object.create;t.exports=function(e){var t=0,a=[[],[]],o=n(null);return{get:function(t){for(var n,o=0,i=a;o<e-1;){if(-1===(n=r.call(i[0],t[o])))return null;i=i[1][n],++o}return-1!==(n=r.call(i[0],t[o]))&&i[1][n]||null},set:function(n){for(var i,l=0,u=a;l<e-1;)-1===(i=r.call(u[0],n[l]))&&(i=u[0].push(n[l])-1,u[1].push([[],[]])),u=u[1]\
[i],++l;return-1===(i=r.call(u[0],n[l]))&&(i=u[0].push(n[l])-1),u[1][i]=++t,o[t]=n,t},delete:function(t){for(var n,i=0,l=a,u=[],s=o[t];i<e-1;){if(-1===(n=r.call(l[0],s[i])))return;u.push(l,n),l=l[1][n],++i}if(-1!==(n=r.call(l[0],s[i]))){for(t=l[1][n],l[0].splice(n,1),l[1].splice(n,1);!l[0].length&&u.length;)n=u.pop(),(l=u.pop())[0].splice(n,1),l[1].splice(n,1);delete o[t]}},clear:function(){a=[[],[]],o=n(null)}}}})),zn=se((function(e,t){var r=jr(),n=zr(),a=Function.prototype.call;t.exports=function(e,t){var o={},i=arguments[2];return r(t),n(e,(function(e,r,n,l){o[r]=a.call(t,i,e,r,n,l)})),o}})),Vn=se((function(e,t){function r(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}function o(e){var t,a,o=n.createTextNode(""),i=0;return new e((function(){var e;if(t)a&&(t=a.concat(t));else{if(!a)return;t=a}if(a=t,t=null,"function"==typeof a)e=a,a=null,e();else for(o.data=i=++i%2;a;)e=a.shift(),a.length||(a=null),e()})).observe(o,{characterData:!0}),function(e){r(e\
),t?"function"==typeof t?t=[t,e]:t.push(e):(t=e,o.data=i=++i%2)}}t.exports=(()=>{if("object"===("undefined"==typeof process?"undefined":a(process))&&process&&"function"==typeof process.nextTick)return process.nextTick;if("function"==typeof queueMicrotask)return function(e){queueMicrotask(r(e))};if("object"===(void 0===n?"undefined":a(n))&&n){if("function"==typeof MutationObserver)return o(MutationObserver);if("function"==typeof WebKitMutationObserver)return o(WebKitMutationObserver)}return"function"==typeof setImmediate?function(e){setImmediate(r(e))}:"function"==typeof setTimeout||"object"===("undefined"==typeof setTimeout?"undefined":a(setTimeout))?function(e){setTimeout(r(e),0)}:null})()})),Gn=se((function(){var e=Cn(),t=zn(),r=Zr(),n=Jr(),a=Vn(),o=Array.prototype.slice,i=Function.prototype.apply,l=Object.create;Vr().async=function(u,s){var c,d,p,f=l(null),m=l(null),h=s.memoized,g=s.original;s.memoized=n((function(e){var t=arguments,r=t[t.length-1];return"function"==typeof r&&(c=r,t\
=o.call(t,0,-1)),h.apply(d=this,p=t)}),h);try{r(s.memoized,h)}catch(u){}s.on("get",(function(e){var t,r,n;c&&(f[e]?("function"==typeof f[e]?f[e]=[f[e],c]:f[e].push(c),c=null):(t=c,r=d,n=p,c=d=p=null,a((function(){var a;hasOwnProperty.call(m,e)?(a=m[e],s.emit("getasync",e,n,r),i.call(t,a.context,a.args)):(c=t,d=r,p=n,h.apply(r,n))}))))})),s.original=function(){var t,r,n,o;return c?(t=e(arguments),n=c,c=d=p=null,t.push(r=function t(r){var n,l,u=t.id;if(null==u)a(i.bind(t,this,arguments));else if(delete t.id,n=f[u],delete f[u],n)return l=e(arguments),s.has(u)&&(r?s.delete(u):(m[u]={context:this,args:l},s.emit("setasync",u,"function"==typeof n?1:n.length))),"function"==typeof n?o=i.call(n,this,l):n.forEach((function(e){o=i.call(e,this,l)}),this),o}),o=i.call(g,this,t),r.cb=n,c=r,o):i.call(g,this,arguments)},s.on("set",(function(e){c?(f[e]?"function"==typeof f[e]?f[e]=[f[e],c.cb]:f[e].push(c.cb):f[e]=c.cb,delete c.cb,c.id=e,c=null):s.delete(e)})),s.on("delete",(function(e){var t;hasOwnPrope\
rty.call(f,e)||m[e]&&(t=m[e],delete m[e],s.emit("deleteasync",e,o.call(t.args,1)))})),s.on("clear",(function(){var e=m;m=l(null),s.emit("clearasync",t(e,(function(e){return o.call(e.args,1)})))}))}})),$n=se((function(e,t){var r=Array.prototype.forEach,n=Object.create;t.exports=function(e){var t=n(null);return r.call(arguments,(function(e){t[e]=!0})),t}})),Hn=se((function(e,t){t.exports=function(e){return"function"==typeof e}})),Un=se((function(e,t){var r=Hn();t.exports=function(e){try{return e&&r(e.toString)?e.toString():String(e)}catch(e){throw new TypeError("Passed argument cannot be stringifed")}}})),Wn=se((function(e,t){var r=Lr(),n=Un();t.exports=function(e){return n(r(e))}})),Yn=se((function(e,t){var r=Hn();t.exports=function(e){try{return e&&r(e.toString)?e.toString():String(e)}catch(e){return"<Non-coercible to string value>"}}})),Kn=se((function(e,t){var r=Yn(),n=/[\\n\\r\\u2028\\u2029]/g;t.exports=function(e){return(e=100<(e=r(e)).length?e.slice(0,99)+"…":e).replace(n,(function(e)\
{return JSON.stringify(e).slice(1,-1)}))}})),Xn=se((function(e,t){function r(e){return!!e&&("object"===a(e)||"function"==typeof e)&&"function"==typeof e.then}t.exports=r,t.exports.default=r})),Zn=se((function(){var e=zn(),t=$n(),r=Wn(),n=Kn(),a=Xn(),o=Vn(),i=Object.create,l=t("then","then:finally","done","done:finally");Vr().promise=function(t,u){var s=i(null),c=i(null),d=i(null);if(!0===t)t=null;else if(t=r(t),!l[t])throw new TypeError("'"+n(t)+"' is not valid promise mode");u.on("set",(function(e,r,n){var i=!1;if(a(n)){s[e]=1,d[e]=n;var l=function(t){var r=s[e];if(i)throw new Error("Memoizee error: Detected unordered then|done & finally resolution, which in turn makes proper detection of success/failure impossible (when in 'done:finally' mode)\\nConsider to rely on 'then' or 'done' mode instead.");r&&(delete s[e],c[e]=t,u.emit("setasync",e,r))},p=function(){i=!0,s[e]&&(delete s[e],delete d[e],u.delete(e))},f=t;if("then"===(f=f||"then")){var m=function(){o(p)};"function"==typeof(n=n.th\
en((function(e){o(l.bind(this,e))}),m)).finally&&n.finally(m)}else if("done"===f){if("function"!=typeof n.done)throw new Error("Memoizee error: Retrieved promise does not implement 'done' in 'done' mode");n.done(l,p)}else if("done:finally"===f){if("function"!=typeof n.done)throw new Error("Memoizee error: Retrieved promise does not implement 'done' in 'done:finally' mode");if("function"!=typeof n.finally)throw new Error("Memoizee error: Retrieved promise does not implement 'finally' in 'done:finally' mode");n.done(l),n.finally(p)}}else c[e]=n,u.emit("setasync",e,1)})),u.on("get",(function(e,t,r){var n,i;s[e]?++s[e]:(n=d[e],i=function(){u.emit("getasync",e,t,r)},a(n)?"function"==typeof n.done?n.done(i):n.then((function(){o(i)})):i())})),u.on("delete",(function(e){var t;delete d[e],s[e]?delete s[e]:hasOwnProperty.call(c,e)&&(t=c[e],delete c[e],u.emit("deleteasync",e,[t]))})),u.on("clear",(function(){var t=c;c=i(null),s=i(null),d=i(null),u.emit("clearasync",e(t,(function(e){return[e]})))}\
))}})),Jn=se((function(){var e=jr(),t=zr(),r=Vr(),n=Function.prototype.apply;r.dispose=function(a,o,i){var l;e(a),i.async&&r.async||i.promise&&r.promise?(o.on("deleteasync",l=function(e,t){n.call(a,null,t)}),o.on("clearasync",(function(e){t(e,(function(e,t){l(t,e)}))}))):(o.on("delete",l=function(e,t){a(t)}),o.on("clear",(function(e){t(e,(function(e,t){l(t,e)}))})))}})),Qn=se((function(e,t){t.exports=2147483647})),ea=se((function(e,t){var r=Ir(),n=Qn();t.exports=function(e){if(e=r(e),n<e)throw new TypeError(e+" exceeds maximum possible timeout");return e}})),ta=se((function(){var e=Cn(),t=zr(),r=Vn(),n=Xn(),a=ea(),o=Vr(),i=Function.prototype,l=Math.max,u=Math.min,s=Object.create;o.maxAge=function(c,d,p){var f,m,h,g;(c=a(c))&&(f=s(null),m=p.async&&o.async||p.promise&&o.promise?"async":"",d.on("set"+m,(function(e){f[e]=setTimeout((function(){d.delete(e)}),c),"function"==typeof f[e].unref&&f[e].unref(),g&&(g[e]&&"nextTick"!==g[e]&&clearTimeout(g[e]),g[e]=setTimeout((function(){delete g[e]\
}),h),"function"==typeof g[e].unref)&&g[e].unref()})),d.on("delete"+m,(function(e){clearTimeout(f[e]),delete f[e],g&&("nextTick"!==g[e]&&clearTimeout(g[e]),delete g[e])})),p.preFetch&&(h=!0===p.preFetch||isNaN(p.preFetch)?.333:l(u(Number(p.preFetch),1),0))&&(g={},h=(1-h)*c,d.on("get"+m,(function(t,a,o){g[t]||(g[t]="nextTick",r((function(){var r;"nextTick"===g[t]&&(delete g[t],d.delete(t),p.async&&(a=e(a)).push(i),r=d.memoized.apply(o,a),p.promise)&&n(r)&&("function"==typeof r.done?r.done(i,i):r.then(i,i))})))}))),d.on("clear"+m,(function(){t(f,(function(e){clearTimeout(e)})),f={},g&&(t(g,(function(e){"nextTick"!==e&&clearTimeout(e)})),g={})})))}})),ra=se((function(e,t){var r=Ir(),n=Object.create,a=Object.prototype.hasOwnProperty;t.exports=function(e){var t,o=0,i=1,l=n(null),u=n(null),s=0;return e=r(e),{hit:function(r){var n=u[r],c=++s;if(l[c]=r,u[r]=c,!n)return++o<=e?void 0:(r=l[i],t(r),r);if(delete l[n],i===n)for(;!a.call(l,++i););},delete:t=function(e){var t=u[e];if(t&&(delete l[t],d\
elete u[e],--o,i===t))if(o)for(;!a.call(l,++i););else s=0,i=1},clear:function(){o=0,i=1,l=n(null),u=n(null),s=0}}}})),na=se((function(){var e=Ir(),t=ra(),r=Vr();r.max=function(n,a,o){var i;(n=e(n))&&(i=t(n),n=o.async&&r.async||o.promise&&r.promise?"async":"",a.on("set"+n,o=function(e){void 0!==(e=i.hit(e))&&a.delete(e)}),a.on("get"+n,o),a.on("delete"+n,i.delete),a.on("clear"+n,i.clear))}})),aa=se((function(){var e=un(),t=Vr(),r=Object.create,n=Object.defineProperties;t.refCounter=function(a,o,i){var l=r(null);i=i.async&&t.async||i.promise&&t.promise?"async":"";o.on("set"+i,(function(e,t){l[e]=t||1})),o.on("get"+i,(function(e){++l[e]})),o.on("delete"+i,(function(e){delete l[e]})),o.on("clear"+i,(function(){l={}})),n(o.memoized,{deleteRef:e((function(){var e=o.get(arguments);return null!==e&&l[e]?!--l[e]&&(o.delete(e),!0):null})),getRefCount:e((function(){var e=o.get(arguments);return null!==e&&l[e]||0}))})}})),oa=se((function(e,t){var r=Or(),n=Br(),a=On();t.exports=function(e){var t,o=r\
(arguments[1]);return o.normalizer||0!==(t=o.length=n(o.length,e.length,o.async))&&(o.primitive?!1===t?o.normalizer=Sn():1<t&&(o.normalizer=_n()(t)):o.normalizer=!1===t?jn()():1===t?Ln()():qn()(t)),o.async&&Gn(),o.promise&&Zn(),o.dispose&&Jn(),o.maxAge&&ta(),o.max&&na(),o.refCounter&&aa(),a(e,o)}})),ia={helpUrlBase:"https://dequeuniversity.com/rules/",gridSize:200,selectorSimilarFilterLimit:700,results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze(["minor","moderate","serious","critical"]),preload:Object.freeze({assets:["cssom","media"],timeout:1e4}),allOrigins:"<unsafe_all_origins>",sameOrigin:"<same_origin>",serializableErrorProps:Object.freeze(["message","stack","name","code","ruleId","method"])},la=([{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;e=e.group;ia[t]=r,ia[t+"_PRIO"]=n,ia[t+"_GROUP"]=e,ia.results[n]=r,ia.resultGroups[n]=e,ia.resultGroupMap[r]=e})),Object.freeze(ia.results),Object.freeze(ia.resultGroups),Object.freeze(ia.resultGroupMap),Object.freeze(ia),ia),ua=function(){"object"===("undefined"==typeof console?"undefined":a(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},sa=/[\\t\\r\\n\\f]/g,ca=W((function e(){H(this,e),this.parent=void 0}),[{key:"props",get:function(){throw new Error('VirtualNode class must have a "props" object consisting of "nodeType" and "nodeName" properties')}},{key:"attrNames",get:function(){throw new Error('VirtualNode class must have an "attrNames" property')}},{key:"attr",value:function(){throw new Error('VirtualNode class must have an "attr" function')}},{key:"hasAttr",value:function(){throw new Error('VirtualNode class must have a "hasAttr" function')}},{key:"hasClass",value:function(e){var t=this.attr("class");return!!t&&(e=" \
"+e+" ",0<=(" "+t+" ").replace(sa," ").indexOf(e))}}]),da={},pa=(ce(da,{DqElement:function(){return Ll},RuleError:function(){return km},aggregate:function(){return pa},aggregateChecks:function(){return ba},aggregateNodeResults:function(){return wa},aggregateResult:function(){return xa},areStylesSet:function(){return Ea},assert:function(){return Aa},checkHelper:function(){return ql},clone:function(){return zl},closest:function(){return Zl},collectResultsFromFrames:function(){return Hu},contains:function(){return Uu},convertSelector:function(){return Kl},cssParser:function(){return Vl},deepMerge:function(){return Wu},escapeSelector:function(){return Ca},extendMetaData:function(){return Yu},filterHtmlAttrs:function(){return xm},finalizeRuleResult:function(){return ya},findBy:function(){return Vu},getAllChecks:function(){return zu},getAncestry:function(){return Tl},getBaseLang:function(){return pf},getCheckMessage:function(){return Df},getCheckOption:function(){return xf},getElementSource:\
function(){return Pl},getEnvironmentData:function(){return Ef},getFlattenedTree:function(){return uf},getFrameContexts:function(){return Nf},getFriendlyUriEnd:function(){return Ta},getNodeAttributes:function(){return Oa},getNodeFromTree:function(){return Ml},getPreloadConfig:function(){return gm},getRootNode:function(){return Ju},getRule:function(){return Tf},getScroll:function(){return Sf},getScrollState:function(){return _f},getSelector:function(){return kl},getSelectorData:function(){return El},getShadowSelector:function(){return ml},getStandards:function(){return Mf},getStyleSheetFactory:function(){return If},getXpath:function(){return Ol},injectStyle:function(){return Bf},isArrayLike:function(){return jf},isContextObject:function(){return zf},isContextProp:function(){return Vf},isContextSpec:function(){return qf},isHidden:function(){return Hf},isHtmlElement:function(){return Uf},isLabelledFramesSelector:function(){return Gf},isLabelledShadowDomSelector:function(){return $f},isNode\
InContext:function(){return Wf},isShadowRoot:function(){return Xu},isValidLang:function(){return Mm},isXHTML:function(){return fl},matchAncestry:function(){return Kf},matches:function(){return Gl},matchesExpression:function(){return Xl},matchesSelector:function(){return Sa},memoize:function(){return pl},mergeResults:function(){return $u},nodeLookup:function(){return Zf},nodeSerializer:function(){return qu},nodeSorter:function(){return Xf},objectHasOwn:function(){return Lf},parseCrossOriginStylesheet:function(){return rm},parseSameOriginStylesheet:function(){return em},parseStylesheet:function(){return tm},parseTabindex:function(){return nm},performanceTimer:function(){return om},pollyfillElementsFromPoint:function(){return im},preload:function(){return mm},preloadCssom:function(){return cm},preloadMedia:function(){return fm},processMessage:function(){return wf},publishMetaData:function(){return vm},querySelectorAll:function(){return ym},querySelectorAllFilter:function(){return sm},queu\
e:function(){return nu},respondable:function(){return _u},ruleShouldRun:function(){return Dm},select:function(){return Am},sendCommandToFrame:function(){return Pu},serializeError:function(){return Fm},setScrollState:function(){return Rm},shadowSelect:function(){return Nm},shadowSelectAll:function(){return Tm},shouldPreload:function(){return hm},toArray:function(){return Fa},tokenList:function(){return ef},uniqueArray:function(){return lm},uuid:function(){return gu},validInputTypes:function(){return Om},validLangs:function(){return _m}}),function(e,t,r){return t=t.slice(),r&&t.push(r),r=t.map((function(t){return e.indexOf(t)})).sort(),e[r.pop()]}),fa=la.CANTTELL_PRIO,ma=la.FAIL_PRIO,ha=[],ga=(ha[la.PASS_PRIO]=!0,ha[la.CANTTELL_PRIO]=null,ha[la.FAIL_PRIO]=!1,["any","all","none"]);function va(e,t){ga.reduce((function(r,n){return r[n]=(e[n]||[]).map((function(e){return t(e,n)})),r}),{})}var ba=function(e){var t=Object.assign({},e),r=(va(t,(function(e,t){var r=void 0===e.result?-1:ha.indexO\
f(e.result);e.priority=-1!==r?r:la.CANTTELL_PRIO,"none"===t&&(e.priority===la.PASS_PRIO?e.priority=la.FAIL_PRIO:e.priority===la.FAIL_PRIO&&(e.priority=la.PASS_PRIO))})),{all:t.all.reduce((function(e,t){return Math.max(e,t.priority)}),0),none:t.none.reduce((function(e,t){return Math.max(e,t.priority)}),0),any:t.any.reduce((function(e,t){return Math.min(e,t.priority)}),4)%4}),n=(t.priority=Math.max(r.all,r.none,r.any),[]);return ga.forEach((function(e){t[e]=t[e].filter((function(n){return n.priority===t.priority&&n.priority===r[e]})),t[e].forEach((function(e){return n.push(e.impact)}))})),[fa,ma].includes(t.priority)?t.impact=pa(la.impact,n):t.impact=null,va(t,(function(e){delete e.result,delete e.priority})),t.result=la.results[t.priority],delete t.priority,t};function ya(e){var t=o._audit.rules.find((function(t){return t.id===e.id}));return t&&t.impact&&e.nodes.forEach((function(e){["any","all","none"].forEach((function(r){(e[r]||[]).forEach((function(e){e.impact=t.impact}))}))})),Obje\
ct.assign(e,wa(e.nodes)),delete e.nodes,e}var wa=function(e){var t={},r=((e=e.map((function(e){if(e.any&&e.all&&e.none)return ba(e);if(Array.isArray(e.node))return ya(e);throw new TypeError("Invalid Result type")})))&&e.length?(r=e.map((function(e){return e.result})),t.result=pa(la.results,r,t.result)):t.result="inapplicable",la.resultGroups.forEach((function(e){return t[e]=[]})),e.forEach((function(e){var r=la.resultGroupMap[e.result];t[r].push(e)})),la.FAIL_GROUP);return 0===t[r].length&&(r=la.CANTTELL_GROUP),0<t[r].length?(e=t[r].map((function(e){return e.impact})),t.impact=pa(la.impact,e)||null):t.impact=null,t};function Da(e,t,r){var n=Object.assign({},t);n.nodes=(n[r]||[]).concat(),la.resultGroups.forEach((function(e){delete n[e]})),e[r].push(n)}var xa=function(e){var t={};return la.resultGroups.forEach((function(e){return t[e]=[]})),e.forEach((function(e){e.error?Da(t,e,la.CANTTELL_GROUP):e.result===la.NA?Da(t,e,la.NA_GROUP):la.resultGroups.forEach((function(r){Array.isArray(e[r\
])&&0<e[r].length&&Da(t,e,r)}))})),t},Ea=function e(r,n,a){var o=t.getComputedStyle(r,null);if(!o)return!1;for(var i=0;i<n.length;++i){var l=n[i];if(o.getPropertyValue(l.property)===l.value)return!0}return!(!r.parentNode||r.nodeName.toUpperCase()===a.toUpperCase())&&e(r.parentNode,n,a)},Aa=function(e,t){if(!e)throw new Error(t)},Fa=function(e){return Array.prototype.slice.call(e)},Ca=function(e){for(var t,r=String(e),n=r.length,a=-1,o="",i=r.charCodeAt(0);++a<n;)0==(t=r.charCodeAt(a))?o+="�":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);return o};function ka(e,t){return[e.substring(0,t),e.substring(t)]}function Ra(e){return e.replace(/\\s+$/,"")}var Na,Ta=function(){var e,t,r,n,a,o,i,l,u=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"",s=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};if(!(u.length<=1||"data\
:"===u.substr(0,5)||"javascript:"===u.substr(0,11)||u.includes("?")))return e=s.currentDomain,s=void 0===(s=s.maxLength)?25:s,i=o=l=a=n="",(r=u).includes("#")&&(u=(t=V(ka(u,u.indexOf("#")),2))[0],i=t[1]),u.includes("?")&&(u=(t=V(ka(u,u.indexOf("?")),2))[0],o=t[1]),u.includes("://")?(n=(t=V(u.split("://"),2))[0],a=(t=V(ka(u=t[1],u.indexOf("/")),2))[0],u=t[1]):"//"===u.substr(0,2)&&(a=(t=V(ka(u=u.substr(2),u.indexOf("/")),2))[0],u=t[1]),(a="www."===a.substr(0,4)?a.substr(4):a)&&a.includes(":")&&(a=(t=V(ka(a,a.indexOf(":")),2))[0],l=t[1]),r=(t={original:r,protocol:n,domain:a,port:l,path:u,query:o,hash:i}).domain,n=t.hash,l=(a=t.path).substr(a.substr(0,a.length-2).lastIndexOf("/")+1),n?l&&(l+n).length<=s?Ra(l+n):l.length<2&&2<n.length&&n.length<=s?Ra(n):void 0:r&&r.length<s&&a.length<=1||a==="/"+l&&r&&e&&r!==e&&(r+a).length<=s?Ra(r+a):(-1===(u=l.lastIndexOf("."))||1<u)&&(-1!==u||2<l.length)&&l.length<=s&&!l.match(/index(\\.[a-zA-Z]{2-4})?/)&&!function(e){return 0!==(e=0<arguments.length&&vo\
id 0!==e?e:"").length&&(e.match(/[0-9]/g)||"").length>=e.length/2}(l)?Ra(l):void 0},Oa=function(e){return(e.attributes instanceof t.NamedNodeMap?e:e.cloneNode(!1)).attributes},Sa=function(e,t){return!!e[Na=Na&&e[Na]?Na:(e=>{for(var t,r=["matches","matchesSelector","mozMatchesSelector","webkitMatchesSelector","msMatchesSelector"],n=r.length,a=0;a<n;a++)if(e[t=r[a]])return t})(e)]&&e[Na](t)},_a={},Ma=(ye=(ce(_a,{ArrayFrom:function(){return dl.default},Colorjs:function(){return ol},CssSelectorParser:function(){return Ma.CssSelectorParser},doT:function(){return Pa.default},emojiRegexText:function(){return Ia},memoize:function(){return Ba.default}}),de(ye())),we=de(we()),De=(de(De()),de(wt())),wt=de(jt()),jt=de(Er()),"hasOwn"in Object||(Object.hasOwn=De.default),"values"in Object||(Object.values=wt.default),"Promise"in t||ye.default.polyfill(),"Uint32Array"in t||(t.Uint32Array=we.Uint32Array),t.Uint32Array&&("some"in t.Uint32Array.prototype||Object.defineProperty(t.Uint32Array.prototype,"so\
me",{value:Array.prototype.some}),"reduce"in t.Uint32Array.prototype||Object.defineProperty(t.Uint32Array.prototype,"reduce",{value:Array.prototype.reduce})),"function"!=typeof Object.assign&&(Object.assign=function(e){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}}),Array.prototype.findIndex||Object.defineProperty(Array.prototype,"findIndex",{value:function(e,t){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)thro\
w new TypeError("predicate must be a function");for(var r,n=Object(this),a=n.length>>>0,o=0;o<a;o++)if(r=n[o],e.call(t,r,o,n))return o;return-1}}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(e){var t=Object(this),r=parseInt(t.length,10)||0;if(0!==r){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){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||(Array.from=jt.default),String.prototype.includes||(String.prototype.includes=function(e,t){return!((t="number"!=typeof t?0:t)+e.length>this.length)&&-1!==this.indexOf(e,t)}),Array.prototype.flat||Object\
.defineProperty(Array.prototype,"flat",{configurable:!0,value:function e(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return t?Array.prototype.reduce.call(this,(function(r,n){return Array.isArray(n)?r.push.apply(r,e.call(n,t-1)):r.push(n),r}),[]):Array.prototype.slice.call(this)},writable:!0}),!t.Node||"isConnected"in t.Node.prototype||Object.defineProperty(t.Node.prototype,"isConnected",{get:function(){return!(this.ownerDocument&&this.ownerDocument.compareDocumentPosition(this)&this.DOCUMENT_POSITION_DISCONNECTED)}}),de(kr())),Pa=de(Rr()),Ia=function(){return/[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\
\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200\
D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\
\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB4\
0\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E-\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\\
uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED8\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\u\
DE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0\
F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDF\
EB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uD\
D2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\
\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDD75(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u20\
0D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC2\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF]|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u20\
0D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\\
u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\
(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g},Ba=de(oa());function ja(e,t){var r=e.length,n=(Array.isArray(e[0])||(e=[e]),(t=Array.isArray(t[0])?t:t.map((function(e){return[e]})))[0].length),a=t[0].map((function(e,r){return t.map((function(e){return e[r]}))}));e=e.map((function(e){return a.map((function(t){var r=0;if(Array.isArray(e))for(var n=0;n<e.l\
ength;n++)r+=e[n]*(t[n]||0);else{var a,o=K(t);try{for(o.s();!(a=o.n()).done;)r+=e*a.value}catch(t){o.e(t)}finally{o.f()}}return r}))}));return 1===r&&(e=e[0]),1===n?e.map((function(e){return e[0]})):e}function La(e){return"string"===qa(e)}function qa(e){return(Object.prototype.toString.call(e).match(/^\\[object\\s+(.*?)\\]$/)[1]||"").toLowerCase()}function za(e,t){e=+e,t=+t;var r=(Math.floor(e)+"").length;return r<t?+e.toFixed(t-r):(r=Math.pow(10,r-t),Math.round(e/r)*r)}function Va(e){var t,r;if(e)return e=e.trim(),t=/^-?[\\d.]+$/,(e=e.match(/^([a-z]+)\\((.+?)\\)$/i))?(r=[],e[2].replace(/\\/?\\s*([-\\w.]+(?:%|deg)?)/g,(function(e,n){/%$/.test(n)?(n=new Number(n.slice(0,-1)/100)).type="<percentage>":/deg$/.test(n)?((n=new Number(+n.slice(0,-3))).type="<angle>",n.unit="deg"):t.test(n)&&((n=new Number(n)).type="<number>"),e.startsWith("/")&&((n=n instanceof Number?n:new Number(n)).alpha=!0),r.push(n)})),{name:e[1].toLowerCase(),rawName:e[1],rawArgs:e[2],args:r}):void 0}function Ga(e){return e[e.le\
ngth-1]}function $a(e,t,r){return isNaN(e)?t:isNaN(t)?e:e+(t-e)*r}function Ha(e,t,r){return(r-e)/(t-e)}function Ua(e,t,r){return $a(t[0],t[1],Ha(e[0],e[1],r))}function Wa(e){return e.map((function(e){return e.split("|").map((function(e){var t,r=(e=e.trim()).match(/^(<[a-z]+>)\\[(-?[.\\d]+),\\s*(-?[.\\d]+)\\]?$/);return r?((t=new String(r[1])).range=[+r[2],+r[3]],t):e}))}))}De=Object.freeze({__proto__:null,isString:La,type:qa,toPrecision:za,parseFunction:Va,last:Ga,interpolate:$a,interpolateInv:Ha,mapRange:Ua,parseCoordGrammar:Wa,multiplyMatrices:ja});var Ya=new(W((function e(){H(this,e)}),[{key:"add",value:function(e,t,r){if("string"!=typeof arguments[0])for(var e in arguments[0])this.add(e,arguments[0][e],t);else(Array.isArray(e)?e:[e]).forEach((function(e){this[e]=this[e]||[],t&&this[e][r?"unshift":"push"](t)}),this)}},{key:"run",value:function(e,t){this[e]=this[e]||[],this[e].forEach((function(e){e.call(t&&t.context?t.context:t,t)}))}}])),Ka={gamut_mapping:"lch.c",precision:5,deltaE:"76"\
},Xa={D50:[.3457/.3585,1,.2958/.3585],D65:[.3127/.329,1,.3583/.329]};function Za(e){return Array.isArray(e)?e:Xa[e]}function Ja(e,t,r,n){if(n=3<arguments.length&&void 0!==n?n:{},e=Za(e),t=Za(t),!e||!t)throw new TypeError("Missing white point to convert ".concat(e?"":"from").concat(e||t?"":"/").concat(t?"":"to"));if(e===t)return r;if(e={W1:e,W2:t,XYZ:r,options:n},Ya.run("chromatic-adaptation-start",e),e.M||(e.W1===Xa.D65&&e.W2===Xa.D50?e.M=[[1.0479298208405488,.022946793341019088,-.05019222954313557],[.029627815688159344,.990434484573249,-.01707382502938514],[-.009243058152591178,.015055144896577895,.7518742899580008]]:e.W1===Xa.D50&&e.W2===Xa.D65&&(e.M=[[.9554734527042182,-.023098536874261423,.0632593086610217],[-.028369706963208136,1.0099954580058226,.021041398966943008],[.012314001688319899,-.020507696433477912,1.3303659366080753]])),Ya.run("chromatic-adaptation-end",e),e.M)return ja(e.M,e.XYZ);throw new TypeError("Only Bradford CAT with white points D50 and D65 supported for now.")}\
J=new WeakSet,Q=new WeakMap;var Qa=W((function e(t){H(this,e),B(this,J),I(this,Q,void 0),this.id=t.id,this.name=t.name,this.base=t.base?Qa.get(t.base):null,this.aliases=t.aliases,this.base&&(this.fromBase=t.fromBase,this.toBase=t.toBase);var r,n=null!=(n=t.coords)?n:this.base.coords;this.coords=n,n=null!=(n=null!=(n=t.white)?n:this.base.white)?n:"D65";for(r in this.white=Za(n),this.formats=null!=(n=t.formats)?n:{},this.formats){var a=this.formats[r];a.type||(a.type="function"),a.name||(a.name=r)}!t.cssId||null!=(n=this.formats.functions)&&n.color?null==(n=this.formats)||!n.color||null!=(n=this.formats)&&n.color.id||(this.formats.color.id=this.id):(this.formats.color={id:t.cssId},Object.defineProperty(this,"cssId",{value:t.cssId})),this.referred=t.referred,q(Q,this,z(J,this,to).call(this).reverse()),Ya.run("colorspace-init-end",this)}),[{key:"inGamut",value:function(e){var t,r=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).epsilon,n=void 0===r?75e-6:r;return this.isPolar?(e\
=this.toBase(e),this.base.inGamut(e,{epsilon:n})):(t=Object.values(this.coords),e.every((function(e,r){var a;return"angle"===(r=t[r]).type||!r.range||!!Number.isNaN(e)||(a=(r=V(r.range,2))[0],r=r[1],(void 0===a||a-n<=e)&&(void 0===r||e<=r+n))})))}},{key:"cssId",get:function(){var e;return(null==(e=this.formats.functions)||null==(e=e.color)?void 0:e.id)||this.id}},{key:"isPolar",get:function(){for(var e in this.coords)if("angle"===this.coords[e].type)return!0;return!1}},{key:"getFormat",value:function(e){return"object"===a(e)||(e="default"===e?Object.values(this.formats)[0]:this.formats[e])?z(J,this,eo).call(this,e):null}},{key:"to",value:function(e,t){var r;if(1===arguments.length&&(e=(r=[e.space,e.coords])[0],t=r[1]),this!==(e=Qa.get(e))){t=t.map((function(e){return Number.isNaN(e)?0:e}));for(var n,a,o=L(Q,this),i=L(Q,e),l=0;l<o.length&&o[l]===i[l];l++)n=o[l],a=l;if(!n)throw new Error("Cannot convert between color spaces ".concat(this," and ").concat(e,": no connection space was found\
"));for(var u=o.length-1;a<u;u--)t=o[u].toBase(t);for(var s=a+1;s<i.length;s++)t=i[s].fromBase(t)}return t}},{key:"from",value:function(e,t){var r;return 1===arguments.length&&(e=(r=[e.space,e.coords])[0],t=r[1]),(e=Qa.get(e)).to(this,t)}},{key:"toString",value:function(){return"".concat(this.name," (").concat(this.id,")")}},{key:"getMinCoords",value:function(){var e,t=[];for(e in this.coords){var r=(r=this.coords[e]).range||r.refRange;t.push(null!=(r=null==r?void 0:r.min)?r:0)}return t}}],[{key:"all",get:function(){return M(new Set(Object.values(Qa.registry)))}},{key:"register",value:function(e,t){if(1===arguments.length&&(e=(t=arguments[0]).id),t=this.get(t),this.registry[e]&&this.registry[e]!==t)throw new Error("Duplicate color space registration: '".concat(e,"'"));if(this.registry[e]=t,1===arguments.length&&t.aliases){var r,n=K(t.aliases);try{for(n.s();!(r=n.n()).done;){var a=r.value;this.register(a,t)}}catch(e){n.e(e)}finally{n.f()}}return t}},{key:"get",value:function(e){if(!e||e\
 instanceof Qa)return e;if("string"===qa(e)){var t=Qa.registry[e.toLowerCase()];if(t)return t;throw new TypeError('No color space found with id = "'.concat(e,'"'))}for(var r=arguments.length,n=new Array(1<r?r-1:0),a=1;a<r;a++)n[a-1]=arguments[a];if(n.length)return Qa.get.apply(Qa,n);throw new TypeError("".concat(e," is not a valid color space"))}},{key:"resolveCoord",value:function(e,t){var r,n;if(n="string"===qa(e)?e.includes(".")?(r=(n=V(e.split("."),2))[0],n[1]):(r=void 0,e):Array.isArray(e)?(r=(n=V(e,2))[0],n[1]):(r=e.space,e.coordId),!(r=(r=Qa.get(r))||t))throw new TypeError("Cannot resolve coordinate reference ".concat(e,": No color space specified and relative references are not allowed here"));if(("number"===(t=qa(n))||"string"===t&&0<=n)&&(e=Object.entries(r.coords)[n]))return _({space:r,id:e[0],index:n},e[1]);r=Qa.get(r);var a,o=n.toLowerCase(),i=0;for(a in r.coords){var l,u=r.coords[a];if(a.toLowerCase()===o||(null==(l=u.name)?void 0:l.toLowerCase())===o)return _({space:r,id\
:a,index:i},u);i++}throw new TypeError('No "'.concat(n,'" coordinate found in ').concat(r.name,". Its coordinates are: ").concat(Object.keys(r.coords).join(", ")))}}]);function eo(e){var t;return e.coords&&!e.coordGrammar&&(e.type||(e.type="function"),e.name||(e.name="color"),e.coordGrammar=Wa(e.coords),t=Object.entries(this.coords).map((function(t,r){(t=V(t,2))[0],t=t[1],r=e.coordGrammar[r][0],t=t.range||t.refRange;var n=r.range,a="";return"<percentage>"==r?(n=[0,100],a="%"):"<angle>"==r&&(a="deg"),{fromRange:t,toRange:n,suffix:a}})),e.serializeCoords=function(e,r){return e.map((function(e,n){var a=(n=t[n]).fromRange,o=n.toRange;n=n.suffix;return e=za(e=a&&o?Ua(a,o,e):e,r),n&&(e+=n),e}))}),e}function to(){for(var e=[this],t=this;t=t.base;)e.push(t);return e}var ro=Qa,no=(pe(ro,"registry",{}),pe(ro,"DEFAULT_FORMAT",{type:"functions",name:"color"}),new ro({id:"xyz-d65",name:"XYZ D65",coords:{x:{name:"X"},y:{name:"Y"},z:{name:"Z"}},white:"D65",formats:{color:{ids:["xyz-d65","xyz"]}},alia\
ses:["xyz"]}));O(ao,ro),wt=W(ao);function ao(e){var t;return H(this,ao),e.coords||(e.coords={r:{range:[0,1],name:"Red"},g:{range:[0,1],name:"Green"},b:{range:[0,1],name:"Blue"}}),e.base||(e.base=no),e.toXYZ_M&&e.fromXYZ_M&&(null==e.toBase&&(e.toBase=function(r){return r=ja(e.toXYZ_M,r),t.white!==t.base.white?Ja(t.white,t.base.white,r):r}),null==e.fromBase)&&(e.fromBase=function(r){return r=Ja(t.base.white,t.white,r),ja(e.fromXYZ_M,r)}),null==e.referred&&(e.referred="display"),t=R(this,ao,[e])}function oo(e){var t={str:null==(s=String(e))?void 0:s.trim()};if(Ya.run("parse-start",t),t.color)return t.color;if(t.parsed=Va(t.str),t.parsed){var r=t.parsed.name;if("color"===r){var n,a=t.parsed.args.shift(),o=0<t.parsed.rawArgs.indexOf("/")?t.parsed.args.pop():1,i=K(ro.all);try{var l;for(i.s();!(n=i.n()).done;)if(l=(()=>{var e,r=n.value,i=r.getFormat("color");if(i&&(a===i.id||null!=(i=i.ids)&&i.includes(a)))return i=Object.keys(r.coords).length,(e=Array(i).fill(0)).forEach((function(r,n){retur\
n e[n]=t.parsed.args[n]||0})),{v:{spaceId:r.id,coords:e,alpha:o}}})())return l.v}catch(e){i.e(e)}finally{i.f()}var u,s="";throw a in ro.registry&&(u=null==(u=ro.registry[a].formats)||null==(u=u.functions)||null==(u=u.color)?void 0:u.id)&&(s="Did you mean color(".concat(u,")?")),new TypeError("Cannot parse color(".concat(a,"). ")+(s||"Missing a plugin?"))}var c,d=K(ro.all);try{var p;for(d.s();!(c=d.n()).done;)if(p=(()=>{var e,n,a=c.value,o=a.getFormat(r);if(o&&"function"===o.type)return e=1,(o.lastAlpha||Ga(t.parsed.args).alpha)&&(e=t.parsed.args.pop()),n=t.parsed.args,o.coordGrammar&&Object.entries(a.coords).forEach((function(e,t){var a=(e=V(e,2))[0],i=(e=e[1],o.coordGrammar[t]),l=null==(u=n[t])?void 0:u.type;if(!(i=i.find((function(e){return e==l}))))throw u=e.name||a,new TypeError("".concat(l," not allowed for ").concat(u," in ").concat(r,"()"));a=i.range;var u=e.range||e.refRange;(a="<percentage>"===l?a||[0,1]:a)&&u&&(n[t]=Ua(a,u,n[t]))})),{v:{spaceId:a.id,coords:n,alpha:e}}})())ret\
urn p.v}catch(e){d.e(e)}finally{d.f()}}else{var f,m=K(ro.all);try{for(m.s();!(f=m.n()).done;){var h,g=f.value;for(h in g.formats){var v=g.formats[h];if("custom"===v.type&&(!v.test||v.test(t.str))){var b=v.parse(t.str);if(b)return null==b.alpha&&(b.alpha=1),b}}}}catch(e){m.e(e)}finally{m.f()}}throw new TypeError("Could not parse ".concat(e," as a color. Missing a plugin?"))}function io(e){var t;if(e)return(t=(e=La(e)?oo(e):e).space||e.spaceId)instanceof ro||(e.space=ro.get(t)),void 0===e.alpha&&(e.alpha=1),e;throw new TypeError("Empty color reference")}function lo(e,t){return(t=ro.get(t)).from(e)}function uo(e,t){var r=(t=ro.resolveCoord(t,e.space)).space;t=t.index;return lo(e,r)[t]}function so(e,t,r){return t=ro.get(t),e.coords=t.to(e.space,r),e}function co(e,t,r){if(e=io(e),2===arguments.length&&"object"===qa(t)){var n,a=t;for(n in a)co(e,n,a[n])}else{"function"==typeof r&&(r=r(uo(e,t)));var o=(t=ro.resolveCoord(t,e.space)).space,i=(t=t.index,lo(e,o));i[t]=r,so(e,o,i)}return e}ye=new \
ro({id:"xyz-d50",name:"XYZ D50",white:"D50",base:no,fromBase:function(e){return Ja(no.white,"D50",e)},toBase:function(e){return Ja("D50",no.white,e)},formats:{color:{}}});var po=24389/27,fo=Xa.D50,mo=new ro({id:"lab",name:"Lab",coords:{l:{refRange:[0,100],name:"L"},a:{refRange:[-125,125]},b:{refRange:[-125,125]}},white:fo,base:ye,fromBase:function(e){return e=e.map((function(e,t){return e/fo[t]})).map((function(e){return 216/24389<e?Math.cbrt(e):(po*e+16)/116})),[116*e[1]-16,500*(e[0]-e[1]),200*(e[1]-e[2])]},toBase:function(e){var t=[];return t[1]=(e[0]+16)/116,t[0]=e[1]/500+t[1],t[2]=t[1]-e[2]/200,[24/116<t[0]?Math.pow(t[0],3):(116*t[0]-16)/po,8<e[0]?Math.pow((e[0]+16)/116,3):e[0]/po,24/116<t[2]?Math.pow(t[2],3):(116*t[2]-16)/po].map((function(e,t){return e*fo[t]}))},formats:{lab:{coords:["<number> | <percentage>","<number>","<number>"]}}});function ho(e){return(e%360+360)%360}var go=new ro({id:"lch",name:"LCH",coords:{l:{refRange:[0,100],name:"Lightness"},c:{refRange:[0,150],name:"Ch\
roma"},h:{refRange:[0,360],type:"angle",name:"Hue"}},base:mo,fromBase:function(e){var t=(e=V(e,3))[0],r=e[1],n=(e=e[2],Math.abs(r)<.02&&Math.abs(e)<.02?NaN:180*Math.atan2(e,r)/Math.PI);return[t,Math.sqrt(Math.pow(r,2)+Math.pow(e,2)),ho(n)]},toBase:function(e){var t=(e=V(e,3))[0],r=e[1];e=e[2];return r<0&&(r=0),isNaN(e)&&(e=0),[t,r*Math.cos(e*Math.PI/180),r*Math.sin(e*Math.PI/180)]},formats:{lch:{coords:["<number> | <percentage>","<number>","<number> | <angle>"]}}}),vo=Math.pow(25,7),bo=Math.PI,yo=180/bo,wo=bo/180;function Do(e,t){var r=void 0===(r=(a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).kL)?1:r,n=void 0===(n=a.kC)?1:n,a=void 0===(a=a.kH)?1:a,o=(e=V(mo.from(e),3))[0],i=e[1],l=(e=e[2],go.from(mo,[o,i,e])[1]),u=(t=V(mo.from(t),3))[0],s=t[1],c=(t=t[2],l=((l=l<0?0:l)+(c=(c=go.from(mo,[u,s,t])[1])<0?0:c))/2,Math.pow(l,7)),d=(c=(1+(l=.5*(1-Math.sqrt(c/(c+vo)))))*i,i=(1+l)*s,l=Math.sqrt(Math.pow(c,2)+Math.pow(e,2)),s=Math.sqrt(Math.pow(i,2)+Math.pow(t,2)),e=0==c&&0===e?0:\
Math.atan2(e,c),c=0==i&&0===t?0:Math.atan2(t,i),t=(e<0&&(e+=2*bo),c<0&&(c+=2*bo),u-o),i=s-l,(c*=yo)-(e*=yo)),p=(e=e+c,c=Math.abs(d),d=(l*s==0?p=0:c<=180?p=d:180<d?p=d-360:d<-180?p=360+d:console.log("the unthinkable has happened"),2*Math.sqrt(s*l)*Math.sin(p*wo/2)),(o+u)/2);o=(l+s)/2,u=Math.pow(o,7),l=l*s==0?e:c<=180?e/2:e<360?(e+360)/2:(e-360)/2,c=1+.015*(s=Math.pow(p-50,2))/Math.sqrt(20+s),e=1+.045*o,p=1,s=1+.015*o*((p-=.17*Math.cos((l-30)*wo))+.24*Math.cos(2*l*wo)+.32*Math.cos((3*l+6)*wo)-.2*Math.cos((4*l-63)*wo)),o=30*Math.exp(-1*Math.pow((l-275)/25,2)),p=2*Math.sqrt(u/(u+vo)),l=-1*Math.sin(2*o*wo)*p,u=Math.pow(t/(r*c),2),u=(u+=Math.pow(i/(n*e),2))+Math.pow(d/(a*s),2)+i/(n*e)*l*(d/(a*s));return Math.sqrt(u)}var xo=75e-6;function Eo(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:e.space,r=void 0===(r=(2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).epsilon)?xo:r,n=(e=io(e),t=ro.get(t),e.coords);return t!==e.space&&(n=t.from(e)),t.inGamut(n,{epsilon:r})}fun\
ction Ao(e){return{space:e.space,coords:e.coords.slice(),alpha:e.alpha}}function Fo(e){var t=void 0===(t=(a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).method)?Ka.gamut_mapping:t,r=void 0===(a=a.space)?e.space:a;if(La(arguments[1])&&(r=arguments[1]),!Eo(e,r=ro.get(r),{epsilon:0})){var n,a=Co(e,r);if("clip"!==t&&!Eo(e,r)){var o=Fo(Ao(a),{method:"clip",space:r});if(2<Do(e,o)){for(var i=ro.resolveCoord(t),l=i.space,u=i.id,s=Co(a,l),c=(i.range||i.refRange)[0],d=uo(s,u);.01<d-c;)Do(s,Fo(Ao(s),{space:r,method:"clip"}))-2<.01?c=uo(s,u):d=uo(s,u),co(s,u,(c+d)/2);a=Co(s,r)}else a=o}"clip"!==t&&Eo(a,r,{epsilon:0})||(n=Object.values(r.coords).map((function(e){return e.range||[]})),a.coords=a.coords.map((function(e,t){var r=(t=V(n[t],2))[0];t=t[1];return void 0!==r&&(e=Math.max(r,e)),void 0!==t?Math.min(e,t):e}))),r!==e.space&&(a=Co(a,e.space)),e.coords=a.coords}return e}function Co(e,t){var r=(2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).inGamut,n=(e=io(e),(t=ro.get(t\
)).from(e));t={space:t,coords:n,alpha:e.alpha};return r?Fo(t):t}function ko(e){var t=void 0===(r=(a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).precision)?Ka.precision:r,r=void 0===(r=a.format)?"default":r,n=void 0===(n=a.inGamut)||n,a=k(a,i),o=r,l=(r=null!=(l=null!=(l=(e=io(e)).space.getFormat(r))?l:e.space.getFormat("default"))?l:ro.DEFAULT_FORMAT,n=n||r.toGamut,(l=e.coords).map((function(e){return e||0})));if(n&&!Eo(e)&&(l=Fo(Ao(e),!0===n?void 0:n).coords),"custom"===r.type){if(a.precision=t,!r.serialize)throw new TypeError("format ".concat(o," can only be used to parse colors, not for serialization"));u=r.serialize(l,e.alpha,a)}else{n=r.name||"color",o=(r.serializeCoords?l=r.serializeCoords(l,t):null!==t&&(l=l.map((function(e){return za(e,t)}))),M(l)),a=("color"===n&&(l=r.id||(null==(a=r.ids)?void 0:a[0])||e.space.id,o.unshift(l)),e.alpha),l=(null!==t&&(a=za(a,t)),e.alpha<1&&!r.noAlpha?"".concat(r.commas?",":" /"," ").concat(a):"");var u="".concat(n,"(").concat(o.joi\
n(r.commas?", ":" ")).concat(l,")")}return u}Co.returns=Fo.returns="color";we=new wt({id:"rec2020-linear",name:"Linear REC.2020",white:"D65",toXYZ_M:[[.6369580483012914,.14461690358620832,.1688809751641721],[.2627002120112671,.6779980715188708,.05930171646986196],[0,.028072693049087428,1.060985057710791]],fromXYZ_M:[[1.716651187971268,-.355670783776392,-.25336628137366],[-.666684351832489,1.616481236634939,.0157685458139111],[.017639857445311,-.042770613257809,.942103121235474]],formats:{color:{}}});var Ro=1.09929682680944,No=.018053968510807,To=(jt=new wt({id:"rec2020",name:"REC.2020",base:we,toBase:function(e){return e.map((function(e){return e<4.5*No?e/4.5:Math.pow((e+Ro-1)/Ro,1/.45)}))},fromBase:function(e){return e.map((function(e){return No<=e?Ro*Math.pow(e,.45)-(Ro-1):4.5*e}))},formats:{color:{}}}),kr=new wt({id:"p3-linear",name:"Linear P3",white:"D65",toXYZ_M:[[.4865709486482162,.26566769316909306,.1982172852343625],[.2289745640697488,.6917385218365064,.079286914093745],[0,.045\
11338185890264,1.043944368900976]],fromXYZ_M:[[2.493496911941425,-.9313836179191239,-.40271078445071684],[-.8294889695615747,1.7626640603183463,.023624685841943577],[.03584583024378447,-.07617238926804182,.9568845240076872]]}),Rr=new wt({id:"srgb-linear",name:"Linear sRGB",white:"D65",toXYZ_M:[[.41239079926595934,.357584339383878,.1804807884018343],[.21263900587151027,.715168678767756,.07219231536073371],[.01933081871559182,.11919477979462598,.9505321522496607]],fromXYZ_M:[[3.2409699419045226,-1.537383177570094,-.4986107602930034],[-.9692436362808796,1.8759675015077202,.04155505740717559],[.05563007969699366,-.20397695888897652,1.0569715142428786]],formats:{color:{}}}),{aliceblue:[240/255,248/255,1],antiquewhite:[250/255,235/255,215/255],aqua:[0,1,1],aquamarine:[127/255,1,212/255],azure:[240/255,1,1],beige:[245/255,245/255,220/255],bisque:[1,228/255,196/255],black:[0,0,0],blanchedalmond:[1,235/255,205/255],blue:[0,0,1],blueviolet:[138/255,43/255,226/255],brown:[165/255,42/255,42/255],b\
urlywood:[222/255,184/255,135/255],cadetblue:[95/255,158/255,160/255],chartreuse:[127/255,1,0],chocolate:[210/255,105/255,30/255],coral:[1,127/255,80/255],cornflowerblue:[100/255,149/255,237/255],cornsilk:[1,248/255,220/255],crimson:[220/255,20/255,60/255],cyan:[0,1,1],darkblue:[0,0,139/255],darkcyan:[0,139/255,139/255],darkgoldenrod:[184/255,134/255,11/255],darkgray:[169/255,169/255,169/255],darkgreen:[0,100/255,0],darkgrey:[169/255,169/255,169/255],darkkhaki:[189/255,183/255,107/255],darkmagenta:[139/255,0,139/255],darkolivegreen:[85/255,107/255,47/255],darkorange:[1,140/255,0],darkorchid:[.6,50/255,.8],darkred:[139/255,0,0],darksalmon:[233/255,150/255,122/255],darkseagreen:[143/255,188/255,143/255],darkslateblue:[72/255,61/255,139/255],darkslategray:[47/255,79/255,79/255],darkslategrey:[47/255,79/255,79/255],darkturquoise:[0,206/255,209/255],darkviolet:[148/255,0,211/255],deeppink:[1,20/255,147/255],deepskyblue:[0,191/255,1],dimgray:[105/255,105/255,105/255],dimgrey:[105/255,105/255\
,105/255],dodgerblue:[30/255,144/255,1],firebrick:[178/255,34/255,34/255],floralwhite:[1,250/255,240/255],forestgreen:[34/255,139/255,34/255],fuchsia:[1,0,1],gainsboro:[220/255,220/255,220/255],ghostwhite:[248/255,248/255,1],gold:[1,215/255,0],goldenrod:[218/255,165/255,32/255],gray:[128/255,128/255,128/255],green:[0,128/255,0],greenyellow:[173/255,1,47/255],grey:[128/255,128/255,128/255],honeydew:[240/255,1,240/255],hotpink:[1,105/255,180/255],indianred:[205/255,92/255,92/255],indigo:[75/255,0,130/255],ivory:[1,1,240/255],khaki:[240/255,230/255,140/255],lavender:[230/255,230/255,250/255],lavenderblush:[1,240/255,245/255],lawngreen:[124/255,252/255,0],lemonchiffon:[1,250/255,205/255],lightblue:[173/255,216/255,230/255],lightcoral:[240/255,128/255,128/255],lightcyan:[224/255,1,1],lightgoldenrodyellow:[250/255,250/255,210/255],lightgray:[211/255,211/255,211/255],lightgreen:[144/255,238/255,144/255],lightgrey:[211/255,211/255,211/255],lightpink:[1,182/255,193/255],lightsalmon:[1,160/255,1\
22/255],lightseagreen:[32/255,178/255,170/255],lightskyblue:[135/255,206/255,250/255],lightslategray:[119/255,136/255,.6],lightslategrey:[119/255,136/255,.6],lightsteelblue:[176/255,196/255,222/255],lightyellow:[1,1,224/255],lime:[0,1,0],limegreen:[50/255,205/255,50/255],linen:[250/255,240/255,230/255],magenta:[1,0,1],maroon:[128/255,0,0],mediumaquamarine:[.4,205/255,170/255],mediumblue:[0,0,205/255],mediumorchid:[186/255,85/255,211/255],mediumpurple:[147/255,112/255,219/255],mediumseagreen:[60/255,179/255,113/255],mediumslateblue:[123/255,104/255,238/255],mediumspringgreen:[0,250/255,154/255],mediumturquoise:[72/255,209/255,.8],mediumvioletred:[199/255,21/255,133/255],midnightblue:[25/255,25/255,112/255],mintcream:[245/255,1,250/255],mistyrose:[1,228/255,225/255],moccasin:[1,228/255,181/255],navajowhite:[1,222/255,173/255],navy:[0,0,128/255],oldlace:[253/255,245/255,230/255],olive:[128/255,128/255,0],olivedrab:[107/255,142/255,35/255],orange:[1,165/255,0],orangered:[1,69/255,0],orchid\
:[218/255,112/255,214/255],palegoldenrod:[238/255,232/255,170/255],palegreen:[152/255,251/255,152/255],paleturquoise:[175/255,238/255,238/255],palevioletred:[219/255,112/255,147/255],papayawhip:[1,239/255,213/255],peachpuff:[1,218/255,185/255],peru:[205/255,133/255,63/255],pink:[1,192/255,203/255],plum:[221/255,160/255,221/255],powderblue:[176/255,224/255,230/255],purple:[128/255,0,128/255],rebeccapurple:[.4,.2,.6],red:[1,0,0],rosybrown:[188/255,143/255,143/255],royalblue:[65/255,105/255,225/255],saddlebrown:[139/255,69/255,19/255],salmon:[250/255,128/255,114/255],sandybrown:[244/255,164/255,96/255],seagreen:[46/255,139/255,87/255],seashell:[1,245/255,238/255],sienna:[160/255,82/255,45/255],silver:[192/255,192/255,192/255],skyblue:[135/255,206/255,235/255],slateblue:[106/255,90/255,205/255],slategray:[112/255,128/255,144/255],slategrey:[112/255,128/255,144/255],snow:[1,250/255,250/255],springgreen:[0,1,127/255],steelblue:[70/255,130/255,180/255],tan:[210/255,180/255,140/255],teal:[0,12\
8/255,128/255],thistle:[216/255,191/255,216/255],tomato:[1,99/255,71/255],turquoise:[64/255,224/255,208/255],violet:[238/255,130/255,238/255],wheat:[245/255,222/255,179/255],white:[1,1,1],whitesmoke:[245/255,245/255,245/255],yellow:[1,1,0],yellowgreen:[154/255,205/255,50/255]}),Oo=(oa=new wt({id:"srgb",name:"sRGB",base:Rr,fromBase:function(e){return e.map((function(e){var t=e<0?-1:1,r=e*t;return.0031308<r?t*(1.055*Math.pow(r,1/2.4)-.055):12.92*e}))},toBase:function(e){return e.map((function(e){var t=e<0?-1:1,r=e*t;return r<.04045?e/12.92:t*Math.pow((.055+r)/1.055,2.4)}))},formats:{rgb:{coords:oa=Array(3).fill("<percentage> | <number>[0, 255]")},rgb_number:{name:"rgb",commas:!0,coords:Oo=Array(3).fill("<number>[0, 255]"),noAlpha:!0},color:{},rgba:{coords:oa,commas:!0,lastAlpha:!0},rgba_number:{name:"rgba",commas:!0,coords:Oo},hex:{type:"custom",toGamut:!0,test:function(e){return/^#([a-f0-9]{3,4}){1,2}$/i.test(e)},parse:function(e){e.length<=5&&(e=e.replace(/[a-f0-9]/gi,"$&$&"));var t=[]\
;return e.replace(/[a-f0-9]{2}/gi,(function(e){t.push(parseInt(e,16)/255)})),{spaceId:"srgb",coords:t.slice(0,3),alpha:t.slice(3)[0]}},serialize:function(e,t){var r=void 0===(r=(2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).collapse)||r,n=(t<1&&e.push(t),e=e.map((function(e){return Math.round(255*e)})),r&&e.every((function(e){return e%17==0})));return"#"+e.map((function(e){return n?(e/17).toString(16):e.toString(16).padStart(2,"0")})).join("")}},keyword:{type:"custom",test:function(e){return/^[a-z]+$/i.test(e)},parse:function(e){var t={spaceId:"srgb",coords:null,alpha:1};if("transparent"===(e=e.toLowerCase())?(t.coords=To.black,t.alpha=0):t.coords=To[e],t.coords)return t}}}}),new wt({id:"p3",name:"P3",base:kr,fromBase:oa.fromBase,toBase:oa.toBase,formats:{color:{id:"display-p3"}}}));if(Ka.display_space=oa,"undefined"!=typeof CSS&&null!=(ue=CSS)&&ue.supports)for(var So=0,_o=[mo,jt,Oo];So<_o.length;So++){var Mo=_o[So],Po=Mo.getMinCoords();Po=ko({space:Mo,coords:Po,alpha:1});\
if(CSS.supports("color",Po)){Ka.display_space=Mo;break}}function Io(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:"lab",n=(e=(r=ro.get(r)).from(e),r.from(t));return Math.sqrt(e.reduce((function(e,t,r){return r=n[r],isNaN(t)||isNaN(r)?e:e+Math.pow(r-t,2)}),0))}function Bo(e){return uo(e,[no,"y"])}function jo(e,t){co(e,[no,"y"],t)}ue=Object.freeze({__proto__:null,getLuminance:Bo,setLuminance:jo,register:function(e){Object.defineProperty(e.prototype,"luminance",{get:function(){return Bo(this)},set:function(e){jo(this,e)}})}});function Lo(e){return.022<=e?e:e+Math.pow(.022-e,1.414)}function qo(e){var t=e<0?-1:1;e=Math.abs(e);return t*Math.pow(e,2.4)}var zo=24389/27,Vo=Xa.D65,Go=new ro({id:"lab-d65",name:"Lab D65",coords:{l:{refRange:[0,100],name:"L"},a:{refRange:[-125,125]},b:{refRange:[-125,125]}},white:Vo,base:no,fromBase:function(e){return e=e.map((function(e,t){return e/Vo[t]})).map((function(e){return 216/24389<e?Math.cbrt(e):(zo*e+16)/116})),[116*e[1]-16,500*(e[0]\
-e[1]),200*(e[1]-e[2])]},toBase:function(e){var t=[];return t[1]=(e[0]+16)/116,t[0]=e[1]/500+t[1],t[2]=t[1]-e[2]/200,[24/116<t[0]?Math.pow(t[0],3):(116*t[0]-16)/zo,8<e[0]?Math.pow((e[0]+16)/116,3):e[0]/zo,24/116<t[2]?Math.pow(t[2],3):(116*t[2]-16)/zo].map((function(e,t){return e*Vo[t]}))},formats:{"lab-d65":{coords:["<number> | <percentage>","<number>","<number>"]}}}),$o=.5*Math.pow(5,.5)+.5,Ho=Object.freeze({__proto__:null,contrastWCAG21:function(e,t){var r;return e=io(e),t=io(t),(e=Math.max(Bo(e),0))<(t=Math.max(Bo(t),0))&&(e=(r=[t,e])[0],t=r[1]),(e+.05)/(t+.05)},contrastAPCA:function(e,t){t=io(t),e=io(e);var r=(t=V((t=Co(t,"srgb")).coords,3))[0],n=t[1],a=(t=t[2],.2126729*qo(r)+.7151522*qo(n)+.072175*qo(t));r=(e=V((e=Co(e,"srgb")).coords,3))[0],n=e[1],t=e[2],e=.2126729*qo(r)+.7151522*qo(n)+.072175*qo(t),t=(r=Lo(a))<(n=Lo(e)),a=Math.abs(n-r)<5e-4?0:t?1.14*(Math.pow(n,.56)-Math.pow(r,.57)):1.14*(Math.pow(n,.65)-Math.pow(r,.62));return 100*(Math.abs(a)<.1?0:0<a?a-.027:a+.027)},contrastM\
ichelson:function(e,t){e=io(e),t=io(t);var r=((e=Math.max(Bo(e),0))<(t=Math.max(Bo(t),0))&&(e=(r=[t,e])[0],t=r[1]),e+t);return 0===r?0:(e-t)/r},contrastWeber:function(e,t){var r;return e=io(e),t=io(t),(e=Math.max(Bo(e),0))<(t=Math.max(Bo(t),0))&&(e=(r=[t,e])[0],t=r[1]),0===t?5e4:(e-t)/t},contrastLstar:function(e,t){return e=io(e),t=io(t),e=uo(e,[mo,"l"]),t=uo(t,[mo,"l"]),Math.abs(e-t)},contrastDeltaPhi:function(e,t){return e=io(e),t=io(t),e=uo(e,[Go,"l"]),t=uo(t,[Go,"l"]),e=Math.abs(Math.pow(e,$o)-Math.pow(t,$o)),(t=Math.pow(e,1/$o)*Math.SQRT2-40)<7.5?0:t}});function Uo(e){var t=(e=V(lo(e,no),3))[0],r=e[1];return[4*t/(e=t+15*r+3*e[2]),9*r/e]}function Wo(e){var t=(e=V(lo(e,no),3))[0],r=e[1];return[t/(e=t+r+e[2]),r/e]}var Yo=Object.freeze({__proto__:null,uv:Uo,xy:Wo,register:function(e){Object.defineProperty(e.prototype,"uv",{get:function(){return Uo(this)}}),Object.defineProperty(e.prototype,"xy",{get:function(){return Wo(this)}})}}),Ko=Math.PI/180,Xo=new ro({id:"xyz-abs-d65",name:"Abso\
lute XYZ D65",coords:{x:{refRange:[0,9504.7],name:"Xa"},y:{refRange:[0,1e4],name:"Ya"},z:{refRange:[0,10888.3],name:"Za"}},base:no,fromBase:function(e){return e.map((function(e){return Math.max(203*e,0)}))},toBase:function(e){return e.map((function(e){return Math.max(e/203,0)}))}}),Zo=2610/Math.pow(2,14),Jo=Math.pow(2,14)/2610,Qo=3424/Math.pow(2,12),ei=2413/Math.pow(2,7),ti=2392/Math.pow(2,7),ri=1.7*2523/Math.pow(2,5),ni=Math.pow(2,5)/(1.7*2523),ai=16295499532821565e-27,oi=[[.41478972,.579999,.014648],[-.20151,1.120649,.0531008],[-.0166008,.2648,.6684799]],ii=[[1.9242264357876067,-1.0047923125953657,.037651404030618],[.35031676209499907,.7264811939316552,-.06538442294808501],[-.09098281098284752,-.3127282905230739,1.5227665613052603]],li=[[.5,.5,0],[3.524,-4.066708,.542708],[.199076,1.096799,-1.295875]],ui=[[1,.1386050432715393,.05804731615611886],[.9999999999999999,-.1386050432715393,-.05804731615611886],[.9999999999999998,-.09601924202631895,-.8118918960560388]],si=new ro({id:"jzazbz\
",name:"Jzazbz",coords:{jz:{refRange:[0,1],name:"Jz"},az:{refRange:[-.5,.5]},bz:{refRange:[-.5,.5]}},base:Xo,fromBase:function(e){var t=(e=V(e,3))[0],r=e[2];e=ja(oi,[1.15*t-(1.15-1)*r,.66*e[1]-(.66-1)*t,r]).map((function(e){var t=Qo+ei*Math.pow(e/1e4,Zo);e=1+ti*Math.pow(e/1e4,Zo);return Math.pow(t/e,ri)}));return[(1-.56)*(r=(t=V(ja(li,e),3))[0])/(1+-.56*r)-ai,t[1],t[2]]},toBase:function(e){var t=(e=V(e,3))[0],r=(t=ja(ui,[(t+ai)/(1-.56- -.56*(t+ai)),e[1],e[2]]).map((function(e){var t=Qo-Math.pow(e,ni);e=ti*Math.pow(e,ni)-ei;return 1e4*Math.pow(t/e,Jo)})),t=(e=V(ja(ii,t),3))[0],e[2]);return[t=(t+(1.15-1)*r)/1.15,(e[1]+(.66-1)*t)/.66,r]},formats:{color:{}}}),ci=new ro({id:"jzczhz",name:"JzCzHz",coords:{jz:{refRange:[0,1],name:"Jz"},cz:{refRange:[0,1],name:"Chroma"},hz:{refRange:[0,360],type:"angle",name:"Hue"}},base:si,fromBase:function(e){var t=(e=V(e,3))[0],r=e[1],n=(e=e[2],Math.abs(r)<2e-4&&Math.abs(e)<2e-4?NaN:180*Math.atan2(e,r)/Math.PI);return[t,Math.sqrt(Math.pow(r,2)+Math.pow(e,2)\
),ho(n)]},toBase:function(e){return[e[0],e[1]*Math.cos(e[2]*Math.PI/180),e[1]*Math.sin(e[2]*Math.PI/180)]},formats:{color:{}}}),di=2610/16384,pi=[[.3592,.6976,-.0358],[-.1922,1.1004,.0755],[.007,.0749,.8434]],fi=[[.5,.5,0],[6610/4096,-13613/4096,7003/4096],[17933/4096,-17390/4096,-543/4096]],mi=[[.9999888965628402,.008605050147287059,.11103437159861648],[1.00001110343716,-.008605050147287059,-.11103437159861648],[1.0000320633910054,.56004913547279,-.3206339100541203]],hi=[[2.0701800566956137,-1.326456876103021,.20661600684785517],[.3649882500326575,.6804673628522352,-.04542175307585323],[-.04959554223893211,-.04942116118675749,1.1879959417328034]],gi=new ro({id:"ictcp",name:"ICTCP",coords:{i:{refRange:[0,1],name:"I"},ct:{refRange:[-.5,.5],name:"CT"},cp:{refRange:[-.5,.5],name:"CP"}},base:Xo,fromBase:function(e){var t=e=ja(pi,e);return t=e.map((function(e){var t=.8359375+2413/128*Math.pow(e/1e4,di);e=1+18.6875*Math.pow(e/1e4,di);return Math.pow(t/e,2523/32)})),ja(fi,t)},toBase:function(\
e){return e=ja(mi,e).map((function(e){var t=Math.max(Math.pow(e,32/2523)-.8359375,0);e=2413/128-18.6875*Math.pow(e,32/2523);return 1e4*Math.pow(t/e,16384/2610)})),ja(hi,e)},formats:{color:{}}}),vi=[[.8190224432164319,.3619062562801221,-.12887378261216414],[.0329836671980271,.9292868468965546,.03614466816999844],[.048177199566046255,.26423952494422764,.6335478258136937]],bi=[[1.2268798733741557,-.5578149965554813,.28139105017721583],[-.04057576262431372,1.1122868293970594,-.07171106666151701],[-.07637294974672142,-.4214933239627914,1.5869240244272418]],yi=[[.2104542553,.793617785,-.0040720468],[1.9779984951,-2.428592205,.4505937099],[.0259040371,.7827717662,-.808675766]],wi=[[.9999999984505198,.39633779217376786,.2158037580607588],[1.0000000088817609,-.10556134232365635,-.06385417477170591],[1.0000000546724108,-.08948418209496575,-1.2914855378640917]],Di=new ro({id:"oklab",name:"OKLab",coords:{l:{refRange:[0,1],name:"L"},a:{refRange:[-.4,.4]},b:{refRange:[-.4,.4]}},white:"D65",base:no,f\
romBase:function(e){return e=ja(vi,e).map((function(e){return Math.cbrt(e)})),ja(yi,e)},toBase:function(e){return e=ja(wi,e).map((function(e){return Math.pow(e,3)})),ja(bi,e)},formats:{oklab:{coords:["<number> | <percentage>","<number>","<number>"]}}}),xi=Object.freeze({__proto__:null,deltaE76:function(e,t){return Io(e,t,"lab")},deltaECMC:function(e,t){var r=void 0===(r=(n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).l)?2:r,n=void 0===(n=n.c)?1:n,a=(e=V(mo.from(e),3))[0],o=e[1],i=(e=e[2],(l=V(go.from(mo,[a,o,e]),3))[1]),l=l[2],u=(t=V(mo.from(t),3))[0],s=t[1],c=(t=t[2],go.from(mo,[u,s,t])[1]);u=a-u,c=(i=i<0?0:i)-(c=c<0?0:c),e-=t,t=Math.pow(o-s,2)+Math.pow(e,2)-Math.pow(c,2),o=.511,16<=a&&(o=.040975*a/(1+.01765*a)),s=.0638*i/(1+.0131*i)+.638,e=164<=(l=Number.isNaN(l)?0:l)&&l<=345?.56+Math.abs(.2*Math.cos((l+168)*Ko)):.36+Math.abs(.4*Math.cos((l+35)*Ko)),a=Math.pow(i,4),i=s*((l=Math.sqrt(a/(a+1900)))*e+1-l),a=Math.pow(u/(r*o),2),a=(a+=Math.pow(c/(n*s),2))+t/Math.pow(i,2);ret\
urn Math.sqrt(a)},deltaE2000:Do,deltaEJz:function(e,t){var r=(e=V(ci.from(e),3))[0],n=e[1],a=(e=e[2],(t=V(ci.from(t),3))[0]),o=t[1];t=t[2],r-=a,a=n-o,Number.isNaN(e)&&Number.isNaN(t)?t=e=0:Number.isNaN(e)?e=t:Number.isNaN(t)&&(t=e),e-=t,t=2*Math.sqrt(n*o)*Math.sin(e/2*(Math.PI/180));return Math.sqrt(Math.pow(r,2)+Math.pow(a,2)+Math.pow(t,2))},deltaEITP:function(e,t){var r=(e=V(gi.from(e),3))[0],n=e[1],a=(e=e[2],(t=V(gi.from(t),3))[0]),o=t[1];t=t[2];return 720*Math.sqrt(Math.pow(r-a,2)+.25*Math.pow(n-o,2)+Math.pow(e-t,2))},deltaEOK:function(e,t){var r=(e=V(Di.from(e),3))[0],n=e[1],a=(e=e[2],(t=V(Di.from(t),3))[0]);n-=t[1],e-=t[2];return Math.sqrt(Math.pow(r-a,2)+Math.pow(n,2)+Math.pow(e,2))}});function Ei(e,t){var r,n,a=(n=n=La(n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{})?{method:n}:n).method,o=void 0===a?Ka.deltaE:a,i=k(n,s);for(r in e=io(e),t=io(t),xi)if("deltae"+o.toLowerCase()===r.toLowerCase())return xi[r](e,t,i);throw new TypeError("Unknown deltaE method: ".concat(\
o))}var Ai=Object.freeze({__proto__:null,lighten:function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:.25;return co(e,[ro.get("oklch","lch"),"l"],(function(e){return e*(1+t)}))},darken:function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:.25;return co(e,[ro.get("oklch","lch"),"l"],(function(e){return e*(1-t)}))}});function Fi(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:.5,n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},a=(e=(a=[io(e),io(t)])[0],t=a[1],"object"===qa(r)&&(r=(a=[.5,r])[0],n=a[1]),n);return ki(e,t,{space:a.space,outputSpace:a.outputSpace,premultiplied:a.premultiplied})(r)}function Ci(e,t){var r,n,a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},o=(s=(Ri(e)&&(a=t,e=(s=V((r=e).rangeArgs.colors,2))[0],t=s[1]),a)).maxDeltaE,i=s.deltaEMethod,l=(a=void 0===(a=s.steps)?2:a,void 0===(u=s.maxSteps)?1e3:u),u=k(s,c),s=(r||(s=[io(e),io(t)],r=ki(e=s[0],t=s[1],u)),Ei(e,t)),d=(u=0<o?Math.max(a,Math.ceil(\
s/o)+1):a,[]);if(void 0!==l&&(u=Math.min(u,l)),d=1===u?[{p:.5,color:r(.5)}]:(n=1/(u-1),Array.from({length:u},(function(e,t){return{p:t*=n,color:r(t)}}))),0<o)for(var p=d.reduce((function(e,t,r){return 0===r?0:(t=Ei(t.color,d[r-1].color,i),Math.max(e,t))}),0);o<p;){p=0;for(var f=1;f<d.length&&d.length<l;f++){var m=d[f-1],h=d[f],g=(h.p+m.p)/2,v=r(g);p=Math.max(p,Ei(v,m.color),Ei(v,h.color));d.splice(f,0,{p:g,color:r(g)}),f++}}return d=d.map((function(e){return e.color}))}function ki(e,t){var r,n,a,o,i,l,u,s,c,d,p,f,m=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return Ri(e)?(a=e,o=t,ki.apply(void 0,M(a.rangeArgs.colors).concat([_({},a.rangeArgs.options,o)]))):(p=m.space,f=m.outputSpace,r=m.progression,n=m.premultiplied,e=io(e),t=io(t),e=Ao(e),t=Ao(t),a={colors:[e,t],options:m},p=p?ro.get(p):ro.registry[Ka.interpolationSpace]||e.space,f=f?ro.get(f):p,e=Co(e,p),t=Co(t,p),e=Fo(e),t=Fo(t),p.coords.h&&"angle"===p.coords.h.type&&(o=m.hue=m.hue||"shorter",s=[(l=[uo(e,m=[p,"h"]),uo(\
t,m)])[0],l=l[1]],u="raw"===(u=o)?s:(c=(s=V(s.map(ho),2))[0],d=(s=s[1])-c,"increasing"===u?d<0&&(s+=360):"decreasing"===u?0<d&&(c+=360):"longer"===u?-180<d&&d<180&&(0<d?s+=360:c+=360):"shorter"===u&&(180<d?c+=360:d<-180&&(s+=360)),[c,s]),i=(d=V(u,2))[0],l=d[1],co(e,m,i),co(t,m,l)),n&&(e.coords=e.coords.map((function(t){return t*e.alpha})),t.coords=t.coords.map((function(e){return e*t.alpha}))),Object.assign((function(a){a=r?r(a):a;var o=e.coords.map((function(e,r){return $a(e,t.coords[r],a)})),i=$a(e.alpha,t.alpha,a);o={space:p,coords:o,alpha:i};return n&&(o.coords=o.coords.map((function(e){return e/i}))),f!==p?Co(o,f):o}),{rangeArgs:a}))}function Ri(e){return"function"===qa(e)&&!!e.rangeArgs}Ka.interpolationSpace="lab";var Ni=Object.freeze({__proto__:null,mix:Fi,steps:Ci,range:ki,isRange:Ri,register:function(e){e.defineFunction("mix",Fi,{returns:"color"}),e.defineFunction("range",ki,{returns:"function<color>"}),e.defineFunction("steps",Ci,{returns:"array<color>"})}}),Ti=new ro({id:"hs\
l",name:"HSL",coords:{h:{refRange:[0,360],type:"angle",name:"Hue"},s:{range:[0,100],name:"Saturation"},l:{range:[0,100],name:"Lightness"}},base:oa,fromBase:function(e){var t=Math.max.apply(Math,M(e)),r=Math.min.apply(Math,M(e)),n=(e=V(e,3))[0],a=e[1],o=e[2],i=NaN,l=(e=0,(r+t)/2),u=t-r;if(0!=u){switch(e=0==l||1==l?0:(t-l)/Math.min(l,1-l),t){case n:i=(a-o)/u+(a<o?6:0);break;case a:i=(o-n)/u+2;break;case o:i=(n-a)/u+4}i*=60}return[i,100*e,100*l]},toBase:function(e){var t=(e=V(e,3))[0],r=e[1],n=e[2];function a(e){e=(e+t/30)%12;var a=r*Math.min(n,1-n);return n-a*Math.max(-1,Math.min(e-3,9-e,1))}return(t%=360)<0&&(t+=360),r/=100,n/=100,[a(0),a(8),a(4)]},formats:{hsl:{toGamut:!0,coords:["<number> | <angle>","<percentage>","<percentage>"]},hsla:{coords:["<number> | <angle>","<percentage>","<percentage>"],commas:!0,lastAlpha:!0}}}),Oi=new ro({id:"hsv",name:"HSV",coords:{h:{refRange:[0,360],type:"angle",name:"Hue"},s:{range:[0,100],name:"Saturation"},v:{range:[0,100],name:"Value"}},base:Ti,fromB\
ase:function(e){var t=(e=V(e,3))[0],r=e[1];e=e[2];return[t,0==(r=(e/=100)+(r/=100)*Math.min(e,1-e))?0:200*(1-e/r),100*r]},toBase:function(e){var t=(e=V(e,3))[0],r=e[1];e=e[2];return[t,0==(r=(e/=100)*(1-(r/=100)/2))||1==r?0:(e-r)/Math.min(r,1-r)*100,100*r]},formats:{color:{toGamut:!0}}}),Si=new ro({id:"hwb",name:"HWB",coords:{h:{refRange:[0,360],type:"angle",name:"Hue"},w:{range:[0,100],name:"Whiteness"},b:{range:[0,100],name:"Blackness"}},base:Oi,fromBase:function(e){var t=(e=V(e,3))[0],r=e[2];return[t,r*(100-e[1])/100,100-r]},toBase:function(e){var t=(e=V(e,3))[0],r=e[1],n=(e=e[2],(r/=100)+(e/=100));return 1<=n?[t,0,r/n*100]:[t,100*(0==(n=1-e)?0:1-r/n),100*n]},formats:{hwb:{toGamut:!0,coords:["<number> | <angle>","<percentage>","<percentage>"]}}}),_i=new wt({id:"a98rgb-linear",name:"Linear Adobe® 98 RGB compatible",white:"D65",toXYZ_M:[[.5766690429101305,.1855582379065463,.1882286462349947],[.29734497525053605,.6273635662554661,.07529145849399788],[.02703136138641234,.0706888525358272\
3,.9913375368376388]],fromXYZ_M:[[2.0415879038107465,-.5650069742788596,-.34473135077832956],[-.9692436362808795,1.8759675015077202,.04155505740717557],[.013444280632031142,-.11836239223101838,1.0151749943912054]]}),Mi=new wt({id:"a98rgb",name:"Adobe® 98 RGB compatible",base:_i,toBase:function(e){return e.map((function(e){return Math.pow(Math.abs(e),563/256)*Math.sign(e)}))},fromBase:function(e){return e.map((function(e){return Math.pow(Math.abs(e),256/563)*Math.sign(e)}))},formats:{color:{id:"a98-rgb"}}}),Pi=new wt({id:"prophoto-linear",name:"Linear ProPhoto",white:"D50",base:ye,toXYZ_M:[[.7977604896723027,.13518583717574031,.0313493495815248],[.2880711282292934,.7118432178101014,8565396060525902e-20],[0,0,.8251046025104601]],fromXYZ_M:[[1.3457989731028281,-.25558010007997534,-.05110628506753401],[-.5446224939028347,1.5082327413132781,.02053603239147973],[0,0,1.2119675456389454]]}),Ii=new wt({id:"prophoto",name:"ProPhoto",base:Pi,toBase:function(e){return e.map((function(e){return e<.\
03125?e/16:Math.pow(e,1.8)}))},fromBase:function(e){return e.map((function(e){return 1/512<=e?Math.pow(e,1/1.8):16*e}))},formats:{color:{id:"prophoto-rgb"}}}),Bi=new ro({id:"oklch",name:"OKLCh",coords:{l:{refRange:[0,1],name:"Lightness"},c:{refRange:[0,.4],name:"Chroma"},h:{refRange:[0,360],type:"angle",name:"Hue"}},white:"D65",base:Di,fromBase:function(e){var t=(e=V(e,3))[0],r=e[1],n=(e=e[2],Math.abs(r)<2e-4&&Math.abs(e)<2e-4?NaN:180*Math.atan2(e,r)/Math.PI);return[t,Math.sqrt(Math.pow(r,2)+Math.pow(e,2)),ho(n)]},toBase:function(e){var t,r=(e=V(e,3))[0],n=e[1];e=e[2],n=isNaN(e)?t=0:(t=n*Math.cos(e*Math.PI/180),n*Math.sin(e*Math.PI/180));return[r,t,n]},formats:{oklch:{coords:["<number> | <percentage>","<number>","<number> | <angle>"]}}}),ji=2610/Math.pow(2,14),Li=Math.pow(2,14)/2610,qi=2523/Math.pow(2,5),zi=Math.pow(2,5)/2523,Vi=3424/Math.pow(2,12),Gi=2413/Math.pow(2,7),$i=2392/Math.pow(2,7),Hi=new wt({id:"rec2100pq",name:"REC.2100-PQ",base:we,toBase:function(e){return e.map((function(\
e){return 1e4*Math.pow(Math.max(Math.pow(e,zi)-Vi,0)/(Gi-$i*Math.pow(e,zi)),Li)/203}))},fromBase:function(e){return e.map((function(e){e=Math.max(203*e/1e4,0);var t=Vi+Gi*Math.pow(e,ji);e=1+$i*Math.pow(e,ji);return Math.pow(t/e,qi)}))},formats:{color:{id:"rec2100-pq"}}}),Ui=.17883277,Wi=.28466892,Yi=.55991073,Ki=3.7743,Xi=new wt({id:"rec2100hlg",cssid:"rec2100-hlg",name:"REC.2100-HLG",referred:"scene",base:we,toBase:function(e){return e.map((function(e){return e<=.5?Math.pow(e,2)/3*Ki:Math.exp((e-Yi)/Ui+Wi)/12*Ki}))},fromBase:function(e){return e.map((function(e){return(e/=Ki)<=1/12?Math.sqrt(3*e):Ui*Math.log(12*e-Wi)+Yi}))},formats:{color:{id:"rec2100-hlg"}}}),Zi={};function Ji(e){var t=e.id;Zi[t]=e}function Qi(e,t,r){var n=(e=V(ja((r=Zi[2<arguments.length&&void 0!==r?r:"Bradford"]).toCone_M,e),3))[0],a=e[1];e=e[2],t=V(ja(r.toCone_M,t),3),n=ja([[t[0]/n,0,0],[0,t[1]/a,0],[0,0,t[2]/e]],r.toCone_M);return ja(r.fromCone_M,n)}Ya.add("chromatic-adaptation-start",(function(e){e.options.metho\
d&&(e.M=Qi(e.W1,e.W2,e.options.method))})),Ya.add("chromatic-adaptation-end",(function(e){e.M||(e.M=Qi(e.W1,e.W2,e.options.method))})),Ji({id:"von Kries",toCone_M:[[.40024,.7076,-.08081],[-.2263,1.16532,.0457],[0,0,.91822]],fromCone_M:[[1.8599364,-1.1293816,.2198974],[.3611914,.6388125,-64e-7],[0,0,1.0890636]]}),Ji({id:"Bradford",toCone_M:[[.8951,.2664,-.1614],[-.7502,1.7135,.0367],[.0389,-.0685,1.0296]],fromCone_M:[[.9869929,-.1470543,.1599627],[.4323053,.5183603,.0492912],[-.0085287,.0400428,.9684867]]}),Ji({id:"CAT02",toCone_M:[[.7328,.4296,-.1624],[-.7036,1.6975,.0061],[.003,.0136,.9834]],fromCone_M:[[1.0961238,-.278869,.1827452],[.454369,.4735332,.0720978],[-.0096276,-.005698,1.0153256]]}),Ji({id:"CAT16",toCone_M:[[.401288,.650173,-.051461],[-.250268,1.204414,.045854],[-.002079,.048952,.953127]],fromCone_M:[[1.862067855087233,-1.011254630531685,.1491867754444518],[.3875265432361372,.6214474419314753,-.008973985167612518],[-.01584149884933386,-.03412293802851557,1.04996443687785]]}\
),Object.assign(Xa,{A:[1.0985,1,.35585],C:[.98074,1,1.18232],D55:[.95682,1,.92149],D75:[.94972,1,1.22638],E:[1,1,1],F2:[.99186,1,.67393],F7:[.95041,1,1.08747],F11:[1.00962,1,.6435]}),Xa.ACES=[.32168/.33767,1,.34065/.33767];var el=new wt({id:"acescg",name:"ACEScg",coords:{r:{range:[0,65504],name:"Red"},g:{range:[0,65504],name:"Green"},b:{range:[0,65504],name:"Blue"}},referred:"scene",white:Xa.ACES,toXYZ_M:[[.6624541811085053,.13400420645643313,.1561876870049078],[.27222871678091454,.6740817658111484,.05368951740793705],[-.005574649490394108,.004060733528982826,1.0103391003129971]],fromXYZ_M:[[1.6410233796943257,-.32480329418479,-.23642469523761225],[-.6636628587229829,1.6153315916573379,.016756347685530137],[.011721894328375376,-.008284441996237409,.9883948585390215]],formats:{color:{}}}),tl=Math.pow(2,-16),rl=-.35828683,nl=(Math.log2(65504)+9.72)/17.52,al=(wt=new wt({id:"acescc",name:"ACEScc",coords:{r:{range:[rl,nl],name:"Red"},g:{range:[rl,nl],name:"Green"},b:{range:[rl,nl],name:"Blu\
e"}},referred:"scene",base:el,toBase:function(e){return e.map((function(e){return e<=(9.72-15)/17.52?2*(Math.pow(2,17.52*e-9.72)-tl):e<nl?Math.pow(2,17.52*e-9.72):65504}))},fromBase:function(e){return e.map((function(e){return e<=0?(Math.log2(tl)+9.72)/17.52:e<tl?(Math.log2(tl+.5*e)+9.72)/17.52:(Math.log2(e)+9.72)/17.52}))},formats:{color:{}}}),Object.freeze({__proto__:null,XYZ_D65:no,XYZ_D50:ye,XYZ_ABS_D65:Xo,Lab_D65:Go,Lab:mo,LCH:go,sRGB_Linear:Rr,sRGB:oa,HSL:Ti,HWB:Si,HSV:Oi,P3_Linear:kr,P3:Oo,A98RGB_Linear:_i,A98RGB:Mi,ProPhoto_Linear:Pi,ProPhoto:Ii,REC_2020_Linear:we,REC_2020:jt,OKLab:Di,OKLCH:Bi,Jzazbz:si,JzCzHz:ci,ICTCP:gi,REC_2100_PQ:Hi,REC_2100_HLG:Xi,ACEScg:el,ACEScc:wt})),ol=(ee=new WeakMap,W((function e(){var t=this;H(this,e),I(this,ee,void 0);for(var r,n,a,o=arguments.length,i=new Array(o),l=0;l<o;l++)i[l]=arguments[l];a=(a=1===i.length?io(i[0]):a)?(r=a.space||a.spaceId,n=a.coords,a.alpha):(r=i[0],n=i[1],i[2]),q(ee,this,ro.get(r)),this.coords=n?n.slice():[0,0,0],this.alpha\
=a<1?a:1;for(var u=0;u<this.coords.length;u++)"NaN"===this.coords[u]&&(this.coords[u]=NaN);for(var s in L(ee,this).coords)(e=>{Object.defineProperty(t,e,{get:function(){return t.get(e)},set:function(r){return t.set(e,r)}})})(s)}),[{key:"space",get:function(){return L(ee,this)}},{key:"spaceId",get:function(){return L(ee,this).id}},{key:"clone",value:function(){return new ol(this.space,this.coords,this.alpha)}},{key:"toJSON",value:function(){return{spaceId:this.spaceId,coords:this.coords,alpha:this.alpha}}},{key:"display",value:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];var n=function(e){var t,r=void 0===(r=(n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).space)?Ka.display_space:r,n=k(n,l),a=ko(e,n);return"undefined"==typeof CSS||null!=(t=CSS)&&t.supports("color",a)||!Ka.display_space?(a=new String(a)).color=e:(t=Co(e,r),(a=new String(ko(t,n))).color=t),a}.apply(void 0,[this].concat(t));return n.color=new ol(n.color),n}}],[{key:"get",v\
alue:function(e){if(e instanceof ol)return e;for(var t=arguments.length,r=new Array(1<t?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return C(ol,[e].concat(r))}},{key:"defineFunction",value:function(e,t){function r(){var e,r=t.apply(void 0,arguments);return"color"===o?r=ol.get(r):"function<color>"===o?(e=r,r=function(){var t=e.apply(void 0,arguments);return ol.get(t)},Object.assign(r,e)):"array<color>"===o&&(r=r.map((function(e){return ol.get(e)}))),r}var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:t,a=void 0===(a=n.instance)||a,o=n.returns;e in ol||(ol[e]=r),a&&(ol.prototype[e]=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return r.apply(void 0,[this].concat(t))})}},{key:"defineFunctions",value:function(e){for(var t in e)ol.defineFunction(t,e[t],e[t])}},{key:"extend",value:function(e){if(e.register)e.register(ol);else for(var t in e)ol.defineFunction(t,e[t])}}]));ol.defineFunctions({get:uo,getAll:lo,set:co,setAll:so,to:Co,equals:function(e,t\
){return e=io(e),t=io(t),e.space===t.space&&e.alpha===t.alpha&&e.coords.every((function(e,r){return e===t.coords[r]}))},inGamut:Eo,toGamut:Fo,distance:Io,toString:ko}),Object.assign(ol,{util:De,hooks:Ya,WHITES:Xa,Space:ro,spaces:ro.registry,parse:oo,defaults:Ka});for(var il,ll=0,ul=Object.keys(al);ll<ul.length;ll++){var sl=ul[ll];ro.register(al[sl])}for(il in ro.registry)cl(il,ro.registry[il]);function cl(e,t){Object.keys(t.coords),Object.values(t.coords).map((function(e){return e.name}));var r=e.replace(/-/g,"_");Object.defineProperty(ol.prototype,r,{get:function(){var r=this,n=this.getAll(e);return"undefined"==typeof Proxy?n:new Proxy(n,{has:function(e,r){try{return ro.resolveCoord([t,r]),!0}catch(e){}return Reflect.has(e,r)},get:function(e,r,n){if(r&&"symbol"!==a(r)&&!(r in e)){var o=ro.resolveCoord([t,r]).index;if(0<=o)return e[o]}return Reflect.get(e,r,n)},set:function(n,o,i,l){if(o&&"symbol"!==a(o)&&!(o in n)||0<=o){var u=ro.resolveCoord([t,o]).index;if(0<=u)return n[u]=i,r.setAl\
l(e,n),!0}return Reflect.set(n,o,i,l)}})},set:function(t){this.setAll(e,t)},configurable:!0,enumerable:!0})}Ya.add("colorspace-init-end",(function(e){var t;cl(e.id,e),null!=(t=e.aliases)&&t.forEach((function(t){cl(t,e)}))})),ol.extend(xi),ol.extend({deltaE:Ei}),ol.extend(Ai),ol.extend({contrast:function(e,t){var r,n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},a=(n=n=La(n)?{algorithm:n}:n).algorithm,o=k(n,u);if(!a)throw n=Object.keys(Ho).map((function(e){return e.replace(/^contrast/,"")})).join(", "),new TypeError("contrast() function needs a contrast algorithm. Please specify one of: ".concat(n));for(r in e=io(e),t=io(t),Ho)if("contrast"+a.toLowerCase()===r.toLowerCase())return Ho[r](e,t,o);throw new TypeError("Unknown contrast algorithm: ".concat(a))}}),ol.extend(Yo),ol.extend(ue),ol.extend(Ni),ol.extend(Ho);var dl=de(Er()),pl=(Pa.default.templateSettings.strip=!1,o._memoizedFns=[],function(e){return e=(0,Ba.default)(e),o._memoizedFns.push(e),e}),fl=pl((function(e){retur\
n!(null==e||!e.createElement)&&"A"===e.createElement("A").localName}));function ml(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};if(!t)return"";var a=t.getRootNode&&t.getRootNode()||n;if(11!==a.nodeType)return e(t,r,a);for(var o=[];11===a.nodeType;){if(!a.host)return"";o.unshift({elm:t,doc:a}),a=(t=a.host).getRootNode()}return o.unshift({elm:t,doc:a}),o.map((function(t){return e(t.elm,r,t.doc)}))}var hl=["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","xmlns"],gl=31,vl=/([\\\\"])/g,bl=/(\\r\\n|\\r|\\n)/g;function yl(e){return e.replace(vl,"\\\\$1").replace(bl,"\\\\a ")}function wl(e,t){var r,n=t.name;return-1!==n.indexOf("href")||-1!==n.indexOf("src")?(r=Ta(e.getAttribute(n)))?Ca(t.name)+'$="'+yl(r)+'"':Ca(t.name)+'="'+yl(e.getAttribute(n))+'"':Ca(n)+'="'+yl(t.value)+'"'}function Dl(e,t){return e.cou\
nt<t.count?-1:e.count===t.count?0:1}function xl(e){return!hl.includes(e.name)&&-1===e.name.indexOf(":")&&(!e.value||e.value.length<gl)}function El(e){for(var t={classes:{},tags:{},attributes:{}},r=(e=Array.isArray(e)?e:[e]).slice(),n=[];r.length;)(()=>{var e,a=r.pop(),o=a.actualNode;for(o.querySelectorAll&&(e=o.nodeName,t.tags[e]?t.tags[e]++:t.tags[e]=1,o.classList&&Array.from(o.classList).forEach((function(e){e=Ca(e),t.classes[e]?t.classes[e]++:t.classes[e]=1})),o.hasAttributes())&&Array.from(Oa(o)).filter(xl).forEach((function(e){(e=wl(o,e))&&(t.attributes[e]?t.attributes[e]++:t.attributes[e]=1)})),a.children.length&&(n.push(r),r=a.children.slice());!r.length&&n.length;)r=n.pop()})();return t}function Al(e){var t=fl(n);return Ca(t?e.localName:e.nodeName.toLowerCase())}function Fl(e,t){var r,n,a,o,i,l,u,s,c,d="",p=(n=e,a=[],o=t.classes,i=t.tags,n.classList&&Array.from(n.classList).forEach((function(e){e=Ca(e),o[e]<i[n.nodeName]&&a.push({name:e,count:o[e],species:"class"})})),a.sort(Dl\
));l=e,u=[],s=t.attributes,c=t.tags,l.hasAttributes()&&Array.from(Oa(l)).filter(xl).forEach((function(e){(e=wl(l,e))&&s[e]<c[l.nodeName]&&u.push({name:e,count:s[e],species:"attribute"})})),t=u.sort(Dl);return p.length&&1===p[0].count?r=[p[0]]:t.length&&1===t[0].count?(r=[t[0]],d=Al(e)):((r=p.concat(t)).sort(Dl),(r=r.slice(0,3)).some((function(e){return"class"===e.species}))?r.sort((function(e,t){return e.species!==t.species&&"class"===e.species?-1:e.species===t.species?0:1})):d=Al(e)),d+r.reduce((function(e,t){switch(t.species){case"class":return e+"."+t.name;case"attribute":return e+"["+t.name+"]"}return e}),"")}function Cl(e,t,r){if(!o._selectorData)throw new Error("Expect axe._selectorData to be set up");var a,i,l=void 0!==(t=t.toRoot)&&t;do{var u=(e=>{var t;if(e.getAttribute("id"))return t=e.getRootNode&&e.getRootNode()||n,(e="#"+Ca(e.getAttribute("id")||"")).match(/player_uid_/)||1!==t.querySelectorAll(e).length?void 0:e})(e);u||(u=Fl(e,o._selectorData),u+=((e,t)=>{var r=e.parentN\
ode&&Array.from(e.parentNode.children||"")||[];return r.find((function(r){return r!==e&&Sa(r,t)}))?":nth-child("+(1+r.indexOf(e))+")":""})(e,u)),a=a?u+" > "+a:u,i=!i||i.length>la.selectorSimilarFilterLimit?Rl(r,a):i.filter((function(e){return Sa(e,a)})),e=e.parentElement}while((1<i.length||l)&&e&&11!==e.nodeType);return 1===i.length?a:-1!==a.indexOf(" > ")?":root"+a.substring(a.indexOf(" > ")):":root"}var kl=pl((function(e,t){return ml(Cl,e,t)})),Rl=pl((function(e,t){return Array.from(e.querySelectorAll(t))}));function Nl(e){var t=Ca(e.nodeName.toLowerCase()),r=e.parentElement,n=e.parentNode,a="";return"head"!==t&&"body"!==t&&1<(null==n?void 0:n.children.length)&&(n=Array.prototype.indexOf.call(n.children,e)+1,a=":nth-child(".concat(n,")")),r?Nl(r)+" > "+t+a:t+a}function Tl(e,t){return ml(Nl,e,t)}var Ol=function(e){return function e(t,r){var n,a,o,i;if(!t)return[];if(!r&&9===t.nodeType)return[{str:"html"}];if(r=r||[],t.parentNode&&t.parentNode!==t&&(r=e(t.parentNode,r)),t.previousSibli\
ng){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););return 1===t.nodeType&&((o={}).str=t.nodeName.toLowerCase(),(i=t.getAttribute&&Ca(t.getAttribute("id")))&&1===t.ownerDocument.querySelectorAll("#"+i).length&&(o.id=t.getAttribute("id")),1<a&&(o.count=a),r.push(o)),r}(e).reduce((function(e,t){return t.id?"//".concat(t.str,"[@id='").concat(t.id,"']"):e+"/".concat(t.str)+(0<t.count?"[".concat(t.count,"]"):"")}),"")},Sl={},_l={set:function(e,t){var r;Aa("string"==typeof(r=e),"key must be a string, "+a(r)+" given"),Aa(""!==r,"key must not be empty"),Sl[e]=t},get:function(e,t){var r;return Aa("function"==typeof(r=t)||void 0===r,"creator must be a function or undefined, "+a(r)+" given"),e in Sl?Sl[e]:"function"==typeof t?(r=t(),Aa(void 0!==r,"Cache creator function should not return undefined"),this.set(e,r)\
,Sl[e]):void 0},clear:function(){Sl={}}},Ml=function(e,t){return t=t||e,_l.get("nodeMap")?_l.get("nodeMap").get(t):null};function Pl(e){var r=void 0===(r=(a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).maxLength)?300:r,a=void 0===(a=a.attrLimit)?20:a;if(!e)return"";if(1!==e.nodeType)return Il(null!=(o=e.nodeValue)?o:"",r);var o=(e=>{var r=e.outerHTML;return(r=r||"function"!=typeof t.XMLSerializer?r:(new t.XMLSerializer).serializeToString(e))||""})(e);if(o.length>r){var i=(r={maxLength:r,attrLimit:a}).maxLength,l=r.attrLimit;r=fl(e.ownerDocument||n)?e.nodeName:e.nodeName.toLowerCase(),a=(e=Array.from(Oa(e)).map((function(e){return{name:e.name,value:e.value}}))).reduce((function(e,t){return e+t.name.length+t.value.length+4}),0);2+r.length+a>i&&e.forEach((function(e){e.name=Il(e.name,l),e.value=Il(e.value,l)}));var u,s="<".concat(r),c=">",d=K(e);try{for(d.s();!(u=d.n()).done;){var p=u.value,f=" ".concat(p.name,'="').concat(p.value,'"');s.length+f.length>i-5?c=" ...>":s+=f}}c\
atch(e){d.e(e)}finally{d.f()}return s+c}return o}function Il(e,t){return e.length<=t?e:e.substring(0,t)+"..."}var Bl="DqElm.RunOptions",jl=pl((function(e,t,r){var n;return null==r&&(r={}),t=(t=null==t?null:t)||(null!=(n=_l.get(Bl))?n:{}),this.spec=r,e instanceof ca?(this._virtualNode=e,this._element=e.actualNode):(this._element=e,this._virtualNode=Ml(e)),this.fromFrame=1<(null==(n=this.spec.selector)?void 0:n.length),this._includeElementInJson=t.elementRef,t.absolutePaths&&(this._options={toRoot:!0}),this.nodeIndexes=[],Array.isArray(this.spec.nodeIndexes)?this.nodeIndexes=this.spec.nodeIndexes:"number"==typeof(null==(r=this._virtualNode)?void 0:r.nodeIndex)&&(this.nodeIndexes=[this._virtualNode.nodeIndex]),this.source=null,o._audit.noHtml||(this.source=null!=(e=this.spec.source)?e:Pl(this._element)),this})),Ll=(jl.prototype={get selector(){return this.spec.selector||[kl(this.element,this._options)]},get ancestry(){return this.spec.ancestry||[Tl(this.element)]},get xpath(){return this.\
spec.xpath||[Ol(this.element)]},get element(){return this._element},toJSON:function(){var e={selector:this.selector,source:this.source,xpath:this.xpath,ancestry:this.ancestry,nodeIndexes:this.nodeIndexes,fromFrame:this.fromFrame};return this._includeElementInJson&&(e.element=this._element),e}},jl.fromFrame=function(e,t,r){return e=jl.mergeSpecs(e,r),new jl(r.element,t,e)},jl.mergeSpecs=function(e,t){return _({},e,{selector:[].concat(M(t.selector),M(e.selector)),ancestry:[].concat(M(t.ancestry),M(e.ancestry)),xpath:[].concat(M(t.xpath),M(e.xpath)),nodeIndexes:[].concat(M(t.nodeIndexes),M(e.nodeIndexes)),fromFrame:!0})},jl.setRunOptions=function(e){var t=e.elementRef;_l.set(Bl,{elementRef:t,absolutePaths:e.absolutePaths})},jl),ql=function(e,r,n,a){return{isAsync:!1,async:function(){return this.isAsync=!0,function(t){t instanceof Error==0?(e.result=t,n(e)):a(t)}},data:function(t){e.data=t},relatedNodes:function(r){t.Node&&(r=r instanceof t.Node||r instanceof ca?[r]:Fa(r),e.relatedNodes=[]\
,r.forEach((function(r){(r=r instanceof ca?r.actualNode:r)instanceof t.Node&&(r=new Ll(r),e.relatedNodes.push(r))})))}}};function zl(e){return function e(r,n){var o,i;if(null===r||"object"!==a(r))return r;if(null!=(o=t)&&o.Node&&r instanceof t.Node||null!=(o=t)&&o.HTMLCollection&&r instanceof t.HTMLCollection||"nodeName"in r&&"nodeType"in r&&"ownerDocument"in r)return r;if(n.has(r))return n.get(r);if(Array.isArray(r))return i=[],n.set(r,i),r.forEach((function(t){i.push(e(t,n))})),i;var l={};for(var u in n.set(r,l),r)l[u]=e(r[u],n);return l}(e,new Map)}(rl=new Ma.CssSelectorParser).registerSelectorPseudos("not"),rl.registerSelectorPseudos("is"),rl.registerNestingOperators(">"),rl.registerAttrEqualityMods("^","$","*","~");var Vl=rl;function Gl(e,t){return Kl(t).some((function(t){return Xl(e,t)}))}function $l(e,t){return i=t,1===(o=e).props.nodeType&&("*"===i.tag||o.props.nodeName===i.tag)&&(a=e,!(o=t).classes||o.classes.every((function(e){return a.hasClass(e.value)})))&&(n=e,!(i=t).attri\
butes||i.attributes.every((function(e){var t=n.attr(e.key);return null!==t&&e.test(t)})))&&(o=e,!(i=t).id||o.props.id===i.id)&&(r=e,!((o=t).pseudos&&!o.pseudos.every((function(e){if("not"===e.name)return!e.expressions.some((function(e){return Xl(r,e)}));if("is"===e.name)return e.expressions.some((function(e){return Xl(r,e)}));throw new Error("the pseudo selector "+e.name+" has not yet been implemented")}))));var r,n,a,o,i}Hl=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g;var Hl,Ul=function(e){return e.replace(Hl,"\\\\")},Wl=/\\\\/g;function Yl(e){return e.map((function(e){for(var t=[],r=e.rule;r;)t.push({tag:r.tagName?r.tagName.toLowerCase():"*",combinator:r.nestingOperator||" ",id:r.id,attributes:(e=>{if(e)return e.map((function(e){var t,r,n=e.name.replace(Wl,""),a=(e.value||"").replace(Wl,"");switch(e.operator){case"^=":r=new RegExp("^"+Ul(a));break;case"$=":r=new RegExp(Ul(a)+"$");break;case"~=":r=new RegExp("(^|\\\\s)"+Ul(a)+"(\\\\s|$)");break;case"|=":r=new RegExp("^"+Ul(a)+"(-|$)");break;case"=":t=fu\
nction(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 null!==e}}return""===a&&/^[*$^]=$/.test(e.operator)&&(t=function(){return!1}),{key:n,value:a,type:void 0===e.value?"attrExist":"attrValue",test:t=t||function(e){return e&&r.test(e)}}}))})(r.attrs),classes:(e=>{if(e)return e.map((function(e){return{value:e=e.replace(Wl,""),regexp:new RegExp("(^|\\\\s)"+Ul(e)+"(\\\\s|$)")}}))})(r.classNames),pseudos:(e=>{if(e)return e.map((function(e){var t;return["is","not"].includes(e.name)&&(t=Yl(t=(t=e.value).selectors||[t])),{name:e.name,expressions:t,value:e.value}}))})(r.pseudos)}),r=r.rule;return t}))}function Kl(e){return Yl((e=Vl.parse(e)).selectors||[e])}function Xl(e,t,r){return function e(t,r,n,a){if(!t)return!1;for(var o=Array.isArray(r)?r[n]:r,i=$l(t,o);!i&&a&&t.parent;)i=$l(t=t.parent,o);if(0<n){if(!1===[" ",">"].includes(o.combinator))throw new Error("axe.utils.matchesExpression does not \
support the combinator: "+o.combinator);i=i&&e(t.parent,r,n-1," "===o.combinator)}return i}(e,t,t.length-1,r)}var Zl=function(e,t){for(;e;){if(Gl(e,t))return e;if(void 0===e.parent)throw new TypeError("Cannot resolve parent for non-DOM nodes");e=e.parent}return null};function Jl(){}function Ql(e){if("function"!=typeof e)throw new TypeError("Queue methods require functions as arguments")}for(var eu,tu,ru,nu=function(){function e(e){t=e,setTimeout((function(){null!=t&&ua("Uncaught error (of queue)",t)}),1)}var t,r=[],n=0,o=0,i=Jl,l=!1,u=e;function s(e){return i=Jl,u(e),r}function c(){for(var e=r.length;n<e;n++){var t=r[n];try{t.call(null,(e=>function(t){r[e]=t,--o||i===Jl||(l=!0,i(r))})(n),s)}catch(e){s(e)}}}var d={defer:function(e){var n;if("object"===a(e)&&e.then&&e.catch&&(n=e,e=function(e,t){n.then(e).catch(t)}),Ql(e),void 0===t){if(l)throw new Error("Queue already completed");return r.push(e),++o,c(),d}},then:function(e){if(Ql(e),i!==Jl)throw new Error("queue \`then\` already set");re\
turn t||(i=e,o)||(l=!0,i(r)),d},catch:function(r){if(Ql(r),u!==e)throw new Error("queue \`catch\` already set");return t?(r(t),t=null):u=r,d},abort:s};return d},au=t.crypto||t.msCrypto,ou=(!tu&&au&&au.getRandomValues&&(eu=new Uint8Array(16),tu=function(){return au.getRandomValues(eu),eu}),tu||(ru=new Array(16),tu=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),ru[t]=e>>>((3&t)<<3)&255;return ru}),"function"==typeof t.Buffer?t.Buffer:Array),iu=[],lu={},uu=0;uu<256;uu++)iu[uu]=(uu+256).toString(16).substr(1),lu[iu[uu]]=uu;function su(e,t){return t=t||0,iu[e[t++]]+iu[e[t++]]+iu[e[t++]]+iu[e[t++]]+"-"+iu[e[t++]]+iu[e[t++]]+"-"+iu[e[t++]]+iu[e[t++]]+"-"+iu[e[t++]]+iu[e[t++]]+"-"+iu[e[t++]]+iu[e[t++]]+iu[e[t++]]+iu[e[t++]]+iu[e[t++]]+iu[e[+t]]}var cu=[1|(ye=tu())[0],ye[1],ye[2],ye[3],ye[4],ye[5]],du=16383&(ye[6]<<8|ye[7]),pu=0,fu=0;function mu(e,t,r){var n=t&&r||0,a=t||[],o=(r=null!=(e=e||{}).clockseq?e.clockseq:du,null!=e.msecs?e.msecs:(new Date).getTime()),i=null!=e.\
nsecs?e.nsecs:fu+1;if((l=o-pu+(i-fu)/1e4)<0&&null==e.clockseq&&(r=r+1&16383),1e4<=(i=(l<0||pu<o)&&null==e.nsecs?0:i))throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");pu=o,du=r;for(var l=(1e4*(268435455&(o+=122192928e5))+(fu=i))%4294967296,u=(i=(a[n++]=l>>>24&255,a[n++]=l>>>16&255,a[n++]=l>>>8&255,a[n++]=255&l,o/4294967296*1e4&268435455),a[n++]=i>>>8&255,a[n++]=255&i,a[n++]=i>>>24&15|16,a[n++]=i>>>16&255,a[n++]=r>>>8|128,a[n++]=255&r,e.node||cu),s=0;s<6;s++)a[n+s]=u[s];return t||su(a)}function hu(e,t,r){var n=t&&r||0,a=("string"==typeof e&&(t="binary"==e?new ou(16):null,e=null),(e=e||{}).random||(e.rng||tu)());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||su(a)}(Xo=hu).v1=mu,Xo.v4=hu,Xo.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++]=lu[e])}));a<16;)t[n+a++]=0;return t},Xo.unparse=su,Xo.BufferClass=ou,o._uuid=mu();var gu=hu,vu=Object.freeze(["EvalError","RangeErro\
r","ReferenceError","SyntaxError","TypeError","URIError"]);function bu(){var e="axeAPI",t="";return(e=void 0!==o&&o._audit&&o._audit.application?o._audit.application:e)+"."+(void 0!==o?o.version:t)}function yu(e){Du(e),Aa(t.parent===e,"Source of the response must be the parent window.")}function wu(e){Du(e),Aa(e.parent===t,"Respondable target must be a frame in the current window")}function Du(e){Aa(t!==e,"Messages can not be sent to the same window.")}var xu={},Eu=[];function Au(){var e="".concat(hu(),":").concat(hu());return Eu.includes(e)?Au():(Eu.push(e),e)}function Fu(e,t,r,n){var a,i,l,u;return(r?yu:wu)(e),t.message instanceof Error&&!r?(o.log(t.message),!1):(i=(u=_({messageId:Au()},t)).topic,l=u.message,i={channelId:u.channelId,topic:i,messageId:u.messageId,keepalive:!!u.keepalive,source:bu()},l instanceof Error?i.error={name:l.name,message:l.message,stack:l.stack}:i.payload=l,a=JSON.stringify(i),!(!(u=o._audit.allowedOrigins)||!u.length||("function"==typeof n&&function(e,t,r){r\
=!(2<arguments.length&&void 0!==r)||r,Aa(!Object.prototype.hasOwnProperty.call(xu,e),"A replyHandler already exists for this message channel."),xu[e]={replyHandler:t,sendToParent:r}}(t.channelId,n,r),u.forEach((function(t){try{e.postMessage(a,t)}catch(r){if(r instanceof e.DOMException)throw new Error('allowedOrigins value "'.concat(t,'" is not a valid origin'));throw r}})),0)))}function Cu(e,t,r){var n=!(2<arguments.length&&void 0!==r)||r;return function(r,a,o){Fu(e,{channelId:t,message:r,keepalive:a},n,o)}}function ku(e,r){var n,i,l,u=e.origin,s=e.data;e=e.source;try{var c=function(e){var r,n,o,i;try{r=JSON.parse(e)}catch(e){return}if(null!==(e=r)&&"object"===a(e)&&"string"==typeof e.channelId&&e.source===bu())return n=(e=r).topic,o=e.channelId,i=e.messageId,e=e.keepalive,{topic:n,message:"object"===a(r.error)?(e=>{var r=e.message||"Unknown error occurred",n=vu.includes(e.name)?e.name:"Error";return n=t[n]||Error,e.stack&&(r+="\\n"+e.stack.replace(e.message,"")),new n(r)})(r.error):r.p\
ayload,messageId:i,channelId:o,keepalive:!!e}}(s)||{},d=c.channelId,p=c.message,f=c.messageId;if(i=u,((l=o._audit.allowedOrigins)&&l.includes("*")||l.includes(i))&&(n=f,!Eu.includes(n))&&(Eu.push(n),1))if(p instanceof Error&&e.parent!==t)o.log(p);else try{if(c.topic){var m=Cu(e,d);yu(e),r(c,m)}else{var h=e,g=(b=c).channelId,v=b.message,b=b.keepalive,y=(w=(e=>Object.prototype.hasOwnProperty.call(xu,e)?xu[e]:void 0)(g)||{}).replyHandler,w=w.sendToParent;if(y){(w?yu:wu)(h),h=Cu(h,g,w),!b&&g&&(e=>{delete xu[e]})(g);try{y(v,b,h)}catch(r){o.log(r),h(r,b)}}}}catch(r){var D=e,x=r,E=d;if(!D.parent!==t)o.log(x);else try{Fu(D,{topic:null,channelId:E,message:x,messageId:Au(),keepalive:!0},!0)}catch(r){return void o.log(r)}}}catch(r){o.log(r)}}var Ru,Nu,Tu={open:function(e){var r;if("function"==typeof t.addEventListener)return t.addEventListener("message",r=function(t){ku(t,e)},!1),function(){t.removeEventListener("message",r,!1)}},post:function(e,r,n){return"function"==typeof t.addEventListener&&F\
u(e,r,!1,n)}};function Ou(e){e.updateMessenger(Tu)}var Su={};function _u(e,t,r,n,a){return t={topic:t,message:r,channelId:"".concat(hu(),":").concat(hu()),keepalive:n},Nu(e,t,a)}function Mu(e,t){var r=e.topic,n=e.message;e=e.keepalive;if(r=Object.prototype.hasOwnProperty.call(Su,r)?Su[r]:void 0)try{r(n,e,t)}catch(r){o.log(r),t(r,e)}}function Pu(e,t,r,n){var a,o=e.contentWindow,i=null!=(i=null==(i=t.options)?void 0:i.pingWaitTime)?i:500;o?0===i?Iu(e,t,r,n):(a=setTimeout((function(){a=setTimeout((function(){t.debug?n(Bu("No response from frame",e)):r(null)}),0)}),i),_u(o,"axe.ping",null,void 0,(function(){clearTimeout(a),Iu(e,t,r,n)}))):(ua("Frame does not have a content window",e),r(null))}function Iu(e,t,r,n){var a=null!=(a=null==(a=t.options)?void 0:a.frameWaitTime)?a:6e4,o=e.contentWindow,i=setTimeout((function(){n(Bu("Axe in frame timed out",e))}),a);_u(o,"axe.start",t,void 0,(function(e){clearTimeout(i),(e instanceof Error==0?r:n)(e)}))}function Bu(e,t){var r;return o._tree&&(r=kl(\
t)),new Error(e+": "+(r||t))}_u.updateMessenger=function(e){var t=e.open;e=e.post,Aa("function"==typeof t,"open callback must be a function"),Aa("function"==typeof e,"post callback must be a function"),Ru&&Ru(),t=t(Mu);Ru=t?(Aa("function"==typeof t,"open callback must return a cleanup function"),t):null,Nu=e},_u.subscribe=function(e,t){Aa("function"==typeof t,"Subscriber callback must be a function"),Aa(!Object.prototype.hasOwnProperty.call(Su,e),"Topic ".concat(e," is already registered to.")),Su[e]=t},_u.isInFrame=function(){return!!(0<arguments.length&&void 0!==arguments[0]?arguments[0]:t).frameElement},Ou(_u);var ju=null,Lu={update:function(e){Aa("object"===a(e),"serializer must be an object"),ju=e},toSpec:function(e){return Lu.dqElmToSpec(new Ll(e))},dqElmToSpec:function(e,t){var r,n,a,o,i;return e instanceof Ll==0?e:(t&&(n=(r=e).fromFrame,a=t.ancestry,o=t.xpath,i=!1!==t.selectors||n,(r=new Ll(r.element,t,{source:r.source,nodeIndexes:r.nodeIndexes,selector:i?r.selector:[":root"],a\
ncestry:a?r.ancestry:[":root"],xpath:o?r.xpath:"/"})).fromFrame=n,e=r),"function"==typeof(null==(t=ju)?void 0:t.toSpec)?ju.toSpec(e):e.toJSON())},mergeSpecs:function(e,t){var r;return("function"==typeof(null==(r=ju)?void 0:r.mergeSpecs)?ju:Ll).mergeSpecs(e,t)},mapRawResults:function(e){return e.map((function(e){return _({},e,{nodes:Lu.mapRawNodeResults(e.nodes)})}))},mapRawNodeResults:function(e){return null==e?void 0:e.map((function(e){var t=e.node,r=k(e,d);r.node=Lu.dqElmToSpec(t);for(var n=0,a=["any","all","none"];n<a.length;n++){var o=a[n];r[o]=r[o].map((function(e){var t=e.relatedNodes;return(e=k(e,p)).relatedNodes=t.map(Lu.dqElmToSpec),e}))}return r}))}},qu=Lu,zu=function(e){return[].concat(e.any||[]).concat(e.all||[]).concat(e.none||[])},Vu=function(e,t,r){if(Array.isArray(e))return e.find((function(e){return null!==e&&"object"===a(e)&&Object.hasOwn(e,t)&&e[t]===r}))};function Gu(e,t){for(var r=0<arguments.length&&void 0!==e?e:[],n=1<arguments.length&&void 0!==t?t:[],a=Math.max(\
null==r?void 0:r.length,null==n?void 0:n.length),o=0;o<a;o++){var i=null==r?void 0:r[o],l=null==n?void 0:n[o];if("number"!=typeof i||isNaN(i))return 0===o?1:-1;if("number"!=typeof l||isNaN(l))return 0===o?-1:1;if(i!==l)return i-l}return 0}var $u=function(e,t){var r=[];return e.forEach((function(e){var t,n=(n=e)&&n.results?Array.isArray(n.results)?n.results.length?n.results:null:[n.results]:null;n&&n.length&&(t=(e=>e.frameElement?qu.toSpec(e.frameElement):e.frameSpec||null)(e),n.forEach((function(e){e.nodes&&t&&(a=e.nodes,n=t,a.forEach((function(e){e.node=qu.mergeSpecs(e.node,n),zu(e).forEach((function(e){e.relatedNodes=e.relatedNodes.map((function(e){return qu.mergeSpecs(e,n)}))}))})));var n,a=Vu(r,"id",e.id);a?(e.nodes.length&&((e,t)=>{for(var r=t[0].node,n=0;n<e.length;n++){var a,o=Gu((a=e[n].node).nodeIndexes,r.nodeIndexes);if(0<o||0===o&&r.selector.length<a.selector.length)return e.splice.apply(e,[n,0].concat(M(t)))}e.push.apply(e,M(t))})(a.nodes,e.nodes),e.error&&null==a.error&&(a\
.error=e.error)):r.push(e)})))})),r.forEach((function(e){e.nodes&&e.nodes.sort((function(e,t){return Gu(e.node.nodeIndexes,t.node.nodeIndexes)}))})),r};function Hu(e,t,r,n,a,o){t=_({},t,{elementRef:!1});var i=nu();e.frames.forEach((function(e){var a=e.node,o=k(e,f);i.defer((function(e,i){Pu(a,{options:t,command:r,parameter:n,context:o},(function(t){return e(t?{results:t,frameElement:a}:null)}),i)}))})),i.then((function(e){a($u(e,t))})).catch(o)}function Uu(e,t){if(!e.shadowId&&!t.shadowId&&e.actualNode&&"function"==typeof e.actualNode.contains)return e.actualNode.contains(t.actualNode);do{if(e===t)return!0;if(t.nodeIndex<e.nodeIndex)return!1}while(t=t.parent);return!1}var Wu=function e(){for(var t={},r=arguments.length,n=new Array(r),o=0;o<r;o++)n[o]=arguments[o];return n.forEach((function(r){if(r&&"object"===a(r)&&!Array.isArray(r))for(var n=0,o=Object.keys(r);n<o.length;n++){var i=o[n];!t.hasOwnProperty(i)||"object"!==a(r[i])||Array.isArray(t[i])?t[i]=r[i]:t[i]=e(t[i],r[i])}})),t},Yu\
=function(e,t){Object.assign(e,t),Object.keys(t).filter((function(e){return"function"==typeof t[e]})).forEach((function(r){e[r]=null;try{e[r]=t[r](e)}catch(r){}}))},Ku=["article","aside","blockquote","body","div","footer","h1","h2","h3","h4","h5","h6","header","main","nav","p","section","span"],Xu=function(e){return!!(e.shadowRoot&&(e=e.nodeName.toLowerCase(),Ku.includes(e)||/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(e)))},Zu={},Ju=(ce(Zu,{createGrid:function(){return Js},findElmsInContext:function(){return es},findNearbyElms:function(){return ic},findUp:function(){return rs},findUpVirtual:function(){return ts},focusDisabled:function(){return pc},getComposedParent:function(){return Es},getElementByReference:function(){return gc},getElementCoordinates:function(){return Fs},getElementStack:function(){return wc},getModalDialog:function(){return lc},getNodeGrid:function(){return oc},getOverflowHiddenAncestors:function(){return os},getRootNode:function(){return Qu},getScrollOffset:function(){r\
eturn As},getTabbableElements:function(){return Dc},getTargetRects:function(){return Fc},getTargetSize:function(){return Cc},getTextElementStack:function(){return lp},getViewportSize:function(){return Cs},getVisibleChildTextRects:function(){return op},hasContent:function(){return fp},hasContentVirtual:function(){return pp},hasLangText:function(){return mp},idrefs:function(){return Rc},insertedIntoFocusOrder:function(){return hp},isCurrentPageLink:function(){return hc},isFixedPosition:function(){return ks},isFocusable:function(){return Ec},isHTML5:function(){return yp},isHiddenForEveryone:function(){return ws},isHiddenWithCSS:function(){return bp},isInTabOrder:function(){return Ac},isInTextBlock:function(){return Ep},isInert:function(){return uc},isModalOpen:function(){return Fp},isMultiline:function(){return Cp},isNativelyFocusable:function(){return xc},isNode:function(){return kp},isOffscreen:function(){return Ts},isOpaque:function(){return jp},isSkipLink:function(){return Lp},isVisib\
le:function(){return Gp},isVisibleOnScreen:function(){return Ss},isVisibleToScreenReaders:function(){return xd},isVisualContent:function(){return sp},reduceToElementsBelowFloating:function(){return $p},shadowElementsFromPoint:function(){return Wp},urlPropsFromAttribute:function(){return Yp},visuallyContains:function(){return Hp},visuallyOverlaps:function(){return Kp},visuallySort:function(){return vc}}),function(e){var t=e.getRootNode&&e.getRootNode()||n;return t===e?n:t}),Qu=Ju,es=function(e){var t=e.context,r=e.attr,n=void 0===(n=e.elm)?"":n;e=Ca(e.value),t=9===t.nodeType||11===t.nodeType?t:Qu(t);return Array.from(t.querySelectorAll(n+"["+r+"="+e+"]"))},ts=function(e,t){var r=e.actualNode;if(!e.shadowId&&"function"==typeof e.actualNode.closest)return e.actualNode.closest(t)||null;for(;(r=(r=r.assignedSlot||r.parentNode)&&11===r.nodeType?r.host:r)&&!Sa(r,t)&&r!==n.documentElement;);return r&&Sa(r,t)?r:null},rs=function(e,t){return ts(Ml(e),t)};function ns(e,t){return(0|e.left)<(0|t.ri\
ght)&&(0|e.right)>(0|t.left)&&(0|e.top)<(0|t.bottom)&&(0|e.bottom)>(0|t.top)}var as=pl((function(e){var t=[];return e?("hidden"===e.getComputedStylePropertyValue("overflow")&&t.push(e),t.concat(as(e.parent))):t})),os=as,is=/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/,ls=/(\\w+)\\((\\d+)/;function us(e){return["style","script","noscript","template"].includes(e.props.nodeName)}function ss(e){return"area"!==e.props.nodeName&&"none"===e.getComputedStylePropertyValue("display")}function cs(e){return!(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).isAncestor&&["hidden","collapse"].includes(e.getComputedStylePropertyValue("visibility"))}function ds(e){return!!(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).isAncestor&&"hidden"===e.getComputedStylePropertyValue("content-visibility")}function ps(e){return"true"===e.attr("aria-hidden")}function fs(e){return"0"===e.getComputedStylePropertyValue("opacity")}function ms(e){var t=Sf(e.actualNode),r=pars\
eInt(e.getComputedStylePropertyValue("height"));e=parseInt(e.getComputedStylePropertyValue("width"));return!!t&&(0===r||0===e)}function hs(e){var t,r,n;return!(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).isAncestor&&"fixed"!==(t=e.getComputedStylePropertyValue("position"))&&!!(r=os(e)).length&&(n=e.boundingClientRect,r.some((function(r){return!("absolute"===t&&!((e,t)=>{for(var r=e.parent;r&&r!==t;){if(["relative","sticky"].includes(r.getComputedStylePropertyValue("position")))return 1;r=r.parent}})(e,r)&&"static"===r.getComputedStylePropertyValue("position"))&&((r=r.boundingClientRect).width<2||r.height<2||!ns(n,r))})))}function gs(e){var t=e.getComputedStylePropertyValue("clip").match(is),r=e.getComputedStylePropertyValue("clip-path").match(ls);if(t&&5===t.length&&(e=e.getComputedStylePropertyValue("position"),["fixed","absolute"].includes(e)))return t[3]-t[1]<=0&&t[2]-t[4]<=0;if(r){e=r[1];var n=parseInt(r[2],10);switch(e){case"inset":return 50<=n;case"circle":return 0\
===n}}return!1}function vs(e,t){var r,n=Zl(e,"map");return!n||!((n=n.attr("name"))&&(e=Ju(e.actualNode))&&9===e.nodeType&&(r=ym(o._tree,'img[usemap="#'.concat(Ca(n),'"]')))&&r.length)||r.some((function(e){return!t(e)}))}function bs(e){var t;return"details"===(null==(t=e.parent)?void 0:t.props.nodeName)&&(("summary"!==e.props.nodeName||e.parent.children.find((function(e){return"summary"===e.props.nodeName}))!==e)&&!e.parent.hasAttr("open"))}var ys=[ss,cs,ds,bs];function ws(e){var t=(r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).skipAncestors,r=void 0!==(r=r.isAncestor)&&r;return e=Zf(e).vNode,(t?Ds:xs)(e,r)}var Ds=pl((function(e,t){return!!us(e)||!(!e.actualNode||!ys.some((function(r){return r(e,{isAncestor:t})}))&&e.actualNode.isConnected)})),xs=pl((function(e,t){return!!Ds(e,t)||!!e.parent&&xs(e.parent,!0)})),Es=function e(t){if(t.assignedSlot)return e(t.assignedSlot);if(t.parentNode){if(1===(t=t.parentNode).nodeType)return t;if(t.host)return t.host}return null},As=func\
tion(e){var t,r;return 9===(e=!e.nodeType&&e.document?e.document:e).nodeType?(t=e.documentElement,r=e.body,{left:t&&t.scrollLeft||r&&r.scrollLeft||0,top:t&&t.scrollTop||r&&r.scrollTop||0}):{left:e.scrollLeft,top:e.scrollTop}},Fs=function(e){var t=(r=As(n)).left,r=r.top;return{top:(e=e.getBoundingClientRect()).top+r,right:e.right+t,bottom:e.bottom+r,left:e.left+t,width:e.right-e.left,height:e.bottom-e.top}},Cs=function(e){var t=e.document,r=t.documentElement;return e.innerWidth?{width:e.innerWidth,height:e.innerHeight}:r?{width:r.clientWidth,height:r.clientHeight}:{width:(e=t.body).clientWidth,height:e.clientHeight}};function ks(e){var t=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).skipAncestors;return!!(e=Zf(e).vNode)&&(t?Rs:Ns)(e)}var Rs=pl((function(e){return"fixed"===e.getComputedStylePropertyValue("position")})),Ns=pl((function(e){return!!Rs(e)||!!e.parent&&Ns(e.parent)})),Ts=function(e){var r,a,o,i,l;return!(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{})\
.isAncestor&&((e=Zf(e).domNode)?(r=n.documentElement,l=t.getComputedStyle(e),a=t.getComputedStyle(n.body||r).getPropertyValue("direction"),(0!==(i=(o=ks(e))?e.getBoundingClientRect():Fs(e)).top||0!==i.bottom)&&!(0===i.left&&0===i.right||!(i.bottom<=0&&(((e,t)=>{for(e=Es(e);e&&"html"!==e.nodeName.toLowerCase();){if(e.scrollTop&&0<=(t+=e.scrollTop))return;e=Es(e)}return 1})(e,i.bottom)||"absolute"===l.position)||(e=Cs(t),o&&i.top>=e.height)||(l=Math.max(r.scrollWidth,e.width),(o||"rtl"===a)&&i.left>=l)||(o||"ltr"===a)&&i.right<=0))):void 0)},Os=[fs,ms,hs,gs,Ts];function Ss(e){return e=Zf(e).vNode,_s(e)}var _s=pl((function(e,t){return e.actualNode&&"area"===e.props.nodeName?!vs(e,_s):!(ws(e,{skipAncestors:!0,isAncestor:t})||e.actualNode&&Os.some((function(r){return r(e,{isAncestor:t})})))&&(!e.parent||_s(e.parent,!0))}));function Ms(e,r){var n=Math.min(e.top,r.top),a=Math.max(e.right,r.right),o=Math.max(e.bottom,r.bottom);e=Math.min(e.left,r.left);return new t.DOMRect(e,n,a-e,o-n)}functio\
n Ps(e,t){var r=e.x;e=e.y;return t.top<=e&&r<=t.right&&e<=t.bottom&&t.left<=r}var Is={};function Bs(e,r){var n=Math.max(e.left,r.left),a=Math.min(e.right,r.right),o=Math.max(e.top,r.top);e=Math.min(e.bottom,r.bottom);return a<=n||e<=o?null:new t.DOMRect(n,o,a-n,e-o)}function js(e){var r=e.left;return new t.DOMPoint(r+e.width/2,e.top+e.height/2)}ce(Is,{getBoundingRect:function(){return Ms},getIntersectionRect:function(){return Bs},getOffset:function(){return zs},getRectCenter:function(){return js},hasVisualOverlap:function(){return Gs},isPointInRect:function(){return Ps},rectHasMinimumSize:function(){return qs},rectsOverlap:function(){return ns},splitRects:function(){return $s}});var Ls=.05;function qs(e,t){return e<=t.width+Ls&&e<=t.height+Ls}function zs(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:12,n=(e=Fc(e),Fc(t));return e.length&&n.length?e.reduce((function(e,a){var o,i=js(a),l=K(n);try{for(l.s();!(o=l.n()).done;){var u=o.value;if(Ps(i,u))return 0;var s=Vs(i,\
((e,t)=>({x:e.x<t.left?t.left:e.x>t.right?t.right:e.x,y:t=e.y<t.top?t.top:e.y>t.bottom?t.bottom:e.y}))(i,u));e=Math.min(e,s)}}catch(e){l.e(e)}finally{l.f()}a=Cc(t);return qs(2*r,a)?e:(a=Vs(i,js(n.reduce(Ms)))-r,Math.max(0,Math.min(e,a)))}),1/0):null}function Vs(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function Gs(e,t){var r=e.boundingClientRect,n=t.boundingClientRect;return!(r.left>=n.right||r.right<=n.left||r.top>=n.bottom||r.bottom<=n.top)&&0<vc(e,t)}function $s(e,t){var r,n=Array.isArray(e)?e:[e],a=K(t);try{var o=function(){var e=r.value;if(4e3<(n=n.reduce((function(t,r){return t.concat(((e,t)=>{var r=e.top,n=e.left,a=e.bottom,o=e.right,i=r<t.bottom&&a>t.top,l=n<t.right&&o>t.left,u=[];if(Hs(t.top,r,a)&&l&&u.push({top:r,left:n,bottom:t.top,right:o}),Hs(t.right,n,o)&&i&&u.push({top:r,left:t.right,bottom:a,right:o}),Hs(t.bottom,r,a)&&l&&u.push({top:t.bottom,right:o,bottom:a,left:n}),Hs(t.left,n,o)&&i&&u.push({top:r,left:n,bottom:a,right:t.left}),0===u.length){if(((e,t)=>e.top>=t.top&&e.\
left>=t.left&&e.bottom<=t.bottom&&e.right<=t.right)(e,t))return[];u.push(e)}return u.map(Us)})(r,e))}),[])).length)throw new Error("splitRects: Too many rects")};for(a.s();!(r=a.n()).done;)o()}catch(e){a.e(e)}finally{a.f()}return n}var Hs=function(e,t,r){return t<e&&e<r};function Us(e){return new t.DOMRect(e.left,e.top,e.right-e.left,e.bottom-e.top)}var Ws=0,Ys=.1,Ks=.2,Xs=.3,Zs=0;function Js(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:n.body,r=1<arguments.length?arguments[1]:void 0,a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!_l.get("gridCreated")||a){_l.set("gridCreated",!0),a||(l=(l=Ml(n.documentElement))||new Qp(n.documentElement),Zs=0,l._stackingOrder=[tc(Ws,Zs++,null)],rc(r=null!=r?r:new nc,l),Sf(l.actualNode)&&(i=new nc(l),l._subGrid=i));for(var i,l,u=n.createTreeWalker(e,t.NodeFilter.SHOW_ELEMENT,null,!1),s=a?u.nextNode():u.currentNode;s;){var c=Ml(s),d=(c&&c.parent?a=c.parent:s.assignedSlot?a=Ml(s.assignedSlot):s.parentElement?a=Ml(s.par\
entElement):s.parentNode&&Ml(s.parentNode)&&(a=Ml(s.parentNode)),(c=c||new o.VirtualNode(s,a))._stackingOrder=((e,t,r)=>{var n=t._stackingOrder.slice(),a=(Qs(e,t)&&-1!==(a=n.findIndex((function(e){return e=e.stackLevel,[Ws,Ks,Xs].includes(e)})))&&n.splice(a,n.length-a),((e,t)=>{var r=((e,t)=>"static"!==e.getComputedStylePropertyValue("position")||ec(t)?e.getComputedStylePropertyValue("z-index"):"auto")(e,t);return["auto","0"].includes(r)?"static"!==e.getComputedStylePropertyValue("position")?Xs:"none"!==e.getComputedStylePropertyValue("float")?Ks:Qs(e,t)?Ys:null:parseInt(r)})(e,t));return null!==a&&n.push(tc(a,r,e)),n})(c,a,Zs++),((e,t)=>{for(var r=null,n=[e];t;){if(Sf(t.actualNode)){r=t;break}if(t._scrollRegionParent){r=t._scrollRegionParent;break}n.push(t),t=Ml(t.actualNode.parentElement||t.actualNode.parentNode)}return n.forEach((function(e){return e._scrollRegionParent=r})),r})(c,a)),p=(d=d?d._subGrid:r,Sf(c.actualNode)&&(p=new nc(c),c._subGrid=p),c.boundingClientRect);0!==p.width&\
&0!==p.height&&Ss(s)&&rc(d,c),Xu(s)&&Js(s.shadowRoot,d,c),s=u.nextNode()}}return la.gridSize}function Qs(e,t){var r=e.getComputedStylePropertyValue("position"),n=e.getComputedStylePropertyValue("z-index");return"fixed"===r||"sticky"===r||"auto"!==n&&"static"!==r||"1"!==e.getComputedStylePropertyValue("opacity")||"none"!==(e.getComputedStylePropertyValue("-webkit-transform")||e.getComputedStylePropertyValue("-ms-transform")||e.getComputedStylePropertyValue("transform")||"none")||(r=e.getComputedStylePropertyValue("mix-blend-mode"))&&"normal"!==r||(r=e.getComputedStylePropertyValue("filter"))&&"none"!==r||(r=e.getComputedStylePropertyValue("perspective"))&&"none"!==r||(r=e.getComputedStylePropertyValue("clip-path"))&&"none"!==r||"none"!==(e.getComputedStylePropertyValue("-webkit-mask")||e.getComputedStylePropertyValue("mask")||"none")||"none"!==(e.getComputedStylePropertyValue("-webkit-mask-image")||e.getComputedStylePropertyValue("mask-image")||"none")||"none"!==(e.getComputedStylePrope\
rtyValue("-webkit-mask-border")||e.getComputedStylePropertyValue("mask-border")||"none")||"isolate"===e.getComputedStylePropertyValue("isolation")||"transform"===(r=e.getComputedStylePropertyValue("will-change"))||"opacity"===r||"touch"===e.getComputedStylePropertyValue("-webkit-overflow-scrolling")||(r=e.getComputedStylePropertyValue("contain"),["layout","paint","strict","content"].includes(r))||!("auto"===n||!ec(t))}function ec(e){if(e)return e=e.getComputedStylePropertyValue("display"),["flex","inline-flex","grid","inline-grid"].includes(e)}function tc(e,t,r){return{stackLevel:e,treeOrder:t,vNode:r}}function rc(e,t){var r=os(t);t.clientRects.forEach((function(n){n=r.reduce((function(e,t){return e&&Bs(e,t.boundingClientRect)}),n);n&&(null==t._grid&&(t._grid=e),n=e.getGridPositionOfRect(n),e.loopGridPosition(n,(function(e){e.includes(t)||e.push(t)})))}))}var nc=W((function e(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null;H(this,e),this.container=t,this.cells=[]}),\
[{key:"toGridIndex",value:function(e){return Math.floor(e/la.gridSize)}},{key:"getCellFromPoint",value:function(e){var t=e.x;e=e.y,Aa(this.boundaries,"Grid does not have cells added"),e=this.toGridIndex(e),t=this.toGridIndex(t);return null!=(t=(e=(Aa(Ps({y:e,x:t},this.boundaries),"Element midpoint exceeds the grid bounds"),null!=(e=this.cells[e-this.cells._negativeIndex])?e:[]))[t-e._negativeIndex])?t:[]}},{key:"loopGridPosition",value:function(e,t){var r=(o=e).left,n=o.right,a=o.top,o=o.bottom;this.boundaries&&(e=Ms(this.boundaries,e)),this.boundaries=e,ac(this.cells,a,o,(function(e,a){ac(e,r,n,(function(e,r){t(e,{row:a,col:r})}))}))}},{key:"getGridPositionOfRect",value:function(e){var r=e.top,n=e.right,a=e.bottom,o=(e=e.left,1<arguments.length&&void 0!==arguments[1]?arguments[1]:0);r=this.toGridIndex(r-o),n=this.toGridIndex(n+o-1),a=this.toGridIndex(a+o-1),e=this.toGridIndex(e-o);return new t.DOMRect(e,r,n-e,a-r)}}]);function ac(e,t,r,n){if(null!=e._negativeIndex||(e._negativeIndex=0\
),t<e._negativeIndex){for(var a=0;a<e._negativeIndex-t;a++)e.splice(0,0,[]);e._negativeIndex=t}for(var o,i=r-e._negativeIndex,l=t-e._negativeIndex;l<=i;l++)null==e[o=l]&&(e[o]=[]),n(e[l],l+e._negativeIndex)}function oc(e){return Js(),Zf(e).vNode._grid}function ic(e){var t,r,n,a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,o=oc(e);return null!=o&&null!=(r=o.cells)&&r.length?(r=e.boundingClientRect,t=ks(e),r=o.getGridPositionOfRect(r,a),n=[],o.loopGridPosition(r,(function(r){var a,o=K(r);try{for(o.s();!(a=o.n()).done;){var i=a.value;i&&i!==e&&!n.includes(i)&&t===ks(i)&&n.push(i)}}catch(r){o.e(r)}finally{o.f()}})),n):[]}var lc=pl((function(){var e;return o._tree&&(e=sm(o._tree[0],"dialog[open]",(function(e){var t=e.boundingClientRect;return n.elementsFromPoint(t.left+1,t.top+1).includes(e.actualNode)&&Ss(e)}))).length?e.find((function(e){var t=e.boundingClientRect;return n.elementsFromPoint(t.left-10,t.top-10).includes(e.actualNode)}))||(null!=(e=e.find((function(e){e=null!=(e\
=(e=>{Js();var r=o._tree[0]._grid,n=new t.DOMRect(0,0,t.innerWidth,t.innerHeight);if(r)for(var a=0;a<r.cells.length;a++){var i=r.cells[a];if(i)for(var l=0;l<i.length;l++){var u=i[l];if(u)for(var s=0;s<u.length;s++){var c=u[s],d=Bs(c.boundingClientRect,n);if("html"!==c.props.nodeName&&c!==e&&"none"!==c.getComputedStylePropertyValue("pointer-events")&&d)return{vNode:c,rect:d}}}}})(e))?e:{};var r=e.vNode;e=e.rect;return!!r&&!n.elementsFromPoint(e.left+1,e.top+1).includes(r.actualNode)})))?e:null):null}));function uc(e){var t=(r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).skipAncestors,r=r.isAncestor;return(t?sc:cc)(e,r)}var sc=pl((function(e,t){return!!e.hasAttr("inert")||!(t||!e.actualNode||!(t=lc())||Uu(t,e))})),cc=pl((function(e,t){return!!sc(e,t)||!!e.parent&&cc(e.parent,!0)})),dc=["button","command","fieldset","keygen","optgroup","option","select","textarea","input"],pc=function(e){var t=Zf(e).vNode;if(e=t.props.nodeName,dc.includes(e)&&t.hasAttr("disabled")||uc(t))ret\
urn!0;for(var r=t.parent,n=[],a=!1;r&&r.shadowId===t.shadowId&&!a&&(n.push(r),"legend"!==r.props.nodeName);){if(void 0!==r._inDisabledFieldset){a=r._inDisabledFieldset;break}"fieldset"===r.props.nodeName&&r.hasAttr("disabled")&&(a=!0),r=r.parent}return n.forEach((function(e){return e._inDisabledFieldset=a})),!!a||"area"!==t.props.nodeName&&!!t.actualNode&&ws(t)},fc=/^\\/\\#/,mc=/^#[!/]/;function hc(e){var r,n,a,o,i=e.getAttribute("href");return!(!i||"#"===i)&&(!!fc.test(i)||(o=e.hash,r=e.protocol,n=e.hostname,a=e.port,e=e.pathname,!mc.test(o)&&("#"===i.charAt(0)||("string"!=typeof(null==(o=t.location)?void 0:o.origin)||-1===t.location.origin.indexOf("://")?null:(i=t.location.origin+t.location.pathname,o=n?"".concat(r,"//").concat(n).concat(a?":".concat(a):""):t.location.origin,(o+=e?("/"!==e[0]?"/":"")+e:t.location.pathname)===i)))))}var gc=function(e,t){var r=e.getAttribute(t);return r&&("href"!==t||hc(e))?(-1!==r.indexOf("#")&&(r=decodeURIComponent(r.substr(r.indexOf("#")+1))),(t=n.get\
ElementById(r))||((t=n.getElementsByName(r)).length?t[0]:null)):null};function vc(e,r){Js();for(var n=Math.max(e._stackingOrder.length,r._stackingOrder.length),a=0;a<n;a++){if(void 0===r._stackingOrder[a])return-1;if(void 0===e._stackingOrder[a])return 1;if(r._stackingOrder[a].stackLevel>e._stackingOrder[a].stackLevel)return 1;if(r._stackingOrder[a].stackLevel<e._stackingOrder[a].stackLevel)return-1;if(r._stackingOrder[a].treeOrder!==e._stackingOrder[a].treeOrder)return r._stackingOrder[a].treeOrder-e._stackingOrder[a].treeOrder}var o=e.actualNode,i=r.actualNode;if(o.getRootNode&&o.getRootNode()!==i.getRootNode()){for(var l=[];o;)l.push({root:o.getRootNode(),node:o}),o=o.getRootNode().host;for(;i&&!l.find((function(e){return e.root===i.getRootNode()}));)i=i.getRootNode().host;if((o=l.find((function(e){return e.root===i.getRootNode()})).node)===i)return e.actualNode.getRootNode()!==o.getRootNode()?-1:1}var u,s=(d=t.Node).DOCUMENT_POSITION_FOLLOWING,c=d.DOCUMENT_POSITION_CONTAINS,d=d.DOC\
UMENT_POSITION_CONTAINED_BY;s=(u=o.compareDocumentPosition(i))&s?1:-1,c=u&c||u&d;return(u=bc(e))===(d=bc(r))||c?s:d-u}function bc(e){return-1!==e.getComputedStylePropertyValue("display").indexOf("inline")?2:function e(t){if(!t)return!1;if(void 0!==t._isFloated)return t._isFloated;var r=t.getComputedStylePropertyValue("float");return"none"!==r?t._isFloated=!0:(r=e(t.parent),t._isFloated=r,r)}(e)?1:0}function yc(e,t,r){r=2<arguments.length&&void 0!==r&&r,t=js(t);var a=e.getCellFromPoint(t)||[],o=Math.floor(t.x),i=Math.floor(t.y);t=a.filter((function(e){return e.clientRects.some((function(e){var t=e.left,r=e.top;return o<Math.floor(t+e.width)&&o>=Math.floor(t)&&i<Math.floor(r+e.height)&&i>=Math.floor(r)}))}));return(a=e.container)&&(t=yc(a._grid,a.boundingClientRect,!0).concat(t)),r?t:t.sort(vc).map((function(e){return e.actualNode})).concat(n.documentElement).filter((function(e,t,r){return r.indexOf(e)===t}))}var wc=function(e){var t=oc(e);return t?yc(t,Ml(e).boundingClientRect):[]},Dc=f\
unction(e){return ym(e,"*").filter((function(e){var t=e.isFocusable;return null!==(e=nm(e.actualNode.getAttribute("tabindex")))?t&&0<=e:t}))},xc=function(e){var t=Zf(e).vNode;if(t&&!pc(t))switch(t.props.nodeName){case"a":case"area":if(t.hasAttr("href"))return!0;break;case"input":return"hidden"!==t.props.type;case"textarea":case"select":case"summary":case"button":return!0;case"details":return!ym(t,"summary").length}return!1};function Ec(e){return 1===(e=Zf(e).vNode).props.nodeType&&!(pc(e)||!xc(e)&&null===nm(e.attr("tabindex")))}function Ac(e){return 1===(e=Zf(e).vNode).props.nodeType&&!(nm(e.attr("tabindex"))<=-1)&&Ec(e)}var Fc=pl((function(e){var t="inline"===e.getComputedStylePropertyValue("display")?e.clientRects:[e.boundingClientRect],r=ic(e).filter((function(t){return Gs(e,t)&&"none"!==t.getComputedStylePropertyValue("pointer-events")&&!(Uu(e,t)&&!Ac(t))}));return r.length?(r=r.map((function(e){return"inline"===e.getComputedStylePropertyValue("display")?e.clientRects:e.boundingCli\
entRect})).flat(1/0),$s(t,r)):t})),Cc=pl((function(e,t){return((e,t)=>e.reduce((function(e,r){var n=qs(t,e);return n!==qs(t,r)?n?e:r:(n=e.width*e.height,r.width*r.height<n?e:r)})))(Fc(e),t)})),kc={},Rc=(ce(kc,{accessibleText:function(){return Nc},accessibleTextVirtual:function(){return Wd},autocomplete:function(){return Zd},formControlValue:function(){return Id},formControlValueMethods:function(){return Md},hasUnicode:function(){return Hd},isHumanInterpretable:function(){return Xd},isIconLigature:function(){return Ud},isValidAutocomplete:function(){return Jd},label:function(){return rp},labelText:function(){return Ld},labelVirtual:function(){return tp},nativeElementType:function(){return np},nativeTextAlternative:function(){return $d},nativeTextMethods:function(){return Gd},removeUnicode:function(){return Kd},sanitize:function(){return Kc},subtreeText:function(){return jd},titleText:function(){return bd},unsupported:function(){return Dd},visible:function(){return ep},visibleTextNodes:f\
unction(){return ap},visibleVirtual:function(){return Ad}}),function(e,t){e=e.actualNode||e;try{var r=Qu(e),n=[];if(a=e.getAttribute(t))for(var a=ef(a),o=0;o<a.length;o++)n.push(r.getElementById(a[o]));return n}catch(e){throw new TypeError("Cannot resolve id references for non-DOM nodes")}}),Nc=function(e,t){return Wd(Ml(e),t)},Tc=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=Zf(e).vNode;return 1!==(null==r?void 0:r.props.nodeType)||1!==r.props.nodeType||t.inLabelledByContext||t.inControlContext||!r.attr("aria-labelledby")?"":Rc(r,"aria-labelledby").filter((function(e){return e})).reduce((function(e,n){return n=Nc(n,_({inLabelledByContext:!0,startNode:t.startNode||r},t)),e?"".concat(e," ").concat(n):n}),"")};function Oc(e){return 1===(null==(e=Zf(e).vNode)?void 0:e.props.nodeType)&&e.attr("aria-label")||""}var Sc={"aria-activedescendant":{type:"idref",allowEmpty:!0},"aria-atomic":{type:"boolean",global:!0},"aria-autocomplete":{type:"nmtoken",values:["inl\
ine","list","both","none"]},"aria-braillelabel":{type:"string",allowEmpty:!0,global:!0},"aria-brailleroledescription":{type:"string",allowEmpty:!0,global:!0},"aria-busy":{type:"boolean",global:!0},"aria-checked":{type:"nmtoken",values:["false","mixed","true","undefined"]},"aria-colcount":{type:"int",minValue:-1},"aria-colindex":{type:"int",minValue:1},"aria-colspan":{type:"int",minValue:1},"aria-controls":{type:"idrefs",allowEmpty:!0,global:!0},"aria-current":{type:"nmtoken",allowEmpty:!0,values:["page","step","location","date","time","true","false"],global:!0},"aria-describedby":{type:"idrefs",allowEmpty:!0,global:!0},"aria-description":{type:"string",allowEmpty:!0,global:!0},"aria-details":{type:"idref",allowEmpty:!0,global:!0},"aria-disabled":{type:"boolean",global:!0},"aria-dropeffect":{type:"nmtokens",values:["copy","execute","link","move","none","popup"],global:!0},"aria-errormessage":{type:"idref",allowEmpty:!0,global:!0},"aria-expanded":{type:"nmtoken",values:["true","false","u\
ndefined"]},"aria-flowto":{type:"idrefs",allowEmpty:!0,global:!0},"aria-grabbed":{type:"nmtoken",values:["true","false","undefined"],global:!0},"aria-haspopup":{type:"nmtoken",allowEmpty:!0,values:["true","false","menu","listbox","tree","grid","dialog"],global:!0},"aria-hidden":{type:"nmtoken",values:["true","false","undefined"],global:!0},"aria-invalid":{type:"nmtoken",values:["grammar","false","spelling","true"],global:!0},"aria-keyshortcuts":{type:"string",allowEmpty:!0,global:!0},"aria-label":{type:"string",allowEmpty:!0,global:!0},"aria-labelledby":{type:"idrefs",allowEmpty:!0,global:!0},"aria-level":{type:"int",minValue:1},"aria-live":{type:"nmtoken",values:["assertive","off","polite"],global:!0},"aria-modal":{type:"boolean"},"aria-multiline":{type:"boolean"},"aria-multiselectable":{type:"boolean"},"aria-orientation":{type:"nmtoken",values:["horizontal","undefined","vertical"]},"aria-owns":{type:"idrefs",allowEmpty:!0,global:!0},"aria-placeholder":{type:"string",allowEmpty:!0},"a\
ria-posinset":{type:"int",minValue:1},"aria-pressed":{type:"nmtoken",values:["false","mixed","true","undefined"]},"aria-readonly":{type:"boolean"},"aria-relevant":{type:"nmtokens",values:["additions","all","removals","text"],global:!0},"aria-required":{type:"boolean"},"aria-roledescription":{type:"string",allowEmpty:!0,global:!0},"aria-rowcount":{type:"int",minValue:-1},"aria-rowindex":{type:"int",minValue:1},"aria-rowspan":{type:"int",minValue:0},"aria-selected":{type:"nmtoken",values:["false","true","undefined"]},"aria-setsize":{type:"int",minValue:-1},"aria-sort":{type:"nmtoken",values:["ascending","descending","none","other"]},"aria-valuemax":{type:"decimal"},"aria-valuemin":{type:"decimal"},"aria-valuenow":{type:"decimal"},"aria-valuetext":{type:"string",allowEmpty:!0}},_c={alert:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"]},alertdialog:{type:"window",allowedAttrs:["aria-expanded","aria-modal"],superclassRole:["alert","dialog"],accessibleNameRequired\
:!0},application:{type:"landmark",allowedAttrs:["aria-activedescendant","aria-expanded"],superclassRole:["structure"],accessibleNameRequired:!0},article:{type:"structure",allowedAttrs:["aria-posinset","aria-setsize","aria-expanded"],superclassRole:["document"]},banner:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},blockquote:{type:"structure",superclassRole:["section"]},button:{type:"widget",allowedAttrs:["aria-expanded","aria-pressed"],superclassRole:["command"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},caption:{type:"structure",requiredContext:["figure","table","grid","treegrid"],superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},cell:{type:"structure",requiredContext:["row"],allowedAttrs:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan","aria-expanded"],superclassRole:["section"],nameFromContent:!0},checkbox:{type:"widget",requiredAttrs:["aria-checked"],allowedAttrs:["aria-readonly","a\
ria-expanded","aria-required"],superclassRole:["input"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},code:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},columnheader:{type:"structure",requiredContext:["row"],allowedAttrs:["aria-sort","aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],superclassRole:["cell","gridcell","sectionhead"],accessibleNameRequired:!1,nameFromContent:!0},combobox:{type:"widget",requiredAttrs:["aria-expanded","aria-controls"],allowedAttrs:["aria-owns","aria-autocomplete","aria-readonly","aria-required","aria-activedescendant","aria-orientation"],superclassRole:["select"],accessibleNameRequired:!0},command:{type:"abstract",superclassRole:["widget"]},complementary:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},composite:{type:"abstract",superclassRole:["widget"]},contentinfo:{type:"landma\
rk",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},comment:{type:"structure",allowedAttrs:["aria-level","aria-posinset","aria-setsize"],superclassRole:["article"]},definition:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"]},deletion:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},dialog:{type:"window",allowedAttrs:["aria-expanded","aria-modal"],superclassRole:["window"],accessibleNameRequired:!0},directory:{type:"structure",deprecated:!0,allowedAttrs:["aria-expanded"],superclassRole:["list"],nameFromContent:!0},document:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["structure"]},emphasis:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},feed:{type:"structure",requiredOwned:["article"],allowedAttrs:["aria-expanded"],superclassRole:["list"]},figure:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"],nameFromContent\
:!0},form:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},grid:{type:"composite",requiredOwned:["rowgroup","row"],allowedAttrs:["aria-level","aria-multiselectable","aria-readonly","aria-activedescendant","aria-colcount","aria-expanded","aria-rowcount"],superclassRole:["composite","table"],accessibleNameRequired:!1},gridcell:{type:"widget",requiredContext:["row"],allowedAttrs:["aria-readonly","aria-required","aria-selected","aria-colindex","aria-colspan","aria-expanded","aria-rowindex","aria-rowspan"],superclassRole:["cell","widget"],nameFromContent:!0},group:{type:"structure",allowedAttrs:["aria-activedescendant","aria-expanded"],superclassRole:["section"]},heading:{type:"structure",requiredAttrs:["aria-level"],allowedAttrs:["aria-expanded"],superclassRole:["sectionhead"],accessibleNameRequired:!1,nameFromContent:!0},img:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"],accessibleNameRequired:!0,childrenPresentational:!0},input:{ty\
pe:"abstract",superclassRole:["widget"]},insertion:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},landmark:{type:"abstract",superclassRole:["section"]},link:{type:"widget",allowedAttrs:["aria-expanded"],superclassRole:["command"],accessibleNameRequired:!0,nameFromContent:!0},list:{type:"structure",requiredOwned:["listitem"],allowedAttrs:["aria-expanded"],superclassRole:["section"]},listbox:{type:"widget",requiredOwned:["group","option"],allowedAttrs:["aria-multiselectable","aria-readonly","aria-required","aria-activedescendant","aria-expanded","aria-orientation"],superclassRole:["select"],accessibleNameRequired:!0},listitem:{type:"structure",requiredContext:["list"],allowedAttrs:["aria-level","aria-posinset","aria-setsize","aria-expanded"],superclassRole:["section"],nameFromContent:!0},log:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"]},main:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["land\
mark"]},marquee:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"]},math:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"],childrenPresentational:!0},menu:{type:"composite",requiredOwned:["group","menuitemradio","menuitem","menuitemcheckbox","menu","separator"],allowedAttrs:["aria-activedescendant","aria-expanded","aria-orientation"],superclassRole:["select"]},menubar:{type:"composite",requiredOwned:["group","menuitemradio","menuitem","menuitemcheckbox","menu","separator"],allowedAttrs:["aria-activedescendant","aria-expanded","aria-orientation"],superclassRole:["menu"]},menuitem:{type:"widget",requiredContext:["menu","menubar","group"],allowedAttrs:["aria-posinset","aria-setsize","aria-expanded"],superclassRole:["command"],accessibleNameRequired:!0,nameFromContent:!0},menuitemcheckbox:{type:"widget",requiredContext:["menu","menubar","group"],requiredAttrs:["aria-checked"],allowedAttrs:["aria-expanded","aria-posinset","aria-readonly","a\
ria-setsize"],superclassRole:["checkbox","menuitem"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},menuitemradio:{type:"widget",requiredContext:["menu","menubar","group"],requiredAttrs:["aria-checked"],allowedAttrs:["aria-expanded","aria-posinset","aria-readonly","aria-setsize"],superclassRole:["menuitemcheckbox","radio"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},meter:{type:"structure",requiredAttrs:["aria-valuenow"],allowedAttrs:["aria-valuemax","aria-valuemin","aria-valuetext"],superclassRole:["range"],accessibleNameRequired:!0,childrenPresentational:!0},mark:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},navigation:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},none:{type:"structure",superclassRole:["structure"],prohibitedAttrs:["aria-label","aria-labelledby"]},note:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"]},option:{\
type:"widget",requiredContext:["group","listbox"],allowedAttrs:["aria-selected","aria-checked","aria-posinset","aria-setsize"],superclassRole:["input"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},paragraph:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},presentation:{type:"structure",superclassRole:["structure"],prohibitedAttrs:["aria-label","aria-labelledby"]},progressbar:{type:"widget",allowedAttrs:["aria-expanded","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],superclassRole:["range"],accessibleNameRequired:!0,childrenPresentational:!0},radio:{type:"widget",requiredAttrs:["aria-checked"],allowedAttrs:["aria-posinset","aria-setsize","aria-required"],superclassRole:["input"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},radiogroup:{type:"composite",allowedAttrs:["aria-readonly","aria-required","aria-activedescendant","aria-expanded","aria-orientation"],superclassRole\
:["select"],accessibleNameRequired:!1},range:{type:"abstract",superclassRole:["widget"]},region:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"],accessibleNameRequired:!1},roletype:{type:"abstract",superclassRole:[]},row:{type:"structure",requiredContext:["grid","rowgroup","table","treegrid"],requiredOwned:["cell","columnheader","gridcell","rowheader"],allowedAttrs:["aria-colindex","aria-level","aria-rowindex","aria-selected","aria-activedescendant","aria-expanded","aria-posinset","aria-setsize"],superclassRole:["group","widget"],nameFromContent:!0},rowgroup:{type:"structure",requiredContext:["grid","table","treegrid"],requiredOwned:["row"],superclassRole:["structure"],nameFromContent:!0},rowheader:{type:"structure",requiredContext:["row"],allowedAttrs:["aria-sort","aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],superclassRole:["cell","gridcell","sectionhead"],accessibleNameRequire\
d:!1,nameFromContent:!0},scrollbar:{type:"widget",requiredAttrs:["aria-valuenow"],allowedAttrs:["aria-controls","aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],superclassRole:["range"],childrenPresentational:!0},search:{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},searchbox:{type:"widget",allowedAttrs:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],superclassRole:["textbox"],accessibleNameRequired:!0},section:{type:"abstract",superclassRole:["structure"],nameFromContent:!0},sectionhead:{type:"abstract",superclassRole:["structure"],nameFromContent:!0},select:{type:"abstract",superclassRole:["composite","group"]},separator:{type:"structure",requiredAttrs:["aria-valuenow"],allowedAttrs:["aria-valuemax","aria-valuemin","aria-orientation","aria-valuetext"],superclassRole:["structure","widget"],childrenPresentational:!0},slider:{type:"widget",requiredAttrs:["aria-valuenow"],a\
llowedAttrs:["aria-valuemax","aria-valuemin","aria-orientation","aria-readonly","aria-required","aria-valuetext"],superclassRole:["input","range"],accessibleNameRequired:!0,childrenPresentational:!0},spinbutton:{type:"widget",allowedAttrs:["aria-valuemax","aria-valuemin","aria-readonly","aria-required","aria-activedescendant","aria-valuetext","aria-valuenow"],superclassRole:["composite","input","range"],accessibleNameRequired:!0},status:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"]},strong:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},structure:{type:"abstract",superclassRole:["roletype"]},subscript:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},superscript:{type:"structure",superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},switch:{type:"widget",requiredAttrs:["aria-checked"],allowedAttrs:["aria-expanded","aria-readonly","aria-require\
d"],superclassRole:["checkbox"],accessibleNameRequired:!0,nameFromContent:!0,childrenPresentational:!0},suggestion:{type:"structure",requiredOwned:["insertion","deletion"],superclassRole:["section"],prohibitedAttrs:["aria-label","aria-labelledby"]},tab:{type:"widget",requiredContext:["tablist"],allowedAttrs:["aria-posinset","aria-selected","aria-setsize","aria-expanded"],superclassRole:["sectionhead","widget"],nameFromContent:!0,childrenPresentational:!0},table:{type:"structure",requiredOwned:["rowgroup","row"],allowedAttrs:["aria-colcount","aria-rowcount","aria-expanded"],superclassRole:["section"],accessibleNameRequired:!1,nameFromContent:!0},tablist:{type:"composite",requiredOwned:["tab"],allowedAttrs:["aria-level","aria-multiselectable","aria-orientation","aria-activedescendant","aria-expanded"],superclassRole:["composite"]},tabpanel:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"],accessibleNameRequired:!1},term:{type:"structure",allowedAttrs:["aria-expa\
nded"],superclassRole:["section"],nameFromContent:!0},text:{type:"structure",superclassRole:["section"],nameFromContent:!0},textbox:{type:"widget",allowedAttrs:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],superclassRole:["input"],accessibleNameRequired:!0},time:{type:"structure",superclassRole:["section"]},timer:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["status"]},toolbar:{type:"structure",allowedAttrs:["aria-orientation","aria-activedescendant","aria-expanded"],superclassRole:["group"],accessibleNameRequired:!0},tooltip:{type:"structure",allowedAttrs:["aria-expanded"],superclassRole:["section"],nameFromContent:!0},tree:{type:"composite",requiredOwned:["group","treeitem"],allowedAttrs:["aria-multiselectable","aria-required","aria-activedescendant","aria-expanded","aria-orientation"],superclassRole:["select"],accessibleNameRequired:!1},treegrid:{type:"composite",requiredOwned:["rowgroup","row"],a\
llowedAttrs:["aria-activedescendant","aria-colcount","aria-expanded","aria-level","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],superclassRole:["grid","tree"],accessibleNameRequired:!1},treeitem:{type:"widget",requiredContext:["group","tree"],allowedAttrs:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],superclassRole:["listitem","option"],accessibleNameRequired:!0,nameFromContent:!0},widget:{type:"abstract",superclassRole:["roletype"]},window:{type:"abstract",superclassRole:["roletype"]}},Mc=(Rr={a:{variant:{href:{matches:"[href]",contentTypes:["interactive","phrasing","flow"],allowedRoles:["button","checkbox","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem","doc-backlink","doc-biblioref","doc-glossref","doc-noteref"],namingMethods:["subtreeText"]},default:{contentTypes:["phrasing","flow"],allowedRoles:!0}}},abbr:{contentTypes:["phrasing","flow"],allowedRole\
s:!0},address:{contentTypes:["flow"],allowedRoles:!0},area:{variant:{href:{matches:"[href]",allowedRoles:!1},default:{allowedRoles:["button","link"]}},contentTypes:["phrasing","flow"],namingMethods:["altText"]},article:{contentTypes:["sectioning","flow"],allowedRoles:["feed","presentation","none","document","application","main","region"],shadowRoot:!0},aside:{contentTypes:["sectioning","flow"],allowedRoles:["feed","note","presentation","none","region","search","doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip"]},audio:{variant:{controls:{matches:"[controls]",contentTypes:["interactive","embedded","phrasing","flow"]},default:{contentTypes:["embedded","phrasing","flow"]}},allowedRoles:["application"],chromiumRole:"Audio"},b:{contentTypes:["phrasing","flow"],allowedRoles:!0},base:{allowedRoles:!1,noAriaAttrs:!0},bdi:{contentTypes:["phrasing","flow"],allowedRoles:!0},bdo:{contentTypes:["phrasing","flow"],allowedRoles:!0},blockquote:{contentTypes:["flow"]\
,allowedRoles:!0,shadowRoot:!0},body:{allowedRoles:!1,shadowRoot:!0},br:{contentTypes:["phrasing","flow"],allowedRoles:["presentation","none"],namingMethods:["titleText","singleSpace"],allowedAriaAttrs:["aria-hidden"]},button:{contentTypes:["interactive","phrasing","flow"],allowedRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],namingMethods:["subtreeText"]},canvas:{allowedRoles:!0,contentTypes:["embedded","phrasing","flow"],chromiumRole:"Canvas"},caption:{allowedRoles:!1},cite:{contentTypes:["phrasing","flow"],allowedRoles:!0},code:{contentTypes:["phrasing","flow"],allowedRoles:!0},col:{allowedRoles:!1,noAriaAttrs:!0},colgroup:{allowedRoles:!1,noAriaAttrs:!0},data:{contentTypes:["phrasing","flow"],allowedRoles:!0},datalist:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0,implicitAttrs:{"aria-multiselectable":"false"}},dd:{allowedRoles:!1},del:{contentTypes:["phr\
asing","flow"],allowedRoles:!0},dfn:{contentTypes:["phrasing","flow"],allowedRoles:!0},details:{contentTypes:["interactive","flow"],allowedRoles:!1},dialog:{contentTypes:["flow"],allowedRoles:["alertdialog"]},div:{contentTypes:["flow"],allowedRoles:!0,shadowRoot:!0},dl:{contentTypes:["flow"],allowedRoles:["group","list","presentation","none"],chromiumRole:"DescriptionList"},dt:{allowedRoles:["listitem"]},em:{contentTypes:["phrasing","flow"],allowedRoles:!0},embed:{contentTypes:["interactive","embedded","phrasing","flow"],allowedRoles:["application","document","img","presentation","none"],chromiumRole:"EmbeddedObject"},fieldset:{contentTypes:["flow"],allowedRoles:["none","presentation","radiogroup"],namingMethods:["fieldsetLegendText"]},figcaption:{allowedRoles:["group","none","presentation"]},figure:{contentTypes:["flow"],allowedRoles:!0,namingMethods:["figureText","titleText"]},footer:{contentTypes:["flow"],allowedRoles:["group","none","presentation","doc-footnote"],shadowRoot:!0},for\
m:{contentTypes:["flow"],allowedRoles:["form","search","none","presentation"]},h1:{contentTypes:["heading","flow"],allowedRoles:["none","presentation","tab","doc-subtitle"],shadowRoot:!0,implicitAttrs:{"aria-level":"1"}},h2:{contentTypes:["heading","flow"],allowedRoles:["none","presentation","tab","doc-subtitle"],shadowRoot:!0,implicitAttrs:{"aria-level":"2"}},h3:{contentTypes:["heading","flow"],allowedRoles:["none","presentation","tab","doc-subtitle"],shadowRoot:!0,implicitAttrs:{"aria-level":"3"}},h4:{contentTypes:["heading","flow"],allowedRoles:["none","presentation","tab","doc-subtitle"],shadowRoot:!0,implicitAttrs:{"aria-level":"4"}},h5:{contentTypes:["heading","flow"],allowedRoles:["none","presentation","tab","doc-subtitle"],shadowRoot:!0,implicitAttrs:{"aria-level":"5"}},h6:{contentTypes:["heading","flow"],allowedRoles:["none","presentation","tab","doc-subtitle"],shadowRoot:!0,implicitAttrs:{"aria-level":"6"}},head:{allowedRoles:!1,noAriaAttrs:!0},header:{contentTypes:["flow"],a\
llowedRoles:["group","none","presentation","doc-footnote"],shadowRoot:!0},hgroup:{contentTypes:["heading","flow"],allowedRoles:!0},hr:{contentTypes:["flow"],allowedRoles:["none","presentation","doc-pagebreak"],namingMethods:["titleText","singleSpace"]},html:{allowedRoles:!1,noAriaAttrs:!0},i:{contentTypes:["phrasing","flow"],allowedRoles:!0},iframe:{contentTypes:["interactive","embedded","phrasing","flow"],allowedRoles:["application","document","img","none","presentation"],chromiumRole:"Iframe"},img:{variant:{nonEmptyAlt:{matches:[{attributes:{alt:"/.+/"}},{hasAccessibleName:!0}],allowedRoles:["button","checkbox","link","math","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem","doc-cover"]},usemap:{matches:"[usemap]",contentTypes:["interactive","embedded","flow"]},default:{allowedRoles:["presentation","none"],contentTypes:["embedded","flow"]}},namingMethods:["altText"]},input:{variant:{button:{\
matches:{properties:{type:"button"}},allowedRoles:["checkbox","combobox","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"]},buttonType:{matches:{properties:{type:["button","submit","reset"]}},namingMethods:["valueText","titleText","buttonDefaultText"]},checkboxPressed:{matches:{properties:{type:"checkbox"},attributes:{"aria-pressed":"/.*/"}},allowedRoles:["button","menuitemcheckbox","option","switch"],implicitAttrs:{"aria-checked":"false"}},checkbox:{matches:{properties:{type:"checkbox"},attributes:{"aria-pressed":null}},allowedRoles:["menuitemcheckbox","option","switch"],implicitAttrs:{"aria-checked":"false"}},noRoles:{matches:{properties:{type:["color","date","datetime-local","file","month","number","password","range","reset","submit","time","week"]}},allowedRoles:!1},hidden:{matches:{properties:{type:"hidden"}},contentTypes:["flow"],allowedRoles:!1,noAriaAttrs:!0},image:{matches:{properties:{type:"image"}},allowedRoles:["link","menuitem","menuitem\
checkbox","menuitemradio","radio","switch"],namingMethods:["altText","valueText","labelText","titleText","buttonDefaultText"]},radio:{matches:{properties:{type:"radio"}},allowedRoles:["menuitemradio"],implicitAttrs:{"aria-checked":"false"}},textWithList:{matches:{properties:{type:"text"},attributes:{list:"/.*/"}},allowedRoles:!1},default:{contentTypes:["interactive","flow"],allowedRoles:["combobox","searchbox","spinbutton"],implicitAttrs:{"aria-valuenow":""},namingMethods:["labelText","placeholderText"]}}},ins:{contentTypes:["phrasing","flow"],allowedRoles:!0},kbd:{contentTypes:["phrasing","flow"],allowedRoles:!0},label:{contentTypes:["interactive","phrasing","flow"],allowedRoles:!1,chromiumRole:"Label"},legend:{allowedRoles:!1},li:{allowedRoles:["menuitem","menuitemcheckbox","menuitemradio","option","none","presentation","radio","separator","tab","treeitem","doc-biblioentry","doc-endnote"],implicitAttrs:{"aria-setsize":"1","aria-posinset":"1"}},link:{contentTypes:["phrasing","flow"],a\
llowedRoles:!1,noAriaAttrs:!0},main:{contentTypes:["flow"],allowedRoles:!1,shadowRoot:!0},map:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0},math:{contentTypes:["embedded","phrasing","flow"],allowedRoles:!1},mark:{contentTypes:["phrasing","flow"],allowedRoles:!0},menu:{contentTypes:["flow"],allowedRoles:["directory","group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"]},meta:{variant:{itemprop:{matches:"[itemprop]",contentTypes:["phrasing","flow"]}},allowedRoles:!1,noAriaAttrs:!0},meter:{contentTypes:["phrasing","flow"],allowedRoles:!1,chromiumRole:"progressbar"},nav:{contentTypes:["sectioning","flow"],allowedRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","none","presentation","tablist"],shadowRoot:!0},noscript:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0},object:{variant:{usemap:{matches:"[usemap]",contentTypes:["interactive","embedded","phrasing","flow"]},default:{contentTypes:["embedded"\
,"phrasing","flow"]}},allowedRoles:["application","document","img"],chromiumRole:"PluginObject"},ol:{contentTypes:["flow"],allowedRoles:["directory","group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"]},optgroup:{allowedRoles:!1},option:{allowedRoles:!1,implicitAttrs:{"aria-selected":"false"}},output:{contentTypes:["phrasing","flow"],allowedRoles:!0,namingMethods:["subtreeText"]},p:{contentTypes:["flow"],allowedRoles:!0,shadowRoot:!0},param:{allowedRoles:!1,noAriaAttrs:!0},picture:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0},pre:{contentTypes:["flow"],allowedRoles:!0},progress:{contentTypes:["phrasing","flow"],allowedRoles:!1,implicitAttrs:{"aria-valuemax":"100","aria-valuemin":"0","aria-valuenow":"0"}},q:{contentTypes:["phrasing","flow"],allowedRoles:!0},rp:{allowedRoles:!0},rt:{allowedRoles:!0},ruby:{contentTypes:["phrasing","flow"],allowedRoles:!0},s:{contentTypes:["phrasing","flow"],allowedRoles:!0},samp:{contentType\
s:["phrasing","flow"],allowedRoles:!0},script:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0},search:{contentTypes:["flow"],allowedRoles:["form","group","none","presentation","region","search"]},section:{contentTypes:["sectioning","flow"],allowedRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc"],shadowRoot:!0},select:{variant:{combobox:{matches:{attributes:{multiple:null,size:[null,"1"]}},allowedRoles:["\
menu"]},default:{allowedRoles:!1}},contentTypes:["interactive","phrasing","flow"],implicitAttrs:{"aria-valuenow":""},namingMethods:["labelText"]},slot:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0},small:{contentTypes:["phrasing","flow"],allowedRoles:!0},source:{allowedRoles:!1,noAriaAttrs:!0},span:{contentTypes:["phrasing","flow"],allowedRoles:!0,shadowRoot:!0},strong:{contentTypes:["phrasing","flow"],allowedRoles:!0},style:{allowedRoles:!1,noAriaAttrs:!0},svg:{contentTypes:["embedded","phrasing","flow"],allowedRoles:!0,chromiumRole:"SVGRoot",namingMethods:["svgTitleText"]},sub:{contentTypes:["phrasing","flow"],allowedRoles:!0},summary:{allowedRoles:!1,namingMethods:["subtreeText"]},sup:{contentTypes:["phrasing","flow"],allowedRoles:!0},table:{contentTypes:["flow"],allowedRoles:!0,namingMethods:["tableCaptionText","tableSummaryText"]},tbody:{allowedRoles:!0},template:{contentTypes:["phrasing","flow"],allowedRoles:!1,noAriaAttrs:!0},textarea:{contentTypes:["interacti\
ve","phrasing","flow"],allowedRoles:!1,implicitAttrs:{"aria-valuenow":"","aria-multiline":"true"},namingMethods:["labelText","placeholderText"]},tfoot:{allowedRoles:!0},thead:{allowedRoles:!0},time:{contentTypes:["phrasing","flow"],allowedRoles:!0},title:{allowedRoles:!1,noAriaAttrs:!0},td:{allowedRoles:!0},th:{allowedRoles:!0},tr:{allowedRoles:!0},track:{allowedRoles:!1,noAriaAttrs:!0},u:{contentTypes:["phrasing","flow"],allowedRoles:!0},ul:{contentTypes:["flow"],allowedRoles:["directory","group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"]},var:{contentTypes:["phrasing","flow"],allowedRoles:!0},video:{variant:{controls:{matches:"[controls]",contentTypes:["interactive","embedded","phrasing","flow"]},default:{contentTypes:["embedded","phrasing","flow"]}},allowedRoles:["application"],chromiumRole:"video"},wbr:{contentTypes:["phrasing","flow"],allowedRoles:["presentation","none"],allowedAriaAttrs:["aria-hidden"]}},oa={aliceblue:[240,248,255],a\
ntiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebr\
ick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170\
],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,23\
5],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},{ariaAttrs:Sc,ariaRoles:_({},_c,{"doc-abstract":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-acknowledgments":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-afterword":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-appendix":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-backlink":{type:"link",allowedAttrs:["aria-expanded"],nameFromContent:!0,superclassRole:["link"]},"doc-biblioentry":{type:"listitem",allowedAttrs:["aria-expanded","aria-level","aria-posinset","aria-setsize"],superclass\
Role:["listitem"],deprecated:!0},"doc-bibliography":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-biblioref":{type:"link",allowedAttrs:["aria-expanded"],nameFromContent:!0,superclassRole:["link"]},"doc-chapter":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-colophon":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-conclusion":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-cover":{type:"img",allowedAttrs:["aria-expanded"],superclassRole:["img"]},"doc-credit":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-credits":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-dedication":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-endnote":{type:"listitem",allowedAttrs:["aria-expanded","aria-level","aria-posinset","aria-setsize"],superclassRole:["listitem"],deprecat\
ed:!0},"doc-endnotes":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-epigraph":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-epilogue":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-errata":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-example":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-footnote":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-foreword":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-glossary":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-glossref":{type:"link",allowedAttrs:["aria-expanded"],nameFromContent:!0,superclassRole:["link"]},"doc-index":{type:"navigation",allowedAttrs:["aria-expanded"],superclassRole:["navigation"]},"doc-introduction":{type:"landmark",allowedAttrs:["aria-expanded"],sup\
erclassRole:["landmark"]},"doc-noteref":{type:"link",allowedAttrs:["aria-expanded"],nameFromContent:!0,superclassRole:["link"]},"doc-notice":{type:"note",allowedAttrs:["aria-expanded"],superclassRole:["note"]},"doc-pagebreak":{type:"separator",allowedAttrs:["aria-expanded","aria-orientation"],superclassRole:["separator"],childrenPresentational:!0},"doc-pagelist":{type:"navigation",allowedAttrs:["aria-expanded"],superclassRole:["navigation"]},"doc-part":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-preface":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-prologue":{type:"landmark",allowedAttrs:["aria-expanded"],superclassRole:["landmark"]},"doc-pullquote":{type:"none",superclassRole:["none"]},"doc-qna":{type:"section",allowedAttrs:["aria-expanded"],superclassRole:["section"]},"doc-subtitle":{type:"sectionhead",allowedAttrs:["aria-expanded"],superclassRole:["sectionhead"]},"doc-tip":{type:"note",allowedAttrs:["aria-exp\
anded"],superclassRole:["note"]},"doc-toc":{type:"navigation",allowedAttrs:["aria-expanded"],superclassRole:["navigation"]}},{"graphics-document":{type:"structure",superclassRole:["document"],accessibleNameRequired:!0},"graphics-object":{type:"structure",superclassRole:["group"],nameFromContent:!0},"graphics-symbol":{type:"structure",superclassRole:["img"],accessibleNameRequired:!0,childrenPresentational:!0}}),htmlElms:Rr,cssColors:oa}),Pc=_({},Mc),Ic=Pc,Bc=function(e){return!!(e=Ic.ariaRoles[e])&&!!e.unsupported},jc=function(e){var t=(r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).allowAbstract,r=void 0!==(r=r.flagUnsupported)&&r,n=Ic.ariaRoles[e];e=Bc(e);return!(!n||r&&e||!t&&"abstract"===n.type)},Lc=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.fallback,n=t.abstracts,a=t.dpub;return 1===(e=e instanceof ca?e:Ml(e)).props.nodeType&&(t=(e.attr("role")||"").trim().toLowerCase(),(r?ef(t):[t]).find((function(e){return!(!a&&"doc-"===e.substr(\
0,4))&&jc(e,{allowAbstract:n})})))||null},qc=function(e){return Object.keys(Ic.htmlElms).filter((function(t){return(t=Ic.htmlElms[t]).contentTypes?t.contentTypes.includes(e):!!t.variant&&!(!t.variant.default||!t.variant.default.contentTypes)&&t.variant.default.contentTypes.includes(e)}))},zc=function(){return _l.get("globalAriaAttrs",(function(){return Object.keys(Ic.ariaAttrs).filter((function(e){return Ic.ariaAttrs[e].global}))}))},Vc=pl((function(e){for(var t=[],r=e.rows,n=0,a=r.length;n<a;n++)for(var o=r[n].cells,i=(t[n]=t[n]||[],0),l=0,u=o.length;l<u;l++)for(var s=0;s<o[l].colSpan;s++){for(var c=o[l].getAttribute("rowspan"),d=0===parseInt(c)||0===o[l].rowspan?r.length:o[l].rowSpan,p=0;p<d;p++){for(t[n+p]=t[n+p]||[];t[n+p][i];)i++;t[n+p][i]=o[l]}i++}return t})),Gc=pl((function(e,t){var r,n;for(t=t||Vc(rs(e,"table")),r=0;r<t.length;r++)if(t[r]&&-1!==(n=t[r].indexOf(e)))return{x:n,y:r}}));function $c(e){var t,r=(e=Zf(e)).vNode,n=(e=e.domNode,r.attr("scope")),a=Lc(r);if(["td","th"].in\
cludes(r.props.nodeName))return"columnheader"===a?"col":"rowheader"===a?"row":"col"===n||"row"===n?n:"th"===r.props.nodeName&&(r.actualNode?(a=Vc(rs(e,"table")))[(t=Gc(e,a)).y].every((function(e){return"TH"===e.nodeName.toUpperCase()}))?"col":a.map((function(e){return e[t.x]})).every((function(e){return e&&"TH"===e.nodeName.toUpperCase()}))?"row":"auto":"auto");throw new TypeError("Expected TD or TH element")}var Hc=function(e){return-1!==["col","auto"].indexOf($c(e))},Uc=function(e){return["row","auto"].includes($c(e))};function Wc(){return _l.get("sectioningContentSelector",(function(){return qc("sectioning").map((function(e){return"".concat(e,":not([role])")})).join(", ")+" , [role=article], [role=complementary], [role=navigation], [role=region]"}))}function Yc(){return _l.get("sectioningContentPlusMainSelector",(function(){return Wc()+" , main:not([role]), [role=main]"}))}var Kc=function(e){return e?e.replace(/\\r\\n/g,"\\n").replace(/\\u00A0/g," ").replace(/[\\s]{2,}/g," ").trim():""};\
function Xc(e,t){return t=void 0!==(t=(1<arguments.length&&void 0!==t?t:{}).checkTitle)&&t,Kc(Tc(e))||Kc(Oc(e))||t&&1===(null==e?void 0:e.props.nodeType)&&Kc(e.attr("title"))}var Zc={a:function(e){return e.hasAttr("href")?"link":null},area:function(e){return e.hasAttr("href")?"link":null},article:"article",aside:function(e){return Zl(e.parent,Wc())&&!Xc(e,{checkTitle:!0})?null:"complementary"},body:"document",button:"button",datalist:"listbox",dd:"definition",dfn:"term",details:"group",dialog:"dialog",dt:"term",fieldset:"group",figure:"figure",footer:function(e){return Zl(e,Yc())?null:"contentinfo"},form:function(e){return Xc(e)?"form":null},h1:"heading",h2:"heading",h3:"heading",h4:"heading",h5:"heading",h6:"heading",header:function(e){return Zl(e,Yc())?null:"banner"},hr:"separator",img:function(e){var t=e.hasAttr("alt")&&!e.attr("alt"),r=zc().find((function(t){return e.hasAttr(t)}));return!t||r||Ec(e)?"img":"presentation"},input:function(e){var t,r;switch(e.hasAttr("list")&&(r=(t=Rc(\
e.actualNode,"list").filter((function(e){return!!e}))[0])&&"datalist"===t.nodeName.toLowerCase()),e.props.type){case"checkbox":return"checkbox";case"number":return"spinbutton";case"radio":return"radio";case"range":return"slider";case"search":return r?"combobox":"searchbox";case"button":case"image":case"reset":case"submit":return"button";case"text":case"tel":case"url":case"email":case"":return r?"combobox":"textbox";default:return"textbox"}},li:"listitem",main:"main",math:"math",menu:"list",meter:"meter",nav:"navigation",ol:"list",optgroup:"group",option:"option",output:"status",progress:"progressbar",search:"search",section:function(e){return Xc(e)?"region":null},select:function(e){return e.hasAttr("multiple")||1<parseInt(e.attr("size"))?"listbox":"combobox"},summary:"button",table:"table",tbody:"rowgroup",td:function(e){return e=Zl(e,"table"),e=Lc(e),["grid","treegrid"].includes(e)?"gridcell":"cell"},textarea:"textbox",tfoot:"rowgroup",th:function(e){return Hc(e)?"columnheader":Uc(e)?\
"rowheader":void 0},thead:"rowgroup",tr:"row",ul:"list"},Jc=function(e,t){var r=a(t);if(Array.isArray(t)&&void 0!==e)return t.includes(e);if("function"===r)return!!t(e);if(null!=e){if(t instanceof RegExp)return t.test(e);if(/^\\/.*\\/$/.test(t))return r=t.substring(1,t.length-1),new RegExp(r).test(e)}return t===e};function Qc(e,t){return Jc(!!Wd(e),t)}var ed=function(e,t){if("object"!==a(t)||Array.isArray(t)||t instanceof RegExp)throw new Error("Expect matcher to be an object");return Object.keys(t).every((function(r){return Jc(e(r),t[r])}))};function td(e,t){return e=Zf(e).vNode,ed((function(t){return e.attr(t)}),t)}function rd(e,t){return!!t(e)}function nd(e,t){return Jc(Lc(e),t)}function ad(e,t){return Jc(fd(e),t)}function od(e,t){return e=Zf(e).vNode,Jc(e.props.nodeName,t)}function id(e,t){return e=Zf(e).vNode,ed((function(t){return e.props[t]}),t)}function ld(e,t){return Jc(gd(e),t)}var ud={hasAccessibleName:Qc,attributes:td,condition:rd,explicitRole:nd,implicitRole:ad,nodeName:od,p\
roperties:id,semanticRole:ld},sd=function e(t,r){return t=Zf(t).vNode,Array.isArray(r)?r.some((function(r){return e(t,r)})):"string"==typeof r?Gl(t,r):Object.keys(r).every((function(e){var n;if(ud[e])return n=r[e],(0,ud[e])(t,n);throw new Error('Unknown matcher type "'.concat(e,'"'))}))},cd=function(e,t){return sd(e,t)},dd=(cd.hasAccessibleName=Qc,cd.attributes=td,cd.condition=rd,cd.explicitRole=nd,cd.fromDefinition=sd,cd.fromFunction=ed,cd.fromPrimative=Jc,cd.implicitRole=ad,cd.nodeName=od,cd.properties=id,cd.semanticRole=ld,cd),pd=function(e){var t=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).noMatchAccessibleName,r=void 0!==t&&t,n=Ic.htmlElms[e.props.nodeName];if(!n)return{};if(!n.variant)return n;var a,o,i=n.variant,l=k(n,m);for(a in i)if(i.hasOwnProperty(a)&&"default"!==a){for(var u=i[a],s=u.matches,c=k(u,h),d=Array.isArray(s)?s:[s],p=0;p<d.length&&r;p++)if(d[p].hasOwnProperty("hasAccessibleName"))return n;if(dd(e,s))for(var f in c)c.hasOwnProperty(f)&&(l[f]=c[f])}f\
or(o in i.default)i.default.hasOwnProperty(o)&&void 0===l[o]&&(l[o]=i.default[o]);return l},fd=function(e){var t=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).chromium,r=e instanceof ca?e:Ml(e);if(e=r.actualNode,r)return e=r.props.nodeName,!(e=Zc[e])&&t?pd(r).chromiumRole||null:"function"==typeof e?e(r):e||null;throw new ReferenceError("Cannot get implicit role of a node outside the current scope.")},md={td:["tr"],th:["tr"],tr:["thead","tbody","tfoot","table"],thead:["table"],tbody:["table"],tfoot:["table"],li:["ol","ul"],dt:["dl","div"],dd:["dl","div"],div:["dl"]};function hd(e){return zc().some((function(t){return e.hasAttr(t)}))||Ec(e)}var gd=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.noPresentational;e=function(e,t){var r,n=(t=1<arguments.length&&void 0!==t?t:{}).noImplicit;t=k(t,v);return 1!==(e=Zf(e).vNode).props.nodeType?null:!(r=Lc(e,t))||["presentation","none"].includes(r)&&hd(e)?n?null:function(e,t){var r=t.chromium;return t=\
k(t,g),(r=fd(e,{chromium:r}))?function e(t,r){var n=md[t.props.nodeName];if(n){if(t.parent)return n.includes(t.parent.props.nodeName)?(n=Lc(t.parent,r),["none","presentation"].includes(n)&&!hd(t.parent)?n:n?null:e(t.parent,r)):null;if(t.actualNode)throw new ReferenceError("Cannot determine role presentational inheritance of a required parent outside the current scope.")}return null}(e,t)||r:null}(e,t):r}(e,k(t,b));return r&&["presentation","none"].includes(e)?null:e},vd=["iframe"],bd=function(e){var t=Zf(e).vNode;return 1!==t.props.nodeType||!e.hasAttr("title")||!cd(t,vd)&&["none","presentation"].includes(gd(t))?"":t.attr("title")},yd=function(e){var t,r=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).strict;return 1===(e=e instanceof ca?e:Ml(e)).props.nodeType&&(e=gd(e),!(!(t=Ic.ariaRoles[e])||!t.nameFromContent)||!r&&(!t||["presentation","none"].includes(e)))},wd=function(e){var t,r,n=e.actualNode,a=e.children;if(a)return e.hasAttr("aria-owns")?(t=Rc(n,"aria-owns").filter\
((function(e){return!!e})).map((function(e){return o.utils.getNodeFromTree(e)})),r=t.filter((function(e,r){return t.indexOf(e)===r})),e=a.filter((function(e){return!r.includes(e)})),[].concat(M(e),M(r))):M(a);throw new Error("getOwnedVirtual requires a virtual node")},Dd={accessibleNameFromFieldValue:["progressbar"]};function xd(e){return e=Zf(e).vNode,Ed(e)}var Ed=pl((function(e,t){return!ps(e)&&!uc(e,{skipAncestors:!0,isAncestor:t})&&(e.actualNode&&"area"===e.props.nodeName?!vs(e,Ed):!ws(e,{skipAncestors:!0,isAncestor:t})&&(!e.parent||Ed(e.parent,!0)))})),Ad=function e(t,r,n){var a=Zf(t).vNode,o=r?xd:Ss,i=!t.actualNode||(t.actualNode,o(t));o=a.children.map((function(t){var a=(o=t.props).nodeType,o=o.nodeValue;if(3===a){if(o&&i)return o}else if(!n)return e(t,r)})).join("");return Kc(o)},Fd=["button","checkbox","color","file","hidden","image","password","radio","reset","submit"],Cd=function(e){var t=(e=e instanceof ca?e:Ml(e)).props.nodeName;return"textarea"===t||"input"===t&&!Fd.inclu\
des((e.attr("type")||"").toLowerCase())},kd=function(e){return"select"===(e=e instanceof ca?e:Ml(e)).props.nodeName},Rd=function(e){return"textbox"===Lc(e)},Nd=function(e){return"listbox"===Lc(e)},Td=function(e){return"combobox"===Lc(e)},Od=["progressbar","scrollbar","slider","spinbutton"],Sd=function(e){return e=Lc(e),Od.includes(e)},_d=["textbox","progressbar","scrollbar","slider","spinbutton","combobox","listbox"],Md={nativeTextboxValue:function(e){return e=Zf(e).vNode,Cd(e)&&e.props.value||""},nativeSelectValue:function(e){if(e=Zf(e).vNode,!kd(e))return"";var t=(e=ym(e,"option")).filter((function(e){return e.props.selected}));return t.length||t.push(e[0]),t.map((function(e){return Ad(e)})).join(" ")||""},ariaTextboxValue:function(e){var t=(e=Zf(e)).vNode;e=e.domNode;return Rd(t)?e&&ws(e)?e.textContent:Ad(t,!0):""},ariaListboxValue:Pd,ariaComboboxValue:function(e,t){e=Zf(e).vNode;return Td(e)&&(e=wd(e).filter((function(e){return"listbox"===gd(e)}))[0])?Pd(e,t):""},ariaRangeValue:fun\
ction(e){e=Zf(e).vNode;return Sd(e)&&e.hasAttr("aria-valuenow")?(e=+e.attr("aria-valuenow"),isNaN(e)?"0":String(e)):""}};function Pd(e,t){e=Zf(e).vNode;return Nd(e)&&0!==(e=wd(e).filter((function(e){return"option"===gd(e)&&"true"===e.attr("aria-selected")}))).length?Wd(e[0],t):""}var Id=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=e.actualNode,n=Dd.accessibleNameFromFieldValue||[],a=gd(e);return t.startNode===e||!_d.includes(a)||n.includes(a)?"":(n=Object.keys(Md).map((function(e){return Md[e]})).reduce((function(r,n){return r||n(e,t)}),""),t.debug&&ua(n||"{empty-value}",r,t),n)},Bd=qc("phrasing").concat(["#text"]),jd=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=Wd.alreadyProcessed;t.startNode=t.startNode||e;var n=(o=t).strict,a=o.inControlContext,o=o.inLabelledByContext,i=gd(e),l=pd(e,{noMatchAccessibleName:!0}).contentTypes;return r(e,t)||1!==e.props.nodeType||null!=l&&l.includes("embedded")||_d.includes(i)||!(t.subtre\
eDescendant||t.inLabelledByContext||yd(e,{strict:n}))?"":(n||(t=_({subtreeDescendant:!a&&!o},t)),wd(e).reduce((function(e,r){var n=t,a=r.props.nodeName;return(r=Wd(r,n))?(Bd.includes(a)||(" "!==r[0]&&(r+=" "),e&&" "!==e[e.length-1]&&(r=" "+r)),e+r):e}),""))},Ld=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=Wd.alreadyProcessed;if(t.inControlContext||t.inLabelledByContext||r(e,t))return"";t.startNode||(t.startNode=e);var n,a=_({inControlContext:!0},t);r=(e=>{if(!e.attr("id"))return[];if(e.actualNode)return es({elm:"label",attr:"for",value:e.attr("id"),context:e.actualNode});throw new TypeError("Cannot resolve explicit label reference for non-DOM nodes")})(e);return(t=Zl(e,"label"))?(n=[].concat(M(r),[t.actualNode])).sort(Xf):n=r,n.map((function(e){return Nc(e,a)})).filter((function(e){return""!==e})).join(" ")},qd={submit:"Submit",image:"Submit",reset:"Reset",button:""};function zd(e,t){return t.attr(e)||""}function Vd(e,t,r){t=t.actualNode;var n=[e=e.toLo\
werCase(),t.nodeName.toLowerCase()].join(",");return(t=t.querySelector(n))&&t.nodeName.toLowerCase()===e?Nc(t,r):""}var Gd={valueText:function(e){return e.props.value||""},buttonDefaultText:function(e){return qd[e.props.type]||""},tableCaptionText:Vd.bind(null,"caption"),figureText:Vd.bind(null,"figcaption"),svgTitleText:Vd.bind(null,"title"),fieldsetLegendText:Vd.bind(null,"legend"),altText:zd.bind(null,"alt"),tableSummaryText:zd.bind(null,"summary"),titleText:bd,subtreeText:jd,labelText:Ld,singleSpace:function(){return" "},placeholderText:zd.bind(null,"placeholder")};function $d(e){var t,r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=e.actualNode;return 1!==e.props.nodeType||["presentation","none"].includes(gd(e))?"":(t=(pd(e,{noMatchAccessibleName:!0}).namingMethods||[]).map((function(e){return Gd[e]})).reduce((function(t,n){return t||n(e,r)}),""),r.debug&&o.log(t||"{empty-value}",n,r),t)}var Hd=function(e,t){var r=t.emoji,n=t.nonBmp,a=(t=t.punctuations,!1);return r&&\
(a=a||Ia().test(e)),n&&(a=a||/[\\u1D00-\\u1D7F\\u1D80-\\u1DBF\\u1DC0-\\u1DFF\\u20A0-\\u20CF\\u20D0-\\u20FF\\u2100-\\u214F\\u2150-\\u218F\\u2190-\\u21FF\\u2200-\\u22FF\\u2300-\\u23FF\\u2400-\\u243F\\u2440-\\u245F\\u2460-\\u24FF\\u2500-\\u257F\\u2580-\\u259F\\u25A0-\\u25FF\\u2600-\\u26FF\\u2700-\\u27BF\\uE000-\\uF8FF]/g.test(e)||/[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]/g.test(e)||/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC38]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/g.test(e)),t?a||/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!"#$%&\\xa3\\xa2\\xa5\\xa7\\u20ac()*+,\\-.\\/:;<=>?@\\[\\]^_\`{|}~\\xb1]/g.test(e):a};function Ud(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:.15,a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:3,o=e.actualNode.nodeValue.trim();if(!Kc(o)||Hd(o,{emoji:!0,nonBmp:!0}))return!1;var i,l=_l.get("canvasContext",(function(){return n.createElement("canvas").getContext("2\
d",{willReadFrequently:!0})})),u=l.canvas;if((i=((i=_l.get("fonts",(function(){return{}})))[e=t.getComputedStyle(e.parent.actualNode).getPropertyValue("font-family")]||(i[e]={occurrences:0,numLigatures:0}),i[e])).occurrences>=a){if(i.numLigatures/i.occurrences==1)return!0;if(0===i.numLigatures)return!1}i.occurrences++;var s="".concat(a=30,"px ").concat(e),c=(l.font=s,o.charAt(0)),d=l.measureText(c).width;if(0===d)return i.numLigatures++,!0;d<30&&(d*=p=30/d,s="".concat(a*=p,"px ").concat(e)),u.width=d,u.height=a,l.font=s,l.textAlign="left",l.textBaseline="top",l.fillText(c,0,0);var p=new Uint32Array(l.getImageData(0,0,d,a).data.buffer);if(!p.some((function(e){return e})))return i.numLigatures++,!0;l.clearRect(0,0,d,a),l.fillText(o,0,0);var f=new Uint32Array(l.getImageData(0,0,d,a).data.buffer);e=p.reduce((function(e,t,r){return 0===t&&0===f[r]||0!==t&&0!==f[r]?e:++e}),0),u=o.split("").reduce((function(e,t){return e+l.measureText(t).width}),0),s=l.measureText(o).width;return r<=e/p.lengt\
h&&r<=1-s/u&&(i.numLigatures++,!0)}function Wd(e){var t,r,n,a,i,l=((e,t)=>(t.startNode||(t=_({startNode:e},t)),1===e.props.nodeType&&t.inLabelledByContext&&void 0===t.includeHidden?_({includeHidden:!xd(e)},t):t))(e,1<arguments.length&&void 0!==arguments[1]?arguments[1]:{});return t=l,(i=e)&&!(t.includeHidden&&!us(i)||1!==i.props.nodeType||xd(i))||(t=e,r=(i=l).ignoreIconLigature,n=i.pixelThreshold,a=null!=(a=i.occurrenceThreshold)?a:i.occuranceThreshold,3===t.props.nodeType&&r&&Ud(t,n,a))?"":(i=[Tc,Oc,$d,Id,jd,Yd,bd].reduce((function(t,r){return""!==(t=l.startNode===e?Kc(t):t)?t:r(e,l)}),""),l.debug&&o.log(i||"{empty-value}",e.actualNode,l),i)}function Yd(e){return 3!==e.props.nodeType?"":e.props.nodeValue}Wd.alreadyProcessed=function(e,t){return t.processed=t.processed||[],!!t.processed.includes(e)||(t.processed.push(e),!1)};var Kd=function(e,t){var r=t.emoji,n=t.nonBmp;t=t.punctuations;return r&&(e=e.replace(Ia(),"")),n&&(e=e.replace(/[\\u1D00-\\u1D7F\\u1D80-\\u1DBF\\u1DC0-\\u1DFF\\u20A0-\\u2\
0CF\\u20D0-\\u20FF\\u2100-\\u214F\\u2150-\\u218F\\u2190-\\u21FF\\u2200-\\u22FF\\u2300-\\u23FF\\u2400-\\u243F\\u2440-\\u245F\\u2460-\\u24FF\\u2500-\\u257F\\u2580-\\u259F\\u25A0-\\u25FF\\u2600-\\u26FF\\u2700-\\u27BF\\uE000-\\uF8FF]/g,"").replace(/[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]/g,"").replace(/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC38]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/g,"")),t?e.replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!"#$%&\\xa3\\xa2\\xa5\\xa7\\u20ac()*+,\\-.\\/:;<=>?@\\[\\]^_\`{|}~\\xb1]/g,""):e},Xd=function(e){var t;return 0===Kc(e).length||1===(t=e).length&&t.match(/\\D/)||["aa","abc"].includes(e.toLowerCase())||(e=>(e=Kd(e,{emoji:!0,nonBmp:!0,punctuations:!0}),!Kc(e)))(e)?0:1},Zd={stateTerms:["on","off"],standaloneTerms:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","orga\
nization-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","one-time-code"],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"]},Jd=function(e){var t=void 0!==(t=(l=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).looseTyped)&&t,r=void 0===(r=l.stateTerms)?[]:r,n=void 0===(n=l.locations)?[]:n,a=void 0===(a=l.qualifiers)?[]:a,o=void 0===(o=l.standaloneTerms)?[]:o,i=void 0===(i=l.qualifiedTerms)?[]:i,l=void 0\
===(l=l.ignoredValues)?[]:l;return e=e.toLowerCase().trim(),!(!(r=r.concat(Zd.stateTerms)).includes(e)&&""!==e)||(a=a.concat(Zd.qualifiers),n=n.concat(Zd.locations),o=o.concat(Zd.standaloneTerms),i=i.concat(Zd.qualifiedTerms),!("webauthn"===(r=e.split(/\\s+/g))[r.length-1]&&(r.pop(),0===r.length)||!t&&(8<r[0].length&&"section-"===r[0].substr(0,8)&&r.shift(),n.includes(r[0])&&r.shift(),a.includes(r[0])&&(r.shift(),o=[]),1!==r.length))&&(l.includes(e=r[r.length-1])?void 0:o.includes(e)||i.includes(e)))},Qd=function(e){var t;return e.attr("aria-labelledby")&&(t=Rc(e.actualNode,"aria-labelledby").map((function(e){return(e=Ml(e))?Ad(e):""})).join(" ").trim())?t:(t=(t=e.attr("aria-label"))&&Kc(t))||null},ep=function(e,t,r){return e=Ml(e),Ad(e,t,r)},tp=function(e){if(t=Qd(e))return t;if(e.attr("id")){if(!e.actualNode)throw new TypeError("Cannot resolve explicit label reference for non-DOM nodes");var t,r=Ca(e.attr("id"));if(t=(r=Qu(e.actualNode).querySelector('label[for="'+r+'"]'))&&ep(r,!0))r\
eturn t}return(t=(r=Zl(e,"label"))&&Ad(r,!0))||null},rp=function(e){return e=Ml(e),tp(e)},np=[{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"]}],ap=function e(t){var r=Ss(t),n=[];return t.children.forEach((function(t){3===t.actualNode.nodeType?r&&n.push(t):n=n.concat(e(t))})),n},op=pl((function(e){var t=Ml(e),r=t.boundingClientRect,a=[],o=os(t);return e.childNodes.forEach((function(e){var t,i;3!==e.nodeType||""===Kc(e.nodeValue)||((t=n.createRange()).selectNodeContents(e),e=Array.from(t.getClientRects()),i=r,e.some((function(e){return!Ps(js(e),i)})))||a.push.apply(a,M(ip(e,o)))})),a.length?a:ip([r],o)}));function ip(e,t){var r=[];return e.forEach((function(e){e.width<1||e.height<1||(e=t.reduce((function(e,t){return e&&Bs(e,t.boundingClientRect)}),e))&&r.push(e)})),r}var lp=function(e){var t=oc(e);return t?op(e).map((function(e){return yc(t,e)})):[]},up=["checkbox","img","meter","progressbar","scrollbar","radio","slider","spinbutton","textbox"],sp=function(e){var t=Zf(e).vNode;if(e=o.commons.aria.getExplicitRole(t))return-1!==\
up.indexOf(e);switch(t.props.nodeName){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"!==t.props.type;default:return!1}},cp=["head","title","template","script","style","iframe","object","video","audio","noscript"];function dp(e){return!cp.includes(e.props.nodeName)&&e.children.some((function(e){return 3===(e=e.props).nodeType&&e.nodeValue.trim()}))}var pp=function e(t,r,n){return dp(t)||sp(t.actualNode)||!n&&!!Qd(t)||!r&&t.children.some((function(t){return 1===t.actualNode.nodeType&&e(t)}))},fp=function(e,t,r){return e=Ml(e),pp(e,t,r)};function mp(e){return!(void 0!==e.children&&!dp(e))||(1===e.props.nodeType&&sp(e)?!!o.commons.text.accessibleTextVirtual(e):e.children.some((function(e){return!e.attr("lang")&&mp(e)&&!ws(e)})))}var hp=function(e){return-1<nm(e.getAttribute("tabindex"))&&Ec(e)&&!xc(e)};function gp(e,t){var r=(e=\
Zf(e)).vNode;e=e.domNode;return r?(void 0===r._isHiddenWithCSS&&(r._isHiddenWithCSS=vp(e,t)),r._isHiddenWithCSS):vp(e,t)}function vp(e,r){if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),["STYLE","SCRIPT"].includes(e.nodeName.toUpperCase()))return!1;var n,a=t.getComputedStyle(e,null);if(a)return"none"===a.getPropertyValue("display")||(n=["hidden","collapse"],a=a.getPropertyValue("visibility"),!(!n.includes(a)||r))||!!(n.includes(a)&&r&&n.includes(r))||!(!(r=Es(e))||n.includes(a))&&gp(r,a);throw new Error("Style does not exist for the given element.")}var bp=gp,yp=function(e){return null!==(e=e.doctype)&&"html"===e.name&&!e.publicId&&!e.systemId},wp=function(e){(e instanceof ca||null!=(r=t)&&r.Node&&e instanceof t.Node)&&(e=o.commons.aria.getRole(e));var r=Ic.ariaRoles[e];return(null==r?void 0:r.type)||null},Dp=["block","list-item","table","flex","grid"],xp=["inline-block","inline-flex","inline-grid"],Ep=function(e){var t,r,n,a,o=(i=1<arguments.length&&void 0!==arguments[1]?arg\
uments[1]:{}).noLengthCompare,i=void 0!==(i=i.includeInlineBlock)&&i,l=(e=Zf(e)).vNode,u=e.domNode;return!(Ap(u)||!i&&(e=>(e=e.getComputedStylePropertyValue("display"),xp.includes(e)))(l))&&(t=(e=>{for(var t=Es(e);t&&!Ap(t);)t=Es(t);return Ml(t)})(u),n=r="",a=0,function e(t,r){!1!==r(t.actualNode)&&t.children.forEach((function(t){return e(t,r)}))}(t,(function(e){var o,i;return e===t.actualNode||2!==a&&(3===e.nodeType&&(r+=e.nodeValue),1===e.nodeType?(o=(e.nodeName||"").toUpperCase(),e===u&&(a=1),((i=Ap(e))||["BR","HR"].includes(o))&&(0===a?n=r="":a=2),!(i||"none"===e.style.display||"hidden"===e.style.overflow||!["",null,"none"].includes(e.style.float)||!["",null,"relative"].includes(e.style.position))&&("widget"===wp(e)?(n+=e.textContent,!1):void 0)):void 0)})),r=Kc(r),o?0!==r.length:(n=Kc(n),r.length>n.length))};function Ap(e){return e=Zf(e).vNode.getComputedStylePropertyValue("display"),Dp.includes(e)||"table-"===e.substr(0,6)}var Fp=function(e){if(e=(e=e||{}).modalPercent||.75,_l.ge\
t("isModalOpen"))return _l.get("isModalOpen");if(sm(o._tree[0],"dialog, [role=dialog], [aria-modal=true]",Ss).length)return _l.set("isModalOpen",!0),!0;for(var r,a=Cs(t),i=a.width*e,l=a.height*e,u=(e=(a.width-i)/2,(a.height-l)/2),s=[{x:e,y:u},{x:a.width-e,y:u},{x:a.width/2,y:a.height/2},{x:e,y:a.height-u},{x:a.width-e,y:a.height-u}].map((function(e){return Array.from(n.elementsFromPoint(e.x,e.y))})),c=0;c<s.length;c++)if(r=(()=>{var e=s[c].find((function(e){return e=t.getComputedStyle(e),parseInt(e.width,10)>=i&&parseInt(e.height,10)>=l&&"none"!==e.getPropertyValue("pointer-events")&&("absolute"===e.position||"fixed"===e.position)}));if(e&&s.every((function(t){return t.includes(e)})))return _l.set("isModalOpen",!0),{v:!0}})())return r.v;_l.set("isModalOpen",void 0)};function Cp(e){var t,r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:2,n=e.ownerDocument.createRange(),a=(n.setStart(e,0),n.setEnd(e,e.childNodes.length),0),o=0,i=K(n.getClientRects());try{for(i.s();!(t=i.n()).done\
;){var l=t.value;if(!(l.height<=r))if(l.top+r<a)a=Math.max(a,l.bottom);else{if(0!==o)return!0;a=l.bottom,o++}}}catch(e){i.e(e)}finally{i.f()}return!1}var kp=function(e){return e instanceof t.Node},Rp="color.incompleteData",Np={set:function(e,t){if("string"!=typeof e)throw new Error("Incomplete data: key must be a string");var r=_l.get(Rp,(function(){return{}}));return t&&(r[e]=t),r[e]},get:function(e){var t=_l.get(Rp);return null==t?void 0:t[e]},clear:function(){_l.set(Rp,{})}},Tp=function(e,r){var n=e.nodeName.toUpperCase();return["IMG","CANVAS","OBJECT","IFRAME","VIDEO","SVG"].includes(n)?(Np.set("bgColor","imgNode"),!0):((e="none"!==(n=(r=r||t.getComputedStyle(e)).getPropertyValue("background-image")))&&(r=/gradient/.test(n),Np.set("bgColor",r?"bgGradient":"bgImage")),e)},Op=/^#[0-9a-f]{3,8}$/i,Sp=/hsl\\(\\s*([-\\d.]+)(rad|turn)/,_p=(te=new WeakMap,re=new WeakMap,ne=new WeakMap,ae=new WeakMap,oe=new WeakMap,ie=new WeakMap,le=new WeakSet,W((function e(t,r,n){var a,o,i,l=3<arguments.leng\
th&&void 0!==arguments[3]?arguments[3]:1;H(this,e),B(this,le),I(this,te,void 0),I(this,re,void 0),I(this,ne,void 0),I(this,ae,void 0),I(this,oe,void 0),I(this,ie,void 0),t instanceof _p?(a=t.r,o=t.g,i=t.b,this.r=a,this.g=o,this.b=i,this.alpha=t.alpha):(this.red=t,this.green=r,this.blue=n,this.alpha=l)}),[{key:"r",get:function(){return L(te,this)},set:function(e){q(te,this,e),q(ae,this,Math.round(255*Ip(e,0,1)))}},{key:"g",get:function(){return L(re,this)},set:function(e){q(re,this,e),q(oe,this,Math.round(255*Ip(e,0,1)))}},{key:"b",get:function(){return L(ne,this)},set:function(e){q(ne,this,e),q(ie,this,Math.round(255*Ip(e,0,1)))}},{key:"red",get:function(){return L(ae,this)},set:function(e){q(te,this,e/255),q(ae,this,Ip(e,0,255))}},{key:"green",get:function(){return L(oe,this)},set:function(e){q(re,this,e/255),q(oe,this,Ip(e,0,255))}},{key:"blue",get:function(){return L(ie,this)},set:function(e){q(ne,this,e/255),q(ie,this,Ip(e,0,255))}},{key:"toHexString",value:function(){var e=Math.ro\
und(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)}},{key:"toJSON",value:function(){return{red:this.red,green:this.green,blue:this.blue,alpha:this.alpha}}},{key:"parseString",value:function(e){e=e.replace(Sp,(function(e,t,r){var n=t+r;switch(r){case"rad":return e.replace(n,180*t/Math.PI);case"turn":return e.replace(n,360*t)}}));try{"Prototype"in t&&"Version"in t.Prototype&&(r=Array.from,Array.from=dl.default);var r,n=new ol(e).toGamut({space:"srgb",method:"clip"}).to("srgb");r&&(Array.from=r,r=null),this.r=n.r,this.g=n.g,this.b=n.b,this.alpha=+n.alpha}catch(r){throw Np.set("colorParse",e),new Error('Unable to parse color "'.concat(e,'"'))}return this}},{key:"parseRgbString",value:function(e){this.parseString(e)}},{key:"parseHexString",value:function(e){e.match(Op)&&![6,8].includes(e.length)&&this.parseString(e)}},{key:"parseColorFnString",value:functio\
n(e){this.parseString(e)}},{key:"getRelativeLuminance",value:function(){var e=this.r,t=this.g,r=this.b;return.2126*(e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(r<=.04045?r/12.92:Math.pow((r+.055)/1.055,2.4))}},{key:"getLuminosity",value:function(){return.3*this.r+.59*this.g+.11*this.b}},{key:"setLuminosity",value:function(e){return e-=this.getLuminosity(),z(le,this,Mp).call(this,e).clip()}},{key:"getSaturation",value:function(){return Math.max(this.r,this.g,this.b)-Math.min(this.r,this.g,this.b)}},{key:"setSaturation",value:function(e){var t=new _p(this),r=V([{name:"r",value:t.r},{name:"g",value:t.g},{name:"b",value:t.b}].sort((function(e,t){return e.value-t.value})),3),n=r[0],a=r[1];return(r=r[2]).value>n.value?(a.value=(a.value-n.value)*e/(r.value-n.value),r.value=e):a.value=r.value=0,n.value=0,t[r.name]=r.value,t[n.name]=n.value,t[a.name]=a.value,t}},{key:"clip",value:function(){var e=new _p(this),t=e.getLuminosity(),\
r=Math.min(e.r,e.g,e.b),n=Math.max(e.r,e.g,e.b);return r<0&&(e.r=t+(e.r-t)*t/(t-r),e.g=t+(e.g-t)*t/(t-r),e.b=t+(e.b-t)*t/(t-r)),1<n&&(e.r=t+(e.r-t)*(1-t)/(n-t),e.g=t+(e.g-t)*(1-t)/(n-t),e.b=t+(e.b-t)*(1-t)/(n-t)),e}}]));function Mp(e){var t=new _p(this);return t.r+=e,t.g+=e,t.b+=e,t}var Pp=_p;function Ip(e,t,r){return Math.min(Math.max(t,e),r)}var Bp=function(e){var t=new Pp;return t.parseString(e.getPropertyValue("background-color")),0!==t.alpha&&(e=e.getPropertyValue("opacity"),t.alpha=t.alpha*e),t},jp=function(e){var r=t.getComputedStyle(e);return Tp(e,r)||1===Bp(r).alpha};function Lp(e){var t;return!(!e.href||(t=_l.get("firstPageLink",qp))&&e.compareDocumentPosition(t.actualNode)!==e.DOCUMENT_POSITION_FOLLOWING)}function qp(){return(t.location.origin?ym(o._tree,'a[href]:not([href^="javascript:"])').find((function(e){return!hc(e.actualNode)})):ym(o._tree,'a:not([href^="#"]):not([href^="/#"]):not([href^="javascript:"])')[0])||null}var zp=/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]\
+)px,?\\s*([0-9]+)px\\s*\\)/,Vp=/(\\w+)\\((\\d+)/;var Gp=function e(r,n,a){if(!r)throw new TypeError("Cannot determine if element is visible for non-DOM nodes");var i,l,u,s=r instanceof ca?r:Ml(r),c=(r=s?s.actualNode:r,"_isVisible"+(n?"ScreenReader":"")),d=(p=null!=(p=t.Node)?p:{}).DOCUMENT_NODE,p=p.DOCUMENT_FRAGMENT_NODE,f=(s?s.props:r).nodeType,m=s?s.props.nodeName:r.nodeName.toLowerCase();return s&&void 0!==s[c]?s[c]:f===d||!["style","script","noscript","template"].includes(m)&&(r&&f===p&&(r=r.host),(!n||"true"!==(s?s.attr("aria-hidden"):r.getAttribute("aria-hidden")))&&(r?null!==(d=t.getComputedStyle(r,null))&&("area"===m?(i=n,l=a,!!(p=rs(f=r,"map"))&&!!(p=p.getAttribute("name"))&&!(!(f=Qu(f))||9!==f.nodeType||!(u=ym(o._tree,'img[usemap="#'.concat(Ca(p),'"]')))||!u.length)&&u.some((function(t){return e(t.actualNode,i,l)}))):"none"!==d.getPropertyValue("display")&&(m=parseInt(d.getPropertyValue("height")),f=parseInt(d.getPropertyValue("width")),u=(p=Sf(r))&&0===m,p=p&&0===f,m="absolute"==\
=d.getPropertyValue("position")&&(m<2||f<2)&&"hidden"===d.getPropertyValue("overflow"),!(!n&&((e=>{var t=e.getPropertyValue("clip").match(zp),r=e.getPropertyValue("clip-path").match(Vp);if(t&&5===t.length&&(e=e.getPropertyValue("position"),["fixed","absolute"].includes(e)))return t[3]-t[1]<=0&&t[2]-t[4]<=0;if(r){e=r[1];var n=parseInt(r[2],10);switch(e){case"inset":return 50<=n;case"circle":return 0===n}}})(d)||"0"===d.getPropertyValue("opacity")||u||p||m)||!a&&("hidden"===d.getPropertyValue("visibility")||!n&&Ts(r))))&&(f=!1,(p=r.assignedSlot||r.parentNode)&&(f=e(p,n,!0)),s&&(s[c]=f),f)):(m=!0,(a=s.parent)&&(m=e(a,n,!0)),s&&(s[c]=m),m)))},$p=function(e,r){for(var n=["fixed","sticky"],a=[],o=!1,i=0;i<e.length;++i){var l=e[i],u=(l===r&&(o=!0),t.getComputedStyle(l));o||-1===n.indexOf(u.position)?a.push(l):a=[]}return a};function Hp(e,r){var n=Up(r);do{var a,o,i,l,u,s,c=Up(e);if(c===n||c===r)return a=e,o=r,s=(u=t.getComputedStyle(o)).getPropertyValue("overflow"),"inline"===u.getPropertyVal\
ue("display")||(a=Array.from(a.getClientRects()),i=o.getBoundingClientRect(),l={left:i.left,top:i.top,width:i.width,height:i.height},(["scroll","auto"].includes(s)||o instanceof t.HTMLHtmlElement)&&(l.width=o.scrollWidth,l.height=o.scrollHeight),1===a.length&&"hidden"===s&&"nowrap"===u.getPropertyValue("white-space")&&(a[0]=l),a.some((function(e){return!(Math.ceil(e.left)<Math.floor(l.left)||Math.ceil(e.top)<Math.floor(l.top)||Math.floor(e.left+e.width)>Math.ceil(l.left+l.width)||Math.floor(e.top+e.height)>Math.ceil(l.top+l.height))})))}while(e=c);return!1}function Up(e){for(var t=Ml(e).parent;t;){if(Sf(t.actualNode))return t.actualNode;t=t.parent}}var Wp=function e(t,r){var a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:n,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0;if(999<o)throw new Error("Infinite loop detected");return Array.from(a.elementsFromPoint(t,r)||[]).filter((function(e){return Qu(e)===a})).reduce((function(n,a){var i;return Xu(a)&&(i=e(t,r,a.shadow\
Root,o+1),!(n=n.concat(i)).length||!Hp(n[0],a))||n.push(a),n}),[])},Yp=function(e,t){var r,a;if(e.hasAttribute(t))return a=e.nodeName.toUpperCase(),r=e,["A","AREA"].includes(a)&&!e.ownerSVGElement||((r=n.createElement("a")).href=e.getAttribute(t)),a=["https:","ftps:"].includes(r.protocol)?r.protocol.replace(/s:$/,":"):r.protocol,t=(e=(e=(t=e=/^\\//.test(r.pathname)?r.pathname:"/".concat(r.pathname)).split("/").pop())&&-1!==e.indexOf(".")?{pathname:t.replace(e,""),filename:/index./.test(e)?"":e}:{pathname:t,filename:""}).pathname,e=e.filename,{protocol:a,hostname:r.hostname,port:(a=r.port,["443","80"].includes(a)?"":a),pathname:/\\/$/.test(t)?t:"".concat(t,"/"),search:(e=>{var t={};if(e&&e.length){var r=e.substring(1).split("&");if(r&&r.length)for(var n=0;n<r.length;n++){var a=(o=V(r[n].split("="),2))[0],o=void 0===(o=o[1])?"":o;t[decodeURIComponent(a)]=decodeURIComponent(o)}}return t})(r.search),hash:(a=r.hash)&&(t=a.match(/#!?\\/?/g))&&"#"!==V(t,1)[0]?a:"",filename:e}},Kp=function(e,r){v\
ar n=r.getBoundingClientRect(),a=n.top,o=n.left,i=a-r.scrollTop,l=(a=a-r.scrollTop+r.scrollHeight,o-r.scrollLeft);o=o-r.scrollLeft+r.scrollWidth;return!(e.left>o&&e.left>n.right||e.top>a&&e.top>n.bottom||e.right<l&&e.right<n.left||e.bottom<i&&e.bottom<n.top)&&(o=t.getComputedStyle(r),!(e.left>n.right||e.top>n.bottom)||"scroll"===o.overflow||"auto"===o.overflow||r instanceof t.HTMLBodyElement||r instanceof t.HTMLHtmlElement)},Xp=0;function Zp(e,t,r){var n;return H(this,Zp),(n=R(this,Zp)).shadowId=r,n.children=[],n.actualNode=e,(n.parent=t)||(Xp=0),n.nodeIndex=Xp++,n._isHidden=null,n._cache={},n._isXHTML=fl(e.ownerDocument),"input"===e.nodeName.toLowerCase()&&(r=e.getAttribute("type"),r=n._isXHTML?r:(r||"").toLowerCase(),Om().includes(r)||(r="text"),n._type=r),_l.get("nodeMap")&&_l.get("nodeMap").set(e,n),n}O(Zp,ca);var Jp,Qp=W(Zp,[{key:"props",get:function(){var e,t,r,n;return this._cache.hasOwnProperty("props")||(e=(n=this.actualNode).nodeType,t=n.nodeName,r=n.id,n=n.nodeValue,this._ca\
che.props={nodeType:e,nodeName:this._isXHTML?t:t.toLowerCase(),id:r,type:this._type,nodeValue:n},1===e&&(this._cache.props.multiple=this.actualNode.multiple,this._cache.props.value=this.actualNode.value,this._cache.props.selected=this.actualNode.selected,this._cache.props.checked=this.actualNode.checked,this._cache.props.indeterminate=this.actualNode.indeterminate)),this._cache.props}},{key:"attr",value:function(e){return"function"!=typeof this.actualNode.getAttribute?null:this.actualNode.getAttribute(e)}},{key:"hasAttr",value:function(e){return"function"==typeof this.actualNode.hasAttribute&&this.actualNode.hasAttribute(e)}},{key:"attrNames",get:function(){var e;return this._cache.hasOwnProperty("attrNames")||(e=(this.actualNode.attributes instanceof t.NamedNodeMap?this.actualNode:this.actualNode.cloneNode(!1)).attributes,this._cache.attrNames=Array.from(e).map((function(e){return e.name}))),this._cache.attrNames}},{key:"getComputedStylePropertyValue",value:function(e){var r="computed\
Style_"+e;return this._cache.hasOwnProperty(r)||(this._cache.hasOwnProperty("computedStyle")||(this._cache.computedStyle=t.getComputedStyle(this.actualNode)),this._cache[r]=this._cache.computedStyle.getPropertyValue(e)),this._cache[r]}},{key:"isFocusable",get:function(){return this._cache.hasOwnProperty("isFocusable")||(this._cache.isFocusable=Ec(this.actualNode)),this._cache.isFocusable}},{key:"tabbableElements",get:function(){return this._cache.hasOwnProperty("tabbableElements")||(this._cache.tabbableElements=Dc(this)),this._cache.tabbableElements}},{key:"clientRects",get:function(){return this._cache.hasOwnProperty("clientRects")||(this._cache.clientRects=Array.from(this.actualNode.getClientRects()).filter((function(e){return 0<e.width}))),this._cache.clientRects}},{key:"boundingClientRect",get:function(){return this._cache.hasOwnProperty("boundingClientRect")||(this._cache.boundingClientRect=this.actualNode.getBoundingClientRect()),this._cache.boundingClientRect}}]),ef=function(e){\
return(e||"").trim().replace(/\\s{2,}/g," ").split(" ")},tf=" [idsMap]";function rf(e,t,r){var n=e[0]._selectorMap;if(n){for(var a=e[0].shadowId,o=0;o<t.length;o++)if(1<t[o].length&&t[o].some(nf))return;var i=new Set,l=(t.forEach((function(e){var t,r=((e,t,r)=>{var n=e[e.length-1],a=null,o=1<e.length||!!n.pseudos||!!n.classes;if(nf(n))a=t["*"];else{if(n.id){if(!t[tf]||!Object.hasOwn(t[tf],n.id)||null==(e=t[tf][n.id])||!e.length)return;a=t[tf][n.id].filter((function(e){return e.shadowId===r}))}if(n.tag&&"*"!==n.tag){if(null==(e=t[n.tag])||!e.length)return;e=t[n.tag];a=a?af(e,a):e}if(n.classes){if(null==(e=t["[class]"])||!e.length)return;e=t["[class]"],a=a?af(e,a):e}if(n.attributes)for(var i=0;i<n.attributes.length;i++){var l=n.attributes[i];if("attrValue"===l.type&&(o=!0),null==(u=t["[".concat(l.key,"]")])||!u.length)return;var u=t["[".concat(l.key,"]")];a=a?af(u,a):u}}return{nodes:a,isComplexSelector:o}})(e,n,a);null!=r&&null!=(t=r.nodes)&&t.forEach((function(t){r.isComplexSelector&&!Xl\
(t,e)||i.add(t)}))})),[]);return i.forEach((function(e){return l.push(e)})),(l=r?l.filter(r):l).sort((function(e,t){return e.nodeIndex-t.nodeIndex}))}}function nf(e){return"*"===e.tag&&!e.attributes&&!e.id&&!e.classes}function af(e,t){return e.filter((function(e){return t.includes(e)}))}function of(e,t,r){Object.hasOwn(r,e)||(r[e]=[]),r[e].push(t)}function lf(e,t){1===e.props.nodeType&&(of(e.props.nodeName,e,t),of("*",e,t),e.attrNames.forEach((function(r){"id"===r&&(t[tf]=t[tf]||{},ef(e.attr(r)).forEach((function(r){of(r,e,t[tf])}))),of("[".concat(r,"]"),e,t)})))}function uf(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:n.documentElement,t=1<arguments.length?arguments[1]:void 0,r=(Jp=!1,{});return(e=(_l.set("nodeMap",new WeakMap),_l.set("selectorMap",r),df(e,t,null)))[0]._selectorMap=r,e[0]._hasShadowRoot=Jp,e}function sf(e,t,r){return lf(e=new Qp(e,t,r),_l.get("selectorMap")),e}function cf(e,t,r){var n=[];return e.forEach((function(e){(e=df(e,r,t))&&n.push.apply(n,M(e\
))})),n}function df(e,r,a){var o,i,l=(e=e.documentElement?e.documentElement:e).nodeName.toLowerCase();return Xu(e)?(Jp=!0,o=sf(e,a,r),r="a"+Math.random().toString().substring(2),i=Array.from(e.shadowRoot.childNodes),o.children=cf(i,o,r),[o]):"content"===l&&"function"==typeof e.getDistributedNodes?cf(i=Array.from(e.getDistributedNodes()),a,r):"slot"===l&&"function"==typeof e.assignedNodes?((i=Array.from(e.assignedNodes())).length||(i=(e=>{var t=[];for(e=e.firstChild;e;)t.push(e),e=e.nextSibling;return t})(e)),t.getComputedStyle(e),cf(i,a,r)):e.nodeType===n.ELEMENT_NODE?(o=sf(e,a,r),i=Array.from(e.childNodes),o.children=cf(i,o,r),[o]):e.nodeType===n.TEXT_NODE?[sf(e,a)]:void 0}var pf=function(e){return e?e.trim().split("-")[0].toLowerCase():""},ff=function(e){var t={};return t.none=e.none.concat(e.all),t.any=e.any,Object.keys(t).map((function(e){var r;return t[e].length&&(r=o._audit.data.failureSummaries[e])&&"function"==typeof r.failureMessage?r.failureMessage(t[e].map((function(e){retur\
n e.message||""}))):void 0})).filter((function(e){return void 0!==e})).join("\\n\\n")};function mf(){var e=o._audit.data.incompleteFallbackMessage;return"string"!=typeof(e="function"==typeof e?e():e)?"":e}var hf=la.resultGroups;function gf(e,t){var r=o.utils.aggregateResult(e);return hf.forEach((function(e){t.resultTypes&&!t.resultTypes.includes(e)&&(r[e]||[]).forEach((function(e){Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=[e.nodes[0]])})),r[e]=(r[e]||[]).map((function(e){return e=Object.assign({},e),Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=e.nodes.map((function(e){var r,n,o;return"object"===a(e.node)&&(r=vf(e.node,t),Object.assign(e,r)),delete e.result,delete e.node,n=e,o=t,["any","all","none"].forEach((function(e){Array.isArray(n[e])&&n[e].filter((function(e){return Array.isArray(e.relatedNodes)})).forEach((function(e){e.relatedNodes=e.relatedNodes.map((function(e){return vf(e,o)}))}))})),e}))),hf.forEach((function(t){return delete e[t]})),delete e.pageLevel,delete e.\
result,e}))})),r}function vf(e,t){e=0<arguments.length&&void 0!==e?e:{},t=1<arguments.length?t:void 0,e=qu.dqElmToSpec(e,t);var r,n={};return o._audit.noHtml?n.html=null:n.html=null!=(r=e.source)?r:"Undefined",t.elementRef&&!e.fromFrame&&(n.element=null!=(r=e.element)?r:null),!1===t.selectors&&!e.fromFrame||(n.target=null!=(r=e.selector)?r:[":root"]),t.ancestry&&(n.ancestry=null!=(r=e.ancestry)?r:[":root"]),t.xpath&&(n.xpath=null!=(r=e.xpath)?r:["/"]),n}var bf=/\\$\\{\\s?data\\s?\\}/g;function yf(e,t){if("string"==typeof t)return e.replace(bf,t);for(var r in t){var n;t.hasOwnProperty(r)&&(n=new RegExp("\\\\\${\\\\s?data\\\\."+r+"\\\\s?}","g"),r=void 0===t[r]?"":String(t[r]),e=e.replace(n,r))}return e}var wf=function e(t,r){var n;if(t)return Array.isArray(r)?(r.values=r.join(", "),"string"==typeof t.singular&&"string"==typeof t.plural?yf(1===r.length?t.singular:t.plural,r):yf(t,r)):"string"==typeof t?yf(t,r):"string"==typeof r?yf(t[r],r):(n=t.default||mf(),e(n=r&&r.messageKey&&t[r.messageKey]?t[r.mes\
sageKey]:n,r))},Df=function(e,t,r){var n=o._audit.data.checks[e];if(!n)throw new Error("Cannot get message for unknown check: ".concat(e,"."));if(n.messages[t])return wf(n.messages[t],r);throw new Error('Check "'.concat(e,'"" does not have a "').concat(t,'" message.'))},xf=function(e,t,r){t=((r.rules&&r.rules[t]||{}).checks||{})[e.id];var n=(r.checks||{})[e.id],a=e.enabled;e=e.options;return n&&(n.hasOwnProperty("enabled")&&(a=n.enabled),n.hasOwnProperty("options"))&&(e=n.options),t&&(t.hasOwnProperty("enabled")&&(a=t.enabled),t.hasOwnProperty("options"))&&(e=t.options),{enabled:a,options:e,absolutePaths:r.absolutePaths}};function Ef(){var e,r,n,i,l=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,u=1<arguments.length&&void 0!==arguments[1]?arguments[1]:t;return l&&"object"===a(l)?l:"object"!==a(u)?{}:{testEngine:{name:"axe-core",version:o.version},testRunner:{name:o._audit.brand},testEnvironment:(l=u).navigator&&"object"===a(l.navigator)?(e=l.navigator,r=l.innerHeight,n=l.i\
nnerWidth,l=(e=>(e=e.screen).orientation||e.msOrientation||e.mozOrientation)(l)||{},i=l.angle,l=l.type,{userAgent:e.userAgent,windowWidth:n,windowHeight:r,orientationAngle:i,orientationType:l}):{},timestamp:(new Date).toISOString(),url:null==(e=u.location)?void 0:e.href}}function Af(e,t){var r=t.focusable;t=t.page;return{node:e,include:[],exclude:[],initiator:!1,focusable:r&&(e=>null===(e=nm(e.getAttribute("tabindex")))||0<=e)(e),size:(e=>{var t=parseInt(e.getAttribute("width"),10),r=parseInt(e.getAttribute("height"),10);return(isNaN(t)||isNaN(r))&&(e=e.getBoundingClientRect(),t=isNaN(t)?e.width:t,r=isNaN(r)?e.height:r),{width:t,height:r}})(e),page:t}}function Ff(e){var r=0<arguments.length&&void 0!==e?e:[],n=[];jf(r)||(r=[r]);for(var a=0;a<r.length;a++){var o=(e=>{if(e instanceof t.Node)return e;if("string"==typeof e)return[e];var r;if(Gf(e)?(r=e,Cf(Array.isArray(r.fromFrames),"fromFrames property must be an array"),Cf(r.fromFrames.every((function(e){return!Lf(e,"fromFrames")})),"Inva\
lid context; fromFrames selector must be appended, rather than nested"),Cf(!Lf(r,"fromShadowDom"),"fromFrames and fromShadowDom cannot be used on the same object"),e=e.fromFrames):$f(e)&&(e=[e]),Array.isArray(e)){var n,a=[],o=K(e);try{for(o.s();!(n=o.n()).done;){var i=n.value;if($f(i)&&((e=>{Cf(Array.isArray(e.fromShadowDom),"fromShadowDom property must be an array"),Cf(e.fromShadowDom.every((function(e){return!Lf(e,"fromFrames")})),"shadow selector must be inside fromFrame instead"),Cf(e.fromShadowDom.every((function(e){return!Lf(e,"fromShadowDom")})),"fromShadowDom selector must be appended, rather than nested")})(i),i=i.fromShadowDom),"string"!=typeof i&&!(e=>Array.isArray(e)&&e.every((function(e){return"string"==typeof e})))(i))return;a.push(i)}}catch(e){o.e(e)}finally{o.f()}return a}})(r[a]);o&&n.push(o)}return n}function Cf(e,t){Aa(e,"Invalid context; ".concat(t,"\\nSee: https://github.com/dequelabs/axe-core/blob/master/doc/context.md"))}function kf(e,r){for(var n=[],a=0,o=e[r].le\
ngth;a<o;a++){var i,l=e[r][a];l instanceof t.Node?l.documentElement instanceof t.Node?n.push(e.flatTree[0]):l.host instanceof t.Node?(i=Array.from(l.children).map((function(e){return Ml(e)})),n.push.apply(n,M(i))):n.push(Ml(l)):l&&l.length&&(1<l.length?((e,t,r)=>{e.frames=e.frames||[],Tm(r.shift()).forEach((function(n){var a=e.frames.find((function(e){return e.node===n}));a||(a=Af(n,e),e.frames.push(a)),a[t].push(r)}))})(e,r,l):(i=Tm(l[0]),n.push.apply(n,M(i.map((function(e){return Ml(e)}))))))}return n.filter((function(e){return e}))}function Rf(e,r){var o=this,i=(e=zl(e),this.frames=[],this.page="boolean"==typeof(null==(i=e)?void 0:i.page)?e.page:void 0,this.initiator="boolean"!=typeof(null==(i=e)?void 0:i.initiator)||e.initiator,this.focusable="boolean"!=typeof(null==(i=e)?void 0:i.focusable)||e.focusable,this.size="object"===a(null==(i=e)?void 0:i.size)?e.size:{},e=(e=>{if(zf(e)){var t=" must be used inside include or exclude. It should not be on the same object.";Cf(!Lf(e,"fromFra\
mes"),"fromFrames"+t),Cf(!Lf(e,"fromShadowDom"),"fromShadowDom"+t)}else{if(!Vf(e))return{include:[n],exclude:[]};e={include:e,exclude:[]}}return 0===(t=Ff(e.include)).length&&t.push(n),{include:t,exclude:e=Ff(e.exclude)}})(e),this.flatTree=null!=r?r:uf((e=>{for(var r=e.include,a=(e=e.exclude,Array.from(r).concat(Array.from(e))),o=0;o<a.length;o++){var i=a[o];if(i instanceof t.Element)return i.ownerDocument.documentElement;if(i instanceof t.Document)return i.documentElement}return n.documentElement})(e)),this.exclude=e.exclude,this.include=e.include,this.include=kf(this,"include"),this.exclude=kf(this,"exclude"),Am("frame, iframe",this).forEach((function(e){var t;Wf(e,o)&&(t=o,xd(e=e.actualNode))&&!Vu(t.frames,"node",e)&&t.frames.push(Af(e,t))})),void 0===this.page&&(this.page=(e=>1===(e=e.include).length&&e[0].actualNode===n.documentElement)(this),this.frames.forEach((function(e){e.page=o.page}))),this);if(0===i.include.length&&0===i.frames.length)throw i=_u.isInFrame()?"frame":"page",\
new Error("No elements found for include in "+i+" Context");Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(Xf)}function Nf(e){return!1===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).iframes?[]:new Rf(e).frames.map((function(e){var t=e.node;return(e=k(e,y)).initiator=!1,{frameSelector:Tl(t),frameContext:e}}))}function Tf(e){var t=o._audit.rules.find((function(t){return t.id===e}));if(t)return t;throw new Error("Cannot find rule by id: ".concat(e))}function Of(e,t){return e=e.getPropertyValue(t),["scroll","auto"].includes(e)}var Sf=pl((function(e){var r,n,a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,o=e.scrollWidth>e.clientWidth+a;a=e.clientHeight+a<e.scrollHeight;if(o||a)return r=Of(n=t.getComputedStyle(e),"overflow-x"),n=Of(n,"overflow-y"),o&&r||a&&n?{elm:e,top:e.scrollTop,left:e.scrollLeft}:void 0})),_f=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:t,r=e.document.documentElement;return[void \
0!==e.pageXOffset?{elm:e,top:e.pageYOffset,left:e.pageXOffset}:{elm:r,top:r.scrollTop,left:r.scrollLeft}].concat(function e(t){return Array.from(t.children||t.childNodes||[]).reduce((function(t,r){var n=Sf(r);return n&&t.push(n),t.concat(e(r))}),[])}(n.body))};function Mf(){return zl(Ic)}var Pf,If=function(e){if(e)return function(t){var r=t.data,n=void 0!==(n=t.isCrossOrigin)&&n,a=t.shadowId,o=t.root,i=t.priority,l=(t=void 0!==(t=t.isLink)&&t,e.createElement("style"));return t?(t=e.createTextNode('@import "'.concat(r.href,'"')),l.appendChild(t)):l.appendChild(e.createTextNode(r)),e.head.appendChild(l),{sheet:l.sheet,isCrossOrigin:n,shadowId:a,root:o,priority:i}};throw new Error("axe.utils.getStyleSheetFactory should be invoked with an argument")},Bf=function(e){var t;return Pf&&Pf.parentNode?(void 0===Pf.styleSheet?Pf.appendChild(n.createTextNode(e)):Pf.styleSheet.cssText+=e,Pf):e?(t=n.head||n.getElementsByTagName("head")[0],(Pf=n.createElement("style")).type="text/css",void 0===Pf.sty\
leSheet?Pf.appendChild(n.createTextNode(e)):Pf.styleSheet.cssText=e,t.appendChild(Pf),Pf):void 0};function jf(e){return!!e&&"object"===a(e)&&"number"==typeof e.length&&e instanceof t.Node==0}function Lf(e,t){return!(!e||"object"!==a(e))&&Object.prototype.hasOwnProperty.call(e,t)}function qf(e){return zf(e)||Vf(e)}function zf(e){return["include","exclude"].some((function(t){return Lf(e,t)&&Vf(e[t])}))}function Vf(e){return"string"==typeof e||e instanceof t.Node||Gf(e)||$f(e)||jf(e)}function Gf(e){return Lf(e,"fromFrames")}function $f(e){return Lf(e,"fromShadowDom")}var Hf=function e(r,n){var a,o=Ml(r);return 9!==r.nodeType&&(11===r.nodeType&&(r=r.host),o&&null!==o._isHidden?o._isHidden:!(a=t.getComputedStyle(r,null))||!r.parentNode||"none"===a.getPropertyValue("display")||!n&&"hidden"===a.getPropertyValue("visibility")||"true"===r.getAttribute("aria-hidden")||(n=e(r.assignedSlot||r.parentNode,!0),o&&(o._isHidden=n),n))},Uf=function(e){var t=null!=(t=null==(t=e.props)?void 0:t.nodeName)?\
t:e.nodeName.toLowerCase();return"http://www.w3.org/2000/svg"!==e.namespaceURI&&!!Ic.htmlElms[t]};function Wf(e,t){var r=void 0===(r=t.include)?[]:r;t=void 0===(t=t.exclude)?[]:t,r=r.filter((function(t){return Uu(t,e)}));return 0!==r.length&&(0===(t=t.filter((function(t){return Uu(t,e)}))).length||(r=Yf(r),Uu(Yf(t),r)))}function Yf(e){var t,r,n=K(e);try{for(n.s();!(r=n.n()).done;){var a=r.value;t&&Uu(a,t)||(t=a)}}catch(e){n.e(e)}finally{n.f()}return t}function Kf(e,t){return e.length===t.length&&e.every((function(e,r){var n=t[r];return Array.isArray(e)?e.length===n.length&&e.every((function(e,t){return n[t]===e})):e===n}))}var Xf=function(e,t){return(e=e.actualNode||e)===(t=t.actualNode||t)?0:4&e.compareDocumentPosition(t)?-1:1};function Zf(e){return e instanceof ca?{vNode:e,domNode:e.actualNode}:{vNode:Ml(e),domNode:e}}var Jf,Qf,em=function(e,t,r,n){var a,o=4<arguments.length&&void 0!==arguments[4]&&arguments[4],i=Array.from(e.cssRules);return i?(a=i.filter((function(e){return 3===e.t\
ype}))).length?(a=a.filter((function(e){return e.href})).map((function(e){return e.href})).filter((function(e){return!n.includes(e)})).map((function(e,a){a=[].concat(M(r),[a]);var o=/^https?:\\/\\/|^\\/\\//i.test(e);return rm(e,t,a,n,o)})),(i=i.filter((function(e){return 3!==e.type}))).length&&a.push(Promise.resolve(t.convertDataToStylesheet({data:i.map((function(e){return e.cssText})).join(),isCrossOrigin:o,priority:r,root:t.rootNode,shadowId:t.shadowId}))),Promise.all(a)):Promise.resolve({isCrossOrigin:o,priority:r,root:t.rootNode,shadowId:t.shadowId,sheet:e}):Promise.resolve()},tm=function(e,t,r,n){var a=4<arguments.length&&void 0!==arguments[4]&&arguments[4];return(e=>{try{return!(!e.cssRules&&e.href)}catch(e){return!1}})(e)?em(e,t,r,n,a):rm(e.href,t,r,n,!0)},rm=function(e,r,n,a,o){return a.push(e),new Promise((function(r,n){var a=new t.XMLHttpRequest;a.open("GET",e),a.timeout=la.preload.timeout,a.addEventListener("error",n),a.addEventListener("timeout",n),a.addEventListener("loadend",\
(function(e){if(e.loaded&&a.responseText)return r(a.responseText);n(a.responseText)})),a.send()})).then((function(e){return e=r.convertDataToStylesheet({data:e,isCrossOrigin:o,priority:n,root:r.rootNode,shadowId:r.shadowId}),tm(e.sheet,r,n,a,e.isCrossOrigin)}))},nm=function(e){return"string"==typeof e&&(e=e.trim().match(/^([-+]?\\d+)/))?Number(e[1]):null};function am(){if(t.performance)return t.performance.now()}Jf=am(),Qf=!1;var om={start:function(){this.reset(),Qf=!0,this.mark("mark_axe_start")},end:function(){this.mark("mark_axe_end"),this.measure("axe","mark_axe_start","mark_axe_end",!0),this.logMeasures("axe"),this.clearMark("mark_axe_start","mark_axe_end"),Qf=!1},auditStart:function(){Qf||this.reset(),this.mark("mark_audit_start")},auditEnd:function(){this.mark("mark_audit_end"),this.measure("audit_start_to_end","mark_audit_start","mark_audit_end",!0),this.logMeasures(),this.clearMark("mark_audit_start","mark_audit_end")},mark:function(e){var r;null!=(r=t.performance)&&r.mark&&t.p\
erformance.mark(e)},measure:function(e,r,n){var a,o=3<arguments.length&&void 0!==arguments[3]&&arguments[3];if(null!=(a=t.performance)&&a.measure){try{t.performance.measure(e,r,n)}catch(e){this._log(e)}o||this.clearMark(r,n)}},logMeasures:function(e){function r(e){return Array.isArray(e)?e[e.length-1]:e}function n(e){o._log("Measure "+e.name+" took "+e.duration+"ms")}var a,o=this;if(null!=(a=t.performance)&&a.getEntriesByType&&null!=(a=t.performance)&&a.getEntriesByName){var i=r(t.performance.getEntriesByName("mark_axe_start"))||r(t.performance.getEntriesByName("mark_audit_start"));if(i)for(var l=t.performance.getEntriesByType("measure").filter((function(e){return e.startTime>=i.startTime})),u=0;u<l.length;++u){var s=l[u];if(s.name===e)return void n(s);e||n(s)}else this._log("Axe must be started before using performanceTimer")}},timeElapsed:function(){return am()-Jf},clearMark:function(){var e;if(null!=(e=t.performance)&&e.clearMarks){for(var r=arguments.length,n=new Array(r),a=0;a<r;a\
++)n[a]=arguments[a];for(var o=0,i=n;o<i.length;o++){var l=i[o];t.performance.clearMarks(l)}}},reset:function(){Jf=am()},_log:function(e){ua(e)}};function im(){var e,t,r,a;return n.elementsFromPoint||n.msElementsFromPoint||((e=n.createElement("x")).style.cssText="pointer-events:auto",e="auto"===e.style.pointerEvents,t=e?"pointer-events":"visibility",r=e?"none":"hidden",(a=n.createElement("style")).innerHTML=e?"* { pointer-events: all }":"* { visibility: visible }",function(e,o){var i,l,u,s=[],c=[];for(n.head.appendChild(a);(i=n.elementFromPoint(e,o))&&-1===s.indexOf(i);)s.push(i),c.push({value:i.style.getPropertyValue(t),priority:i.style.getPropertyPriority(t)}),i.style.setProperty(t,r,"important");for(s.indexOf(n.documentElement)<s.length-1&&(s.splice(s.indexOf(n.documentElement),1),s.push(n.documentElement)),l=c.length;u=c[--l];)s[l].style.setProperty(t,u.value||"",u.priority);return n.head.removeChild(a),s})}"function"==typeof t.addEventListener&&(n.elementsFromPoint=im());var lm=fu\
nction(e,t){return e.concat(t).filter((function(e,t,r){return r.indexOf(e)===t}))};function um(e,t,r,n,a){return(a=a||{}).vNodes=e,a.vNodesIndex=0,a.anyLevel=t,a.thisLevel=r,a.parentShadowId=n,a}var sm=function(e,t,r){if(n=rf(e=Array.isArray(e)?e:[e],t=Kl(t),r))return n;for(var n=e,a=(e=t,r),o=_l.get("qsa.recycledLocalVariables",(function(){return[]})),i=[],l=um(Array.isArray(n)?n:[n],e,null,n[0].shadowId,o.pop()),u=[];l.vNodesIndex<l.vNodes.length;){for(var s,c=l.vNodes[l.vNodesIndex++],d=null,p=null,f=((null==(s=l.anyLevel)?void 0:s.length)||0)+((null==(s=l.thisLevel)?void 0:s.length)||0),m=!1,h=0;h<f;h++){var g=h<((null==(g=l.anyLevel)?void 0:g.length)||0)?l.anyLevel[h]:l.thisLevel[h-((null==(g=l.anyLevel)?void 0:g.length)||0)];if((!g[0].id||c.shadowId===l.parentShadowId)&&Xl(c,g[0]))if(1===g.length)m||a&&!a(c)||(u.push(c),m=!0);else{var v=g.slice(1);if(!1===[" ",">"].includes(v[0].combinator))throw new Error("axe.utils.querySelectorAll does not support the combinator: "+g[1].combin\
ator);(">"===v[0].combinator?d=d||[]:p=p||[]).push(v)}g[0].id&&c.shadowId!==l.parentShadowId||null==(v=l.anyLevel)||!v.includes(g)||(p=p||[]).push(g)}for(c.children&&c.children.length&&(i.push(l),l=um(c.children,p,d,c.shadowId,o.pop()));l.vNodesIndex===l.vNodes.length&&i.length;)o.push(l),l=i.pop()}return u},cm=function(e){var t,r,a,i;e=void 0===(e=e.treeRoot)?o._tree[0]:e;return t=[],e=sm(e,"*",(function(e){return!t.includes(e.shadowId)&&(t.push(e.shadowId),!0)})).map((function(e){return{shadowId:e.shadowId,rootNode:Ju(e.actualNode)}})),(e=lm(e,[])).length?(r=n.implementation.createHTMLDocument("Dynamic document for loading cssom"),r=If(r),a=r,i=[],e.forEach((function(e,t){var r=e.rootNode,n=((e,t,r)=>{t=11===e.nodeType&&t?((e,t)=>Array.from(e.children).filter(dm).reduce((function(r,n){var a=n.nodeName.toUpperCase();n="STYLE"===a?n.textContent:n;return(n=t({data:n,isLink:"LINK"===a,root:e})).sheet&&r.push(n.sheet),r}),[]))(e,r):(e=>Array.from(e.styleSheets).filter((function(e){return!\
!e.media&&pm(e.media.mediaText)})))(e);var n=[];return t.filter((function(e){if(e.href){if(n.includes(e.href))return!1;n.push(e.href)}return!0}))})(r,e=e.shadowId,a);if(!n)return Promise.all(i);var o=t+1,l={rootNode:r,shadowId:e,convertDataToStylesheet:a,rootIndex:o},u=[];t=Promise.all(n.map((function(e,t){return tm(e,l,[o,t],u)})));i.push(t)})),Promise.all(i).then((function e(t){return t.reduce((function(t,r){return Array.isArray(r)?t.concat(e(r)):t.concat(r)}),[])}))):Promise.resolve()};function dm(e){var t=e.nodeName.toUpperCase(),r=e.getAttribute("href"),n=e.getAttribute("rel");r="LINK"===t&&r&&n&&e.rel.toUpperCase().includes("STYLESHEET");return"STYLE"===t||r&&pm(e.media)}function pm(e){return!e||!e.toUpperCase().includes("PRINT")}var fm=function(e){return e=void 0===(e=e.treeRoot)?o._tree[0]:e,e=sm(e,"video[autoplay], audio[autoplay]",(function(e){return("none"!==(e=e.actualNode).preload||0!==e.readyState||e.networkState===e.NETWORK_LOADING)&&!(e.hasAttribute("paused")||e.hasAttr\
ibute("muted")||(e.hasAttribute("src")?!e.getAttribute("src"):Array.from(e.getElementsByTagName("source")).filter((function(e){return!!e.getAttribute("src")})).length<=0))})),Promise.all(e.map((function(e){var t;e=e.actualNode;return t=e,new Promise((function(e){0<t.readyState&&e(t),t.addEventListener("loadedmetadata",(function r(){t.removeEventListener("loadedmetadata",r),e(t)}))}))})))};function mm(e){var t={cssom:cm,media:fm};return hm(e)?new Promise((function(r,n){var a=gm(e),o=a.assets,i=setTimeout((function(){return n(new Error("Preload assets timed out."))}),a.timeout);Promise.all(o.map((function(r){return t[r](e).then((function(e){return F({},r,e)}))}))).then((function(e){e=e.reduce((function(e,t){return _({},e,t)}),{}),clearTimeout(i),r(e)})).catch((function(e){clearTimeout(i),n(e)}))})):Promise.resolve()}function hm(e){return!e||null==e.preload||("boolean"==typeof e.preload?e.preload:"object"===a(e=e.preload)&&Array.isArray(e.assets))}function gm(e){var t=(r=la.preload).asset\
s,r={assets:t,timeout:r.timeout};if(e.preload&&"boolean"!=typeof e.preload){if(!e.preload.assets.every((function(e){return t.includes(e.toLowerCase())})))throw new Error("Requested assets, not supported. Supported assets are: ".concat(t.join(", "),"."));r.assets=lm(e.preload.assets.map((function(e){return e.toLowerCase()})),[]),e.preload.timeout&&"number"==typeof e.preload.timeout&&!isNaN(e.preload.timeout)&&(r.timeout=e.preload.timeout)}return r}function vm(e){var t=o._audit.data.checks||{},r=o._audit.data.rules||{},n=Vu(o._audit.rules,"id",e.id)||{},a=(e.tags=zl(n.tags||[]),bm(t,!0,n)),i=bm(t,!1,n);e.nodes.forEach((function(e){e.any.forEach(a),e.all.forEach(a),e.none.forEach(i)})),Yu(e,zl(r[e.id]||{}))}function bm(e,t,r){return function(n){var o,i=(o=e[n.id]||{}).messages||{};delete(o=Object.assign({},o)).messages,r.reviewOnFail||void 0!==n.result?o.message=n.result===t?i.pass:i.fail:("object"!==a(i.incomplete)||Array.isArray(n.data)||(o.message=((e,t)=>{function r(e){return e.incomp\
lete&&e.incomplete.default?e.incomplete.default:mf()}if(!e||!e.missingData)return e&&e.messageKey?t.incomplete[e.messageKey]:r(t);try{var n=t.incomplete[e.missingData[0].reason];if(n)return n;throw new Error}catch(n){return"string"==typeof e.missingData?t.incomplete[e.missingData]:r(t)}})(n.data,i)),o.message||(o.message=i.incomplete)),"function"!=typeof o.message&&(o.message=wf(o.message,n.data)),Yu(n,o)}}var ym=function(e,t){return sm(e,t)};function wm(e,t){var r,n=o._audit&&o._audit.tagExclude?o._audit.tagExclude:[],a=t.hasOwnProperty("include")||t.hasOwnProperty("exclude")?(r=t.include||[],r=Array.isArray(r)?r:[r],a=t.exclude||[],(a=Array.isArray(a)?a:[a]).concat(n.filter((function(e){return-1===r.indexOf(e)})))):(r=Array.isArray(t)?t:[t],n.filter((function(e){return-1===r.indexOf(e)})));return!!(r.some((function(t){return-1!==e.tags.indexOf(t)}))||0===r.length&&!1!==e.enabled)&&a.every((function(t){return-1===e.tags.indexOf(t)}))}var Dm=function(e,t,r){var n=r.runOnly||{};r=(r.rul\
es||{})[e.id];return!(e.pageLevel&&!t.page)&&("rule"===n.type?-1!==n.values.indexOf(e.id):r&&"boolean"==typeof r.enabled?r.enabled:"tag"===n.type&&n.values?wm(e,n.values):wm(e,[]))};function xm(e,t){var r,n,a;return t?(a=e.cloneNode(!1),r=Oa(a),a=1===a.nodeType?(n=a.outerHTML,_l.get(n,(function(){return Em(a,r,e,t)}))):Em(a,r,e,t),Array.from(e.childNodes).forEach((function(e){a.appendChild(xm(e,t))})),a):e}function Em(e,t,r,a){return t&&(e=n.createElement(e.nodeName),Array.from(t).forEach((function(t){var n,o,i;n=r,o=t.name,void 0!==(i=a)[o]&&(!0===i[o]||Sa(n,i[o]))||e.setAttribute(t.name,t.value)}))),e}function Am(e,t){var r=[];if(o._selectCache)for(var n=0,a=o._selectCache.length;n<a;n++){var i=o._selectCache[n];if(i.selector===e)return i.result}for(var l,u=t.include.reduce((function(e,t){return e.length&&Uu(e[e.length-1],t)||e.push(t),e}),[]),s=(l=t).exclude&&0!==l.exclude.length?function(e){return Wf(e,l)}:null,c=0;c<u.length;c++){var d=u[c];r=((e,t)=>{if(0===e.length)return t;var \
r;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})(r,sm(d,e,s))}return o._selectCache&&o._selectCache.push({selector:e,result:r}),r}function Fm(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0;if("object"!==a(e)||null===e)return{message:String(e)};var r,n={},o=K(la.serializableErrorProps);try{for(o.s();!(r=o.n()).done;){var i=r.value;["string","number","boolean"].includes(a(e[i]))&&(n[i]=e[i])}}catch(e){o.e(e)}finally{o.f()}return e.cause&&(n.cause=t<10?Fm(e.cause,t+1):"..."),n}function Cm(e){var t,r,n=e.error,a=e.ruleId,o=e.method;e=e.errorNode;return H(this,Cm),(r=R(this,Cm)).name=null!=(t=n.name)?t:"RuleError",r.message=n.message,r.stack=n.stack,n.cause&&(r.cause=Fm(n.cause)),a&&(r.ruleId=a,r.message+=" Skipping ".concat(r.ruleId," rule.")),o&&(r.method=o),e&&(r.errorNode=e),r}O(Cm,function(e){var t="function"==typeof Map?new Map:void 0;return function(e){if(null===e||!(e=>{try{return-1!==Function.toString.cal\
l(e).indexOf("[native code]")}catch(t){return"function"==typeof e}})(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return C(e,arguments,T(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),S(r,e)}(e)}(Error));var km=W(Cm),Rm=function(e){e.forEach((function(e){var r=e.elm,n=e.top;e=e.left;if(r===t)return r.scroll(e,n);r.scrollTop=n,r.scrollLeft=e}))};function Nm(e){return function e(t,r){var n=t.shift();return r=n?r.querySelector(n):null,0===t.length?r:null!=r&&r.shadowRoot?e(t,r.shadowRoot):null}(Array.isArray(e)?M(e):[e],n)}function Tm(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:n,r=Array.isArray(e)?M(e):[e];return 0===e.length?[]:function e(t,r){t=function(e){return $(e)||P(e)||X(e)||G()}(t);var n=t[0],a=Z(t).slice(1);if(t=r.querySelectorAll(n),0===a.length\
)return Array.from(t);var o,i=[],l=K(t);try{for(l.s();!(o=l.n()).done;){var u=o.value;null!=u&&u.shadowRoot&&i.push.apply(i,M(e(a,u.shadowRoot)))}}catch(e){l.e(e)}finally{l.f()}return i}(r,t)}var Om=function(){return["hidden","text","search","tel","url","email","password","date","month","week","time","datetime-local","number","range","color","checkbox","radio","file","submit","image","reset","button"]},Sm=[,[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,,,,,1,1,1,1,,,1,1,1,,1,,1,,1,1],[1,1,1,,1,1,,1,1,1,,1,,,1,1,1,,,1,1,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,,,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1],[,1,,,,,,1,,1,,,,,1,,1,,,1,1,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1\
,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,,,1,,,,1,1,1,1,,1,,1,,1,,,,,,1],[1,,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,,1,,1,,,,,1,,1,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,,1,1,1,,1,,1,1,1,,,1,1,1,1,1,1,1,1],[,,1,,,1,,1,,,,1,1,1,,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1,1,1,1,1,,,1,1,1],[1,1,1,1,1,,,1,,,1,,,1,1,1,,,,,1,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\
1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,\
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1],[,1,,1,1,1,,1,1,,1,,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,,,1,1,1,,,1,1,,,,,,1,1],[1,1,1,,,,,1,,,,1,1,,1,,,,,,1,,,,,1],[,1,,,1,,,1,,,,,,1],[,1,,1,,,,1,,,,1],[1,,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,,1,,,1,1,1,1],[,1,1,1,1,1,,,1,,,1,,1,1,,1,,1,,,,,1,,1],[,1,,,,1,,,1,1,,1,,1,1,1,1,,1,1,,,1,,,1],[,1,1,,,,,,1,,,,1,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,,1,1,1,,,1,1,1,1,1,1,,1,,,,1,1,1,,1,,1],[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,1,1],[,1,1,1,,,,1,1,1,,1,1,,,1,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,,1,,,,,1,1,1,,,1,,1,,,1,1],[,,,,1,,,,,,,,,,,,,,,,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,,1,1,,,,1,1,1,1,1,,,1,1,1,,,,1,1],[1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,1\
,,,,,,,1],[,1,1,,1,1,,1,,,,,,,,,,,,,1],[,,,,,,,,1],[1,1,1,,,,,,,,,,,,,1],[,,,,,,,,1,,,1,,,1,1,,,,,1]],[,[1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,,1],[,,,1,,,,,,,,,,,,,,,1],[,1,,,1,1,,1,,1,1,,,,1,1,,,1,1,,,,1],[1,,,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,,,,1],,[,1,1,1,1,1,,1,1,1,,1,1,,1,1,,,1,1,1,1,,1,1,,1],[,1,,,1,,,1,,1,,,1,1,1,1,,,1,1,,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,,,1,1,1,1,1,1,1,,,1,,,1,,1],[,1,,,,,,1,,,,1,1,,,,,,1,1,,,,,1],[,,,,,,,1,,,,1,,1,1],[,1,1,1,1,1,1,1,,,,1,1,1,1,1,,,1,1,,1,1,1,1,1],[,1,,,1,1,,1,,1,1,1,,,1,1,,,1,,1,1,1,1,,1],[,1,1,1,,1,1,,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1],[,,,,,,,,,,,,,,,,1],,[,1,1,1,1,1,,1,1,1,,,1,,1,1,,1,1,1,1,1,,1,,1],[,,1,,,1,,,1,1,,1,1,,1,1,,1,,,,,,,,,1],[,1,1,,1,,,,1,1,,1,,1,1,1,1,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,1,,1,,1,1],,[,1,1,,1,,,1,,1,,,,1,1,1,,,1,,,1,,,,1],[1,1,,,1,1,,1,,,,,1,,\
1]],[,[,1],[,,,1,,,,1,,,,1,,,,1,,,1,,,1],[,,,,,,,,,,,,,,,,,,1,1,,,,,,1],,[1,,,,,1],[,1,,,,1,,,,1],[,1,,,,,,,,,,,1,1,,1,,,,,,,,,1,1],[,,,,,,,,,,,,,,,,,,,1,,1],[,,,,,,,,,,,,,,,,1,,,,1,,1],[,1],[,1,,1,,1,,1,,1,,1,1,1,,1,1,,1,,,,,,,1],[1,,,,,1,,,1,1,,1,,1,,1,1,,,,,1,,,1],[,1,1,,,1,,1,,1,,1,,1,1,1,1,1,,1,,1,,1,1,1,1],[1,1,1,1,1,,1,,1,,,,1,1,1,1,,1,1,,,1,1,1,1],[1,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],,[,1,,,,,,1,1,1,,1,,,,1,,,1,1,1,,,1],[1,,,,,1,,1,1,1,,1,1,1,1,1,,1,,1,,1,,,1,1],[1,,1,1,,,,,1,,,,,,1,1,,,1,1,1,1,,,1,,1],[1,,,,1,,,,,,,,,,,,,1],[,,,,,1,,,1,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,,,1],[,1,,,,1]],[,[1,1,1,,1,,1,1,1,1,1,1,1,1,1,,1,,1,,1,1,,,1,1,1],[,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],,[,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1],,[1,1,,,,1,1,,,,,,1,,,,1,,1,,1,1,,1],[1],[,,,,,,,,,,,1,,,,,,,,,,,1],[,1,,,,,,,1,1,,,1,,1,,,,1,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,,1],[,,1,,,,,1,,1],[1,,,,1,,,,,1,,,,1,1,,,,1,1,,,,,1],[,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[\
1,,,1,1,,,,,,,1,,1,,1,1,1,1,1,1],[,,,,,1,,,,,,,1,,,,,,,1],,[,,1,1,1,1,1,,1,1,1,,,1,1,,,1,1,,1,1,1,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,,,,1],,[1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,,,1,1,1,1,,,,,,1,,1,,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,,,,1,,1,,,1,1,1,1,1],[,,,,,,,,,,,1,,,,,,,,,1,,,,1],[,1,1,,1,1,,1,,,,1,1,,1,1,,,1,,1,1,,1],[,1,,1,,1,,,1,,,1,1,,1,1,,,1,1,1],[,1,1,1,1,1,,1,1,1,,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,,,,,,,,,1,,1,,1,1,,,,1,,,1],[,1,,,1,1,,,,,,,,,1,1,1,,,,,1],[1,,1,1,1,,,,1,1,1,1,1,,,1,,,1,,,1,,1,,1],[,1,1,,1,1,,1,1,,,,1,1,1,,,1,1,,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,,1],[,1,,,,,,,,1,,,,,1,,,,1,,,1],[,1,1,1,1,,,1,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1],[,,,,,1,,1,,,,,1,1,1,1,1,,,1,,,,1],[,1,,,,,,,,1,,,,,,,,,,,,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\
,1],[1,1,,1,,1,1,,,,1,,1,1,1,1,1,,1,1,,,,,,1],[,1,1,1,1,1,1,1,,1,1,,,1,1,,,,1,,1,1,,1,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,1,1,,1,,,1,1,1,1,,,1,,,,,,,1,1],[,1,,,,,,,,1,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1],[,1,1,,,,,,,,,,,,1,1,,,,,,1],[,1,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,,,,,1],[1,1,,,1,,,1,1,1,,,,1],,[,,,,,,,,,,,,,1,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,1,,,,,,,1],[1,1,1,,1,,1,1,1,1,1,1,1,1,,1,,,1,,1,,,1,1],[,,,,,,,,,1],[,1,,,,1,,,1,,,1,,,1,,,,,1],[,1,1,,1,1,,,,,,,,,,,,,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,1,1,1,,,1,1,1,,,,1,,1],[1,1,1,1,1,1,,,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,,1,1],[,,,,,,,,,,,,,,,1,,,,1],,[1,1,,1,,1,,,,,,1,,1,,1,1,,1,,1,1,,1,1,,1],[,,1,,,,,,1,,,,1,,1,,,,,1],[1,,,,,,,,,1,,,,,,1,,,,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,,1,,,,,,1,,,1,,,,,,,,1],[,1,,1,,,,,,,,,,,,1],,[1,1,,,,,,,,,,,,,,,,,,,,,,1,1],[1]],[,[1,,,,,,,,,1,,,,,1,,1,,1],[,1,1,,1,1,,1,1,1,,,1,1,1,,,,1,,,1,,,,1],[,1,,,,,,,1,,\
,,1,,,,,,1],[1,1,1,1,1,1,,,,1,,,,,,,,,1,1,1,1],[1],[,1,1,,,1,1,,,,,1,,1,,,,,,,,1,,,,1],[1,,1,,,1,,1,,,,,1,1,1,1,,,,1,,,,1],[,,1,,,,,,,1,,,,,,,1,,,,,,,1],[1,,,,,,,,,,,,,,1,,,,1],[,,,1,,1,,,,,1,,,,1,1,,,,1],[1,,,,,1,,,1,1,,1,1,,,1,1,,1,1,1,,1,1,1,,1],[,1,1,,,,,1,,1,,1,1,1,,1,1,,,1,,1,1,1],[,1,,,,1,,,,1,,,1,,1,1,,,1,1,1,,,,,1],[1,,1,1,,1,,1,1,,1,,1,1,1,1,1,,,1,1,,,,,,1],[1,,,,,,,,,,,,,,,,,,1,,,1,,1],[,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,,1,,1],[,1,,,,1,,,1,1,,1,,,1,1,,,1,,,1,,,1,1],[1,1,,1,1,1,,1,1,1,,1,,1,1,1,,,1,,1,1,1],[1,,1,1,1,1,,,,1,,1,1,1,,1,,,1,1,1,,1,1,1,1,1],[1,,,,,,,,,,,,,1],[,,1,,,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,,,1,,1,,1,,,,1],[,,,1,,,,,,,,,1],[,1,,,,,,,,,,,,,,1,,,,,,,,,1],[,,,,,,,,1,1,,,,1,,,,,1,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,,,1,1,1],[,,,,,1,,,,1,1,1,,1,1,1,,,1,,1,1,,1],[,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,1,,,,,,,,,,,,,1],[,,1,,,1,,1,1,1,,1,1,,1,,,,1,,1,1],,[,,1,,,1,,,,,,1,,,,1],[,,,,,,,,,1,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,,1,1,,1,,1,,,1,1,1,,,1],[,,\
,,,1,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,1,,1,1,,1,1,,1],[,,,,,1,,,,,,,,,,,,,,1],[,1,1,1,1,,,,,1,,,1,,1,,,,1,1,,,,1,1],[,1,,,1,,,1,,1,1,,1,,,,,,,1],[,,1,,1,,,1,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,,,,,,,,,,1,,1,1],[,,,,,,,,,,,,1],,[,1,1,1,1,,,,1,1,,1,1,1,1,1,1,,1,1,1,1,,1,,1],[1,,,,1,,,,,,,,,,1],[1,,,,,,,,,1],,[,1,,,,1,,,,,,,,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,\
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,,1,,,,1,1,,,1,1,,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1\
,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,1],[1,1,1,,,,,1,1,1,,1,1,1,1,1,,1,1,1,1,1,,,,,1],[,1,,,,,,,1,1,,,1,1,1,,1,,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,,,1,,,,1,,,1,,,,1,,,,,,,1,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1],[1,1,1,,1,,,1,1,1,1,,1,1,1,1,,,,1,,1,,1,,,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,,1,1,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,,1,,1,,,,1],[,1,1,1,1,1,,1,1,1,,,1,1,1,1,1,,1,1,1,,1,1,,1],[1,,,1,,,,1,1,1,,,,,1,1,,,,1,,1],[1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,,1,,1,1,,,,,,,1,,1],[,1,,,,1,,1,1,,,,1,1,,1,,,,1,1,1,,1],[,,,,,,,,,,,,,1],[,1,,,,,,1,,,,,,,1],[,,,,,,,,1,,,,1,,1,,,,,,,,,,,,1]],[,[,1,1,,1,1,1,1,,1,1,1,,1,1,,1,1,,1,1,1,1,1,1,,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,\
1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[,1,1,,1,1,1,1,1,1,,1,1,1\
,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,,,1,,,,,,,,1,,,,,,1,,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,,1,,1,1,1,1,1,1,1,,1,1,,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\
1,,1,1,1,1,1,,1,1],[,1,1,,,,,1,1,1,,,1,,1,1,,,,1,,1,,,1,1],[,,,,,,,1,,,,1,1,1,1,1,,1,,,1,,,,,1],[1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,,1,,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,1,1,,1,,1,1,1,,1,,1,1,,1,1,,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,,1,,,,,1,,1],[,1,1,1,,1,,1,,1,,,,1,,1,,,1,,,,,1,1,1],[,1,,,1,1,,1,,1,,1,1,1,1,1,,1,1,,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,,1,,1,,1,,,,,1,1,,1,,,,1,1]],[,[,1,,1,,,,,,,,1,,,,,,,1,,,,1],[,,,,,,,,,1,,1,1,1,,1,,,1,,1,1],[1,1,,,,,,,1,,,,,1,,1,,,,,,1],[,1,,,,,,,,,,1,,,,,,,,,1,1],,[,,,,,,,,,,,,,,,1,,,,1,,1],[,,1,1,,1,,1,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,1,,,,,,,,,1],[1,,1,1,,,,1,,,,,,,,,1,,,1,,,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,,1,1,,1,1,,1,,1],[,1,,,1,1,,,,,,1,,1,,1,,,1,,1,1],[1,1,1,1,,1,,1,,1,,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,,,1,,1,,1,1,1,,,1,1,1,,1,1,1,1,,1,1],[,,,,1,,,1,,,,,,,1,,,,1,1],[,1,,,,,,,,,,1,,1,,1,,,,,1,,,,,1],,[1,1,,1,,1,\
,1,1,,,,,,1,1,,,1,1,1,1,1,1,1,1,1],[1,1,,1,,,,,,1,,,,,1,1,1,,,,1,1,,,1],[,1,1,,1,1,,,,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,,,1,,,,1,,,,1,1],[,,,,1],[,,,,,,,,,1,,,1],,[,,1,,1,,,,,,,,,1,,,,,,,,,,,,1],[,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,,,1],[,1,,1,,,,,,1,,,,,1,1,,,,,1,1],[,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,,,1,,1,1,1],[,1,,,,1,,,,,,,1],[,1,,,1,,,1,,1,,1,1,,1,,,,,1,,1,,,,1,1],[,1,,,1,,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,1,1,,,,1,1,,,,,,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,,1,1,,1,1,1,1,1],[,1,,,,1,,,,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,1,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,,1,1,\
1,,1,1,1,,,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,,,,,,,1,1,,,,,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,1,,1,1,1,1],,[,1,1,,,,,1,,1,,,,1,1,1,,,1,,,,,1],[,,,,,,,,,,,,,1],[,,,,,1,,,,,,,,1,1,,,,,1,,1,,,1,1],[,,,,,1,,,1,,,,,,1]],[,[,1],,,,,,,,,,,,,,,,,,,,[1,1,1,1,1,,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,1,1,1,1],[,1,,1,,1,,,1,1,1,,1,1,1,1,1,,,1,,,,1,,1,1],[,1,,1,,1,,,1,,,,,1,,,,,,1,1],[,1,,1,,,,,1,,,,1,,1,1,1,1,1,1,1,1,,1],[,1,,,,,,,,,,,,,,,1]],[,[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,,,,,,,,,1,1,,,,1],[,,,,,,1],[,,1],[,1,1,,,1,,1,,1,1,,1,1,1,,,,1,1,1,,,,,1],,[,1,,,,1,,,,,,1,,,1,,,,1,1,,1],[,,,,,,,1,,,,,,,,,1],[,1,1,,,1,1,,,,,,1,1,1,,,,1,,1,1],[,,,,,,,1,,1,,,,,,,,,,1],[,1,1,,,,,,1,1,,,,1,,,,,,,1,,,1],,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,1,,,1,,,,,1,,1,,1,,1,,,,,1],[1,1,1,1,1,1,1,1,,,,,1,1,,1,1,,1,,,1,,1],[,,,,,,,,,,,,,,1,,,,,,1],,[,,,,,,,,,1,,,,1,,1,,,,,1],[,,1,,,,,,,1,,1,1,1,1,,,,,,,,,1],[,,,1,,,,,1,,,,,1,,,,,,1,,,,1],[1,,1,1,,1,1,1,1,1\
,,1,,,,1,1,1,,,1,1,,,,1,1],,[1,1,,,,,,,,,,1,1,1,,1,,,1],[,,,,1,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,1],[,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,,1,,,1,,,,,,,,1,,,,,,1,,,,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,,,,1,1,1,1,1,1,,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,1,,1,1,,1,1,1,,1,1,1,1,1,,,1],[1,1,1,1,,1,1,1,1,1\
,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,,1,,1,,1,1,1,1,1,,1,,1,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,,,,,,1,,1,,,,,1,1,,,,,1],[1,,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,,1,,,,1,1,1,1,1,,,1,1,,1,,1],[,1,1,1,1,,,,,1,,1,1,1,1,1,,,1,1,,,,1,1,1],[,1,1,1,1,1,,1,,,,,1,,1,,1,,,1,,,1,1,,1]],[,[1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,,,,,1,,,,,1,1,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,,,,1,,1,1,,1,1,1,1,1,,,1,,1,,1],[1,1,1,,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1\
,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,,1,,,,,,,,,,1,1,1,1,1,1,1,,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,1,1,,,,1,,1,1,1,1,1,,,,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,,1,1,1],[,1,1,1,,1,,1,1,1,1,,,1,1,1,,1,1,1,1,1,,,1,1],[1,1,,,,1,,,1,1,1,,1,,1,,1,,1,1,1,1,1,,1,1,1],[,1,,,,,,,1,,1,,1,1,1,1,,,,,,,,,1]],[,[,,,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,1,,,1,,,,,,1,,,1,,,,1],,[,1,,,,1,,1,,1,1,,1,1,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],[1,1,1,,,1,,,1,,,,,,1,1,,,,,,,,,,1],[,1,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1,,,1],[,,,,,,,,,1],[1,1,,,,,,1,1,1,,1,1,,,,1,1,,1,,1,1,1,,1],[,1,1,1,,1,1,,,1,,1,1,1,1,,,,,,,1,,1,,1],[,1,1,1,\
1,,,1,,1,,,,1,1,1,1,,1,1,,1],[,1,,,1,1,,1,,1,,1,,1,1,,1,,1,,,1,,,1,,1],[,,,,,,,,,,,1,,,1],[,,,,,,,,,1,,,,,,,,,,,,,1],,[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1],[,1,,,,,,,1,1,,1,,,,,1,,,1,,1],[,1,,,,1,,,1,,,,,,,,1,,1,,,1],[,,,,,,,,,,,,,1,1,,,,1,,,1],[,,,,,1,,,1,,,,1],[,1],,[,1],[1,,,,,,,,,,,,,,1,,,,,1]],[,[,1,,,,1,1,1,1,1,1,,1,1,1,1,1,,1,1,,1,1,,,1],[,,1,,,,,,,,,1],,,[1,,,1,1,,,,,,,,1,1,,1,1,,1],,[,,,,,,,,,,,,,,,,,,1,,1],,[1,,,1,1,,1,1,,,,,1,,1,,,,,1,1,,1],[,,,,,,,,,,,1],[,1,,,,,,,,1,1,1,1,1,1,1,1,,,,1,1,,,,,1],[,,,,,,,,,,,,,,,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,,1,1,1,1,1,1],[,,,,,,,,,,,1,,1,,,1],[1,,,,,,,,,,,,,,,,,,1,,1],,,[,1,,,,,,,,,,,,,,1,,,,1,1],[,,,,,,,,,1,,,1,,1,,,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,1,1,,,,,,1],,[,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,1,1,,1,1,1,1,1,1,,,1,1,1,1,1,,1,1],[,1,,,,,,,,1],[,,,,1,,,1,,,1,1,,,,,,,,,1,1,,,,1],[,1,,1,1,,,1,1,1,,,,1,1,1,1,,1,1,1,1,,1],[,,,,,,,1],[,1,1,,,,,1,,1,,,,,,1,,,,,,1,,1,,1],[\
,1,,,,,,1,,,,1,,,,,,,,,,1],[,,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1,1,1,1,,1],[,1,,,,,,,,1],[,1,1,,1,,,,,,,,1,,,,,,1,,,1,,1,,1],[,1,,1,,1,,1,1,1,,1,1,1,,1,,,1,1,,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,,,,1,1,1,,,,1,1,,,1,1],[,,1,1,1,1,,1,,1,,1,,1,1,1,1,,,,,1,,1,,1],[1,1,1,1,1,1,1,1,,1,,1,,1,1,1,,,1,1,,,,1,,1],[,,,1],,[,1,1,,1,,,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1],[,1,,,,,,1,,1,,1,,,,,,,1,1,,1,1],[,,1,,,,1,,1,1,,1,,1,,,,,,,,,,1],[,1,1,,1,,,,1,,,,1,1,1,,,,1,,1,1,1,,1,1],,[,1,1,,,,,,,,,,,,,1,,,1,,,,,1],[,1,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,1,,,,1,1,,,,1,,,,,,,1]],[,[,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[,1,1,1,1,1,,1,,1,1,,,1,1,1,1,,1,,,,,1,1,1],[,,1,1,,1,,1,1,,,,1,1,1,1,,,1,,1,1,1,1,,1],[,1,,1,,,,,,,,1,,1,,1,,1,,,,,,,,1],[,,1,,1,,,1,,,,,1,1,,,1,,1,1,1,1],[,1],[,1,1,,1,,1,1,,1,,,1,1,1,,,,1,,,1,,1],[1,1,,1,1,1,,,,,,,,1,,,,,1,,1,1,1],[,1,1,,,,,,,1,,,1,,1,,1,,1,1,,,1,,,1],[,,1,,,,,,,,,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,,1,,,,,1,1,1,,,1,,1,,,,1]\
,[,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,1,1,,1,1,1,,1,1,1,1,1,,,,1,1],[,,,1,1,,,1,,1,,1,,1,1,1,1,,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,,1,,1,,,,1,1,,,1,1,,1,1,,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1,,1,1,,,1],[,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,,1,,,1,,,1,,1,1,1,1,1,,1,,1,1],[,,,,,1,,,,1,,,,,1,1,,,,1],[,1,,1,1,1,,1,,,1,1,1,,,1,,,1,,1,,,1],[,,1,,,,,,,,,1,,1,,,,,1,,1],[,1,1,,,,,,,,1,1,1,,,,,,,,1,,,,,1],[,,,,,,,,1,,,,,1,,,1]],[,[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,,1,1,1,1,1,1,1,1,,,,,,,,,1,1],[,,,,,,,,1,,,,1,,1,,1,,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,1,,1,,1,,,,1,1,,1,,1,,,,1,1,1,1,1,,,1],,[,1,,,,,,,,1,,,1,1,,,1,,1,1,,1,,1],[,1,,,1,,,,,,,,1,,,,,,,1],[1,1,,,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1],,[,1,,,,,,1,1,1,,1,1,1,1,1,,,1,,1,1,,,,1],[,1,1,,,1,,1,,1,,,1,1,1,1,,,1,,,1,,,,1],[,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1],[,1,1,,1,1,,1,1,,,\
1,1,,1,1,,1,,1,,1],[1,,1,,,,,1,,1,,1,1,1,1,,,,,1,1,,,,1,1],[,1,1,,,,,1,1,,,1,,1,1,1,1,,,,,,,,,,1],,[,1,1,,,1,,,,1,,1,1,1,1,1,,,,1,,,,1,,1],[,,,1,1,,,1,,,,,1,1,1,1,1,,1,1,,,,,,1],[,1,,,,,,,,,,,1,,,,1,,,,,,,1,,1],[,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,1,,,,,1,,1,,,1,1,,1,1,,1],[,1,,,,,,1,,,,,1,1,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1,,,1,,,,,1],[,,,,,,,1,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,,1,,,,,,,1,,,,,,,,1,1,,1],[,1,,,1,,,,1],[,,,,,,,,,,1],[,1,,,,,,1,1,,,,,1,1],,[,1,1,,,,,,1,,,,,1,1,,,,1],[1,,1,,1,,,,,1,,,,,1,,,,,,,,,1,1],[,1,1,,,,,,,,,1,1,1,1,,,,1,,,,,1,,,1],,[,1,1,,1,,,1,1,,,1,,,1,1,1,,1,,1,1,1,,,,1],[,1,,,,1,,,,,1,,,1,1,,,1,,1,,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,,,1,,,,,1,,,,,1,,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,1],[,1,,,,,,1,,,,,,,1,1,1,,,1],[,1,,,,,,,,,,1,1,1,,,,,1,,,1],[,,,,,1,,1,,,,,1,1,1,,1,1,,1,1,1,,,1,1],[1\
,1,,,,,,,1,,,,,1,1,,,,,,,,,,,1],,[,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,,1,,,,,1,,,1,,,,1,,1],[,1,,,,,,,,,1]]];function _m(e){e=Array.isArray(e)?e:Sm;var t=[];return e.forEach((function(e,r){var n=String.fromCharCode(r+96).replace("\`","");Array.isArray(e)?t=t.concat(_m(e).map((function(e){return n+e}))):t.push(n)})),t}var Mm=function(e){for(var t=Sm;e.length<3;)e+="\`";for(var r=0;r<=e.length-1;r++)if(!(t=t[e.charCodeAt(r)-96]))return!1;return!0};O(Pm,ca),Ti=W(Pm,[{key:"props",get:function(){return this._props}},{key:"attr",value:function(e){return null!=(e=this._attrs[e])?e:null}},{key:"hasAttr",value:function(e){return void 0!==this._attrs[e]}},{key:"attrNames",get:function(){return Object.keys(this._attrs)}}]);function Pm(e){var t,r,n;return H(this,Pm),(t=R(this,Pm))._props=(e=>{var t=null!=(t=e.nodeName)?t:jm[e.nodeType],r=null!=(r=null!=(r=e.nodeType)?r:Bm[e.nodeName])?r:1,n=(Aa("number"==typeof r,"nodeType has to be a number, got '".concat(r,"'")),Aa("string"==typeof t,"nodeName has t\
o be a string, got '".concat(t,"'")),t=t.toLowerCase(),null);return"input"===t&&(n=(e.type||e.attributes&&e.attributes.type||"").toLowerCase(),Om().includes(n)||(n="text")),e=_({},e,{nodeType:r,nodeName:t}),n&&(e.type=n),delete e.attributes,Object.freeze(e)})(e),t._attrs=(e=e.attributes,r=void 0===e?{}:e,n={htmlFor:"for",className:"class"},Object.keys(r).reduce((function(e,t){var o=r[t];return Aa("object"!==a(o)||null===o,"expects attributes not to be an object, '".concat(t,"' was")),void 0!==o&&(e[n[t]||t]=null!==o?String(o):null),e}),{})),t}var Im,Bm={"#cdata-section":2,"#text":3,"#comment":8,"#document":9,"#document-fragment":11},jm={},Lm=(Object.keys(Bm).forEach((function(e){jm[Bm[e]]=e})),Ti),qm=function(e,t){if(e=e||function(){},t=t||o.log,!o._audit)throw new Error("No audit configured");var r=o.utils.queue(),a=[],i=(Object.keys(o.plugins).forEach((function(e){r.defer((function(t){function r(e){a.push(e),t()}try{o.plugins[e].cleanup(t,r)}catch(e){r(e)}}))})),o.utils.getFlattenedT\
ree(n.body));o.utils.querySelectorAll(i,"iframe, frame").forEach((function(e){r.defer((function(t,r){return o.utils.sendCommandToFrame(e.actualNode,{command:"cleanup-plugin"},t,r)}))})),r.then((function(r){0===a.length?e(r):t(a)})).catch(t)},zm={};function Vm(e){return zm.hasOwnProperty(e)}function Gm(e){return"string"==typeof e&&zm[e]?zm[e]:"function"==typeof e?e:Im}var $m={},Hm=(ce($m,{getAllCells:function(){return Hm},getCellPosition:function(){return Gc},getHeaders:function(){return Wm},getScope:function(){return $c},isColumnHeader:function(){return Hc},isDataCell:function(){return Ym},isDataTable:function(){return Km},isHeader:function(){return Xm},isRowHeader:function(){return Uc},toArray:function(){return Vc},toGrid:function(){return Vc},traverse:function(){return Zm}}),function(e){for(var t,r,n=[],a=0,o=e.rows.length;a<o;a++)for(t=0,r=e.rows[a].cells.length;t<r;t++)n.push(e.rows[a].cells[t]);return n});function Um(e,t,r){for(var n,a="row"===e?"_rowHeaders":"_colHeaders",i="row"\
===e?Uc:Hc,l=(s=r[t.y][t.x]).colSpan-1,u=s.getAttribute("rowspan"),s=(u=0===parseInt(u)||0===s.rowspan?r.length:s.rowSpan,t.y+(u-1)),c=t.x+l,d="row"===e?t.y:0,p="row"===e?0:t.x,f=[],m=s;d<=m&&!n;m--)for(var h=c;p<=h;h--){var g=r[m]?r[m][h]:void 0;if(g){var v=o.utils.getNodeFromTree(g);if(v[a]){n=v[a];break}f.push(g)}}return n=(n||[]).concat(f.filter(i)),f.forEach((function(e){o.utils.getNodeFromTree(e)[a]=n})),n}var Wm=function(e,t){if(e.getAttribute("headers")){var r=Rc(e,"headers");if(r.filter((function(e){return e})).length)return r}return t=t||Vc(rs(e,"table")),e=Um("row",r=Gc(e,t),t),r=Um("col",r,t),[].concat(e,r).reverse()},Ym=function(e){var t;return!(!e.children.length&&!e.textContent.trim())&&((t=Lc(e))?["cell","gridcell"].includes(t):"TD"===e.nodeName.toUpperCase())},Km=function(e){var r=Lc(e);if(("presentation"===r||"none"===r)&&!Ec(e))return!1;if("true"===e.getAttribute("contenteditable")||rs(e,'[contenteditable="true"]'))return!0;if("grid"===r||"treegrid"===r||"table"===r)\
return!0;if("landmark"===wp(r))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 n=0,a=e.children.length;n<a;n++)if("COLGROUP"===e.children[n].nodeName.toUpperCase())return!0;for(var o,i,l,u=0,s=e.rows.length,c=!1,d=0;d<s;d++)for(var p,f=0,m=(p=e.rows[d]).cells.length;f<m;f++){if("TH"===(o=p.cells[f]).nodeName.toUpperCase())return!0;if(c||o.offsetWidth===o.clientWidth&&o.offsetHeight===o.clientHeight||(c=!0),o.getAttribute("scope")||o.getAttribute("headers")||o.getAttribute("abbr"))return!0;if(["columnheader","rowheader"].includes(Lc(o)))return!0;if(1===o.children.length&&"ABBR"===o.children[0].nodeName.toUpperCase())return!0;u++}if(e.getElementsByTagName("table").length)return!1;if(s<2)return!1;if(1===(r=e.rows[Math.ceil(s/2)]).cells.length&&1===r.cells[0].colSpan)return!1;if(5<=r.cells.length)return!0;if(c)return!0;for(var h=0;h<s;h++){if(p=e.rows[h],i&&i!==t.getComputedStyle(p).getPropertyValu\
e("background-color"))return!0;if(i=t.getComputedStyle(p).getPropertyValue("background-color"),l&&l!==t.getComputedStyle(p).getPropertyValue("background-image"))return!0;l=t.getComputedStyle(p).getPropertyValue("background-image")}return 20<=s||!(Fs(e).width>.95*Cs(t).width||u<10||e.querySelector("object, embed, iframe, applet"))},Xm=function(e){return!(!Hc(e)&&!Uc(e))||!!e.getAttribute("id")&&(e=Ca(e.getAttribute("id")),!!n.querySelector('[headers~="'.concat(e,'"]')))},Zm=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)},Jm={},Qm=(ce(Jm,{allowedAttr:function(){return Qm},arialabelText:function(){return Oc},arialabelledbyText:function(){return\
 Tc},getAccessibleRefs:function(){return th},getElementUnallowedRoles:function(){return oh},getExplicitRole:function(){return Lc},getImplicitRole:function(){return fd},getOwnedVirtual:function(){return wd},getRole:function(){return gd},getRoleType:function(){return wp},getRolesByType:function(){return lh},getRolesWithNameFromContents:function(){return dh},implicitNodes:function(){return fh},implicitRole:function(){return fd},isAccessibleRef:function(){return mh},isAriaRoleAllowedOnElement:function(){return rh},isComboboxPopup:function(){return hh},isUnsupportedRole:function(){return Bc},isValidRole:function(){return jc},label:function(){return vh},labelVirtual:function(){return Qd},lookupTable:function(){return ph},namedFromContents:function(){return yd},requiredAttr:function(){return bh},requiredContext:function(){return yh},requiredOwned:function(){return wh},validateAttr:function(){return xh},validateAttrValue:function(){return Dh}}),function(e){e=Ic.ariaRoles[e];var t=M(zc());retur\
n e&&(e.allowedAttrs&&t.push.apply(t,M(e.allowedAttrs)),e.requiredAttrs)&&t.push.apply(t,M(e.requiredAttrs)),t}),eh=/^idrefs?$/,th=function(e){e=e.actualNode||e;var t=(t=Qu(e)).documentElement||t,r=_l.get("idRefsByRoot",(function(){return new Map})),n=r.get(t);return n||(n=new Map,r.set(t,n),function e(t,r,n){if(t.hasAttribute){var a;"LABEL"===t.nodeName.toUpperCase()&&t.hasAttribute("for")&&(a=t.getAttribute("for"),r.has(a)?r.get(a).push(t):r.set(a,[t]));for(var o=0;o<n.length;++o){var i=Kc(t.getAttribute(n[o])||"");if(i){var l,u=K(ef(i));try{for(u.s();!(l=u.n()).done;){var s=l.value;r.has(s)?r.get(s).push(t):r.set(s,[t])}}catch(e){u.e(e)}finally{u.f()}}}}for(var c=0;c<t.childNodes.length;c++)1===t.childNodes[c].nodeType&&e(t.childNodes[c],r,n)}(t,n,Object.keys(Ic.ariaAttrs).filter((function(e){return e=Ic.ariaAttrs[e].type,eh.test(e)})))),null!=(r=n.get(e.id))?r:[]},rh=function(e,t){e=e instanceof ca?e:Ml(e);var r=fd(e);e=pd(e);return Array.isArray(e.allowedRoles)?e.allowedRoles.incl\
udes(t):t!==r&&!!e.allowedRoles},nh=["doc-backlink","doc-biblioentry","doc-biblioref","doc-cover","doc-endnote","doc-glossref","doc-noteref"],ah={header:"banner",footer:"contentinfo"},oh=function(e){var t,r,n=!(1<arguments.length&&void 0!==arguments[1])||arguments[1],a=Zf(e).vNode;return Uf(a)?(e=a.props.nodeName,t=fd(a)||ah[e],e=[],((r=a)?(r.hasAttr("role")&&(r=ef(r.attr("role").toLowerCase()),e=e.concat(r)),e.filter((function(e){return jc(e)}))):e).filter((function(e){var r=a,o=t;return!(n&&e===o||(!nh.includes(e)||wp(e)===o)&&rh(r,e))}))):[]},ih=function(e){return Object.keys(Ic.ariaRoles).filter((function(t){return Ic.ariaRoles[t].type===e}))},lh=function(e){return ih(e)},uh=function(){return _l.get("ariaRolesNameFromContent",(function(){return Object.keys(Ic.ariaRoles).filter((function(e){return Ic.ariaRoles[e].nameFromContent}))}))};function sh(e){return null===e}function ch(e){return null!==e}var dh=function(){return uh()},ph=((Si={attributes:{"aria-activedescendant":{type:"idre\
f",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":{type:"idref",allowEmpty:!0,unsupported:!1},"aria-disabled":{type:"boolean",values:["true","false"],unsupported:!1},"aria-dropeffect":{type:"nmtokens",values:["copy","move","reference","execute","po\
pup","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},"ar\
ia-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:!1},"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"],unsupp\
orted:!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}},globalAttributes:["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","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"]}).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,unsupporte\
d:!1,allowedElements:["dialog","section"]},application:{type:"landmark",attributes:{allowed:["aria-expanded","aria-errormessage","aria-activedescendant"]},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:[{nodeNam\
e:"a",attributes:{href:ch}}]},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"\
,"tree","grid","dialog","textbox"]},nameFrom:["author"],context:null,unsupported:!1,allowedElements:[{nodeName:"input",properties:{type:["text","search","tel","url","email"]}}]},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:nu\
ll,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:ch}}]},"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:{one:["doc-biblioentry"]},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:ch}}]},"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:{one:["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",at\
tributes:{allowed:["aria-expanded","aria-errormessage"]},owned:null,namefrom:["author","contents"],context:null,unsupported:!1,allowedElements:[{nodeName:"a",attributes:{href:ch}}]},"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:ch}}]},"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"],con\
text: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,allo\
wedElements:["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",attributes:{allowed:["aria-expanded","aria-errormessage"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["figure"],unsupported:!1},form:{type:"landmark",attributes:{allowed:["aria-expanded","aria-errormessag\
e"]},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-lev\
el"],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]","area[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-activ\
edescendant","aria-multiselectable","aria-readonly","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:{one:["menuitem","menuitemradio","menuitemcheckbox"]},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",{nodeNam\
e:"iput",properties:{type:["image","button"]}},{nodeName:"a",attributes:{href:ch}}]},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:ch}}]},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:ch}}]},navigation:{type:"landmark",attributes:{allowed:["aria-expanded","aria-errormessage"]},owned:null,nameFrom:["author"],cont\
ext: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","hr","iframe","li","ol","section","ul"]},{nodeName:"img",attributes:{alt:ch}}]},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:ch}}]},presentation:{type:"structure",attributes:null,owned:null,nameFrom:["aut\
hor"],context:null,unsupported:!1,allowedElements:[{nodeName:["article","aside","dl","embed","figcaption","fieldset","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hr","iframe","li","ol","section","ul"]},{nodeName:"img",attributes:{alt:ch}}]},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","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","aria-orientation\
"]},owned:{all:["radio"]},nameFrom:["author"],context:null,unsupported:!1,allowedElements:{nodeName:["ol","ul","fieldset"]}},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:["g\
rid","table","treegrid"],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"],allowed:["aria-valuetext","aria-orientation","aria-errormessage","aria-valuemax","aria-valuemin"]},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:nul\
l,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","aria-valuemax","aria-valuemin"],required:["aria-valuenow"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="range"]'],unsupported:!1},spinbutton:{type:"widget",attributes:{allowed:["aria-valuetext","aria-required","aria-readonly","aria-errorm\
essage","aria-valuemax","aria-valuemin"],required:["aria-valuenow"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="number"]'],unsupported:!1,allowedElements:{nodeName:"input",properties:{type:["text","tel"]}}},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:ch}}]},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:ch}}]},table:{type:"structure",attributes:{allowed:["aria-colcount","aria-rowcount","aria-errormessage"]},owned:{one:["rowgroup","row"]},nameFrom:["author","contents"],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-a\
utocomplete","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:"structure",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:ch}}]},widget:{type:"abstract",unsupported:!1},window:{nameFrom:["author"],type:"abstract",unsupported:!1}},Si.implicitHtmlRole=Zc,Si.elementsAllowedNoRole=[{nodeName:["base","body","caption","col","colgroup","datalist","dd","details","dt","head","html","keygen","label","l\
egend","main","map","math","meta","meter","noscript","optgroup","param","picture","progress","script","source","style","template","textarea","title","track"]},{nodeName:"area",attributes:{href:ch}},{nodeName:"input",properties:{type:["color","data","datatime","file","hidden","month","number","password","range","reset","submit","time","week"]}},{nodeName:"link",attributes:{href:ch}},{nodeName:"menu",attributes:{type:"context"}},{nodeName:"menuitem",attributes:{type:["command","checkbox","radio"]}},{nodeName:"select",condition:function(e){return e instanceof o.AbstractVirtualNode||(e=o.utils.getNodeFromTree(e)),1<Number(e.attr("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","fepoi\
ntlight","fespecularlighting","fespotlight","fetile","feturbulence","filter","hatch","hatchpath","lineargradient","marker","mask","meshgradient","meshpatch","meshrow","metadata","mpath","pattern","radialgradient","solidcolor","stop","switch","view"]}],Si.elementsAllowedAnyRole=[{nodeName:"a",attributes:{href:sh}},{nodeName:"img",attributes:{alt:sh}},{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"]}],Si.evaluateRoleForElement={A:function(e){var t=e.node;return"http://www.w3.org/2000/svg"===t.namespaceURI||!t.href.length||e.out},AREA:function(e){return!e.node.href},BUTTON:function(e){var t=e.node,r=e.role;e=e.out;return"menu"===t.getAttribute("type")?"menuitem"===r:e},IMG:function(e){var t=e.node,r=e.role,n=e.out;switch(t.alt){case null:return n\
;case"":return"presentation"===r||"none"===r;default:return"presentation"!==r&&"none"!==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;case"tel":return"combobox"===r||"spinbutton"===r;case"url":case"search":case"email":return"combobox"===r;default:return!1}},LI:function(e){var t=e.node;e=e.out;return!o.utils.matchesSelector(t,"ol li, ul li")||e},MENU:function(e){return"context"!==e.node.getAttribute("type")},OPTION:function(e){return e=e.node,!o.utils.matchesSelector(e,"select > option, datalist > option, optgroup > option")},SELECT:function(e){var t=e.node;return!t.multiple&&t.size<=1&&"menu"===e.role},SVG:function(e){var t=e.node;return!(!t.parentNode||"http://www.w3.org/2000/svg"!==t.parentNode.namespaceURI)||e.out}},Si.rolesOfType={widget:["button","chec\
kbox","dialog","gridcell","link","log","marquee","menuitem","menuitemcheckbox","menuitemradio","option","progressbar","radio","scrollbar","searchbox","slider","spinbutton","status","switch","tab","tabpanel","textbox","timer","tooltip","tree","treeitem"]},Si),fh=function(e){var t=null;return(e=ph.role[e])&&e.implicit?zl(e.implicit):t},mh=function(e){return!!th(e).length};function hh(e){var t=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).popupRoles,r=gd(e);if(!(t=null!=t?t:Sc["aria-haspopup"].values).includes(r))return!1;if(t=(e=>{for(;e=e.parent;)if(null!==gd(e,{noPresentational:!0}))return e;return null})(e),gh(t))return!0;if(!(r=e.props.id))return!1;if(e.actualNode)return t=Ju(e.actualNode).querySelectorAll('[aria-owns~="'.concat(r,'"][role~="combobox"]:not(select),\\n     [aria-controls~="').concat(r,'"][role~="combobox"]:not(select)')),Array.from(t).some(gh);throw new Error("Unable to determine combobox popup without an actualNode")}var gh=function(e){return e&&"combobo\
x"===gd(e)},vh=function(e){return e=Ml(e),Qd(e)},bh=function(e){return(e=Ic.ariaRoles[e])&&Array.isArray(e.requiredAttrs)?M(e.requiredAttrs):[]},yh=function(e){return(e=Ic.ariaRoles[e])&&Array.isArray(e.requiredContext)?M(e.requiredContext):null},wh=function(e){return(e=Ic.ariaRoles[e])&&Array.isArray(e.requiredOwned)?M(e.requiredOwned):null},Dh=function(e,t){var r,n=(e=e instanceof ca?e:Ml(e)).attr(t),a=Ic.ariaAttrs[t];if(!a)return!0;if(a.allowEmpty&&(!n||""===n.trim()))return!0;switch(a.type){case"boolean":return["true","false"].includes(n.toLowerCase());case"nmtoken":return"string"==typeof n&&a.values.includes(n.toLowerCase());case"nmtokens":return(r=ef(n)).reduce((function(e,t){return e&&a.values.includes(t)}),0!==r.length);case"idref":try{var o=Qu(e.actualNode);return!(!n||!o.getElementById(n))}catch(e){throw new TypeError("Cannot resolve id references for partial DOM")}case"idrefs":return Rc(e,t).some((function(e){return!!e}));case"string":return""!==n.trim();case"decimal":return\
!(!(r=n.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!r[1]&&!r[2]);case"int":return o=void 0!==a.minValue?a.minValue:-1/0,/^[-+]?[0-9]+$/.test(n)&&parseInt(n)>=o}},xh=function(e){return!!Ic.ariaAttrs[e]};var Eh=["cell-header-not-in-table","cell-header-not-th","header-refs-self","empty-hdrs"],Ah=Eh[0],Fh=Eh[1],Ch=Eh[2],kh=Eh[3];function Rh(e){return"caption"===e.props.nodeName}var Nh={};ce(Nh,{getAriaRolesByType:function(){return ih},getAriaRolesSupportingNameFromContent:function(){return uh},getElementSpec:function(){return pd},getElementsByContentType:function(){return qc},getGlobalAriaAttrs:function(){return zc},implicitHtmlRoles:function(){return Zc}}),Oi=Ss;var Th=["alert","log","status"];function Oh(e){return e=t.getComputedStyle((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)),{fontWeight:(e=>{switch(e){case"lighter":ret\
urn 100;case"normal":return 400;case"bold":return 700;case"bolder":return 900}return e=parseInt(e),isNaN(e)?400:e})(e.getPropertyValue("font-weight")),fontSize:parseInt(e.getPropertyValue("font-size")),isItalic:"italic"===e.getPropertyValue("font-style")}}function Sh(e,t,r){return r.reduce((function(r,n){return r||(!n.size||e.fontSize/n.size>t.fontSize)&&(!n.weight||e.fontWeight-n.weight>t.fontWeight)&&(!n.italic||e.isItalic&&!t.isItalic)}),!1)}var _h=/[;,\\s]/,Mh=/^[0-9.]+$/;ce(kr={},{aria:function(){return Jm},color:function(){return Ph},dom:function(){return Zu},forms:function(){return pg},matches:function(){return dd},math:function(){return Is},standards:function(){return Nh},table:function(){return $m},text:function(){return kc},utils:function(){return da}});var Ph={},Ih=(ce(Ph,{Color:function(){return Pp},centerPointOfRect:function(){return Ih},elementHasImage:function(){return Tp},elementIsDistinct:function(){return jh},filteredRectStack:function(){return qh},flattenColors:functi\
on(){return Gh},flattenShadowColors:function(){return Hh},getBackgroundColor:function(){return ig},getBackgroundStack:function(){return Uh},getContrast:function(){return sg},getForegroundColor:function(){return cg},getOwnBackgroundColor:function(){return Bp},getRectStack:function(){return Lh},getStackingContext:function(){return tg},getStrokeColorsFromShadows:function(){return Zh},getTextShadowColors:function(){return eg},hasValidContrastRatio:function(){return dg},incompleteData:function(){return Np},parseTextShadows:function(){return Qh},stackingContextToColor:function(){return rg}}),function(e){if(!(e.left>t.innerWidth||t.innerHeight<e.top))return{x:Math.min(Math.ceil(e.left+e.width/2),t.innerWidth-1),y:Math.min(Math.ceil(e.top+e.height/2),t.innerHeight-1)}});function Bh(e){return e.getPropertyValue("font-family").split(/[,;]/g).map((function(e){return e.trim().toLowerCase()}))}var jh=function(e,r){var n,a=t.getComputedStyle(e);return"none"!==a.getPropertyValue("background-image")||\
!!["border-bottom","border-top","outline"].reduce((function(e,t){var r=new Pp;return r.parseString(a.getPropertyValue(t+"-color")),e||"none"!==a.getPropertyValue(t+"-style")&&0<parseFloat(a.getPropertyValue(t+"-width"))&&0!==r.alpha}),!1)||(n=t.getComputedStyle(r),Bh(a)[0]!==Bh(n)[0])||(e=["text-decoration-line","text-decoration-style","font-weight","font-style","font-size"].reduce((function(e,t){return e||a.getPropertyValue(t)!==n.getPropertyValue(t)}),!1),(r=a.getPropertyValue("text-decoration")).split(" ").length<3?e||r!==n.getPropertyValue("text-decoration"):e)},Lh=function(e){var t=wc(e);return!(e=lp(e))||e.length<=1?[t]:e.some((function(e){return void 0===e}))?null:(e.splice(0,0,t),e)},qh=function(e){var t,r,n=Lh(e);return n&&1===n.length?n[0]:n&&1<n.length?(t=n.shift(),n.forEach((function(a,o){var i,l;0!==o&&(i=n[o-1],l=n[o],r=i.every((function(e,t){return e===l[t]}))||t.includes(e))})),r?n[0]:(Np.set("bgColor","elmPartiallyObscuring"),null)):(Np.set("bgColor","outsideViewport")\
,null)},zh=["hue","saturation","color","luminosity"],Vh={normal:function(e,t){return t},multiply:function(e,t){return t*e},screen:function(e,t){return e+t-e*t},overlay:function(e,t){return this["hard-light"](t,e)},darken:function(e,t){return Math.min(e,t)},lighten:function(e,t){return Math.max(e,t)},"color-dodge":function(e,t){return 0===e?0:1===t?1:Math.min(1,e/(1-t))},"color-burn":function(e,t){return 1===e?1:0===t?0:1-Math.min(1,(1-e)/t)},"hard-light":function(e,t){return t<=.5?this.multiply(e,2*t):this.screen(e,2*t-1)},"soft-light":function(e,t){return t<=.5?e-(1-2*t)*e*(1-e):e+(2*t-1)*((e<=.25?((16*e-12)*e+4)*e:Math.sqrt(e))-e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},hue:function(e,t){return t.setSaturation(e.getSaturation()).setLuminosity(e.getLuminosity())},saturation:function(e,t){return e.setSaturation(t.getSaturation()).setLuminosity(e.getLuminosity())},color:function(e,t){return t.setLuminosity(e.getLuminosity())},luminosity:\
function(e,t){return e.setLuminosity(t.getLuminosity())}};function Gh(e,t){var r,n=((e,t,r)=>{var n;return zh.includes(r)?Vh[r](e,t):(n=new Pp,["r","g","b"].forEach((function(a){n[a]=Vh[r](e[a],t[a])})),n)})(t,e,2<arguments.length&&void 0!==arguments[2]?arguments[2]:"normal"),a=$h(e.red,e.alpha,t.red,t.alpha,255*n.r),o=$h(e.green,e.alpha,t.green,t.alpha,255*n.g);n=$h(e.blue,e.alpha,t.blue,t.alpha,255*n.b);return 0===(e=(t=e.alpha+t.alpha*(1-e.alpha),e=0,r=1,Math.min(Math.max(e,t),r)))?new Pp(a,o,n,e):(t=Math.round(a/e),r=Math.round(o/e),a=Math.round(n/e),new Pp(t,r,a,e))}function $h(e,t,r,n,a){return t*(1-n)*e+t*n*a+(1-t)*n*r}function Hh(e,t){var r=e.alpha,n=(1-r)*t.red+r*e.red;return new Pp(n,(1-r)*t.green+r*e.green,(1-r)*t.blue+r*e.blue,e.alpha+t.alpha*(1-e.alpha))}function Uh(e){for(var r=lp(e).map((function(r){return(e=>{var r=e.indexOf(n.body),a=Bp(t.getComputedStyle(n.documentElement));return 1<r&&0===a.alpha&&!Tp(n.documentElement)&&(1<r&&(e.splice(r,1),e.push(n.body)),0<(a=e.in\
dexOf(n.documentElement)))&&(e.splice(a,1),e.push(n.documentElement)),e})(r=$p(r,e))})),a=0;a<r.length;a++){var o=r[a];if(o[0]!==e)return Np.set("bgColor","bgOverlap"),null;if(0!==a&&!((e,t)=>{if(e!==t){if(null===e||null===t)return;if(e.length!==t.length)return;for(var r=0;r<e.length;++r)if(e[r]!==t[r])return}return 1})(o,r[0]))return Np.set("bgColor","elmPartiallyObscuring"),null}return r[0]||null}var Wh=.54,Yh=.5,Kh=1.5,Xh=["top","right","bottom","left"];function Zh(e){var t=void 0!==(t=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).ignoreEdgeCount)&&t;e=(e=>{var t,r={},n=K(e);try{for(n.s();!(t=n.n()).done;){var a=t.value,o=a.colorStr,i=a.pixels,l=(null!=r[o]||(r[o]={top:[],right:[],bottom:[],left:[]}),r[o]),u=V(i,2),s=u[0],c=u[1];Yh<s?l.right.push(s):Yh<-s&&l.left.push(-s),Yh<c?l.bottom.push(c):Yh<-c&&l.top.push(-c)}}catch(e){n.e(e)}finally{n.f()}return r})(e),e=Object.entries(e).map((function(e){var t=(e=V(e,2))[0],r=e[1];e=Xh.filter((function(e){return 0!==r[e].length\
})).length;return{colorStr:t,sides:r,edgeCount:e}}));return!t&&e.some((function(e){return 1<(e=e.edgeCount)&&e<4}))?null:e.map(Jh).filter((function(e){return null!==e}))}function Jh(e){var t,r,n=e.colorStr,a=e.sides;return 4!==e.edgeCount?null:((e=new Pp).parseString(n),r=!(t=0),Xh.forEach((function(e){t+=a[e].length/4,r=r&&a[e].every((function(e){return Kh<e}))})),r||(e.alpha=1-Math.pow(Wh,t)),e)}function Qh(e){var t={pixels:[]},r=[t];if(!(o=e.trim()))return[];for(;o;){var n=o.match(/^[a-z]+(\\([^)]+\\))?/i)||o.match(/^#[0-9a-f]+/i),a=o.match(/^([0-9.-]+)px/i)||o.match(/^(0)/);if(n)Aa(!t.colorStr,"Multiple colors identified in text-shadow: ".concat(e)),o=o.replace(n[0],"").trim(),t.colorStr=n[0];else if(a){Aa(t.pixels.length<3,"Too many pixel units in text-shadow: ".concat(e));var o=o.replace(a[0],"").trim();n=parseFloat(("."===a[1][0]?"0":"")+a[1]);t.pixels.push(n)}else{if(","!==o[0])throw new Error("Unable to process text-shadows: ".concat(o));Aa(2<=t.pixels.length,"Missing pixel valu\
e in text-shadow: ".concat(e)),r.push(t={pixels:[]}),o=o.substr(1).trim()}}return r.forEach((function(e){2===(e=e.pixels).length&&e.push(0)})),r}function eg(e){var r,n=(r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).minRatio,a=r.maxRatio,o=r.ignoreEdgeCount,i=[],l=t.getComputedStyle(e);if("none"!==(r=l.getPropertyValue("text-shadow"))){e=l.getPropertyValue("font-size");var u,s=parseInt(e),c=(Aa(!1===isNaN(s),"Unable to determine font-size value ".concat(e)),[]),d=K(Qh(r));try{for(d.s();!(u=d.n()).done;){var p=u.value,f=p.colorStr||l.getPropertyValue("color"),m=V(p.pixels,3),h=m[0],g=m[1],v=m[2],b=void 0===v?0:v;if(!(a&&s*a<=b))if(n&&b<s*n)c.push({colorStr:f,pixels:p.pixels});else{if(0<c.length){var y=Zh(c,{ignoreEdgeCount:o});if(null===y)return null;i.push.apply(i,M(y)),c.splice(0,c.length)}var w=(e=>{var t=e.colorStr,r=e.offsetY,n=e.blurRadius,a=e.fontSize;return e.offsetX>n||n<r?new Pp(0,0,0,0):((e=new Pp).parseString(t),e.alpha*=((e,t)=>0===e?1:.185/(e/t+.4))(n,a),e)})\
({colorStr:f,offsetX:h,offsetY:g,blurRadius:b,fontSize:s});i.push(w)}}}catch(e){d.e(e)}finally{d.f()}if(0<c.length){if(null===(e=Zh(c,{ignoreEdgeCount:o})))return null;i.push.apply(i,M(e))}}return i}function tg(e,t){var r,n,a=Ml(e);return a._stackingContext||(r=[],n=new Map,(t=null!=t?t:Uh(e)).forEach((function(e){var t=(t=e=Ml(e),(o=new Pp).parseString(t.getComputedStylePropertyValue("background-color")),o),a=e._stackingOrder.filter((function(e){return!!e.vNode})),o=(a.forEach((function(e,t){e=e.vNode;var o=null==(o=a[t-1])?void 0:o.vNode;o=og(n,e,o);0!==t||n.get(e)||r.unshift(o),n.set(e,o)})),null==(o=a[a.length-1])?void 0:o.vNode);e=og(n,e,o);a.length||r.unshift(e),e.bgColor=t})),a._stackingContext=r)}function rg(e){var t;return null!=(t=e.descendants)&&t.length?(t=Gh(e.descendants.reduce(ng,ag()),e.bgColor,e.descendants[0].blendMode)).alpha*=e.opacity:(t=e.bgColor).alpha*=e.opacity,{color:t,blendMode:e.blendMode}}function ng(e,t){return e=e instanceof Pp?e:rg(e).color,Gh(rg(t).colo\
r,e,t.blendMode)}function ag(e,t){return{vNode:e,ancestor:t,opacity:parseFloat(null!=(t=null==e?void 0:e.getComputedStylePropertyValue("opacity"))?t:1),bgColor:new Pp(0,0,0,0),blendMode:(null==e?void 0:e.getComputedStylePropertyValue("mix-blend-mode"))||void 0,descendants:[]}}function og(e,t,r){var n=e.get(r);e=null!=(e=e.get(t))?e:ag(t,n);return n&&r!==t&&!n.descendants.includes(e)&&n.descendants.unshift(e),e}function ig(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:.1,o=Ml(e),i=o._cache.getBackgroundColor;return i?(r.push.apply(r,M(i.bgElms)),Np.set("bgColor",i.incompleteData),i.bgColor):(i=((e,r,a)=>{var o=Uh(e);if(!o)return null;var i=op(e);(a=null!=(a=eg(e,{minRatio:a,ignoreEdgeCount:!0}))?a:[]).length&&(a=[{color:a.reduce(Hh)}]);for(var l=0;l<o.length;l++){var u=o[l],s=t.getComputedStyle(u);if(Tp(u,s))return r.push(u),null;var c=void 0;try{if(0===(c=Bp(s)).alpha)continue}catch(e){if(e&&Np.get("colorPars\
e"))return null;throw e}if("inline"!==s.getPropertyValue("display")&&!lg(u,i))return r.push(u),Np.set("bgColor","elmPartiallyObscured"),null;if(r.push(u),1===c.alpha)break}var d=(a=(d=tg(e,o)).map(rg).concat(a),((e,r)=>{var a,o,i,l,u=[];return r||(r=n.documentElement,l=n.body,r=t.getComputedStyle(r),a=t.getComputedStyle(l),o=Bp(r),l=0!==(i=Bp(a)).alpha&&lg(l,e.getBoundingClientRect()),(0!==i.alpha&&0===o.alpha||l&&1!==i.alpha)&&u.unshift({color:i,blendMode:ug(a.getPropertyValue("mix-blend-mode"))}),0===o.alpha)||l&&1===i.alpha||u.unshift({color:o,blendMode:ug(r.getPropertyValue("mix-blend-mode"))}),u})(e,o.includes(n.body)));return a.unshift.apply(a,M(d)),0===a.length?new Pp(255,255,255,1):(e=a.reduce((function(e,t){return Gh(t.color,e.color instanceof Pp?e.color:e,t.blendMode)})),Gh(e.color instanceof Pp?e.color:e,new Pp(255,255,255,1)))})(e,r,a),o._cache.getBackgroundColor={bgColor:i,bgElms:r,incompleteData:Np.get("bgColor")},i)}function lg(e,r){r=Array.isArray(r)?r:[r];var n=e.getBo\
undingClientRect(),a=n.right,o=n.bottom,i=(c=t.getComputedStyle(e)).getPropertyValue("overflow"),l=parseInt(c.getPropertyValue("padding-left"),10),u=parseInt(c.getPropertyValue("padding-right"),10),s=parseInt(c.getPropertyValue("padding-top"),10),c=parseInt(c.getPropertyValue("padding-bottom"),10);return(["scroll","auto"].includes(i)||e instanceof t.HTMLHtmlElement)&&(a=n.left+e.scrollWidth+l+u,o=n.top+e.scrollHeight+s+c),r.every((function(e){return e.top>=n.top&&e.bottom<=o&&e.left>=n.left&&e.right<=a}))}function ug(e){return e||void 0}var sg=function(e,t){return t&&e?(t.alpha<1&&(t=Gh(t,e)),e=e.getRelativeLuminance(),t=t.getRelativeLuminance(),(Math.max(t,e)+.05)/(Math.min(t,e)+.05)):null};function cg(e,r,n){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},o=t.getComputedStyle(e),i=[function(){var e,t,r=o,n=void 0===(n=(n=a).textStrokeEmMin)?0:n;return 0===(t=parseFloat(r.getPropertyValue("-webkit-text-stroke-width")))||(e=r.getPropertyValue("font-size"),t/=parseFloat(\
e),isNaN(t))||t<n?null:(e=r.getPropertyValue("-webkit-text-stroke-color"),(new Pp).parseString(e))},function(){return e=o,(new Pp).parseString(e.getPropertyValue("-webkit-text-fill-color")||e.getPropertyValue("color"));var e},function(){return eg(e,{minRatio:0})}],l=[];try{for(var u=0,s=i;u<s.length;u++){var c=(0,s[u])();if(c&&(l=l.concat(c),1===c.alpha))break}}catch(e){if(e&&Np.get("colorParse"))return null;throw e}return i=l.reduce((function(e,t){return Gh(e,t)})),null===(n=null==n?ig(e,[]):n)?(n=Np.get("bgColor"),Np.set("fgColor",n),null):Gh(((e,t,r)=>{for(;t;){var n;1===t.opacity&&t.ancestor||(e.alpha*=t.opacity,n=(null==(n=t.ancestor)?void 0:n.descendants)||r,(n=(n=1!==t.opacity?n.slice(0,n.indexOf(t)):n).map(rg)).length&&(n=n.reduce((function(e,t){return Gh(t.color,e.color instanceof Pp?e.color:e)}),{color:new Pp(0,0,0,0),blendMode:"normal"}),e=Gh(e,n))),t=t.ancestor}return e})(i,function e(t,r){var n,a=K(t);try{for(a.s();!(n=a.n()).done;){var o,i=n.value;if((null==(o=i.vNode)?vo\
id 0:o.actualNode)===r)return i;var l=e(i.descendants,r);if(l)return l}}catch(e){a.e(e)}finally{a.f()}}(n=tg(e),e),n),new Pp(255,255,255,1))}var dg=function(e,t,r,n){return e=sg(e,t),{isValid:(t=n&&Math.ceil(72*r)/96<14||!n&&Math.ceil(72*r)/96<18?4.5:3)<e,contrastRatio:e,expectedContrastRatio:t}},pg={},fg=(ce(pg,{isAriaCombobox:function(){return Td},isAriaListbox:function(){return Nd},isAriaRange:function(){return Sd},isAriaTextbox:function(){return Rd},isDisabled:function(){return mg},isNativeSelect:function(){return kd},isNativeTextbox:function(){return Cd}}),["fieldset","button","select","input","textarea"]),mg=function e(t){var r,n,a=t._isDisabled;return"boolean"!=typeof a&&(r=t.props.nodeName,n=t.attr("aria-disabled"),a=!(!fg.includes(r)||!t.hasAttr("disabled"))||(n?"true"===n.toLowerCase():!!t.parent&&e(t.parent)),t._isDisabled=a),a};function hg(e,t){var r=null==(r=t.data)?void 0:r.headingOrder,n=vg(t.node.ancestry,1);return r&&(t=r.map((function(e){return _({},e,{ancestry:n.conc\
at(e.ancestry)})})),-1===(r=((e,t)=>{for(;t.length;){var r=gg(e,t);if(-1!==r)return r;t=vg(t,1)}return-1})(e,n))?e.push.apply(e,M(t)):e.splice.apply(e,[r,0].concat(M(t)))),e}function gg(e,t){return e.findIndex((function(e){return Kf(e.ancestry,t)}))}function vg(e,t){return e.slice(0,e.length-t)}function bg(e,t){return e=e.boundingClientRect,t=t.boundingClientRect,e.top>=t.top&&e.left>=t.left&&e.bottom<=t.bottom&&e.right<=t.right}function yg(e){return{width:Math.round(10*e.width)/10,height:Math.round(10*e.height)/10}}function wg(e,t){return Uu(e,t)&&!Ac(t)}function Dg(e){return e.map((function(e){return e.actualNode}))}function xg(e,t){var r=1<arguments.length&&void 0!==t&&t;return e.map((function(e){return{vChild:e,nested:r}}))}function Eg(e){return""!==(e||"").trim()}function Ag(e){return e=Kd(e,{emoji:!0,nonBmp:!0,punctuations:!0}),Kc(e)}function Fg(e){return null!==(e=nm(e.attr("tabindex")))&&e<0}var Cg=["block","list-item","table","flex","grid","inline-block"];function kg(e){return\
 e=t.getComputedStyle(e).getPropertyValue("display"),-1!==Cg.indexOf(e)||"table-"===e.substr(0,6)}function Rg(e,t){return e=e.getRelativeLuminance(),t=t.getRelativeLuminance(),(Math.max(e,t)+.05)/(Math.min(e,t)+.05)}var Ng=["block","list-item","table","flex","grid","inline-block"];function Tg(e){return e=t.getComputedStyle(e).getPropertyValue("display"),-1!==Ng.indexOf(e)||"table-"===e.substr(0,6)}var Og=pl((function(e,r){function n(e,t){return a.getPropertyValue(e)===t}var a=t.getComputedStyle(e,r);return n("content","none")||n("display","none")||n("visibility","hidden")||!1===n("position","absolute")||0===Bp(a).alpha&&n("background-image","none")?0:(e=Sg(a.getPropertyValue("width")),r=Sg(a.getPropertyValue("height")),"px"!==e.unit||"px"!==r.unit?0===e.value||0===r.value?0:1/0:e.value*r.value)}));function Sg(e){var t=(e=V(e.match(/^([0-9.]+)([a-z]+)$/i)||[],3))[1];e=void 0===(e=e[2])?"":e;return{value:parseFloat(void 0===t?"":t),unit:e.toLowerCase()}}var _g={ARTICLE:!0,ASIDE:!0,NAV:!0\
,SECTION:!0},Mg={alert:!0,alertdialog:!0,application:!0,article:!0,banner:!1,complementary:!0,contentinfo:!0,dialog:!0,form:!0,log:!0,main:!0,navigation:!0,region:!0,search:!1,status:!0,tabpanel:!0};function Pg(e,t,r,n){var a=Lc(e);if(!(r=r||yh(a)))return null;for(var o=r.includes("group"),i=n?e:e.parent;i;){var l=gd(i,{noPresentational:!0});if(l){if("group"!==l||!o)return r.includes(l)?null:r;t.includes(a)&&r.push(a),r=r.filter((function(e){return"group"!==e}))}i=i.parent}return r}function Ig(e){return 3===(e=e.vNode).props.nodeType?0<e.props.nodeValue.trim().length:pp(e,!1,!0)}var Bg=pl((function(e){var t;if(e)return(t=gd(e,{noPresentational:!0,chromium:!0}))?wp(t):Bg(e.parent)}));function jg(e){var t,r,n=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).invalidTableRowAttrs,a=2<arguments.length?arguments[2]:void 0;n=null!=(t=null==n||null==(t=n.filter)?void 0:t.call(n,(function(e){return a.hasAttr(e)})))?t:[];return 0===n.length||!(t=(t=(e=>{if(e.parent)return Zl(e,'table:\
not([role]), [role~="treegrid"], [role~="table"], [role~="grid"]')})(a))&&gd(t))||"treegrid"===t||(r="row".concat(1<n.length?"Plural":"Singular"),this.data({messageKey:r,invalidAttrs:n,ownerRole:t}),!1)}function Lg(e,t,r){var n=(a=r.props).nodeName,a=a.type,o=(e=>e?(e=e.toLowerCase(),["mixed","true"].includes(e)?e:"false"):"")(r.attr("aria-checked"));return"input"!==n||"checkbox"!==a||!o||o===(n=(e=>e.props.indeterminate?"mixed":e.props.checked?"true":"false")(r))||(this.data({messageKey:"checkbox",checkState:n}),!1)}var qg={row:jg,checkbox:Lg};var zg=function(e,t){try{return"svg"===t.props.nodeName||!!Zl(t,"svg")}catch(e){return!1}},Vg=[function(e,t){return Gg(t)},function(e,t){return"area"!==t.props.nodeName},function(e,t){return!zg(0,t)},function(e,t){return Ec(t)},function(e,t){return Ac(t)||!$g(t)},function(e){return!Ep(e,{noLengthCompare:!0,includeInlineBlock:!0})}];function Gg(e){return"widget"===wp(e)}var $g=pl((function e(t){return!(null==t||!t.parent)&&(!(!Gg(t.parent)||!Ac(t\
.parent))||e(t.parent))})),Hg=function(e,t){var r=Lc(t);return!(r&&!["none","presentation"].includes(r)&&!(_c[r]||{}).accessibleNameRequired&&!Ec(t))},Ug=function(e,t,r){return r.initiator},Wg={emoji:!0,nonBmp:!1,punctuations:!0},Yg={"abstractrole-evaluate":function(e,t,r){return 0<(r=ef(r.attr("role")).filter((function(e){return"abstract"===wp(e)}))).length&&(this.data(r),!0)},"accesskeys-after":function(e){var t={};return e.filter((function(e){if(e.data){var r=e.data.toUpperCase();if(!t[r])return(t[r]=e).relatedNodes=[],!0;t[r].relatedNodes.push(e.relatedNodes[0])}return!1})).map((function(e){return e.result=!!e.relatedNodes.length,e}))},"accesskeys-evaluate":function(e,t,r){return ws(r)||(this.data(r.attr("accesskey")),this.relatedNodes([e])),!0},"alt-space-value-evaluate":function(e,t,r){return"string"==typeof(r=r.attr("alt"))&&/^\\s+$/.test(r)},"aria-allowed-attr-elm-evaluate":function(e,t,r){var n=pd(r);if(!n.allowedAriaAttrs)return!0;if(Lc(r))return!0;var a,o=n.allowedAriaAttrs,i\
=zc(),l=[],u=K(r.attrNames);try{for(u.s();!(a=u.n()).done;){var s=a.value;i.includes(s)&&!o.includes(s)&&l.push(s)}}catch(e){u.e(e)}finally{u.f()}return!l.length||(this.data({messageKey:1<l.length?"plural":"singular",nodeName:r.props.nodeName,values:l.map((function(e){return e+'="'+r.attr(e)+'"'})).join(", ")}),!1)},"aria-allowed-attr-evaluate":function(e,t,r){var n,a=[],o=gd(r),i=Qm(o),l=(Array.isArray(t[o])&&(i=lm(t[o].concat(i))),K(r.attrNames));try{for(l.s();!(n=l.n()).done;){var u=n.value;!xh(u)||i.includes(u)||((e,t,r)=>"aria-required"===e&&"false"===t||!("aria-multiline"!==e||"false"!==t||!r.hasAttr("contenteditable")))(u,r.attr(u),r)||a.push(u)}}catch(e){l.e(e)}finally{l.f()}return!a.length||(this.data(a.map((function(e){return e+'="'+r.attr(e)+'"'}))),!(o||Uf(r)||Ec(r))&&void 0)},"aria-allowed-attr-matches":function(e,t){var r=/^aria-/,n=t.attrNames;if(n.length)for(var a=0,o=n.length;a<o;a++)if(r.test(n[a]))return!0;return!1},"aria-allowed-role-evaluate":function(e){var t=2<ar\
guments.length?arguments[2]:void 0,r=void 0===(r=(n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).allowImplicit)||r,n=void 0===(n=n.ignoredTags)?[]:n,a=t.props.nodeName;return!!n.map((function(e){return e.toLowerCase()})).includes(a)||!(n=oh(t,r)).length||(this.data(n),!xd(t)&&void 0)},"aria-allowed-role-matches":function(e,t){return null!==Lc(t,{dpub:!0,fallback:!0})},"aria-busy-evaluate":function(e,t,r){return"true"===r.attr("aria-busy")},"aria-conditional-attr-evaluate":function(e,t,r){var n=gd(r);return!qg[n]||qg[n].call(this,e,t,r)},"aria-conditional-checkbox-attr-evaluate":Lg,"aria-conditional-row-attr-evaluate":jg,"aria-errormessage-evaluate":function(e,t,r){t=Array.isArray(t)?t:[];var n=r.attr("aria-errormessage"),a=r.hasAttr("aria-errormessage"),o=r.attr("aria-invalid");return!r.hasAttr("aria-invalid")||"false"===o||-1!==t.indexOf(n)||!a||(this.data(ef(n)),function(e){if(""===e.trim())return Ic.ariaAttrs["aria-errormessage"].allowEmpty;var t,n,a=ef(e);if(1<a.lengt\
h)return this.data({messageKey:"unsupported",values:a}),!1;try{t=e&&Rc(r,"aria-errormessage")[0]}catch(e){return void this.data({messageKey:"idrefs",values:a})}return t?xd(t)?(n=ef(r.attr("aria-describedby")),"alert"===Lc(t)||"assertive"===t.getAttribute("aria-live")||"polite"===t.getAttribute("aria-live")||a.some((function(e){return n.includes(e)}))):(this.data({messageKey:"hidden",values:a}),!1):void 0}.call(this,n))},"aria-has-attr-matches":function(e,t){var r=/^aria-/;return t.attrNames.some((function(e){return r.test(e)}))},"aria-hidden-body-evaluate":function(e,t,r){return"true"!==r.attr("aria-hidden")},"aria-hidden-focus-matches":function(e){return function e(t){return!t||"true"!==t.getAttribute("aria-hidden")&&e(Es(t))}(Es(e))},"aria-label-evaluate":function(e,t,r){return!!Kc(Oc(r))},"aria-labelledby-evaluate":function(e,t,r){try{return!!Kc(Tc(r))}catch(e){}},"aria-level-evaluate":function(e,t,r){if(r=r.attr("aria-level"),!(6<(r=parseInt(r,10))))return!0},"aria-prohibited-attr-\
evaluate":function(e){var t,r=2<arguments.length?arguments[2]:void 0,n=(null==(n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{})?void 0:n.elementsAllowedAriaLabel)||[],a=r.props.nodeName,o=gd(r,{chromium:!0,fallback:!0});return 0!==(n=((e,t,r,n)=>{var a=Ic.ariaRoles[t];return a?a.prohibitedAttrs||[]:t||n.includes(r)||"widget"===Bg(e)?[]:["aria-label","aria-labelledby"]})(r,o,a,n).filter((function(e){return!!r.attrNames.includes(e)&&""!==Kc(r.attr(e))}))).length&&(t=null!==o?"hasRole":"noRole",this.data({role:o,nodeName:a,messageKey:t+=1<n.length?"Plural":"Singular",prohibited:n}),o=jd(r,{subtreeDescendant:!0}),""===Kc(o)||void 0)},"aria-required-attr-evaluate":function(e){var t,r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=2<arguments.length?arguments[2]:void 0,a=Lc(n),o=n.attrNames,i=bh(a);return Array.isArray(r[a])&&(i=lm(r[a],i)),!(a&&o.length&&i.length&&(r=n,"separator"!==a||Ec(r))&&(o=n,"combobox"!==a||"false"!==o.attr("aria-expanded"))&&("slider"!==a||n\
ull==(r=n.attr("aria-valuetext"))||!r.trim())&&(t=pd(n),(o=i.filter((function(e){return!(n.attr(e)||void 0!==(null==(r=(r=t).implicitAttrs)?void 0:r[e]));var r}))).length)&&(this.data(o),1))},"aria-required-children-evaluate":function(e,t,r){t=t&&Array.isArray(t.reviewEmpty)?t.reviewEmpty:[];var n,a,o,i,l=Lc(r,{dpub:!0}),u=wh(l);return null===u||((a=(n=((e,t)=>{function r(){if(3===n.props.nodeType&&a.push({vNode:n,role:null}),1!==n.props.nodeType||!xd(n))return 1;var e,r=gd(n,{noPresentational:!0}),i=(e=n,zc().find((function(t){return e.hasAttr(t)}))),l=!!i||Ec(n);!r&&!l||["group","rowgroup"].includes(r)&&t.some((function(e){return e===r}))?o.push.apply(o,M(n.children)):(r||l)&&a.push({role:r,attr:i||"tabindex",vNode:n})}for(var n,a=[],o=wd(e);n=o.shift();)r();return a})(r,u)).filter((function(e){var t=e.role;return 1===e.vNode.props.nodeType&&!u.includes(t)}))).length?(this.relatedNodes(a.map((function(e){return e.vNode}))),o="true"===r.attr("aria-busy")?"aria-busy-fail":"unallowed",t\
his.data({messageKey:o,values:a.map((function(e){var t=e.vNode,r=(e=e.attr,t.props),n=r.nodeName;return 3===r.nodeType?"#text":(r=Lc(t,{dpub:!0}))?"[role=".concat(r,"]"):e?n+"[".concat(e,"]"):n})).filter((function(e,t,r){return r.indexOf(e)===t})).join(", ")}),!1):(i=u,!!n.some((function(e){return(e=e.role)&&i.includes(e)}))||("true"===r.attr("aria-busy")?(this.data({messageKey:"aria-busy"}),!0):(this.data(u),!(!t.includes(l)||n.some(Ig))&&void 0))))},"aria-required-children-matches":function(e,t){return t=Lc(t,{dpub:!0}),!!wh(t)},"aria-required-parent-evaluate":function(e,t,r){var n=t&&Array.isArray(t.ownGroupRoles)?t.ownGroupRoles:[],a=Pg(r,n);if(!a)return!0;var o=(e=>{for(var t,r=[];e;)e.getAttribute("id")&&(t=Ca(e.getAttribute("id")),t=Qu(e).querySelector("[aria-owns~=".concat(t,"]")))&&r.push(t),e=e.parentElement;return r.length?r:null})(e);if(o)for(var i=0,l=o.length;i<l;i++)if(!(a=Pg(Ml(o[i]),n,a,!0)))return!0;return this.data(a),!1},"aria-required-parent-matches":function(e,t){\
return t=Lc(t),!!yh(t)},"aria-roledescription-evaluate":function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=gd(2<arguments.length?arguments[2]:void 0);return!!(t.supportedRoles||[]).includes(r)||!(!r||"presentation"===r||"none"===r)&&void 0},"aria-unsupported-attr-evaluate":function(e,t,r){return!!(r=r.attrNames.filter((function(t){var r=Ic.ariaAttrs[t];return!!xh(t)&&(t=r.unsupported,"object"!==a(t)?!!t:!dd(e,t.exceptions))}))).length&&(this.data(r),!0)},"aria-valid-attr-evaluate":function(e,t,r){t=Array.isArray(t.value)?t.value:[];var n=[],a=/^aria-/;return r.attrNames.forEach((function(e){-1===t.indexOf(e)&&a.test(e)&&!xh(e)&&n.push(e)})),!n.length||(this.data(n),!1)},"aria-valid-attr-value-evaluate":function(e,t,r){t=Array.isArray(t.value)?t.value:[];var n="",a="",i=[],l=/^aria-/,u=["aria-errormessage"],s={"aria-controls":function(){var e=!1===["false",null].includes(r.attr("aria-haspopup"));return e&&(n='aria-controls="'.concat(r.attr("aria-controls"),'"'\
),a="controlsWithinPopup"),"false"!==r.attr("aria-expanded")&&"false"!==r.attr("aria-selected")&&0==e},"aria-current":function(e){e||(n='aria-current="'.concat(r.attr("aria-current"),'"'),a="ariaCurrent")},"aria-owns":function(){return"false"!==r.attr("aria-expanded")},"aria-describedby":function(e){e||(n='aria-describedby="'.concat(r.attr("aria-describedby"),'"'),a=o._tree&&o._tree[0]._hasShadowRoot?"noIdShadow":"noId")},"aria-labelledby":function(e){e||(n='aria-labelledby="'.concat(r.attr("aria-labelledby"),'"'),a=o._tree&&o._tree[0]._hasShadowRoot?"noIdShadow":"noId")}};return r.attrNames.forEach((function(e){if(!u.includes(e)&&!t.includes(e)&&l.test(e)){var o,c=r.attr(e);try{o=Dh(r,e)}catch(o){return n="".concat(e,'="').concat(c,'"'),void(a="idrefs")}s[e]&&!s[e](o)||o||(""===c&&(o=e,"string"!==(null==(o=Ic.ariaAttrs[e])?void 0:o.type))?(n=e,a="empty"):i.push("".concat(e,'="').concat(c,'"')))}})),i.length?(this.data(i),!1):!n||void this.data({messageKey:a,needsReview:n})},"attr-non-\
space-content-evaluate":function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=2<arguments.length?arguments[2]:void 0;if(t.attribute&&"string"==typeof t.attribute)return r.hasAttr(t.attribute)?(r=r.attr(t.attribute),!!Kc(r)||(this.data({messageKey:"emptyAttr"}),!1)):(this.data({messageKey:"noAttr"}),!1);throw new TypeError("attr-non-space-content requires options.attribute to be a string")},"autocomplete-appropriate-evaluate":function(e,t,r){var n,o,i;return"input"!==r.props.nodeName||(o={bday:["text","search","date"],email:["text","search","email"],username:["text","search","email"],"street-address":["text"],tel:["text","search","tel"],"tel-country-code":["text","search","tel"],"tel-national":["text","search","tel"],"tel-area-code":["text","search","tel"],"tel-local":["text","search","tel"],"tel-local-prefix":["text","search","tel"],"tel-local-suffix":["text","search","tel"],"tel-extension":["text","search","tel"],"cc-number":n=["text","search","number","tel"],"\
cc-exp":["text","search","month","tel"],"cc-exp-month":n,"cc-exp-year":n,"cc-csc":n,"transaction-amount":n,"bday-day":n,"bday-month":n,"bday-year":n,"new-password":["text","search","password"],"current-password":["text","search","password"],url:i=["text","search","url"],photo:i,impp:i},"object"===a(t)&&Object.keys(t).forEach((function(e){o[e]||(o[e]=[]),o[e]=o[e].concat(t[e])})),i=(n=r.attr("autocomplete").split(/\\s+/g).map((function(e){return e.toLowerCase()})))[n.length-1],!!Zd.stateTerms.includes(i))||(n=o[i],i=r.hasAttr("type")?Kc(r.attr("type")).toLowerCase():"text",i=Om().includes(i)?i:"text",void 0===n?"text"===i:n.includes(i))},"autocomplete-matches":function(e,t){var r=t.attr("autocomplete");if(!r||""===Kc(r))return!1;if(r=t.props.nodeName,!1===["textarea","input","select"].includes(r))return!1;var n=t.attr("aria-readonly")||"false";return!t.hasAttr("readonly")&&"true"!==n.toLowerCase()&&(("input"!==r||!["submit","reset","button","hidden"].includes(t.props.type))&&(n=t.attr("a\
ria-disabled")||"false",!t.hasAttr("disabled")&&"true"!==n.toLowerCase()&&(r=Lc(t),(!((n=nm(t.attr("tabindex")))<0&&t.hasAttr("role"))||void 0!==(r=Ic.ariaRoles[r])&&"widget"===r.type)&&!(n<0&&t.actualNode&&!Ss(t)&&!xd(t)))))},"autocomplete-valid-evaluate":function(e,t,r){return r=r.attr("autocomplete")||"",Jd(r,t)},"avoid-inline-spacing-evaluate":function(e,t){return!(0<(t=t.cssProperties.filter((function(t){if("important"===e.style.getPropertyPriority(t))return t}))).length&&(this.data(t),1))},"braille-label-equivalent-evaluate":function(e,t,r){var n;if(!(null!=(n=r.attr("aria-braillelabel"))?n:"").trim())return!0;try{return""!==Kc(Wd(r))}catch(e){}},"braille-roledescription-equivalent-evaluate":function(e,t,r){var n=null!=(n=r.attr("aria-brailleroledescription"))?n:"";return""===Kc(n)||("string"!=typeof(n=r.attr("aria-roledescription"))?(this.data({messageKey:"noRoleDescription"}),!1):""!==Kc(n)||(this.data({messageKey:"emptyRoleDescription"}),!1))},"bypass-matches":function(e,t,r){\
return!Ug(0,0,r)||!!e.querySelector("a[href]")},"caption-evaluate":function(e,t,r){return!ym(r,"track").some((function(e){return"captions"===(e.attr("kind")||"").toLowerCase()}))&&void 0},"caption-faked-evaluate":function(e){var t=Vc(e),r=t[0];return t.length<=1||r.length<=1||e.rows.length<=1||r.reduce((function(e,t,n){return e||t!==r[n+1]&&void 0!==r[n+1]}),!1)},"color-contrast-evaluate":function(e,r,n){var a=r.ignoreUnicode,o=r.ignoreLength,i=r.ignorePseudo,l=r.boldValue,u=r.boldTextPt,s=r.largeTextPt,c=r.contrastRatio,d=r.shadowOutlineEmMax,p=r.pseudoSizeThreshold;if(!Ss(e))return this.data({messageKey:"hidden"}),!0;var f=Ad(n,!1,!0);if(a&&(h=Hd(a=f,m={nonBmp:!0}),a=""===Kc(Kd(a,m)),h)&&a)this.data({messageKey:"nonBmp"});else{var m=t.getComputedStyle(e),h=parseFloat(m.getPropertyValue("font-size"));a=m.getPropertyValue("font-weight"),l=parseFloat(a)>=l||"bold"===a,a=Math.ceil(72*h)/96,a=(u=l&&a<u||!l&&a<s?c.normal:c.large).expected,s=u.minThreshold,c=u.maxThreshold,u=((e,t)=>{var r=\
void 0===(r=t.pseudoSizeThreshold)?.25:r;if(!(t=void 0!==(t=t.ignorePseudo)&&t)){var n=(t=e.boundingClientRect).width*t.height*r;do{if(n<Og(e.actualNode,":before")+Og(e.actualNode,":after"))return e}while(e=e.parent)}})(n,{ignorePseudo:i,pseudoSizeThreshold:p});if(u)this.data({fontSize:"".concat((72*h/96).toFixed(1),"pt (").concat(h,"px)"),fontWeight:l?"bold":"normal",messageKey:"pseudoContent",expectedContrastRatio:a+":1"}),this.relatedNodes(u.actualNode);else{var g,v,b,y;if(null!==(n=eg(e,{minRatio:.001,maxRatio:d})))return u=cg(e,!(i=[]),p=ig(e,i,d),r),r=d=e=null,0===n.length?e=sg(p,u):u&&p&&(r=[].concat(M(n),[p]).reduce(Hh),n=sg(p,u),y=sg(p,r),g=sg(r,u),(e=Math.max(n,y,g))!==n)&&(d=g<y?"shadowOnBgColor":"fgOnShadowColor"),n=a<e,"number"==typeof s&&("number"!=typeof e||e<s)||"number"==typeof c&&("number"!=typeof e||c<e)?(this.data({contrastRatio:e}),!0):(g=Math.floor(100*e)/100,null===p?Np.get("colorParse")?b=Np.get(v="colorParse"):v=Np.get("bgColor"):n||(v=d),null===u&&Np.get("colo\
rParse")&&(b=Np.get(v="colorParse")),y=1===f.length,(s=1==g)?v=Np.set("bgColor","equalRatio"):n||!y||o||(v="shortTextContent"),this.data({fgColor:u?u.toHexString():void 0,bgColor:p?p.toHexString():void 0,contrastRatio:g,fontSize:"".concat((72*h/96).toFixed(1),"pt (").concat(h,"px)"),fontWeight:l?"bold":"normal",messageKey:v,expectedContrastRatio:a+":1",shadowColor:r?r.toHexString():void 0,colorParse:b}),null===u||null===p||s||y&&!o&&!n?(v=null,Np.clear(),void this.relatedNodes(i)):(n||this.relatedNodes(i),n));this.data({messageKey:"complexTextShadows"})}}},"color-contrast-matches":function(e,r){var a=(f=r.props).nodeName;if("option"===a)return!1;if("select"===a&&!e.options.length)return!1;if("input"===a&&["hidden","range","color","checkbox","radio","image"].includes(f.type))return!1;if(mg(r)||uc(r))return!1;if(["input","select","textarea"].includes(a)){if(f=t.getComputedStyle(e),f=parseInt(f.getPropertyValue("text-indent"),10)){var o={top:(o=e.getBoundingClientRect()).top,bottom:o.bott\
om,left:o.left+f,right:o.right+f};if(!Kp(o,e))return!1}return!0}if(f=ts(r,"label"),"label"===a||f){if(o=f||e,a=f?Ml(f):r,o.htmlFor&&(o=(f=Qu(o).getElementById(o.htmlFor))&&Ml(f))&&mg(o))return!1;if((f=ym(a,'input:not([type="hidden"],[type="image"],[type="button"],[type="submit"],[type="reset"]), select, textarea')[0])&&mg(f))return!1}for(var i,l=[],u=r;u;)u.props.id&&(i=th(u).filter((function(e){return ef(e.getAttribute("aria-labelledby")||"").includes(u.props.id)})).map((function(e){return Ml(e)})),l.push.apply(l,M(i))),u=u.parent;if(0<l.length&&l.every(mg))return!1;if(""===(a=Ad(o=r,!1,!0))||""===Kd(a,Wg)||!o.children.some((function(e){return"#text"===e.props.nodeName&&!Ud(e)})))return!1;if(!parseFloat(r.getComputedStylePropertyValue("font-size")))return!1;for(var s=n.createRange(),c=r.children,d=0;d<c.length;d++){var p=c[d];3===p.actualNode.nodeType&&""!==Kc(p.actualNode.nodeValue)&&s.selectNodeContents(p.actualNode)}var f=Array.from(s.getClientRects()),m=os(r);return f.some((functi\
on(t){var r,n=Kp(t,e);return m.length?(r=m.some((function(e){return ns(t,e.boundingClientRect)})),n&&r):n}))},"css-orientation-lock-evaluate":function(e,t,r,n){n=void 0===(n=(n||{}).cssom)?void 0:n;var a=void 0===(t=(t||{}).degreeThreshold)?0:t;if(n&&n.length){for(var o=!1,i=[],l=n.reduce((function(e,t){var r,n=t.sheet;return e[r=(r=t.shadowId)||"topDocument"]||(e[r]={root:t.root,rules:[]}),n&&n.cssRules&&(t=Array.from(n.cssRules),e[r].rules=e[r].rules.concat(t)),e}),{}),u=function(){var e=c[s],t=(e=l[e]).root;if(!(e=e.rules.filter(d)).length)return 1;e.forEach((function(e){e=e.cssRules,Array.from(e).forEach((function(e){var r=(e=>{var t=e.selectorText;e=e.style;return!(!t||e.length<=0||!(t=e.transform||e.webkitTransform||e.msTransform||!1)&&!e.rotate||(t=(e=>e&&(e=e.match(/(rotate|rotateZ|rotate3d|matrix|matrix3d)\\(([^)]+)\\)(?!.*(rotate|rotateZ|rotate3d|matrix|matrix3d))/))?p((e=V(e,3))[1],e[2]):0)(t),e=p("rotate",e.rotate),!(t+=e))||(t=Math.abs(t),Math.abs(t-180)%180<=a))&&Math.abs(t\
-90)%90<=a})(e);r&&"HTML"!==e.selectorText.toUpperCase()&&(e=Array.from(t.querySelectorAll(e.selectorText))||[],i=i.concat(e)),o=o||r}))}))},s=0,c=Object.keys(l);s<c.length;s++)u();return!o||(i.length&&this.relatedNodes(i),!1)}function d(e){var t=e.type;e=e.cssText;return 4===t&&(/orientation:\\s*landscape/i.test(e)||/orientation:\\s*portrait/i.test(e))}function p(e,t){switch(e){case"rotate":case"rotateZ":return f(t);case"rotate3d":var r=V(t.split(",").map((function(e){return e.trim()})),4),n=r[2];r=r[3];return 0===parseInt(n)?void 0:f(r);case"matrix":case"matrix3d":var a,o;return(n=(n=t).split(",")).length<=6?(a=(o=V(n,2))[0],o=o[1],m(Math.atan2(parseFloat(o),parseFloat(a)))):(o=parseFloat(n[8]),a=Math.asin(o),o=Math.cos(a),m(Math.acos(parseFloat(n[0])/o)));default:return 0}}function f(e){var t=V(e.match(/(deg|grad|rad|turn)/)||[],1)[0];if(!t)return 0;var r=parseFloat(e.replace(t,""));switch(t){case"rad":return m(r);case"grad":var n=r;return(n%=400)<0&&(n+=400),Math.round(n/400*360);cas\
e"turn":return Math.round(360/(1/r));default:return parseInt(r)}}function m(e){return Math.round(e*(180/Math.PI))}},"data-table-large-matches":function(e){return!!Km(e)&&3<=(e=Vc(e)).length&&3<=e[0].length&&3<=e[1].length&&3<=e[2].length},"data-table-matches":function(e){return Km(e)},"deprecatedrole-evaluate":function(e,t,r){r=gd(r,{dpub:!0,fallback:!0});var n=Ic.ariaRoles[r];return!(null==n||!n.deprecated||(this.data(r),0))},"dlitem-evaluate":function(e){var t=(e=Es(e)).nodeName.toUpperCase(),r=Lc(e);return"DIV"===t&&["presentation","none",null].includes(r)&&(t=(e=Es(e)).nodeName.toUpperCase(),r=Lc(e)),"DL"===t&&!(r&&!["presentation","none","list"].includes(r))},"doc-has-title-evaluate":function(){var e=n.title;return!!Kc(e)},"duplicate-id-active-matches":function(e){var t=e.getAttribute("id").trim();t='*[id="'.concat(Ca(t),'"]'),t=Array.from(Qu(e).querySelectorAll(t));return!mh(e)&&t.some(Ec)},"duplicate-id-after":function(e){var t=[];return e.filter((function(e){return-1===t.indexO\
f(e.data)&&(t.push(e.data),!0)}))},"duplicate-id-aria-matches":function(e){return mh(e)},"duplicate-id-evaluate":function(e){var t,r=e.getAttribute("id").trim();return!r||(t=Qu(e),(t=Array.from(t.querySelectorAll('[id="'.concat(Ca(r),'"]'))).filter((function(t){return t!==e}))).length&&this.relatedNodes(t),this.data(r),0===t.length)},"duplicate-id-misc-matches":function(e){var t=e.getAttribute("id").trim();t='*[id="'.concat(Ca(t),'"]'),t=Array.from(Qu(e).querySelectorAll(t));return!mh(e)&&t.every((function(e){return!Ec(e)}))},"duplicate-img-label-evaluate":function(e,t,r){return!["none","presentation"].includes(gd(r))&&!!(t=Zl(r,t.parentSelector))&&""!==(t=Ad(t,!0).toLowerCase())&&t===Wd(r).toLowerCase()},"exists-evaluate":function(){},"explicit-evaluate":function(e,t,r){var n=this;if(!r.attr("id"))return!1;if(r.actualNode){var a=Qu(r.actualNode),o=Ca(r.attr("id"));a=Array.from(a.querySelectorAll('label[for="'.concat(o,'"]')));if(this.relatedNodes(a),!a.length)return!1;try{return a.som\
e((function(e){return!Ss(e)||(e=Kc(Nc(e,{inControlContext:!0,startNode:r})),n.data({explicitLabel:e}),!!e)}))}catch(e){}}},"fallbackrole-evaluate":function(e,t,r){var n=ef(r.attr("role"));return!(n.length<=1)&&(!(!fd(r)&&2===n.length&&n.includes("none")&&n.includes("presentation"))||void 0)},"focusable-content-evaluate":function(e,t,r){var n=r.tabbableElements;return!!n&&0<n.filter((function(e){return e!==r})).length},"focusable-disabled-evaluate":function(e,t,r){var n=["button","fieldset","input","select","textarea"];return!((r=r.tabbableElements)&&r.length&&(r=r.filter((function(e){return n.includes(e.props.nodeName)})),this.relatedNodes(r.map((function(e){return e.actualNode}))),0!==r.length)&&!Fp())||!!r.every((function(e){var t=e.getComputedStylePropertyValue("pointer-events"),r=parseInt(e.getComputedStylePropertyValue("width")),n=parseInt(e.getComputedStylePropertyValue("height"));return e.actualNode.onfocus||(0===r||0===n)&&"none"===t}))&&void 0},"focusable-element-evaluate":fun\
ction(e,t,r){return!(!r.hasAttr("contenteditable")||!function e(t){return"true"===(t=t.attr("contenteditable"))||""===t||"false"!==t&&(!!(t=Zl(r.parent,"[contenteditable]"))&&e(t))}(r))||Ac(r)},"focusable-modal-open-evaluate":function(e,t,r){return!(r=r.tabbableElements.map((function(e){return e.actualNode})))||!r.length||!Fp()||void this.relatedNodes(r)},"focusable-no-name-evaluate":function(e,t,r){if(!Ac(r))return!1;try{return!Wd(r)}catch(e){}},"focusable-not-tabbable-evaluate":function(e,t,r){var n=["button","fieldset","input","select","textarea"];return!((r=r.tabbableElements)&&r.length&&(r=r.filter((function(e){return!n.includes(e.props.nodeName)})),this.relatedNodes(r.map((function(e){return e.actualNode}))),0!==r.length)&&!Fp())||!!r.every((function(e){var t=e.getComputedStylePropertyValue("pointer-events"),r=parseInt(e.getComputedStylePropertyValue("width")),n=parseInt(e.getComputedStylePropertyValue("height"));return e.actualNode.onfocus||(0===r||0===n)&&"none"===t}))&&void 0}\
,"frame-focusable-content-evaluate":function(e,t,r){if(r.children)try{return!r.children.some((function e(t){if(Ac(t))return!0;if(!t.children){if(1===t.props.nodeType)throw new Error("Cannot determine children");return!1}return t.children.some((function(t){return e(t)}))}))}catch(e){}},"frame-focusable-content-matches":function(e,t,r){var n;return!r.initiator&&!r.focusable&&1<(null==(n=r.size)?void 0:n.width)*(null==(n=r.size)?void 0:n.height)},"frame-tested-after":function(e){var t={};return e.filter((function(e){var r;return"html"!==e.node.ancestry[e.node.ancestry.length-1]?(r=e.node.ancestry.flat(1/0).join(" > "),t[r]=e,!0):(r=e.node.ancestry.slice(0,e.node.ancestry.length-1).flat(1/0).join(" > "),t[r]&&(t[r].result=!0),!1)}))},"frame-tested-evaluate":function(e,t){return!t.isViolation&&void 0},"frame-title-has-text-matches":function(e){return e=e.getAttribute("title"),!!Kc(e)},"has-alt-evaluate":function(e,t,r){var n=r.props.nodeName;return!!["img","input","area"].includes(n)&&r.has\
Attr("alt")},"has-descendant-after":function(e){return e.some((function(e){return!0===e.result}))&&e.forEach((function(e){e.result=!0})),e},"has-descendant-evaluate":function(e,t,r){if(t&&t.selector&&"string"==typeof t.selector)return!(!t.passForModal||!Fp())||(r=sm(r,t.selector,xd),this.relatedNodes(r.map((function(e){return e.actualNode}))),0<r.length);throw new TypeError("has-descendant requires options.selector to be a string")},"has-global-aria-attribute-evaluate":function(e,t,r){var n=zc().filter((function(e){return r.hasAttr(e)}));return this.data(n),0<n.length},"has-implicit-chromium-role-matches":function(e,t){return null!==fd(t,{chromium:!0})},"has-lang-evaluate":function(e,t,r){var a=void 0!==n&&fl(n);return t.attributes.includes("xml:lang")&&t.attributes.includes("lang")&&Eg(r.attr("xml:lang"))&&!Eg(r.attr("lang"))&&!a?(this.data({messageKey:"noXHTML"}),!1):!!t.attributes.some((function(e){return Eg(r.attr(e))}))||(this.data({messageKey:"noLang"}),!1)},"has-text-content-eva\
luate":function(e,t,r){try{return""!==Kc(jd(r))}catch(e){}},"has-widget-role-evaluate":function(e,t,r){return null!==(r=Lc(r))&&("widget"===(r=wp(r))||"composite"===r)},"heading-matches":function(e,t){return"heading"===gd(t)},"heading-order-after":function(e){(t=M(t=e)).sort((function(e,t){return e=e.node,t=t.node,e.ancestry.length-t.ancestry.length}));var t,r=t.reduce(hg,[]).filter((function(e){return-1!==e.level}));return e.forEach((function(e){e.result=((e,t)=>{var r=null!=(r=null==(r=t[e=gg(t,e.node.ancestry)])?void 0:r.level)?r:-1;t=null!=(t=null==(t=t[e-1])?void 0:t.level)?t:-1;return 0===e||(-1!==r?r-t<=1:void 0)})(e,r)})),e},"heading-order-evaluate":function(){var e,t=_l.get("headingOrder");return t||(t=(e=sm(o._tree[0],"h1, h2, h3, h4, h5, h6, [role=heading], iframe, frame",xd)).map((function(e){return{ancestry:[Tl(e.actualNode)],level:(t=(t=gd(e))&&t.includes("heading"),r=e.attr("aria-level"),n=parseInt(r,10),e=V(e.props.nodeName.match(/h(\\d)/)||[],2)[1],t?e&&!r?parseInt(e,10\
):isNaN(n)||n<1?e?parseInt(e,10):2:n||-1:-1)};var t,r,n})),this.data({headingOrder:t}),_l.set("headingOrder",e)),!0},"help-same-as-label-evaluate":function(e,t,r){r=tp(r);var n=e.getAttribute("title");return!!r&&(n||(n="",e.getAttribute("aria-describedby")&&(n=Rc(e,"aria-describedby").map((function(e){return e?Nc(e):""})).join(""))),Kc(n)===Kc(r))},"hidden-content-evaluate":function(e,r,n){if(!["SCRIPT","HEAD","TITLE","NOSCRIPT","STYLE","TEMPLATE"].includes(e.nodeName.toUpperCase())&&pp(n)){if("none"===(n=t.getComputedStyle(e)).getPropertyValue("display"))return;if("hidden"===n.getPropertyValue("visibility")&&(!(e=(n=Es(e))&&t.getComputedStyle(n))||"hidden"!==e.getPropertyValue("visibility")))return}return!0},"hidden-explicit-label-evaluate":function(e,t,r){if(r.hasAttr("id")){if(!r.actualNode)return;var n,a=Qu(e);e=Ca(e.getAttribute("id"));if((a=a.querySelector('label[for="'.concat(e,'"]')))&&!xd(a)){try{n=Wd(r).trim()}catch(e){return}return""===n}}return!1},"html-namespace-matches":f\
unction(e,t){return!zg(0,t)},"html5-scope-evaluate":function(e){return!yp(n)||"TH"===e.nodeName.toUpperCase()},"identical-links-same-purpose-after":function(e){if(e.length<2)return e;for(var t=e.filter((function(e){return void 0!==e.result})),r=[],n={},o=function(e){var o=t[e],i=(u=o.data).name,l=u.urlProps;if(n[i])return 1;var u=t.filter((function(t,r){return t.data.name===i&&r!==e})),s=u.every((function(e){return function e(t,r){var n,o;return!(!t||!r)&&(n=Object.getOwnPropertyNames(t),o=Object.getOwnPropertyNames(r),n.length===o.length)&&n.every((function(n){var o=t[n];n=r[n];return a(o)===a(n)&&("object"===a(o)||"object"===a(n)?e(o,n):o===n)}))}(e.data.urlProps,l)}));u.length&&!s&&(o.result=void 0),o.relatedNodes=[],(s=o.relatedNodes).push.apply(s,M(u.map((function(e){return e.relatedNodes[0]})))),n[i]=u,r.push(o)},i=0;i<t.length;i++)o(i);return r},"identical-links-same-purpose-evaluate":function(e,t,r){if(r=kc.accessibleTextVirtual(r),r=kc.sanitize(kc.removeUnicode(r,{emoji:!0,non\
Bmp:!0,punctuations:!0})).toLowerCase())return r={name:r,urlProps:Zu.urlPropsFromAttribute(e,"href")},this.data(r),this.relatedNodes([e]),!0},"identical-links-same-purpose-matches":function(e,t){return!(!Wd(t)||(t=gd(e))&&"link"!==t)},"implicit-evaluate":function(e,t,r){try{var n,a=Zl(r,"label");return!!a&&(n=Kc(Wd(a,{inControlContext:!0,startNode:r})),a.actualNode&&this.relatedNodes([a.actualNode]),this.data({implicitLabel:n}),!!n)}catch(e){}},"inline-style-property-evaluate":function(e,r){var n=r.cssProperty,a=r.absoluteValues,o=r.minValue,i=r.maxValue,l=void 0===(l=r.normalValue)?0:l,u=r.multiLineOnly;return!!(!r.noImportant&&"important"!==e.style.getPropertyPriority(n)||u&&!Cp(e))||(r={},"number"==typeof o&&(r.minValue=o),"number"==typeof i&&(r.maxValue=i),u=e.style.getPropertyValue(n),["inherit","unset","revert","revert-layer"].includes(u)?(this.data(_({value:u},r)),!0):(u=((e,r)=>{var n=r.cssProperty,a=r.absoluteValues;r=r.normalValue;return"normal"===(n=(e=t.getComputedStyle(e))\
.getPropertyValue(n))||(r=parseFloat(n),a)?r:(a=parseFloat(e.getPropertyValue("font-size")),e=Math.round(r/a*100)/100,isNaN(e)?n:e)})(e,{absoluteValues:a,cssProperty:n,normalValue:l}),this.data(_({value:u},r)),"number"==typeof u?("number"!=typeof o||o<=u)&&("number"!=typeof i||u<=i):void 0))},"inserted-into-focus-order-matches":function(e){return hp(e)},"internal-link-present-evaluate":function(e,t,r){return ym(r,"a[href]").some((function(e){return/^#[^/!]/.test(e.attr("href"))}))},"invalid-children-evaluate":function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=2<arguments.length?arguments[2]:void 0,n=[],a=[];if(r.children){for(var o=xg(r.children);o.length;){var i=(l=o.shift()).vChild,l=l.nested;if(t.divGroups&&!l&&"div"===(u=i).props.nodeName&&null===Lc(u)){if(!i.children)return;var u=xg(i.children,!0);o.push.apply(o,M(u))}else u=((e,t,r)=>{var n=void 0===(n=r.validRoles)?[]:n,a=(r=void 0===(r=r.validNodeNames)?[]:r,(i=e.props).nodeName),o=i.nodeType,i=i.node\
Value;t=t?"div > ":"";return 3===o&&""!==i.trim()?t+"#text":!(1!==o||!xd(e))&&((i=Lc(e))?!n.includes(i)&&t+"[role=".concat(i,"]"):!r.includes(a)&&t+a)})(i,l,t),u&&(a.includes(u)||a.push(u),1===(null==i||null==(l=i.actualNode)?void 0:l.nodeType))&&n.push(i.actualNode)}return 0!==a.length&&(this.data({values:a.join(", ")}),this.relatedNodes(n),!0)}},"invalidrole-evaluate":function(e,t,r){return!!(r=ef(r.attr("role"))).every((function(e){return!jc(e.toLowerCase(),{allowAbstract:!0})}))&&(this.data(r),!0)},"is-element-focusable-evaluate":function(e,t,r){return Ec(r)},"is-initiator-matches":Ug,"is-on-screen-evaluate":Oi,"is-visible-matches":Ss,"is-visible-on-screen-matches":function(e,t){return Ss(t)},"label-content-name-mismatch-evaluate":function(e,t,r){var n=null==t?void 0:t.pixelThreshold,a=null!=(a=null==t?void 0:t.occurrenceThreshold)?a:null==t?void 0:t.occuranceThreshold;return t=Nc(e).toLowerCase(),!(e=Kc(jd(r,{subtreeDescendant:!0,ignoreIconLigature:!0,pixelThreshold:n,occurrenceTh\
reshold:a})).toLowerCase())||(Xd(t)<1||Xd(e)<1?void 0:(r=e,n=Ag(n=t),r=Ag(r),!(!n||!r)&&n.includes(r)))},"label-content-name-mismatch-matches":function(e,t){var r=gd(e);return!!(r&&ih("widget").includes(r)&&uh().includes(r)&&(Kc(Oc(t))||Kc(Tc(e)))&&Kc(Ad(t)))},"label-matches":function(e,t){return"input"!==t.props.nodeName||!1===t.hasAttr("type")||(t=t.attr("type").toLowerCase(),!1===["hidden","image","button","submit","reset"].includes(t))},"landmark-has-body-context-matches":function(e,t){return e.hasAttribute("role")||!ts(t,"article, aside, main, nav, section")},"landmark-is-top-level-evaluate":function(e){var t=ih("landmark"),r=Es(e),n=gd(e);for(this.data({role:n});r;){var a=Lc(r);if((a=a||"FORM"===r.nodeName.toUpperCase()?a:fd(r))&&t.includes(a)&&("main"!==a||"complementary"!==n))return!1;r=Es(r)}return!0},"landmark-is-unique-after":function(e){var t=[];return e.filter((function(e){var r=t.find((function(t){return e.data.role===t.data.role&&e.data.accessibleText===t.data.accessible\
Text}));return r?(r.result=!1,r.relatedNodes.push(e.relatedNodes[0]),!1):(t.push(e),e.relatedNodes=[],!0)}))},"landmark-is-unique-evaluate":function(e,t,r){var n=gd(e);return r=(r=Wd(r))?r.toLowerCase():null,this.data({role:n,accessibleText:r}),this.relatedNodes([e]),!0},"landmark-unique-matches":function(e,t){return r=t,a=ih("landmark"),!!(o=gd(r))&&("section"!==(n=r.props.nodeName)&&"form"!==n?0<=a.indexOf(o)||"region"===o:!!Wd(r))&&xd(t);var r,n,a,o},"layout-table-matches":function(e){return!Km(e)&&!Ec(e)},"link-in-text-block-evaluate":function(e,t){var r=t.requiredContrastRatio;if(t=t.allowSameColor,Tg(e))return!1;for(var n=Es(e);n&&1===n.nodeType&&!Tg(n);)n=Es(n);if(n){this.relatedNodes([n]);var a=cg(e),o=cg(n),i=(e=ig(e),ig(n)),l=a&&o?Rg(a,o):void 0;if((l=l&&Math.floor(100*l)/100)&&r<=l)return!0;var u=e&&i?Rg(e,i):void 0;if((u=u&&Math.floor(100*u)/100)&&r<=u)return!0;if(u){if(l)return!(!t||1!==l||1!==u)||(1===l&&1<u?this.data({messageKey:"bgContrast",contrastRatio:u,requiredContr\
astRatio:r,nodeBackgroundColor:e?e.toHexString():void 0,parentBackgroundColor:i?i.toHexString():void 0}):this.data({messageKey:"fgContrast",contrastRatio:l,requiredContrastRatio:r,nodeColor:a?a.toHexString():void 0,parentColor:o?o.toHexString():void 0}),!1)}else u=null!=(t=Np.get("bgColor"))?t:"bgContrast",this.data({messageKey:u}),Np.clear()}},"link-in-text-block-matches":function(e){var t=Kc(e.innerText),r=Lc(e);return!(r&&"link"!==r||!t||!Ss(e))&&Ep(e)},"link-in-text-block-style-evaluate":function(e){if(kg(e))return!1;for(var r=Es(e);r&&1===r.nodeType&&!kg(r);)r=Es(r);return r?(this.relatedNodes([r]),!!jh(e,r)||!!(e=>{for(var r=0,n=["before","after"];r<n.length;r++){var a=n[r];if("none"!==t.getComputedStyle(e,":".concat(a)).getPropertyValue("content"))return 1}})(e)&&void this.data({messageKey:"pseudoContent"})):void 0},"listitem-evaluate":function(e,t,r){var n;if(r=r.parent)return n=r.props.nodeName,r=Lc(r),!!["presentation","none","list"].includes(r)||(r&&jc(r)?(this.data({message\
Key:"roleNotValid"}),!1):["ul","ol","menu"].includes(n))},"matches-definition-evaluate":function(e,t,r){return dd(r,t.matcher)},"meta-refresh-evaluate":function(e,t,r){var n=(a=t||{}).minDelay,a=a.maxDelay;return!(r=V((r.attr("content")||"").trim().split(_h),1)[0]).match(Mh)||(r=parseFloat(r),this.data({redirectDelay:r}),"number"==typeof n&&r<=t.minDelay)||"number"==typeof a&&r>t.maxDelay},"meta-viewport-scale-evaluate":function(e,t,r){var n,a=void 0===(a=(t=t||{}).scaleMinimum)?2:a;return t=void 0!==(t=t.lowerBound)&&t,!((r=r.attr("content")||"")&&(r=r.split(/[;,]/).reduce((function(e,t){var r;return(t=t.trim())&&(r=(t=V(t.split("="),2))[0],t=t[1],r)&&t&&(r=r.toLowerCase().trim(),t=t.toLowerCase().trim(),"maximum-scale"===r&&"yes"===t&&(t=1),"maximum-scale"===r&&parseFloat(t)<0||(e[r]=t)),e}),{}),!(t&&r["maximum-scale"]&&parseFloat(r["maximum-scale"])<t))&&(t||"no"!==r["user-scalable"]?(n=parseFloat(r["user-scalable"]),!t&&r["user-scalable"]&&(n||0===n)&&-1<n&&n<1?(this.data("user-sca\
lable"),1):r["maximum-scale"]&&parseFloat(r["maximum-scale"])<a&&(this.data("maximum-scale"),1)):(this.data("user-scalable=no"),1)))},"multiple-label-evaluate":function(e){var t=Ca(e.getAttribute("id")),r=e.parentNode,n=(n=Qu(e)).documentElement||n,a=Array.from(n.querySelectorAll('label[for="'.concat(t,'"]')));for(a.length&&(a=a.filter((function(e){return!ws(e)})));r;)"LABEL"===r.nodeName.toUpperCase()&&-1===a.indexOf(r)&&a.push(r),r=r.parentNode;return this.relatedNodes(a),1<a.length&&(1<(n=a.filter(xd)).length||!Rc(e,"aria-labelledby").includes(n[0]))&&void 0},"nested-interactive-matches":function(e,t){return!!(t=gd(t))&&!!Ic.ariaRoles[t].childrenPresentational},"no-autoplay-audio-evaluate":function(e,t){var r,n=e.hasAttribute("controls");return e.hasAttribute("loop")?n:e.duration?(t=void 0===(t=t.allowedDuration)?3:t,(e.currentSrc?(r=(e=>{if(e=e.match(/#t=(.*)/))return V(e,2)[1].split(",").map((function(e){if(/:/.test(e)){for(var t=e.split(":"),r=0,n=1;0<t.length;)r+=n*parseInt(t.po\
p(),10),n*=60;return parseFloat(r)}return parseFloat(e)}))})(e.currentSrc))?1!==r.length?Math.abs(r[1]-r[0]):Math.abs(e.duration-r[0]):Math.abs(e.duration-(e.currentTime||0)):0)<=t||!!n):void console.warn("axe.utils.preloadMedia did not load metadata")},"no-autoplay-audio-matches":function(e){return!!e.currentSrc&&!e.hasAttribute("paused")&&!e.hasAttribute("muted")},"no-empty-role-matches":function(e,t){return!!t.hasAttr("role")&&!!t.attr("role").trim()},"no-explicit-name-required-matches":Hg,"no-focusable-content-evaluate":function(e,t,r){if(r.children)try{var n,a=function e(t){if(!t.children){if(1===t.props.nodeType)throw new Error("Cannot determine children");return[]}var r=[];return t.children.forEach((function(t){"widget"===wp(t)&&Ec(t)?r.push(t):r.push.apply(r,M(e(t)))})),r}(r);return!a.length||(0<(n=a.filter(Fg)).length?(this.data({messageKey:"notHidden"}),this.relatedNodes(n)):this.relatedNodes(a),!1)}catch(e){}},"no-implicit-explicit-label-evaluate":function(e,t,r){var n,a,o=g\
d(r,{noImplicit:!0});this.data(o);try{n=Kc(Ld(r)).toLowerCase(),a=Kc(Wd(r)).toLowerCase()}catch(e){return}return!(!a&&!n||(a||!n)&&a.includes(n))&&void 0},"no-naming-method-matches":function(e,t){var r=pd(t).namingMethods;return!(r&&0!==r.length||"combobox"===Lc(t)&&ym(t,'input:not([type="hidden"])').length||hh(t,{popupRoles:["listbox"]}))},"no-negative-tabindex-matches":function(e,t){return null===(t=nm(t.attr("tabindex")))||0<=t},"no-role-matches":function(e,t){return!t.attr("role")},"non-empty-if-present-evaluate":function(e,t,r){var n=r.props.nodeName,a=(r.attr("type")||"").toLowerCase();return(r=r.attr("value"))&&this.data({messageKey:"has-label"}),!("input"!==n||!["submit","reset"].includes(a))&&null===r},"not-html-matches":function(e,t){return"html"!==t.props.nodeName},"object-is-loaded-matches":function(e,t){return[Hg,function(e){var t;return null==e||null==(t=e.ownerDocument)||!t.createRange||((t=e.ownerDocument.createRange()).setStart(e,0),t.setEnd(e,e.childNodes.length),0===\
t.getClientRects().length)}].every((function(r){return r(e,t)}))},"only-dlitems-evaluate":function(e,t,r){var n=["definition","term","list"];return(r=r.children.reduce((function(e,t){var r=t.actualNode;return"DIV"===r.nodeName.toUpperCase()&&null===gd(r)?e.concat(t.children):e.concat(t)}),[]).reduce((function(e,t){var r,a=(t=t.actualNode).nodeName.toUpperCase();return 1===t.nodeType&&xd(t)?(r=Lc(t),("DT"!==a&&"DD"!==a||r)&&!n.includes(r)&&e.badNodes.push(t)):3===t.nodeType&&""!==t.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0),e}),{badNodes:[],hasNonEmptyTextNode:!1})).badNodes.length&&this.relatedNodes(r.badNodes),!!r.badNodes.length||r.hasNonEmptyTextNode},"only-listitems-evaluate":function(e,t,r){var n=!1,a=!1,o=!0,i=[],l=[],u=[];if(r.children.forEach((function(e){var t,r,s=e.actualNode;3===s.nodeType&&""!==s.nodeValue.trim()?n=!0:1===s.nodeType&&xd(s)&&(o=!1,t="LI"===s.nodeName.toUpperCase(),r="listitem"===(e=gd(e)),t||r||i.push(s),t&&!r&&(l.push(s),u.includes(e)||u.push(e)),r)&&(a=!\
0)})),n||i.length)this.relatedNodes(i);else{if(o||a)return!1;this.relatedNodes(l),this.data({messageKey:"roleNotValid",roles:u.join(", ")})}return!0},"p-as-heading-evaluate":function(e,t,r){var n=(i=Array.from(e.parentNode.children)).indexOf(e),a=(t=t||{}).margins||[],o=i.slice(n+1).find((function(e){return"P"===e.nodeName.toUpperCase()})),i=i.slice(0,n).reverse().find((function(e){return"P"===e.nodeName.toUpperCase()})),l=(n=Oh(e),o?Oh(o):null),u=(i=i?Oh(i):null,t.passLength);return t=t.failLength,e=e.textContent.trim().length,(o=null==o?void 0:o.textContent.trim().length)*u<e||!l||!Sh(n,l,a)||!!((u=ts(r,"blockquote"))&&"BLOCKQUOTE"===u.nodeName.toUpperCase()||i&&!Sh(n,i,a)||o*t<e)&&void 0},"p-as-heading-matches":function(e){var t=Array.from(e.parentNode.childNodes),r=e.textContent.trim();return!(0===r.length||2<=(r.match(/[.!?:;](?![.!?:;])/g)||[]).length)&&0!==t.slice(t.indexOf(e)+1).filter((function(e){return"P"===e.nodeName.toUpperCase()&&""!==e.textContent.trim()})).length},"page\
-no-duplicate-after":function(e){return e.filter((function(e){return"ignored"!==e.data}))},"page-no-duplicate-evaluate":function(e,t,r){if(!t||!t.selector||"string"!=typeof t.selector)throw new TypeError("page-no-duplicate requires options.selector to be a string");var n="page-no-duplicate;"+t.selector;if(!_l.get(n))return _l.set(n,!0),n=sm(o._tree[0],t.selector,xd),"string"==typeof t.nativeScopeFilter&&(n=n.filter((function(e){return e.actualNode.hasAttribute("role")||!ts(e,t.nativeScopeFilter)}))),"string"==typeof t.role&&(n=n.filter((function(e){return gd(e)===t.role}))),this.relatedNodes(n.filter((function(e){return e!==r})).map((function(e){return e.actualNode}))),n.length<=1;this.data("ignored")},"presentation-role-conflict-matches":function(e,t){return null!==fd(t,{chromiumRoles:!0})},"presentational-role-evaluate":function(e,t,r){var n=Lc(r);if(["presentation","none"].includes(n)&&["iframe","frame"].includes(r.props.nodeName)&&r.hasAttr("title"))this.data({messageKey:"iframe",n\
odeName:r.props.nodeName});else{var a,o=gd(r);if(["presentation","none"].includes(o))return this.data({role:o}),!0;["presentation","none"].includes(n)&&(n=zc().some((function(e){return r.hasAttr(e)})),a=Ec(r),this.data({messageKey:n&&!a?"globalAria":!n&&a?"focusable":"both",role:o}))}return!1},"region-after":function(e){var t=e.filter((function(e){return e.data.isIframe}));return e.forEach((function(e){if(!e.result&&1!==e.node.ancestry.length){var r,n=e.node.ancestry.slice(0,-1),a=K(t);try{for(a.s();!(r=a.n()).done;){var o=r.value;if(Kf(n,o.node.ancestry)){e.result=o.result;break}}}catch(e){a.e(e)}finally{a.f()}}})),t.forEach((function(e){e.result||(e.result=!0)})),e},"region-evaluate":function(e,t,r){return this.data({isIframe:["iframe","frame"].includes(r.props.nodeName)}),!_l.get("regionlessNodes",(function(){return function e(t,r){var a=t.actualNode;if("button"===gd(t)||function(e,t){var r=e.actualNode,n=gd(e),a=(r=(r.getAttribute("aria-live")||"").toLowerCase().trim(),ih("landmark\
"));return!!(["assertive","polite"].includes(r)||Th.includes(n)||a.includes(n)||t.regionMatcher&&dd(e,t.regionMatcher))}(t,r)||["iframe","frame"].includes(t.props.nodeName)||Lp(t.actualNode)&&gc(t.actualNode,"href")||!xd(a)){for(var o=t;o;)o._hasRegionDescendant=!0,o=o.parent;return["iframe","frame"].includes(t.props.nodeName)?[t]:[]}return a!==n.body&&fp(a,!0)&&!function(e){return["none","presentation"].includes(gd(e))&&!dp(e)}(t)?[t]:t.children.filter((function(e){return 1===(e=e.actualNode).nodeType})).map((function(t){return e(t,r)})).reduce((function(e,t){return e.concat(t)}),[])}(o._tree[0],t).map((function(e){for(;e.parent&&!e.parent._hasRegionDescendant&&e.parent.actualNode!==n.body;)e=e.parent;return e})).filter((function(e,t,r){return r.indexOf(e)===t}))})).includes(r)},"same-caption-summary-evaluate":function(e,t,r){var n;if(void 0!==r.children)return n=r.attr("summary"),!(!(r=!!(r=r.children.find(Rh))&&Kc(jd(r)))||!n)&&Kc(n).toLowerCase()===Kc(r).toLowerCase()},"scope-value\
-evaluate":function(e,t){return e=e.getAttribute("scope").toLowerCase(),-1!==t.values.indexOf(e)},"scrollable-region-focusable-matches":function(e,t){return void 0!==Sf(e,13)&&!1===hh(t)&&(r=t.boundingClientRect,ym(t,"*").some((function(e){var t,a,o;return!!pp(e,!0,!0)&&(t=[],dp(e)?t.push.apply(t,M((a=e,(o=n.createRange()).selectNodeContents(a.actualNode),Array.from(o.getClientRects())))):t=[e.boundingClientRect],t.some((function(e){return e.left<r.left||e.right>r.right||e.top<r.top||e.bottom>r.bottom})))})));var r},"skip-link-evaluate":function(e){return!!(e=gc(e,"href"))&&(xd(e)||void 0)},"skip-link-matches":function(e){return Lp(e)&&Ts(e)},"structured-dlitems-evaluate":function(e,t,r){var n=r.children;if(!n||!n.length)return!1;for(var a,o=!1,i=!1,l=0;l<n.length;l++){if((o="DT"===(a=n[l].props.nodeName.toUpperCase())||o)&&"DD"===a)return!1;"DD"===a&&(i=!0)}return o||i},"summary-interactive-matches":function(e,t){var r,n,a=t.parent;return!("details"!==a.props.nodeName||(n=null==(n=(r=\
t).actualNode)?void 0:n.parentElement)&&n!==r.parent.actualNode)&&a.children.find((function(e){return"summary"===e.props.nodeName}))===t},"svg-namespace-matches":zg,"svg-non-empty-title-evaluate":function(e,t,r){if(r.children){if(r=r.children.find((function(e){return"title"===e.props.nodeName})),!r)return this.data({messageKey:"noTitle"}),!1;try{if(""===jd(r,{includeHidden:!0}).trim())return this.data({messageKey:"emptyTitle"}),!1}catch(e){return}return!0}},"tabindex-evaluate":function(e,t,r){return null===(r=nm(r.attr("tabindex")))||r<=0},"table-or-grid-role-matches":function(e,t){return t=gd(t),["treegrid","grid","table"].includes(t)},"target-offset-evaluate":function(e,t,r){var n=(null==t?void 0:t.minOffset)||24;if(qs(10*n,r.boundingClientRect))return this.data({messageKey:"large",minOffset:n}),!0;var a,o,i=[],l=n,u=K(ic(r,n));try{for(u.s();!(a=u.n()).done;){var s=a.value;if("widget"===wp(s)&&Ec(s)){var c=null;try{c=zs(r,s,n/2)}catch(e){if(e.message.startsWith("splitRects"))return v\
oid this.data({messageKey:"tooManyRects",closestOffset:0,minOffset:n});throw e}null===c||n<=.05+(c=2*(o=c,Math.round(10*o)/10))||(l=Math.min(l,c),i.push(s))}}}catch(e){u.e(e)}finally{u.f()}return 0===i.length?(this.data({closestOffset:l,minOffset:n}),!0):(this.relatedNodes(i.map((function(e){return e.actualNode}))),i.some(Ac)?(this.data({closestOffset:l,minOffset:n}),!Ac(r)&&void 0):void this.data({messageKey:"nonTabbableNeighbor",closestOffset:l,minOffset:n}))},"target-size-evaluate":function(e,t,r){t=(null==t?void 0:t.minSize)||24;var n,a,o,i,l,u,s=r.boundingClientRect;return qs(10*t,s)?(this.data({messageKey:"large",minSize:t}),!0):(l=qs.bind(null,t),i=ic(r),a=r,n=i.filter((function(e){return!bg(e,a)&&wg(a,e)})),o=(i=((e,t)=>{var r,n=[],a=[],o=K(t);try{for(o.s();!(r=o.n()).done;){var i=r.value;!wg(e,i)&&Gs(e,i)&&"none"!==i.getComputedStylePropertyValue("pointer-events")&&(bg(e,i)?n:a).push(i)}}catch(e){o.e(e)}finally{o.f()}return{fullyObscuringElms:n,partialObscuringElms:a}})(r,i)).\
fullyObscuringElms,i=i.partialObscuringElms,!n.length||!o.length&&l(s)?o.length?(this.relatedNodes(Dg(o)),this.data({messageKey:"obscured"}),!0):(o=!Ac(r)&&void 0,l(s)?(i=i.filter((function(e){return"widget"===wp(e)&&Ec(e)}))).length?(r=((e,t,r)=>{var n;e=e.boundingClientRect,t=t.map((function(e){return"inline"===e.getComputedStylePropertyValue("display")?e.clientRects:e.boundingClientRect})).flat(1/0);try{n=$s(e,t)}catch(e){return null}var a=r;return n.reduce((function(e,t){var r=qs(a,e);return r!==qs(a,t)?r?e:t:(r=e.width*e.height,t.width*t.height<r?e:t)}))})(r,i,t))?l(r)?(this.data(_({minSize:t},yg(r||s))),this.relatedNodes(Dg(i)),!0):n.length?(this.data({minSize:t,messageKey:"contentOverflow"}),void this.relatedNodes(Dg(n))):(l=i.every(Ac),u="partiallyObscured".concat(l?"":"NonTabbable"),this.data(_({messageKey:u,minSize:t},yg(r))),this.relatedNodes(Dg(i)),l?o:void 0):void this.data({minSize:t,messageKey:"tooManyRects"}):(this.data(_({minSize:t},yg(s))),!0):(this.data(_({minSize:t}\
,yg(s))),o)):(this.data({minSize:t,messageKey:"contentOverflow"}),void this.relatedNodes(Dg(n))))},"td-has-header-evaluate":function(e){var t=[],r=Hm(e),n=Vc(e);return r.forEach((function(e){fp(e)&&Ym(e)&&!vh(e)&&!Wm(e,n).some((function(e){return null!==e&&!!fp(e)}))&&t.push(e)})),!t.length||(this.relatedNodes(t),!1)},"td-headers-attr-evaluate":function(e){for(var t=[],r={},n=0;n<e.rows.length;n++)for(var a=e.rows[n],o=0;o<a.cells.length;o++){var i=a.cells[o],l=(t.push(i),i.getAttribute("id"));l&&(r[l]=gd(i))}var u,s=F(F(F(F({},Ch,new Set),Ah,new Set),Fh,new Set),kh,new Set),c=(t.forEach((function(e){var t,n;e.hasAttribute("headers")&&xd(e)&&((t=e.getAttribute("headers").trim())?(n=e.getAttribute("id"),ef(t).forEach((function(t){n&&t===n?s[Ch].add(e):r[t]?["columnheader","rowheader"].includes(r[t])||s[Fh].add(e):s[Ah].add(e)}))):s[kh].add(e))})),K(Eh));try{for(c.s();!(u=c.n()).done;){var d=u.value;if(0<s[d].size)return this.relatedNodes(M(s[d])),d===kh?void 0:(this.data({messageKey:d})\
,!1)}}catch(e){c.e(e)}finally{c.f()}return!0},"th-has-data-cells-evaluate":function(e){var t=Hm(e),r=this,n=[],a=(t=(t.forEach((function(e){var t;(t=((t=e.getAttribute("headers"))&&(n=n.concat(t.split(/\\s+/))),e.getAttribute("aria-labelledby")))&&(n=n.concat(t.split(/\\s+/)))})),t.filter((function(e){return""!==Kc(e.textContent)&&("TH"===e.nodeName.toUpperCase()||-1!==["rowheader","columnheader"].indexOf(Lc(e)))}))),Vc(e)),o=!0;return t.forEach((function(e){var t,i;e.getAttribute("id")&&n.includes(e.getAttribute("id"))||(t=Gc(e,a),i=!1,(i=!(i=Hc(e)?Zm("down",t,a).find((function(t){return!Hc(t)&&Wm(t,a).includes(e)})):i)&&Uc(e)?Zm("right",t,a).find((function(t){return!Uc(t)&&Wm(t,a).includes(e)})):i)||r.relatedNodes(e),o=o&&i)})),!!o||void 0},"title-only-evaluate":function(e,t,r){var n=tp(r),a=bd(r);return r=r.attr("aria-describedby"),!(n||!a&&!r)},"unique-frame-title-after":function(e){var t={};return e.forEach((function(e){t[e.data]=void 0!==t[e.data]?++t[e.data]:0})),e.forEach((functi\
on(e){e.result=!!t[e.data]})),e},"unique-frame-title-evaluate":function(e,t,r){return r=Kc(r.attr("title")).toLowerCase(),this.data(r),!0},"unsupportedrole-evaluate":function(e,t,r){r=gd(r,{dpub:!0,fallback:!0});var n=Bc(r);return n&&this.data(r),n},"valid-lang-evaluate":function(e,t,r){var n=[];return t.attributes.forEach((function(e){var a,o,i=r.attr(e);"string"==typeof i&&(a=pf(i),o=t.value?!t.value.map(pf).includes(a):!Mm(a),""!==a&&o||""!==i&&!Kc(i))&&n.push(e+'="'+r.attr(e)+'"')})),!!n.length&&!("html"!==r.props.nodeName&&!mp(r)||(this.data(n),0))},"valid-scrollable-semantics-evaluate":function(e,t){return(r=Lc(r=e))&&(Mg[r]||t.roles.includes(r))||(t=(t=e).nodeName.toUpperCase(),_g[t])||!1;var r},"widget-not-inline-matches":function(e,t){return Vg.every((function(r){return r(e,t)}))},"window-is-top-matches":function(e){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},"xml-lang-mismatch-evaluate":function(e,t,r){return pf(r.attr("lang"))===pf(r.attr("xml:\
lang"))},"xml-lang-mismatch-matches":function(e){var t=pf(e.getAttribute("lang"));return e=pf(e.getAttribute("xml:lang")),Mm(t)&&Mm(e)}},Kg=function(e){this.id=e.id,this.data=null,this.relatedNodes=[],this.result=null};function Xg(e){if("string"!=typeof e)return e;if(Yg[e])return Yg[e];if(/^\\s*function[\\s\\w]*\\(/.test(e))return new Function("return "+e+";")();throw new ReferenceError("Function ID does not exist in the metadata-function-map: ".concat(e))}function Zg(e){return e=0<arguments.length&&void 0!==e?e:{},Array.isArray(e)||"object"!==a(e)?{value:e}:e}function Jg(e){e&&(this.id=e.id,this.configure(e))}Jg.prototype.enabled=!0,Jg.prototype.run=function(e,t,r,n,a){var o=((t=t||{}).hasOwnProperty("enabled")?t:this).enabled,i=this.getOptions(t.options);if(o){var l;o=new Kg(this),t=ql(o,t,n,a);try{l=this.evaluate.call(t,e.actualNode,i,e,r)}catch(t){return e&&e.actualNode&&(t.errorNode=qu.toSpec(e)),void a(t)}t.isAsync||(o.result=l,n(o))}else n(null)},Jg.prototype.runSync=function(e,t,r)\
{if(!(void 0===(a=(t=t||{}).enabled)?this.enabled:a))return null;var n,a=this.getOptions(t.options),o=new Kg(this);(t=ql(o,t)).async=function(){throw new Error("Cannot run async check while in a synchronous run")};try{n=this.evaluate.call(t,e.actualNode,a,e,r)}catch(t){throw e&&e.actualNode&&(t.errorNode=qu.toSpec(e)),t}return o.result=n,o},Jg.prototype.configure=function(e){var t=this;e.evaluate&&!Yg[e.evaluate]||(this._internalCheck=!0),e.hasOwnProperty("enabled")&&(this.enabled=e.enabled),e.hasOwnProperty("options")&&(this._internalCheck?this.options=Zg(e.options):this.options=e.options),["evaluate","after"].filter((function(t){return e.hasOwnProperty(t)})).forEach((function(r){return t[r]=Xg(e[r])}))},Jg.prototype.getOptions=function(e){return this._internalCheck?Wu(this.options,Zg(e||{})):e||this.options};var Qg=Jg,ev=function(e){this.id=e.id,this.result=la.NA,this.pageLevel=e.pageLevel,this.impact=null,this.nodes=[]};function tv(e,t){this._audit=t,this.id=e.id,this.selector=e.sel\
ector||"*",e.impact&&(Aa(la.impact.includes(e.impact),"Impact ".concat(e.impact," is not a valid impact")),this.impact=e.impact),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.reviewOnFail="boolean"==typeof e.reviewOnFail&&e.reviewOnFail,this.any=e.any||[],this.all=e.all||[],this.none=e.none||[],this.tags=e.tags||[],this.preload=!!e.preload,this.actIds=e.actIds,e.matches&&(this.matches=Xg(e.matches))}function rv(e){var t,r;if(e.length)return t=!1,r={},e.forEach((function(e){var n=e.results.filter((function(e){return e}));(r[e.type]=n).length&&(t=!0)})),t?r:null}tv.prototype.matches=function(){return!0},tv.prototype.gather=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r="mark_gather_start_"+this.id,n="mark_gather_end_"+this.id,a="mark_isVisibleToScreenReaders_start_"+this.id,o="mark_isVisibleToScreenReaders_end_"+this.id;\
t.performanceTimer&&om.mark(r),e=Am(this.selector,e);return this.excludeHidden&&(t.performanceTimer&&om.mark(a),e=e.filter(xd),t.performanceTimer)&&(om.mark(o),om.measure("rule_"+this.id+"#gather_axe.utils.isVisibleToScreenReaders",a,o)),t.performanceTimer&&(om.mark(n),om.measure("rule_"+this.id+"#gather",r,n)),e},tv.prototype.runChecks=function(e,t,r,n,a,o){var i=this,l=nu();this[e].forEach((function(e){var a=i._audit.checks[e.id||e],o=xf(a,i.id,r);l.defer((function(e,r){a.run(t,o,n,e,(function(e){r(new km({ruleId:i.id,method:"".concat(a.id,"#evaluate"),errorNode:new Ll(t),error:e}))}))}))})),l.then((function(t){t=t.filter((function(e){return e})),a({type:e,results:t})})).catch(o)},tv.prototype.runChecksSync=function(e,t,r,n){var a=this,o=[];return this[e].forEach((function(e){e=a._audit.checks[e.id||e];var i=xf(e,a.id,r);o.push(e.runSync(t,i,n))})),{type:e,results:o=o.filter((function(e){return e}))}},tv.prototype.run=function(e){var t,r=this,n=1<arguments.length&&void 0!==arguments[\
1]?arguments[1]:{},a=2<arguments.length?arguments[2]:void 0,o=3<arguments.length?arguments[3]:void 0,i=(n.performanceTimer&&this._trackPerformance(),nu()),l=new ev(this);try{t=this.gatherAndMatchNodes(e,n)}catch(t){return void o(t)}n.performanceTimer&&this._logGatherPerformance(t),t.forEach((function(t){i.defer((function(a,o){var i=nu();["any","all","none"].forEach((function(a){i.defer((function(o,i){r.runChecks(a,t,n,e,o,i)}))})),i.then((function(e){var n=rv(e);n&&(n.node=new Ll(t),l.nodes.push(n),r.reviewOnFail)&&(["any","all"].forEach((function(e){n[e].forEach((function(e){!1===e.result&&(e.result=void 0)}))})),n.none.forEach((function(e){!0===e.result&&(e.result=void 0)}))),a()})).catch((function(e){return o(e)}))}))})),i.then((function(){n.performanceTimer&&r._logRulePerformance(),setTimeout((function(){a(l)}),0)})).catch((function(e){n.performanceTimer&&r._logRulePerformance(),o(e)}))},tv.prototype.runSync=function(e){var t=this,r=1<arguments.length&&void 0!==arguments[1]?argumen\
ts[1]:{},n=(r.performanceTimer&&this._trackPerformance(),new ev(this)),a=this.gatherAndMatchNodes(e,r);return r.performanceTimer&&this._logGatherPerformance(a),a.forEach((function(a){var o=[],i=(["any","all","none"].forEach((function(n){o.push(t.runChecksSync(n,a,r,e))})),rv(o));i&&(i.node=a.actualNode?new Ll(a):null,n.nodes.push(i),t.reviewOnFail)&&(["any","all"].forEach((function(e){i[e].forEach((function(e){!1===e.result&&(e.result=void 0)}))})),i.none.forEach((function(e){!0===e.result&&(e.result=void 0)})))})),r.performanceTimer&&this._logRulePerformance(),n},tv.prototype._trackPerformance=function(){this._markStart="mark_rule_start_"+this.id,this._markEnd="mark_rule_end_"+this.id,this._markChecksStart="mark_runchecks_start_"+this.id,this._markChecksEnd="mark_runchecks_end_"+this.id},tv.prototype._logGatherPerformance=function(e){ua("gather for ".concat(this.id," (").concat(e.length," nodes): ").concat(om.timeElapsed(),"ms")),om.mark(this._markChecksStart)},tv.prototype._logRulePe\
rformance=function(){om.mark(this._markChecksEnd),om.mark(this._markEnd),om.measure("runchecks_"+this.id,this._markChecksStart,this._markChecksEnd),om.measure("rule_"+this.id,this._markStart,this._markEnd)},tv.prototype.gatherAndMatchNodes=function(e,t){var r=this,n="mark_matches_start_"+this.id,a="mark_matches_end_"+this.id,o=this.gather(e,t);return t.performanceTimer&&om.mark(n),o=o.filter((function(t){try{return r.matches(t.actualNode,t,e)}catch(e){throw new km({ruleId:r.id,method:"#matches",errorNode:new Ll(t),error:e})}})),t.performanceTimer&&(om.mark(a),om.measure("rule_"+this.id+"#matches",n,a)),o},tv.prototype.after=function(e,t){var r,n,a,o,i=this;return zu(r=this).map((function(e){return(e=r._audit.checks[e.id||e])&&"function"==typeof e.after?e:null})).filter(Boolean).forEach((function(r){l=e.nodes,n=r.id,a=[],l.forEach((function(e){zu(e).forEach((function(t){t.id===n&&(t.node=e.node,a.push(t))}))}));var n,a,o,l=a,u=xf(r,i.id,t);try{o=r.after(l,u.options)}catch(l){throw new k\
m({ruleId:i.id,method:"".concat(r.id,"#after"),errorNode:null==(u=e.nodes)||null==(u=u[0])?void 0:u.node,error:l})}i.reviewOnFail&&o.forEach((function(e){var t=(i.any.includes(e.id)||i.all.includes(e.id))&&!1===e.result,r=i.none.includes(e.id)&&!0===e.result;(t||r)&&(e.result=void 0)})),l.forEach((function(e){delete e.node,-1===o.indexOf(e)&&(e.filtered=!0)}))})),e.nodes=(a=["any","all","none"],o=(n=e).nodes.filter((function(e){var t=0;return a.forEach((function(r){e[r]=e[r].filter((function(e){return!0!==e.filtered})),t+=e[r].length})),0<t})),o=n.pageLevel&&o.length?[o.reduce((function(e,t){if(e)return a.forEach((function(r){e[r].push.apply(e[r],t[r])})),e}))]:o),e},tv.prototype.configure=function(e){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.pageL\
evel="boolean"==typeof e.pageLevel&&e.pageLevel),e.hasOwnProperty("reviewOnFail")&&(this.reviewOnFail="boolean"==typeof e.reviewOnFail&&e.reviewOnFail),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("actIds")&&(this.actIds=e.actIds),e.hasOwnProperty("matches")&&(this.matches=Xg(e.matches)),e.impact&&(Aa(la.impact.includes(e.impact),"Impact ".concat(e.impact," is not a valid impact")),this.impact=e.impact)};var nv=/\\{\\{.+?\\}\\}/g,av=W((function e(t){H(this,e),this.lang="en",this.defaultConfig=t,this.standards=Ic,this._init(),this._defaultLocale=null}),[{key:"_setDefaultLocale",value:function(){if(!this._defaultLocale){for(var e={checks:{},rules:{},failureSummaries:{},incompleteFallbackMessage:"",lang:this.lang},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;e.checks[n]={pass:o,fail:a.fail,in\
complete:a.incomplete}}for(var i=Object.keys(this.data.rules),l=0;l<i.length;l++){var u=i[l],s=this.data.rules[u],c=s.description;e.rules[u]={description:c,help:s.help}}for(var d=Object.keys(this.data.failureSummaries),p=0;p<d.length;p++){var f=d[p],m=this.data.failureSummaries[f].failureMessage;e.failureSummaries[f]={failureMessage:m}}e.incompleteFallbackMessage=this.data.incompleteFallbackMessage,this._defaultLocale=e}}},{key:"_resetLocale",value:function(){var e=this._defaultLocale;e&&this.applyLocale(e)}},{key:"_applyCheckLocale",value:function(e){for(var t=Object.keys(e),r=0;r<t.length;r++){var n=t[r];if(!this.data.checks[n])throw new Error('Locale provided for unknown check: "'.concat(n,'"'));this.data.checks[n]=lv(this.data.checks[n],e[n])}}},{key:"_applyRuleLocale",value:function(e){for(var t=Object.keys(e),r=0;r<t.length;r++){var n=t[r];if(!this.data.rules[n])throw new Error('Locale provided for unknown rule: "'.concat(n,'"'));this.data.rules[n]=uv(this.data.rules[n],e[n])}}},\
{key:"_applyFailureSummaries",value:function(e){for(var t=Object.keys(e),r=0;r<t.length;r++){var n=t[r];if(!this.data.failureSummaries[n])throw new Error('Locale provided for unknown failureMessage: "'.concat(n,'"'));this.data.failureSummaries[n]=sv(this.data.failureSummaries[n],e[n])}}},{key:"applyLocale",value:function(e){this._setDefaultLocale(),e.checks&&this._applyCheckLocale(e.checks),e.rules&&this._applyRuleLocale(e.rules),e.failureSummaries&&this._applyFailureSummaries(e.failureSummaries,"failureSummaries"),e.incompleteFallbackMessage&&(this.data.incompleteFallbackMessage=cv(this.data.incompleteFallbackMessage,e.incompleteFallbackMessage)),e.lang&&(this.lang=e.lang)}},{key:"setAllowedOrigins",value:function(e){var t,r=ov(),n=(this.allowedOrigins=[],K(e));try{for(n.s();!(t=n.n()).done;){var a=t.value;if(a===la.allOrigins)return void(this.allowedOrigins=["*"]);a!==la.sameOrigin?this.allowedOrigins.push(a):r&&this.allowedOrigins.push(r)}}catch(e){n.e(e)}finally{n.f()}}},{key:"_ini\
t",value:function(){var e=(e=>{var t;return e?(t=zl(e)).commons=e.commons:t={},t.reporter=t.reporter||null,t.noHtml=t.noHtml||!1,t.allowedOrigins||(e=ov(),t.allowedOrigins=e?[e]:[]),t.rules=t.rules||[],t.checks=t.checks||[],t.data=_({checks:{},rules:{}},t.data),t})(this.defaultConfig);this.lang=e.lang||"en",this.reporter=e.reporter,this.commands={},this.rules=[],this.checks={},this.brand="axe",this.application="axeAPI",this.tagExclude=["experimental","deprecated"],this.noHtml=e.noHtml,this.allowedOrigins=e.allowedOrigins,iv(e.rules,this,"addRule"),iv(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()}},{key:"registerCommand",value:function(e){this.commands[e.id]=e.callback}},{key:"addRule",value:function(e){e.metadata&&(this.data.rules[e.id]=e.meta\
data);var t=this.getRule(e.id);t?t.configure(e):this.rules.push(new tv(e,this))}},{key:"addCheck",value:function(e){var t=e.metadata;"object"===a(t)&&(this.data.checks[e.id]=t,"object"===a(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 Qg(e)}},{key:"run",value:function(e,t,r,n){this.normalizeOptions(t),Ll.setRunOptions(t),o._selectCache=[],l=this.rules,a=e,i=t;var a,i,l=l.reduce((function(e,t){return Dm(t,a,i)&&(t.preload?e.later:e.now).push(t),e}),{now:[],later:[]}),u=l.now,s=l.later,c=nu();u.forEach((function(r){c.defer(dv(r,e,t))})),l=nu();(u=(s.length&&l.defer((function(e){mm(t).then((function(t){return e(t)})).catch((function(t){console.warn("Couldn't load preload assets: ",t),e(void 0)}))})),nu())).defer(c),u\
.defer(l),u.then((function(a){var i,l=a.pop(),u=(l&&l.length&&(l=l[0])&&(e=_({},e,l)),a[0]);s.length?(i=nu(),s.forEach((function(r){r=dv(r,e,t),i.defer(r)})),i.then((function(e){o._selectCache=void 0,r(u.concat(e).filter((function(e){return!!e})))})).catch(n)):(o._selectCache=void 0,r(u.filter((function(e){return!!e}))))})).catch(n)}},{key:"after",value:function(e,t){var r=this.rules;return e.map((function(e){if(e.error)return e;var n=Vu(r,"id",e.id);if(!n)throw new Error("Result for unknown rule. You may be running mismatch axe-core versions");try{return n.after(e,t)}catch(e){if(t.debug)throw e;return pv(n,e)}}))}},{key:"getRule",value:function(e){return this.rules.find((function(t){return t.id===e}))}},{key:"normalizeOptions",value:function(e){var t=[],r=[];if(this.rules.forEach((function(e){r.push(e.id),e.tags.forEach((function(e){t.includes(e)||t.push(e)}))})),["object","string"].includes(a(e.runOnly))){if("string"==typeof e.runOnly&&(e.runOnly=[e.runOnly]),Array.isArray(e.runOnly)\
){var n=e.runOnly.find((function(e){return t.includes(e)})),i=e.runOnly.find((function(e){return r.includes(e)}));if(n&&i)throw new Error("runOnly cannot be both rules and tags");e.runOnly=i?{type:"rule",values:e.runOnly}:{type:"tag",values:e.runOnly}}if((n=e.runOnly).value&&!n.values&&(n.values=n.value,delete n.value),!Array.isArray(n.values)||0===n.values.length)throw new Error("runOnly.values must be a non-empty array");if(["rule","rules"].includes(n.type))n.type="rule",n.values.forEach((function(e){if(!r.includes(e))throw new Error("unknown rule \`"+e+"\` in options.runOnly")}));else{if(!["tag","tags",void 0].includes(n.type))throw new Error("Unknown runOnly type '".concat(n.type,"'"));n.type="tag",i=n.values.filter((function(e){return!t.includes(e)&&!/wcag2[1-3]a{1,3}/.test(e)})),0!==i.length&&o.log("Could not find tags \`"+i.join("\`, \`")+"\`")}}return"object"===a(e.rules)&&Object.keys(e.rules).forEach((function(e){if(!r.includes(e))throw new Error("unknown rule \`"+e+"\` in options.rul\
es")})),e}},{key:"setBranding",value:function(e){var t={brand:this.brand,application:this.application};"string"==typeof e&&(this.application=e),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)}},{key:"_constructHelpUrls",value:function(){var e=this,t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,r=(o.version.match(/^[1-9][0-9]*\\.[0-9]+/)||["x.y"])[0];this.rules.forEach((function(n){e.data.rules[n.id]||(e.data.rules[n.id]={});var a=e.data.rules[n.id];("string"!=typeof a.helpUrl||t&&a.helpUrl===fv(t,n.id,r))&&(a.helpUrl=fv(e,n.id,r))}))}},{key:"resetRulesAndChecks",value:function(){this._init(),this._resetLocale()}}]);function ov(){return t.origin&&"null"!==t.origin?t.origin:t.location&&t.location.origin&&"null"!==t.location.origin?t.location.origin:void 0}function iv(e,t,r){for(var n=0,a=e.length\
;n<a;n++)t[r](e[n])}var lv=function(e,t){var r=t.pass,n=t.fail;return"string"==typeof r&&nv.test(r)&&(r=Pa.default.compile(r)),"string"==typeof n&&nv.test(n)&&(n=Pa.default.compile(n)),_({},e,{messages:{pass:r||e.messages.pass,fail:n||e.messages.fail,incomplete:"object"===a(e.messages.incomplete)?_({},e.messages.incomplete,t.incomplete):t.incomplete}})},uv=function(e,t){var r=t.help;t=t.description;return"string"==typeof r&&nv.test(r)&&(r=Pa.default.compile(r)),"string"==typeof t&&nv.test(t)&&(t=Pa.default.compile(t)),_({},e,{help:r||e.help,description:t||e.description})},sv=function(e,t){return _({},e,{failureMessage:(t="string"==typeof(t=t.failureMessage)&&nv.test(t)?Pa.default.compile(t):t)||e.failureMessage})},cv=function(e,t){return(t="string"==typeof t&&nv.test(t)?Pa.default.compile(t):t)||e};function dv(e,t,r){return r.performanceTimer&&om.mark("mark_rule_start_"+e.id),function(n,a){e.run(t,r,(function(e){return n(e)}),(function(t){r.debug?a(t):n(pv(e,t))}))}}function pv(e,t){va\
r r=t.errorNode,a=[{id:"error-occurred",result:void 0,data:t=Fm(t),relatedNodes:[]}];r=r||new Ll(n.documentElement);return Object.assign(new ev(e),{error:t,result:la.CANTTELL,nodes:[{any:[],all:[],none:a,node:r}]})}function fv(e,t,r){var n=e.brand,a=e.application;e=e.lang;return la.helpUrlBase+n+"/"+(r||o.version.substring(0,o.version.lastIndexOf(".")))+"/"+t+"?application="+encodeURIComponent(a)+(e&&"en"!==e?"&lang="+encodeURIComponent(e):"")}function mv(e){var r=t&&"Node"in t&&"NodeList"in t,a=!!n;if(!r||!a){if(!e||!e.ownerDocument)throw new Error('Required "window" or "document" globals not defined and cannot be deduced from the context. Either set the globals before running or pass in a valid Element.');a||(_l.set("globalDocumentSet",!0),n=e.ownerDocument),r||(_l.set("globalWindowSet",!0),t=n.defaultView)}}var hv=function(){_l.get("globalDocumentSet")&&(_l.set("globalDocumentSet",!1),n=null),_l.get("globalWindowSet")&&(_l.set("globalWindowSet",!1),t=null),o._memoizedFns.forEach((fu\
nction(e){return e.clear()})),_l.clear(),o._tree=void 0,o._selectorData=void 0,o._selectCache=void 0};function gv(e,t,r,n){try{e=new Rf(e),o._tree=e.flatTree,o._selectorData=El(e.flatTree)}catch(a){return hv(),n(a)}var a=nu(),i=o._audit;t.performanceTimer&&om.auditStart(),e.frames.length&&!1!==t.iframes&&a.defer((function(r,n){Hu(e,t,"rules",null,r,n)})),a.defer((function(r,n){i.run(e,t,r,n)})),a.then((function(a){try{t.performanceTimer&&om.auditEnd();var o=$u(a.map((function(e){return{results:e}})));e.initiator&&(t.performanceTimer&&om.mark("auditAfterStart"),o=i.after(o,t),t.performanceTimer&&(om.mark("auditAfterEnd"),om.measure("audit.after","auditAfterStart","auditAfterEnd"),om.logMeasures("audit.after")),o.forEach(vm),o=o.map(ya));try{r(o,hv)}catch(a){hv(),ua(a)}}catch(a){hv(),n(a)}})).catch((function(e){hv(),n(e)}))}function vv(e){this._run=e.run,this._collect=e.collect,this._registry={},e.commands.forEach((function(e){o._audit.registerCommand(e)}))}function bv(e){var t=(e=V(e,3)\
)[0],r=e[1],i=(e=e[2],new TypeError("axe.run arguments are invalid"));if(!qf(t)){if(void 0!==e)throw i;e=r,r=t,t=n}if("object"!==a(r)){if(void 0!==e)throw i;e=r,r={}}if("function"!=typeof e&&void 0!==e)throw i;return(r=zl(r)).reporter=null!=(i=null!=(i=r.reporter)?i:null==(i=o._audit)?void 0:i.reporter)?i:"v1",{context:t,options:r,callback:e}}t.top!==t&&(_u.subscribe("axe.start",(function(e,t,r){function a(e){e instanceof Error==0&&(e=new Error(e)),r(e)}var i=r,l=e&&e.context||{},u=(l.hasOwnProperty("include")&&!l.include.length&&(l.include=[n]),e&&e.options||{});switch(e.command){case"rules":return gv(l,u,(function(e,t){e=qu.mapRawResults(e),i(e),t()}),a);case"cleanup-plugin":return qm(i,a);default:if(o._audit&&o._audit.commands&&o._audit.commands[e.command])return o._audit.commands[e.command](e,r)}})),_u.subscribe("axe.ping",(function(e,t,r){r({axe:!0})}))),vv.prototype.run=function(){return this._run.apply(this,arguments)},vv.prototype.collect=function(){return this._collect.apply(t\
his,arguments)},vv.prototype.cleanup=function(e){var t=o.utils.queue(),r=this;Object.keys(this._registry).forEach((function(e){t.defer((function(t){r._registry[e].cleanup(t)}))})),t.then(e)},vv.prototype.add=function(e){this._registry[e.id]=e};var yv=function(){};var wv=function(e,t,r){if("function"==typeof t&&(r=t,t={}),!e||!Array.isArray(e))return r(e);r(e.map((function(e){for(var t=_({},e),r=0,n=["passes","violations","incomplete","inapplicable"];r<n.length;r++){var a=n[r];t[a]=qu.mapRawNodeResults(t[a])}return t})))};Oo={base:{Audit:av,CheckResult:Kg,Check:Qg,Context:Rf,RuleResult:ev,Rule:tv,metadataFunctionMap:Yg},public:{reporters:zm},helpers:{failureSummary:ff,incompleteFallbackMessage:mf,processAggregate:gf},utils:{setDefaultFrameMessenger:Ou,cacheNodeSelectors:lf,getNodesMatchingExpression:rf,convertSelector:Kl},commons:{dom:{nativelyHidden:us,displayHidden:ss,visibilityHidden:cs,contentVisibiltyHidden:ds,ariaHidden:ps,opacityHidden:fs,scrollHidden:ms,overflowHidden:hs,clipHid\
den:gs,areaHidden:vs,detailsHidden:bs}}};o._thisWillBeDeletedDoNotUse=Oo,o.constants=la,o.log=ua,o.AbstractVirtualNode=ca,o.SerialVirtualNode=Lm,o.VirtualNode=Qp,o._cache=_l,o.imports=_a,o.cleanup=qm,o.configure=function(e){var t=o._audit;if(!t)throw new Error("No audit configured");if(e.axeVersion||e.ver){var r=e.axeVersion||e.ver;if(!/^\\d+\\.\\d+\\.\\d+(-canary)?/.test(r))throw new Error("Invalid configured version ".concat(r));var n=(a=V(r.split("-"),2))[0],a=a[1],i=(n=V(n.split(".").map(Number),3))[0],l=n[1],u=(n=n[2],(s=V(o.version.split("-"),2))[0]),s=s[1],c=(u=V(u.split(".").map(Number),3))[0],d=u[1];u=u[2];if(i!==c||d<l||d===l&&u<n||i===c&&l===d&&n===u&&a&&a!==s)throw new Error("Configured version ".concat(r," is not compatible with current axe version ").concat(o.version))}if(e.reporter&&("function"==typeof e.reporter||Vm(e.reporter))&&(t.reporter=e.reporter),e.checks){if(!Array.isArray(e.checks))throw new TypeError("Checks property must be an array");e.checks.forEach((function(e)\
{if(!e.id)throw new TypeError("Configured check ".concat(JSON.stringify(e)," is invalid. Checks must be an object with at least an id property"));t.addCheck(e)}))}var p,f=[];if(e.rules){if(!Array.isArray(e.rules))throw new TypeError("Rules property must be an array");e.rules.forEach((function(e){if(!e.id)throw new TypeError("Configured rule ".concat(JSON.stringify(e)," is invalid. Rules must be an object with at least an id property"));f.push(e.id),t.addRule(e)}))}if(e.disableOtherRules&&t.rules.forEach((function(e){!1===f.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),e.standards&&(p=e.standards,Object.keys(Pc).forEach((function(e){p[e]&&(Pc[e]=Wu(Pc[e],p[e]))}))),e.noHtml&&(t.noHtml=!0),e.allowedOrigins){if(!Array.isArray(e.allowedOrigins))throw new TypeError("Allowed origins property must be an array");if(e.allowedOrigins.includes("*"))throw new Error('\
"*" is not allowed. Use "'.concat(la.allOrigins,'" instead'));t.setAllowedOrigins(e.allowedOrigins)}},o.frameMessenger=function(e){_u.updateMessenger(e)},o.getRules=function(e){var t=(e=e||[]).length?o._audit.rules.filter((function(t){return!!e.filter((function(e){return-1!==t.tags.indexOf(e)})).length})):o._audit.rules,r=o._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,actIds:e.actIds}}))},o._load=function(e){o._audit=new av(e)},o.plugins={},o.registerPlugin=function(e){o.plugins[e.id]=new vv(e)},o.hasReporter=Vm,o.getReporter=Gm,o.addReporter=function(e,t,r){zm[e]=t,r&&(Im=t)},o.reset=function(){var e=o._audit;if(!e)throw new Error("No audit configured");e.resetRulesAndChecks(),Object.keys(Pc).forEach((function(e){Pc[e]=Mc[e]}))},o._runRules=gv,o.runVirtualRule=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},n=(r.reporter=r.reporter||o._audit.reporte\
r||"v1",o._selectorData={},t instanceof ca||(t=new Lm(t)),Tf(e));if(n)return vm(n=(n=Object.create(n,{excludeHidden:{value:!1}})).runSync({initiator:!0,include:[t],exclude:[],frames:[],page:!1,focusable:!0,size:{},flatTree:[]},r)),ya(n),(t=xa([n])).violations.forEach((function(e){return e.nodes.forEach((function(e){e.failureSummary=ff(e)}))})),_({},Ef(),t,{toolOptions:r});throw new Error("unknown rule \`"+e+"\`")},o.run=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];mv(t[0]);var n=(c=bv(t)).context,a=c.options,i=void 0===(c=c.callback)?yv:c,l=(c=(e=>{var t,r,n;return"function"==typeof Promise&&e===yv?t=new Promise((function(e,t){r=t,n=e})):(n=function(t){return e(null,t)},r=function(t){return e(t)}),{thenable:t,reject:r,resolve:n}})(i)).thenable,u=c.resolve,s=c.reject;try{Aa(o._audit,"No audit configured"),Aa(!o._running,"Axe is already running. Use \`await axe.run()\` to wait for the previous run to finish before starting a new run.")}catch(e){var c=e;i\
f("function"!=typeof i||i===yv)throw c;return void i(c.message)}return o._running=!0,a.performanceTimer&&om.start(),o._runRules(n,a,(function(e,t){function r(e){o._running=!1,t();try{s(e)}catch(e){o.log(e)}}try{a.performanceTimer&&om.mark("reporterStart");var n=e,i=a,l=function(e){a.performanceTimer&&(om.mark("reporterEnd"),om.measure("reporter","reporterStart","reporterEnd"),om.logMeasures("reporter"),om.end()),o._running=!1,t();try{u(e)}catch(e){o.log(e)}},c=r;void 0!==(n=Gm(i.reporter)(n,i,l,c))&&l(n)}catch(e){r(e)}}),(function(e){a.performanceTimer&&om.end(),o._running=!1,i(e),s(e)})),l},o.setup=function(e){if(o._tree)throw new Error("Axe is already setup. Call \`axe.teardown()\` before calling \`axe.setup\` again.");return mv(e=e&&"object"===a(e.documentElement)&&"object"===a(e.defaultView)?e.documentElement:e),o._tree=uf(e),o._selectorData=El(o._tree),o._tree[0]},o.teardown=hv,o.runPartial=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];var n=(a=bv(\
t)).options,a=a.context,i=(Aa(o._audit,"Axe is not configured. Audit is missing."),Aa(!o._running,"Axe is already running. Use \`await axe.run()\` to wait for the previous run to finish before starting a new run."),new Rf(a,o._tree));return o._tree=i.flatTree,o._selectorData=El(i.flatTree),o._running=!0,n.elementRef=!1,new Promise((function(e,t){o._audit.run(i,n,e,t)})).then((function(e){e=qu.mapRawResults(e);var t,r=i.frames.map((function(e){return e=e.node,qu.toSpec(e)}));return i.initiator&&(t=Ef()),o._running=!1,hv(),{results:e,frames:r,environmentData:t}})).catch((function(e){return o._running=!1,hv(),Promise.reject(e)}))},o.finishRun=function(e){var t,r=zl(r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}),n=(e.find((function(e){return e.environmentData}))||{}).environmentData;o._audit.normalizeOptions(r),r.reporter=null!=(p=null!=(p=r.reporter)?p:null==(p=o._audit)?void 0:p.reporter)?p:"v1";var a=[],i=K(p=e);try{for(i.s();!(t=i.n()).done;){var l,u=t.value,s=a.shift();u&&\
(u.frameSpec=null!=s?s:null,l=(e=>{var t=e.frames,r=e.frameSpec;return r?t.map((function(e){return qu.mergeSpecs(e,r)})):t})(u),a.unshift.apply(a,M(l)))}}catch(e){i.e(e)}finally{i.f()}var c,d,p=$u(e);return(p=o._audit.after(p,r)).forEach(vm),p=p.map(ya),c=p,d=_({environmentData:n},r),new Promise((function(e,t){Gm(d.reporter)(c,d,e,t)}))},o.commons=kr,o.utils=da,o.addReporter("na",(function(e,t,r){console.warn('"na" reporter will be deprecated in axe v4.0. Use the "v2" reporter instead.'),"function"==typeof t&&(r=t,t={});var n=t.environmentData,a=k(a=t,w);r(_({},Ef(n),{toolOptions:a},gf(e,t)))})),o.addReporter("no-passes",(function(e,t,r){"function"==typeof t&&(r=t,t={});var n=t.environmentData,a=k(a=t,D);t.resultTypes=["violations"],e=gf(e,t).violations,r(_({},Ef(n),{toolOptions:a,violations:e}))})),o.addReporter("rawEnv",(function(e,t,r){"function"==typeof t&&(r=t,t={});var n=t.environmentData;t=k(t,x),wv(e,t,(function(e){var t=Ef(n);r({raw:e,env:t})}))})),o.addReporter("raw",wv),o.ad\
dReporter("v1",(function(e,t,r){function n(e){e.nodes.forEach((function(e){e.failureSummary=ff(e)}))}"function"==typeof t&&(r=t,t={});var a=t.environmentData,o=k(o=t,E);(e=gf(e,t)).incomplete.forEach(n),e.violations.forEach(n),r(_({},Ef(a),{toolOptions:o},e))})),o.addReporter("v2",(function(e,t,r){"function"==typeof t&&(r=t,t={});var n=t.environmentData,a=k(a=t,A);e=gf(e,t),r(_({},Ef(n),{toolOptions:a},e))}),!0),o._load({lang:"en",data:{rules:{accesskeys:{description:"Ensure every accesskey attribute value is unique",help:"accesskey attribute value should be unique"},"area-alt":{description:"Ensure <area> elements of image maps have alternative text",help:"Active <area> elements must have alternative text"},"aria-allowed-attr":{description:"Ensure an element's role supports its ARIA attributes",help:"Elements must only use supported ARIA attributes"},"aria-allowed-role":{description:"Ensure role attribute has an appropriate value for the element",help:"ARIA role should be appropriate f\
or the element"},"aria-braille-equivalent":{description:"Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",help:"aria-braille attributes must have a non-braille equivalent"},"aria-command-name":{description:"Ensure every ARIA button, link and menuitem has an accessible name",help:"ARIA commands must have an accessible name"},"aria-conditional-attr":{description:"Ensure ARIA attributes are used as described in the specification of the element's role",help:"ARIA attributes must be used as specified for the element's role"},"aria-deprecated-role":{description:"Ensure elements do not use deprecated roles",help:"Deprecated ARIA roles must not be used"},"aria-dialog-name":{description:"Ensure every ARIA dialog and alertdialog node has an accessible name",help:"ARIA dialog and alertdialog nodes should have an accessible name"},"aria-hidden-body":{description:'Ensure 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:"Ensure aria-hidden elements are not focusable nor contain focusable elements",help:"ARIA hidden element must not be focusable or contain focusable elements"},"aria-input-field-name":{description:"Ensure every ARIA input field has an accessible name",help:"ARIA input fields must have an accessible name"},"aria-meter-name":{description:"Ensure every ARIA meter node has an accessible name",help:"ARIA meter nodes must have an accessible name"},"aria-progressbar-name":{description:"Ensure every ARIA progressbar node has an accessible name",help:"ARIA progressbar nodes must have an accessible name"},"aria-prohibited-attr":{description:"Ensure ARIA attributes are not prohibited for an element's role",help:"Elements must only use permitted ARIA attributes"},"aria-required-attr":{description:"Ensure elements with ARIA roles have all required ARIA attributes",help:"Required ARIA attributes must be provided"},"aria-required-chil\
dren":{description:"Ensure elements with an ARIA role that require child roles contain them",help:"Certain ARIA roles must contain particular children"},"aria-required-parent":{description:"Ensure elements with an ARIA role that require parent roles are contained by them",help:"Certain ARIA roles must be contained by particular parents"},"aria-roledescription":{description:"Ensure aria-roledescription is only used on elements with an implicit or explicit role",help:"aria-roledescription must be on elements with a semantic role"},"aria-roles":{description:"Ensure all elements with a role attribute use a valid value",help:"ARIA roles used must conform to valid values"},"aria-text":{description:'Ensure role="text" is used on elements with no focusable descendants',help:'"role=text" should have no focusable descendants'},"aria-toggle-field-name":{description:"Ensure every ARIA toggle field has an accessible name",help:"ARIA toggle fields must have an accessible name"},"aria-tooltip-name":{\
description:"Ensure every ARIA tooltip node has an accessible name",help:"ARIA tooltip nodes must have an accessible name"},"aria-treeitem-name":{description:"Ensure every ARIA treeitem node has an accessible name",help:"ARIA treeitem nodes should have an accessible name"},"aria-valid-attr-value":{description:"Ensure all ARIA attributes have valid values",help:"ARIA attributes must conform to valid values"},"aria-valid-attr":{description:"Ensure attributes that begin with aria- are valid ARIA attributes",help:"ARIA attributes must conform to valid names"},"audio-caption":{description:"Ensure <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"},"avoid-inline-spacing":{description:"Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",help:"Inline text \
spacing must be adjustable with custom stylesheets"},blink:{description:"Ensure <blink> elements are not used",help:"<blink> elements are deprecated and must not be used"},"button-name":{description:"Ensure buttons have discernible text",help:"Buttons must have discernible text"},bypass:{description:"Ensure 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"},"color-contrast-enhanced":{description:"Ensure the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds",help:"Elements must meet enhanced color contrast ratio thresholds"},"color-contrast":{description:"Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",help:"Elements must meet minimum color contrast ratio thresholds"},"css-orientation-lock":{description:"Ensure content is not locked to any specific display orientation\
, and the content is operable in all display orientations",help:"CSS Media queries must not lock display orientation"},"definition-list":{description:"Ensure <dl> elements are structured correctly",help:"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements"},dlitem:{description:"Ensure <dt> and <dd> elements are contained by a <dl>",help:"<dt> and <dd> elements must be contained by a <dl>"},"document-title":{description:"Ensure each HTML document contains a non-empty <title> element",help:"Documents must have <title> element to aid in navigation"},"duplicate-id-active":{description:"Ensure every id attribute value of active elements is unique",help:"IDs of active elements must be unique"},"duplicate-id-aria":{description:"Ensure 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:"Ensure every id attribute value is unique",help:"id \
attribute value must be unique"},"empty-heading":{description:"Ensure headings have discernible text",help:"Headings should not be empty"},"empty-table-header":{description:"Ensure table headers have discernible text",help:"Table header text should not be empty"},"focus-order-semantics":{description:"Ensure elements in the focus order have a role appropriate for interactive content",help:"Elements in the focus order should have an appropriate role"},"form-field-multiple-labels":{description:"Ensure form field does not have multiple label elements",help:"Form field must not have multiple label elements"},"frame-focusable-content":{description:"Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",help:"Frames with focusable content must not have tabindex=-1"},"frame-tested":{description:"Ensure <iframe> and <frame> elements contain the axe-core script",help:"Frames should be tested with axe-core"},"frame-title-unique":{description:"Ensure <iframe> and <fra\
me> elements contain a unique title attribute",help:"Frames must have a unique title attribute"},"frame-title":{description:"Ensure <iframe> and <frame> elements have an accessible name",help:"Frames must have an accessible name"},"heading-order":{description:"Ensure the order of headings is semantically correct",help:"Heading levels should only increase by one"},"hidden-content":{description:"Inform users about hidden content.",help:"Hidden content on the page should be analyzed"},"html-has-lang":{description:"Ensure every HTML document has a lang attribute",help:"<html> element must have a lang attribute"},"html-lang-valid":{description:"Ensure 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 bas\
e language"},"identical-links-same-purpose":{description:"Ensure that links with the same accessible name serve a similar purpose",help:"Links with the same name must have a similar purpose"},"image-alt":{description:"Ensure <img> elements have alternative text or a role of none or presentation",help:"Images must have alternative text"},"image-redundant-alt":{description:"Ensure image alternative is not repeated as text",help:"Alternative text of images should not be repeated as text"},"input-button-name":{description:"Ensure input buttons have discernible text",help:"Input buttons must have discernible text"},"input-image-alt":{description:'Ensure <input type="image"> elements have alternative text',help:"Image buttons must have alternative text"},"label-content-name-mismatch":{description:"Ensure 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"},"la\
bel-title-only":{description:"Ensure that every form element has a visible label and is not solely labeled using hidden labels, or the title or aria-describedby attributes",help:"Form elements should have a visible label"},label:{description:"Ensure every form element has a label",help:"Form elements must have labels"},"landmark-banner-is-top-level":{description:"Ensure the banner landmark is at top level",help:"Banner landmark should not be contained in another landmark"},"landmark-complementary-is-top-level":{description:"Ensure the complementary landmark or aside is at top level",help:"Aside should not be contained in another landmark"},"landmark-contentinfo-is-top-level":{description:"Ensure the contentinfo landmark is at top level",help:"Contentinfo landmark should not be contained in another landmark"},"landmark-main-is-top-level":{description:"Ensure the main landmark is at top level",help:"Main landmark should not be contained in another landmark"},"landmark-no-duplicate-banner\
":{description:"Ensure the document has at most one banner landmark",help:"Document should not have more than one banner landmark"},"landmark-no-duplicate-contentinfo":{description:"Ensure the document has at most one contentinfo landmark",help:"Document should not have more than one contentinfo landmark"},"landmark-no-duplicate-main":{description:"Ensure the document has at most one main landmark",help:"Document should not have more than one main landmark"},"landmark-one-main":{description:"Ensure the document has a main landmark",help:"Document should have one main landmark"},"landmark-unique":{description:"Ensure landmarks are unique",help:"Landmarks should have a unique role or role/label/title (i.e. accessible name) combination"},"link-in-text-block":{description:"Ensure links are distinguished from surrounding text in a way that does not rely on color",help:"Links must be distinguishable without relying on color"},"link-name":{description:"Ensure links have discernible text",help\
:"Links must have discernible text"},list:{description:"Ensure that lists are structured correctly",help:"<ul> and <ol> must only directly contain <li>, <script> or <template> elements"},listitem:{description:"Ensure <li> elements are used semantically",help:"<li> elements must be contained in a <ul> or <ol>"},marquee:{description:"Ensure <marquee> elements are not used",help:"<marquee> elements are deprecated and must not be used"},"meta-refresh-no-exceptions":{description:'Ensure <meta http-equiv="refresh"> is not used for delayed refresh',help:"Delayed refresh must not be used"},"meta-refresh":{description:'Ensure <meta http-equiv="refresh"> is not used for delayed refresh',help:"Delayed refresh under 20 hours must not be used"},"meta-viewport-large":{description:'Ensure <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:'Ensure <meta name="viewport"> does not disable text scaling and\
 zooming',help:"Zooming and scaling must not be disabled"},"nested-interactive":{description:"Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",help:"Interactive controls must not be nested"},"no-autoplay-audio":{description:"Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",help:"<video> or <audio> elements must not play automatically"},"object-alt":{description:"Ensure <object> elements have alternative text",help:"<object> elements must have alternative text"},"p-as-heading":{description:"Ensure bold, italic text and font-size is not used to style <p> elements as a heading",help:"Styled <p> elements must not be used as headings"},"page-has-heading-one":{description:"Ensure that the page, or at least one of its frames contains a level-one heading",help:"Page should contain a level-one heading"},"prese\
ntation-role-conflict":{description:"Ensure elements marked as presentational do not have global ARIA or tabindex so that all screen readers ignore them",help:"Elements marked as presentational should be consistently ignored"},region:{description:"Ensure all page content is contained by landmarks",help:"All page content should be contained by landmarks"},"role-img-alt":{description:'Ensure [role="img"] elements have alternative text',help:'[role="img"] elements must have alternative text'},"scope-attr-valid":{description:"Ensure the scope attribute is used correctly on tables",help:"scope attribute should be used correctly"},"scrollable-region-focusable":{description:"Ensure elements that have scrollable content are accessible by keyboard in Safari",help:"Scrollable region must have keyboard access"},"select-name":{description:"Ensure select element has an accessible name",help:"Select element must have an accessible name"},"server-side-image-map":{description:"Ensure 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"},"summary-name":{description:"Ensure summary elements have discernible text",help:"Summary elements must have discernible text"},"svg-img-alt":{description:"Ensure <svg> elements with an img, graphics-document or graphics-symbol role have accessible text",help:"<svg> elements with an img role must have alternative text"},tabindex:{description:"Ensure tabindex attribute values are not greater than 0",help:"Elements should not have tabindex greater than zero"},"table-duplicate-name":{description:"Ensure the <caption> element does not contain the same text as the summary attribute",help:"Tables should not have the same summary and caption"},"table-fake-caption":{description:"Ensure that tables with a caption use the <caption> element.",help:"Data or header cells must not be used to give c\
aption to a data table."},"target-size":{description:"Ensure touch targets have sufficient size and space",help:"All touch targets must be 24px large, or leave sufficient space"},"td-has-header":{description:"Ensure that each non-empty data cell in a <table> larger than 3 by 3  has one or more table headers",help:"Non-empty <td> elements in larger <table> must have an associated table header"},"td-headers-attr":{description:"Ensure that each cell in a table that uses the headers attribute refers only to other <th> elements in that table",help:"Table cell headers attributes must refer to other <th> elements in the same table"},"th-has-data-cells":{description:"Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",help:"Table headers in a data table must refer to data cells"},"valid-lang":{description:"Ensure lang attributes have valid values",help:"lang attribute must have a valid value"},"video-caption":{description:"Ensure <video> eleme\
nts have captions",help:"<video> elements must have captions"}},checks:{abstractrole:{impact:"serious",messages:{pass:"Abstract roles are not used",fail:{singular:"Abstract role cannot be directly used: \${data.values}",plural:"Abstract roles cannot be directly used: \${data.values}"}}},"aria-allowed-attr-elm":{messages:{pass:"ARIA attributes are allowed for this element",fail:{singular:"ARIA attribute is not allowed on \${data.nodeName} elements: \${data.values}",plural:"ARIA attributes are not allowed on \${data.nodeName} elements: \${data.values}"}}},"aria-allowed-attr":{impact:"critical",messages:{pass:"ARIA attributes are used correctly for the defined role",fail:{singular:"ARIA attribute is not allowed: \${data.values}",plural:"ARIA attributes are not allowed: \${data.values}"},incomplete:"Check that there is no problem if the ARIA attribute is ignored on this element: \${data.values}"}},"aria-allowed-role":{impact:"minor",messages:{pass:"ARIA role is allowed for given element",fail:{sing\
ular:"ARIA role \${data.values} is not allowed for given element",plural:"ARIA roles \${data.values} are not allowed for given element"},incomplete:{singular:"ARIA role \${data.values} must be removed when the element is made visible, as it is not allowed for the element",plural:"ARIA roles \${data.values} must be removed when the element is made visible, as they are not allowed for the element"}}},"aria-busy":{impact:"serious",messages:{pass:"Element has an aria-busy attribute",fail:'Element uses aria-busy="true" while showing a loader'}},"aria-conditional-attr":{impact:"serious",messages:{pass:"ARIA attribute is allowed",fail:{checkbox:'Remove aria-checked, or set it to "\${data.checkState}" to match the real checkbox state',rowSingular:"This attribute is supported with treegrid rows, but not \${data.ownerRole}: \${data.invalidAttrs}",rowPlural:"These attributes are supported with treegrid rows, but not \${data.ownerRole}: \${data.invalidAttrs}"}}},"aria-errormessage":{impact:"critical",messa\
ges:{pass:"aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique",fail:{singular:"aria-errormessage value \`\${data.values}\` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",plural:"aria-errormessage values \`\${data.values}\` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",unsupported:"Multiple IDs in aria-errormessage is not widely supported in assistive technologies",hidden:"aria-errormessage value \`\${data.values}\` cannot reference a hidden element"},incomplete:{singular:"Ensure aria-errormessage value \`\${data.values}\` references an existing element",plural:"Ensure aria-errormessage values \`\${data.values}\` reference existing elements",idrefs:"Unable to determine if aria-errormessage element exists on the page: \${data.values}"}}},"aria-hidden-body":{impact:"critical",messages:{pass:"No aria-hidden attribute is present \
on document body",fail:"aria-hidden=true should not be present on the document body"}},"aria-level":{impact:"serious",messages:{pass:"aria-level values are valid",incomplete:"aria-level values greater than 6 are not supported in all screenreader and browser combinations"}},"aria-prohibited-attr":{impact:"serious",messages:{pass:"ARIA attribute is allowed",fail:{hasRolePlural:'\${data.prohibited} attributes cannot be used with role "\${data.role}".',hasRoleSingular:'\${data.prohibited} attribute cannot be used with role "\${data.role}".',noRolePlural:"\${data.prohibited} attributes cannot be used on a \${data.nodeName} with no valid role attribute.",noRoleSingular:"\${data.prohibited} attribute cannot be used on a \${data.nodeName} with no valid role attribute."},incomplete:{hasRoleSingular:'\${data.prohibited} attribute is not well supported with role "\${data.role}".',hasRolePlural:'\${data.prohibited} attributes are not well supported with role "\${data.role}".',noRoleSingular:"\${data.prohibited\
} attribute is not well supported on a \${data.nodeName} with no valid role attribute.",noRolePlural:"\${data.prohibited} attributes are not well supported on a \${data.nodeName} with no valid role attribute."}}},"aria-required-attr":{impact:"critical",messages:{pass:"All required ARIA attributes are present",fail:{singular:"Required ARIA attribute not present: \${data.values}",plural:"Required ARIA attributes not present: \${data.values}"}}},"aria-required-children":{impact:"critical",messages:{pass:{default:"Required ARIA children are present","aria-busy":"Element has an aria-busy attribute, so it is allowed to omit required children"},fail:{singular:"Required ARIA child role not present: \${data.values}",plural:"Required ARIA children role not present: \${data.values}",unallowed:"Element has children which are not allowed: \${data.values}","aria-busy-fail":'Element has children which are not allowed: \${data.values}; Having aria-busy="true" does not allow children with roles that are not all\
owed'},incomplete:{singular:"Expecting ARIA child role to be added: \${data.values}",plural:"Expecting ARIA children role to be added: \${data.values}"}}},"aria-required-parent":{impact:"critical",messages:{pass:"Required ARIA parent role present",fail:{singular:"Required ARIA parent role not present: \${data.values}",plural:"Required ARIA parents role not present: \${data.values}"}}},"aria-roledescription":{impact:"serious",messages:{pass:"aria-roledescription used on a supported semantic role",incomplete:"Check that the aria-roledescription is announced by supported screen readers",fail:"Give the element a role that supports aria-roledescription"}},"aria-unsupported-attr":{impact:"critical",messages:{pass:"ARIA attribute is supported",fail:"ARIA attribute is not widely supported in screen readers and assistive technologies: \${data.values}"}},"aria-valid-attr-value":{impact:"critical",messages:{pass:"ARIA attribute values are valid",fail:{singular:"Invalid ARIA attribute value: \${data.val\
ues}",plural:"Invalid ARIA attribute values: \${data.values}"},incomplete:{noId:"ARIA attribute element ID does not exist on the page: \${data.needsReview}",noIdShadow:"ARIA attribute element ID does not exist on the page or is a descendant of a different shadow DOM tree: \${data.needsReview}",ariaCurrent:'ARIA attribute value is invalid and will be treated as "aria-current=true": \${data.needsReview}',idrefs:"Unable to determine if ARIA attribute element ID exists on the page: \${data.needsReview}",empty:"ARIA attribute value is ignored while empty: \${data.needsReview}",controlsWithinPopup:"Unable to determine if aria-controls referenced ID exists on the page while using aria-haspopup: \${data.needsReview}"}}},"aria-valid-attr":{impact:"critical",messages:{pass:"ARIA attribute name is valid",fail:{singular:"Invalid ARIA attribute name: \${data.values}",plural:"Invalid ARIA attribute names: \${data.values}"}}},"braille-label-equivalent":{impact:"serious",messages:{pass:"aria-braillelabel is us\
ed on an element with accessible text",fail:"aria-braillelabel is used on an element with no accessible text",incomplete:"Unable to compute accessible text"}},"braille-roledescription-equivalent":{impact:"serious",messages:{pass:"aria-brailleroledescription is used on an element with aria-roledescription",fail:{noRoleDescription:"aria-brailleroledescription is used on an element with no aria-roledescription",emptyRoleDescription:"aria-brailleroledescription is used on an element with an empty aria-roledescription"}}},deprecatedrole:{impact:"minor",messages:{pass:"ARIA role is not deprecated",fail:"The role used is deprecated: \${data}"}},fallbackrole:{impact:"serious",messages:{pass:"Only one role value used",fail:"Use only one role value, since fallback roles are not supported in older browsers",incomplete:"Use only role 'presentation' or 'none' since they are synonymous."}},"has-global-aria-attribute":{impact:"minor",messages:{pass:{singular:"Element has global ARIA attribute: \${data.\
values}",plural:"Element has global ARIA attributes: \${data.values}"},fail:"Element does not have global ARIA attribute"}},"has-widget-role":{impact:"minor",messages:{pass:"Element has a widget role.",fail:"Element does not have a widget role."}},invalidrole:{impact:"critical",messages:{pass:"ARIA role is valid",fail:{singular:"Role must be one of the valid ARIA roles: \${data.values}",plural:"Roles must be one of the valid ARIA roles: \${data.values}"}}},"is-element-focusable":{impact:"minor",messages:{pass:"Element is focusable.",fail:"Element is not focusable."}},"no-implicit-explicit-label":{impact:"serious",messages:{pass:"There is no mismatch between a <label> and accessible name",incomplete:"Check that the <label> does not need be part of the ARIA \${data} field's name"}},unsupportedrole:{impact:"critical",messages:{pass:"ARIA role is supported",fail:"The role used is not widely supported in screen readers and assistive technologies: \${data}"}},"valid-scrollable-semantics":{impact:\
"minor",messages:{pass:"Element has valid semantics for an element in the focus order.",fail:"Element has invalid semantics for an element in the focus order."}},"color-contrast-enhanced":{impact:"serious",messages:{pass:"Element has sufficient color contrast of \${data.contrastRatio}",fail:{default:"Element has insufficient color contrast of \${data.contrastRatio} (foreground color: \${data.fgColor}, background color: \${data.bgColor}, font size: \${data.fontSize}, font weight: \${data.fontWeight}). Expected contrast ratio of \${data.expectedContrastRatio}",fgOnShadowColor:"Element has insufficient color contrast of \${data.contrastRatio} between the foreground and shadow color (foreground color: \${data.fgColor}, text-shadow color: \${data.shadowColor}, font size: \${data.fontSize}, font weight: \${data.fontWeight}). Expected contrast ratio of \${data.expectedContrastRatio}",shadowOnBgColor:"Element has insufficient color contrast of \${data.contrastRatio} between the shadow color and background c\
olor (text-shadow color: \${data.shadowColor}, background color: \${data.bgColor}, font size: \${data.fontSize}, font weight: \${data.fontWeight}). Expected contrast ratio of \${data.expectedContrastRatio}"},incomplete:{default:"Unable to determine contrast ratio",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",nonBmp:"Element content contains only non-text characters",pseudoContent:"Element's background color could not be determined due to a pseudo element",colorParse:"Could not parse color string \${data.colorParse}"}}},"color-contrast":{impact:"serious",messages:{pass:{default:"Element has sufficient color contrast of \${data.contrastRatio}",hidden:"Element is hidden"},fail:{default:"Element has insufficient color contrast of \${data.contrastRatio} (foreground color: \${data.fgColor}, background color: \${data.bgColor}, font size: \${data.fontSize}, font weight: \${data.fontWeight}). Expected contrast ratio of \${data.expectedContrastRatio}",fgOnShadowColor:"Element has insufficient color contrast of \${data.contrastRatio} between the foreground and shadow colo\
r (foreground color: \${data.fgColor}, text-shadow color: \${data.shadowColor}, font size: \${data.fontSize}, font weight: \${data.fontWeight}). Expected contrast ratio of \${data.expectedContrastRatio}",shadowOnBgColor:"Element has insufficient color contrast of \${data.contrastRatio} between the shadow color and background color (text-shadow color: \${data.shadowColor}, background color: \${data.bgColor}, font size: \${data.fontSize}, font weight: \${data.fontWeight}). Expected contrast ratio of \${data.expectedContrastRatio}"},incomplete:{default:"Unable to determine contrast ratio",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",complexTextShadows:"Element's c\
ontrast could not be determined because it uses complex text shadows",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",nonBmp:"Element content contains only non-text characters",pseudoContent:"Element's background color could not be determined due to a pseudo element",colorParse:"Could not parse color string \${data.colorParse}"}}},"link-in-text-block-style":{impact:"serious",messages:{pass:"Links can be distinguished from surrounding text by visual s\
tyling",incomplete:{default:"Check if the link needs styling to distinguish it from nearby text",pseudoContent:"Check if the link's pseudo style is sufficient to distinguish it from the surrounding text"},fail:"The link has no styling (such as underline) to distinguish it from the surrounding text"}},"link-in-text-block":{impact:"serious",messages:{pass:"Links can be distinguished from surrounding text in some way other than by color",fail:{fgContrast:"The link has insufficient color contrast of \${data.contrastRatio}:1 with the surrounding text. (Minimum contrast is \${data.requiredContrastRatio}:1, link text: \${data.nodeColor}, surrounding text: \${data.parentColor})",bgContrast:"The link background has insufficient color contrast of \${data.contrastRatio} (Minimum contrast is \${data.requiredContrastRatio}:1, link background color: \${data.nodeBackgroundColor}, surrounding background color: \${data.parentBackgroundColor})"},incomplete:{default:"Element's foreground contrast ratio could not\
 be determined",bgContrast:"Element's background contrast ratio could not be determined",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"}}},"autocomplete-appropriate":{impact:"serious",messages:{pass:"The autocomplete value is on an appropriate element",fail:"The autocomplete value is inappropriate for this type of input"}},"autocomplete-valid":{impact:"serious",messages:{pass:"the autocomplete attribute is correctly formatted",fail:"the autocomplete attribute is incorrectly formatted",incomplete:"the autocomplete attribute has a non-standard value. Check whether any standard value could be used instead."}},accesskeys:{impact:"serious",messages:{pass:"Accesskey attribute value \
is unique",fail:"Document has multiple elements with the same accesskey"}},"focusable-content":{impact:"serious",messages:{pass:"Element contains focusable elements",fail:"Element should have focusable content"}},"focusable-disabled":{impact:"serious",messages:{pass:"No focusable elements contained within element",incomplete:"Check if the focusable elements immediately move the focus indicator",fail:"Focusable content should be disabled or be removed from the DOM"}},"focusable-element":{impact:"serious",messages:{pass:"Element is focusable",fail:"Element should be focusable"}},"focusable-modal-open":{impact:"serious",messages:{pass:"No focusable elements while a modal is open",incomplete:"Check that focusable elements are not tabbable in the current state"}},"focusable-no-name":{impact:"serious",messages:{pass:"Element is not in tab order or has accessible text",fail:"Element is in tab order and does not have accessible text",incomplete:"Unable to determine if element has an accessible\
 name"}},"focusable-not-tabbable":{impact:"serious",messages:{pass:"No focusable elements contained within element",incomplete:"Check if the focusable elements immediately move the focus indicator",fail:'Focusable content should have tabindex="-1" or be removed from the DOM'}},"frame-focusable-content":{impact:"serious",messages:{pass:"Element does not have focusable descendants",fail:"Element has focusable descendants",incomplete:"Could not determine if element has descendants"}},"landmark-is-top-level":{impact:"moderate",messages:{pass:"The \${data.role} landmark is at the top level.",fail:"The \${data.role} landmark is contained in another landmark."}},"no-focusable-content":{impact:"serious",messages:{pass:"Element does not have focusable descendants",fail:{default:"Element has focusable descendants",notHidden:'Using a negative tabindex on an element inside an interactive control does not prevent assistive technologies from focusing the element (even with aria-hidden="true")'},incomp\
lete:"Could not determine if element has descendants"}},"page-has-heading-one":{impact:"moderate",messages:{pass:"Page has at least one level-one heading",fail:"Page must have a level-one heading"}},"page-has-main":{impact:"moderate",messages:{pass:"Document has at least one main landmark",fail:"Document does not have a main landmark"}},"page-no-duplicate-banner":{impact:"moderate",messages:{pass:"Document does not have more than one banner landmark",fail:"Document has more than one banner landmark"}},"page-no-duplicate-contentinfo":{impact:"moderate",messages:{pass:"Document does not have more than one contentinfo landmark",fail:"Document has more than one contentinfo landmark"}},"page-no-duplicate-main":{impact:"moderate",messages:{pass:"Document does not have more than one main landmark",fail:"Document has more than one main landmark"}},tabindex:{impact:"serious",messages:{pass:"Element does not have a tabindex greater than 0",fail:"Element has a tabindex greater than 0"}},"alt-spac\
e-value":{impact:"critical",messages:{pass:"Element has a valid alt attribute value",fail:"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:"Element does not duplicate existing text in <img> alt text",fail:"Element contains <img> element with alt text that duplicates existing text"}},"explicit-label":{impact:"critical",messages:{pass:"Element has an explicit <label>",fail:"Element does not have an explicit <label>",incomplete:"Unable to determine if form element has an explicit <label>"}},"help-same-as-label":{impact:"minor",messages:{pass:"Help text (title or aria-describedby) does not duplicate label text",fail:"Help text (title or aria-describedby) text is the same as the label text"}},"hidden-explicit-label":{impact:"critical",messages:{pass:"Form element has a visible explicit <label>",fail:"Form element has explicit <label> that is hidden",incomplete:"Unable to determ\
ine if form element has explicit <label> that is hidden"}},"implicit-label":{impact:"critical",messages:{pass:"Element has an implicit (wrapped) <label>",fail:"Element does not have an implicit (wrapped) <label>",incomplete:"Unable to determine if form element has an implicit (wrapped) <label>"}},"label-content-name-mismatch":{impact:"serious",messages:{pass:"Element contains visible text as part of it's accessible name",fail:"Text inside the element is not included in the accessible name"}},"multiple-label":{impact:"moderate",messages:{pass:"Form field does not have multiple label elements",incomplete:"Multiple label elements is not widely supported in assistive technologies. Ensure the first label contains all necessary information."}},"title-only":{impact:"serious",messages:{pass:"Form element does not solely use title attribute for its label",fail:"Only title used to generate label for form element"}},"landmark-is-unique":{impact:"moderate",messages:{pass:"Landmarks must have a uni\
que role or role/label/title (i.e. accessible name) combination",fail:"The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable"}},"has-lang":{impact:"serious",messages:{pass:"The <html> element has a lang attribute",fail:{noXHTML:"The xml:lang attribute is not valid on HTML pages, use the lang attribute.",noLang:"The <html> element does not have a lang attribute"}}},"valid-lang":{impact:"serious",messages:{pass:"Value of lang attribute is included in the list of valid languages",fail:"Value of lang attribute not included in the list of valid languages"}},"xml-lang-mismatch":{impact:"moderate",messages:{pass:"Lang and xml:lang attributes have the same base language",fail:"Lang and xml:lang attributes do not have the same base language"}},dlitem:{impact:"serious",messages:{pass:"Description list item has a <dl> parent element",fail:"Description list item does not have a <dl> parent element"}},listitem:{impact:"serious",messages:{pass:'List \
item has a <ul>, <ol> or role="list" parent element',fail:{default:"List item does not have a <ul>, <ol> parent element",roleNotValid:'List item parent element has a role that is not role="list"'}}},"only-dlitems":{impact:"serious",messages:{pass:"dl element only has direct children that are allowed inside; <dt>, <dd>, or <div> elements",fail:"dl element has direct children that are not allowed: \${data.values}"}},"only-listitems":{impact:"serious",messages:{pass:"List element only has direct children that are allowed inside <li> elements",fail:"List element has direct children that are not allowed: \${data.values}"}},"structured-dlitems":{impact:"serious",messages:{pass:"When not empty, element has both <dt> and <dd> elements",fail:"When not empty, element does not have at least one <dt> element followed by at least one <dd> element"}},caption:{impact:"critical",messages:{pass:"The multimedia element has a captions track",incomplete:"Check that captions are available for the element"}},\
"frame-tested":{impact:"critical",messages:{pass:"The iframe was tested with axe-core",fail:"The iframe could not be tested with axe-core",incomplete:"The iframe still has to be tested with axe-core"}},"no-autoplay-audio":{impact:"moderate",messages:{pass:"<video> or <audio> does not output audio for more than allowed duration or has controls mechanism",fail:"<video> or <audio> outputs audio for more than allowed duration and does not have a controls mechanism",incomplete:"Check that the <video> or <audio> does not output audio for more than allowed duration or provides a controls mechanism"}},"css-orientation-lock":{impact:"serious",messages:{pass:"Display is operable, and orientation lock does not exist",fail:"CSS Orientation lock is applied, and makes display inoperable",incomplete:"CSS Orientation lock cannot be determined"}},"meta-viewport-large":{impact:"minor",messages:{pass:"<meta> tag does not prevent significant zooming on mobile devices",fail:"<meta> tag limits zooming on mo\
bile devices"}},"meta-viewport":{impact:"critical",messages:{pass:"<meta> tag does not disable zooming on mobile devices",fail:"\${data} on <meta> tag disables zooming on mobile devices"}},"target-offset":{impact:"serious",messages:{pass:{default:"Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of \${data.closestOffset}px which is at least \${data.minOffset}px.",large:"Target far exceeds the minimum size of \${data.minOffset}px."},fail:"Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of \${data.closestOffset}px instead of at least \${data.minOffset}px.",incomplete:{default:"Element with negative tabindex has insufficient space to its closest neighbors. Safe clickable space has a diameter of \${data.closestOffset}px instead of at least \${data.minOffset}px. Is this a target?",nonTabbableNeighbor:"Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of \${data.closestOffs\
et}px instead of at least \${data.minOffset}px. Is the neighbor a target?",tooManyRects:"Could not get the target size because there are too many overlapping elements"}}},"target-size":{impact:"serious",messages:{pass:{default:"Control has sufficient size (\${data.width}px by \${data.height}px, should be at least \${data.minSize}px by \${data.minSize}px)",obscured:"Control is ignored because it is fully obscured and thus not clickable",large:"Target far exceeds the minimum size of \${data.minSize}px."},fail:{default:"Target has insufficient size (\${data.width}px by \${data.height}px, should be at least \${data.minSize}px by \${data.minSize}px)",partiallyObscured:"Target has insufficient size because it is partially obscured (smallest space is \${data.width}px by \${data.height}px, should be at least \${data.minSize}px by \${data.minSize}px)"},incomplete:{default:"Element with negative tabindex has insufficient size (\${data.width}px by \${data.height}px, should be at least \${data.minSize}px by \${data\
.minSize}px). Is this a target?",contentOverflow:"Element size could not be accurately determined due to overflow content",partiallyObscured:"Element with negative tabindex has insufficient size because it is partially obscured (smallest space is \${data.width}px by \${data.height}px, should be at least \${data.minSize}px by \${data.minSize}px). Is this a target?",partiallyObscuredNonTabbable:"Target has insufficient size because it is partially obscured by a neighbor with negative tabindex (smallest space is \${data.width}px by \${data.height}px, should be at least \${data.minSize}px by \${data.minSize}px). Is the neighbor a target?",tooManyRects:"Could not get the target size because there are too many overlapping elements"}}},"header-present":{impact:"serious",messages:{pass:"Page has a heading",fail:"Page does not have a heading"}},"heading-order":{impact:"moderate",messages:{pass:"Heading order valid",fail:"Heading order invalid",incomplete:"Unable to determine previous heading"}},"identi\
cal-links-same-purpose":{impact:"minor",messages:{pass:"There are no other links with the same name, that go to a different URL",incomplete:"Check that links have the same purpose, or are intentionally ambiguous."}},"internal-link-present":{impact:"serious",messages:{pass:"Valid skip link found",fail:"No valid skip link found"}},landmark:{impact:"serious",messages:{pass:"Page has a landmark region",fail:"Page does not have a landmark region"}},"meta-refresh-no-exceptions":{impact:"minor",messages:{pass:"<meta> tag does not immediately refresh the page",fail:"<meta> tag forces timed refresh of page"}},"meta-refresh":{impact:"critical",messages:{pass:"<meta> tag does not immediately refresh the page",fail:"<meta> tag forces timed refresh of page (less than 20 hours)"}},"p-as-heading":{impact:"serious",messages:{pass:"<p> elements are not styled as headings",fail:"Heading elements should be used instead of styled <p> elements",incomplete:"Unable to determine if <p> elements are styled as \
headings"}},region:{impact:"moderate",messages:{pass:"All page content is contained by landmarks",fail:"Some page content is not contained by landmarks"}},"skip-link":{impact:"moderate",messages:{pass:"Skip link target exists",incomplete:"Skip link target should become visible on activation",fail:"No skip link target"}},"unique-frame-title":{impact:"serious",messages:{pass:"Element's title attribute is unique",fail:"Element's title attribute is not unique"}},"duplicate-id-active":{impact:"serious",messages:{pass:"Document has no active elements that share the same id attribute",fail:"Document has active elements with the same id attribute: \${data}"}},"duplicate-id-aria":{impact:"critical",messages:{pass:"Document has no elements referenced with ARIA or labels that share the same id attribute",fail:"Document has multiple elements referenced with ARIA with the same id attribute: \${data}"}},"duplicate-id":{impact:"minor",messages:{pass:"Document has no static elements that share the same \
id attribute",fail:"Document has multiple static elements with the same id attribute: \${data}"}},"aria-label":{impact:"serious",messages:{pass:"aria-label attribute exists and is not empty",fail:"aria-label attribute does not exist or is empty"}},"aria-labelledby":{impact:"serious",messages:{pass:"aria-labelledby attribute exists and references elements that are visible to screen readers",fail:"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty",incomplete:"Ensure aria-labelledby references an existing element"}},"avoid-inline-spacing":{impact:"serious",messages:{pass:"No inline styles with '!important' that affect text spacing has been specified",fail:{singular:"Remove '!important' from inline style \${data.values}, as overriding this is not supported by most browsers",plural:"Remove '!important' from inline styles \${data.values}, as overriding this is not supported by most browsers"}}},"button-has-visible-text":{impact\
:"critical",messages:{pass:"Element has inner text that is visible to screen readers",fail:"Element does not have inner text that is visible to screen readers",incomplete:"Unable to determine if element has children"}},"doc-has-title":{impact:"serious",messages:{pass:"Document has a non-empty <title> element",fail:"Document does not have a non-empty <title> element"}},"error-occurred":{messages:{pass:"",incomplete:"Axe encountered an error; test the page for this type of problem manually"}},exists:{impact:"minor",messages:{pass:"Element does not exist",incomplete:"Element exists"}},"has-alt":{impact:"critical",messages:{pass:"Element has an alt attribute",fail:"Element does not have an alt attribute"}},"has-visible-text":{impact:"minor",messages:{pass:"Element has text that is visible to screen readers",fail:"Element does not have text that is visible to screen readers",incomplete:"Unable to determine if element has children"}},"important-letter-spacing":{impact:"serious",messages:{pas\
s:"Letter-spacing in the style attribute is not set to !important, or meets the minimum",fail:"letter-spacing in the style attribute must not use !important, or be at \${data.minValue}em (current \${data.value}em)"}},"important-line-height":{impact:"serious",messages:{pass:"line-height in the style attribute is not set to !important, or meets the minimum",fail:"line-height in the style attribute must not use !important, or be at \${data.minValue}em (current \${data.value}em)"}},"important-word-spacing":{impact:"serious",messages:{pass:"word-spacing in the style attribute is not set to !important, or meets the minimum",fail:"word-spacing in the style attribute must not use !important, or be at \${data.minValue}em (current \${data.value}em)"}},"is-on-screen":{impact:"serious",messages:{pass:"Element is not visible",fail:"Element is visible"}},"non-empty-alt":{impact:"critical",messages:{pass:"Element has a non-empty alt attribute",fail:{noAttr:"Element has no alt attribute",emptyAttr:"Element \
has an empty alt attribute"}}},"non-empty-if-present":{impact:"critical",messages:{pass:{default:"Element does not have a value attribute","has-label":"Element has a non-empty value attribute"},fail:"Element has a value attribute and the value attribute is empty"}},"non-empty-placeholder":{impact:"serious",messages:{pass:"Element has a placeholder attribute",fail:{noAttr:"Element has no placeholder attribute",emptyAttr:"Element has an empty placeholder attribute"}}},"non-empty-title":{impact:"serious",messages:{pass:"Element has a title attribute",fail:{noAttr:"Element has no title attribute",emptyAttr:"Element has an empty title attribute"}}},"non-empty-value":{impact:"critical",messages:{pass:"Element has a non-empty value attribute",fail:{noAttr:"Element has no value attribute",emptyAttr:"Element has an empty value attribute"}}},"presentational-role":{impact:"minor",messages:{pass:'Element\\'s default semantics were overridden with role="\${data.role}"',fail:{default:'Element\\'s defau\
lt semantics were not overridden with role="none" or role="presentation"',globalAria:"Element's role is not presentational because it has a global ARIA attribute",focusable:"Element's role is not presentational because it is focusable",both:"Element's role is not presentational because it has a global ARIA attribute and is focusable",iframe:'Using the "title" attribute on an \${data.nodeName} element with a presentational role behaves inconsistently between screen readers'}}},"role-none":{impact:"minor",messages:{pass:'Element\\'s default semantics were overridden with role="none"',fail:'Element\\'s default semantics were not overridden with role="none"'}},"role-presentation":{impact:"minor",messages:{pass:'Element\\'s default semantics were overridden with role="presentation"',fail:'Element\\'s default semantics were not overridden with role="presentation"'}},"svg-non-empty-title":{impact:"serious",messages:{pass:"Element has a child that is a title",fail:{noTitle:"Element has no child tha\
t is a title",emptyTitle:"Element child title is empty"},incomplete:"Unable to determine element has a child that is a title"}},"caption-faked":{impact:"serious",messages:{pass:"The first row of a table is not used as a caption",fail:"The first child of the table should be a caption instead of a table cell"}},"html5-scope":{impact:"moderate",messages:{pass:"Scope attribute is only used on table header elements (<th>)",fail:"In HTML 5, scope attributes may only be used on table header elements (<th>)"}},"same-caption-summary":{impact:"minor",messages:{pass:"Content of summary attribute and <caption> are not duplicated",fail:"Content of summary attribute and <caption> element are identical",incomplete:"Unable to determine if <table> element has a caption"}},"scope-value":{impact:"critical",messages:{pass:"Scope attribute is used correctly",fail:"The value of the scope attribute may only be 'row' or 'col'"}},"td-has-header":{impact:"critical",messages:{pass:"All non-empty data cells have \
table headers",fail:"Some non-empty data cells do not have table headers"}},"td-headers-attr":{impact:"serious",messages:{pass:"The headers attribute is exclusively used to refer to other header cells in the table",incomplete:"The headers attribute is empty",fail:{"cell-header-not-in-table":"The headers attribute is not exclusively used to refer to other header cells in the table","cell-header-not-th":"The headers attribute must refer to header cells, not data cells","header-refs-self":"The element with headers attribute refers to itself"}}},"th-has-data-cells":{impact:"serious",messages:{pass:"All table header cells refer to data cells",fail:"Not all table header cells refer to data cells",incomplete:"Table data cells are missing or empty"}},"hidden-content":{impact:"minor",messages:{pass:"All content on the page has been analyzed.",fail:"There were problems analyzing the content on this page.",incomplete:"There is hidden content on the page that was not analyzed. You will need to tri\
gger the display of this content in order to analyze it."}}},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:"axe couldn't tell the reason. Time to break out the element inspector!"},rules:[{id:"accesskeys",impact:"serious",selector:"[accesskey]",excludeHidden:!1,tags:["cat.keyboard","best-practice"],all:[],any:[],none:["accesskeys"]},{id:"area-alt",impact:"critical",selector:"map area[href]",excludeHidden:!1,tags:["cat.text-alternatives","wcag2a","wcag244","wcag412","section508","section508.22.a","TTv5","TT6.a","EN-301-549","EN-9.2.4.4","EN-9.4.1.2","ACT","RGAAv4","RGAA-1.1.2"],actIds:["c487ae"],all:[],any:[{options:{attribute:"alt"},id:"non-empty-alt"},"aria-label","aria-\
labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-allowed-attr",impact:"critical",matches:"aria-allowed-attr-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["5c01ea"],all:[{options:{validTreeRowAttrs:["aria-posinset","aria-setsize","aria-expanded","aria-level"]},id:"aria-allowed-attr"},"aria-allowed-attr-elm"],any:[],none:["aria-unsupported-attr"]},{id:"aria-allowed-role",impact:"minor",excludeHidden:!1,selector:"[role]",matches:"aria-allowed-role-matches",tags:["cat.aria","best-practice"],all:[],any:[{options:{allowImplicit:!0,ignoredTags:[]},id:"aria-allowed-role"}],none:[]},{id:"aria-braille-equivalent",reviewOnFail:!0,impact:"serious",selector:"[aria-brailleroledescription], [aria-braillelabel]",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2"],all:["braille-roledescription-equivalent","braille-label-equivalent"],any:[],none:[]},{id:"aria-command-name",impact:"serious",selector:'[rol\
e="link"], [role="button"], [role="menuitem"]',matches:"no-naming-method-matches",tags:["cat.aria","wcag2a","wcag412","TTv5","TT6.a","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.9.1"],actIds:["97a4e1"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-conditional-attr",impact:"serious",matches:"aria-allowed-attr-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["5c01ea"],all:[{options:{invalidTableRowAttrs:["aria-posinset","aria-setsize","aria-expanded","aria-level"]},id:"aria-conditional-attr"}],any:[],none:[]},{id:"aria-deprecated-role",impact:"minor",selector:"[role]",matches:"no-empty-role-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["674b10"],all:[],any:[],none:["deprecatedrole"]},{id:"aria-dialog-name",impact:"serious",selector:'[role="dialog"], [role="alertdialog"]',matches:"no-naming-\
method-matches",tags:["cat.aria","best-practice"],all:[],any:["aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-hidden-body",impact:"critical",selector:"body",excludeHidden:!1,matches:"is-initiator-matches",tags:["cat.aria","wcag2a","wcag131","wcag412","EN-301-549","EN-9.1.3.1","EN-9.4.1.2","RGAAv4","RGAA-10.8.1"],all:[],any:["aria-hidden-body"],none:[]},{id:"aria-hidden-focus",impact:"serious",selector:'[aria-hidden="true"]',matches:"aria-hidden-focus-matches",excludeHidden:!1,tags:["cat.name-role-value","wcag2a","wcag412","TTv5","TT6.a","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-10.8.1"],actIds:["6cfa84"],all:["focusable-modal-open","focusable-disabled","focusable-not-tabbable"],any:[],none:[]},{id:"aria-input-field-name",impact:"serious",selector:'[role="combobox"], [role="listbox"], [role="searchbox"], [role="slider"], [role="spinbutton"], [role="textbox"]',matches:"no-naming-method-matches",tags:["cat.aria","wcag2a","wcag412","TTv5\
","TT5.c","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.1.1"],actIds:["e086e5"],all:[],any:["aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:["no-implicit-explicit-label"]},{id:"aria-meter-name",impact:"serious",selector:'[role="meter"]',matches:"no-naming-method-matches",tags:["cat.aria","wcag2a","wcag111","EN-301-549","EN-9.1.1.1","RGAAv4","RGAA-11.1.1"],all:[],any:["aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-progressbar-name",impact:"serious",selector:'[role="progressbar"]',matches:"no-naming-method-matches",tags:["cat.aria","wcag2a","wcag111","EN-301-549","EN-9.1.1.1","RGAAv4","RGAA-11.1.1"],all:[],any:["aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-prohibited-attr",impact:"serious",matches:"aria-allowed-attr-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["5c01ea"],all:[],an\
y:[],none:[{options:{elementsAllowedAriaLabel:["applet","input"]},id:"aria-prohibited-attr"}]},{id:"aria-required-attr",impact:"critical",selector:"[role]",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["4e8ab6"],all:[],any:["aria-required-attr"],none:[]},{id:"aria-required-children",impact:"critical",selector:"[role]",matches:"aria-required-children-matches",tags:["cat.aria","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.3.1"],actIds:["bc4a75","ff89c9"],all:[],any:[{options:{reviewEmpty:["doc-bibliography","doc-endnotes","grid","list","listbox","menu","menubar","table","tablist","tree","treegrid","rowgroup"]},id:"aria-required-children"}],none:[]},{id:"aria-required-parent",impact:"critical",selector:"[role]",matches:"aria-required-parent-matches",tags:["cat.aria","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.3.1"],actIds:["ff89c9"],all:[],any:[{options:{ownGroupRoles:["listitem","treeitem"]},id:"aria-require\
d-parent"}],none:[]},{id:"aria-roledescription",impact:"serious",selector:"[aria-roledescription]",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","deprecated"],enabled:!1,all:[],any:[{options:{supportedRoles:["button","img","checkbox","radio","combobox","menuitemcheckbox","menuitemradio"]},id:"aria-roledescription"}],none:[]},{id:"aria-roles",impact:"critical",selector:"[role]",matches:"no-empty-role-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["674b10"],all:[],any:[],none:["invalidrole","abstractrole","unsupportedrole"]},{id:"aria-text",impact:"serious",selector:"[role=text]",tags:["cat.aria","best-practice"],all:[],any:["no-focusable-content"],none:[]},{id:"aria-toggle-field-name",impact:"serious",selector:'[role="checkbox"], [role="menuitemcheckbox"], [role="menuitemradio"], [role="radio"], [role="switch"], [role="option"]',matches:"no-naming-method-matches",tags:["cat.aria","wcag2a","wcag412","TTv5","TT5.c","EN\
-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-7.1.1"],actIds:["e086e5"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:["no-implicit-explicit-label"]},{id:"aria-tooltip-name",impact:"serious",selector:'[role="tooltip"]',matches:"no-naming-method-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-treeitem-name",impact:"serious",selector:'[role="treeitem"]',matches:"no-naming-method-matches",tags:["cat.aria","best-practice"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"aria-valid-attr-value",impact:"critical",matches:"aria-has-attr-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["6a7281"],all:[{options:[],id:"aria-valid-attr-value"},\
"aria-errormessage","aria-level"],any:[],none:[]},{id:"aria-valid-attr",impact:"critical",matches:"aria-has-attr-matches",tags:["cat.aria","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["5f99a7"],all:[],any:[{options:[],id:"aria-valid-attr"}],none:[]},{id:"audio-caption",impact:"critical",selector:"audio",enabled:!1,excludeHidden:!1,tags:["cat.time-and-media","wcag2a","wcag121","EN-301-549","EN-9.1.2.1","section508","section508.22.a","deprecated"],actIds:["2eb176","afb423"],all:[],any:[],none:["caption"]},{id:"autocomplete-valid",impact:"serious",matches:"autocomplete-matches",tags:["cat.forms","wcag21aa","wcag135","EN-301-549","EN-9.1.3.5","ACT","RGAAv4","RGAA-11.13.1"],actIds:["73f2c2"],all:[{options:{stateTerms:["none","false","true","disabled","enabled","undefined","null","xoff","xon"],ignoredValues:["text","pronouns","gender","message","content"]},id:"autocomplete-valid"}],any:[],none:[]},{id:"avoid-inline-spacing",impact:"serious",selector:"[style]",m\
atches:"is-visible-on-screen-matches",tags:["cat.structure","wcag21aa","wcag1412","EN-301-549","EN-9.1.4.12","ACT"],actIds:["24afc2","9e45ec","78fd32"],all:[{options:{cssProperty:"letter-spacing",minValue:.12},id:"important-letter-spacing"},{options:{cssProperty:"word-spacing",minValue:.16},id:"important-word-spacing"},{options:{multiLineOnly:!0,cssProperty:"line-height",minValue:1.5,normalValue:1},id:"important-line-height"}],any:[],none:[]},{id:"blink",impact:"serious",selector:"blink",excludeHidden:!1,tags:["cat.time-and-media","wcag2a","wcag222","section508","section508.22.j","TTv5","TT2.b","EN-301-549","EN-9.2.2.2","RGAAv4","RGAA-13.8.1"],all:[],any:[],none:["is-on-screen"]},{id:"button-name",impact:"critical",selector:"button",matches:"no-explicit-name-required-matches",tags:["cat.name-role-value","wcag2a","wcag412","section508","section508.22.a","TTv5","TT6.a","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.9.1"],actIds:["97a4e1","m6b1q3"],all:[],any:["button-has-visible-text"\
,"aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},"implicit-label","explicit-label","presentational-role"],none:[]},{id:"bypass",impact:"serious",selector:"html:not(html *)",pageLevel:!0,matches:"bypass-matches",reviewOnFail:!0,tags:["cat.keyboard","wcag2a","wcag241","section508","section508.22.o","TTv5","TT9.a","EN-301-549","EN-9.2.4.1","RGAAv4","RGAA-12.7.1"],actIds:["cf77f2","047fe0","b40fd1","3e12e1","ye5d6e"],all:[],any:["internal-link-present",{options:{selector:":is(h1, h2, h3, h4, h5, h6):not([role]), [role=heading]"},id:"header-present"},{options:{selector:"main, [role=main]"},id:"landmark"}],none:[]},{id:"color-contrast-enhanced",impact:"serious",matches:"color-contrast-matches",excludeHidden:!1,enabled:!1,tags:["cat.color","wcag2aaa","wcag146","ACT"],actIds:["09o5cg"],all:[],any:[{options:{ignoreUnicode:!0,ignoreLength:!1,ignorePseudo:!1,boldValue:700,boldTextPt:14,largeTextPt:18,contrastRatio:{normal:{expected:7,minThreshold:4.5},large:{expe\
cted:4.5,minThreshold:3}},pseudoSizeThreshold:.25,shadowOutlineEmMax:.1,textStrokeEmMin:.03},id:"color-contrast-enhanced"}],none:[]},{id:"color-contrast",impact:"serious",matches:"color-contrast-matches",excludeHidden:!1,tags:["cat.color","wcag2aa","wcag143","TTv5","TT13.c","EN-301-549","EN-9.1.4.3","ACT","RGAAv4","RGAA-3.2.1"],actIds:["afw4f7","09o5cg"],all:[],any:[{options:{ignoreUnicode:!0,ignoreLength:!1,ignorePseudo:!1,boldValue:700,boldTextPt:14,largeTextPt:18,contrastRatio:{normal:{expected:4.5},large:{expected:3}},pseudoSizeThreshold:.25,shadowOutlineEmMax:.2,textStrokeEmMin:.03},id:"color-contrast"}],none:[]},{id:"css-orientation-lock",impact:"serious",selector:"html:not(html *)",tags:["cat.structure","wcag134","wcag21aa","EN-301-549","EN-9.1.3.4","RGAAv4","RGAA-13.9.1","experimental"],actIds:["b33eff"],all:[{options:{degreeThreshold:2},id:"css-orientation-lock"}],any:[],none:[],preload:!0},{id:"definition-list",impact:"serious",selector:"dl",matches:"no-role-matches",tags:["c\
at.structure","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.3.3"],all:[],any:[],none:["structured-dlitems",{options:{validRoles:["definition","term","listitem"],validNodeNames:["dt","dd"],divGroups:!0},id:"only-dlitems"}]},{id:"dlitem",impact:"serious",selector:"dd, dt",matches:"no-role-matches",tags:["cat.structure","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.3.3"],all:[],any:["dlitem"],none:[]},{id:"document-title",impact:"serious",selector:"html:not(html *)",matches:"is-initiator-matches",tags:["cat.text-alternatives","wcag2a","wcag242","TTv5","TT12.a","EN-301-549","EN-9.2.4.2","ACT","RGAAv4","RGAA-8.5.1"],actIds:["2779a5"],all:[],any:["doc-has-title"],none:[]},{id:"duplicate-id-active",impact:"serious",selector:"[id]",matches:"duplicate-id-active-matches",excludeHidden:!1,tags:["cat.parsing","wcag2a-obsolete","wcag411","deprecated"],enabled:!1,actIds:["3ea0c8"],all:[],any:["duplicate-id-active"],none:[]},{id:"duplicate-id-aria",impact:"critical",se\
lector:"[id]",matches:"duplicate-id-aria-matches",excludeHidden:!1,tags:["cat.parsing","wcag2a","wcag412","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-8.2.1"],reviewOnFail:!0,actIds:["3ea0c8"],all:[],any:["duplicate-id-aria"],none:[]},{id:"duplicate-id",impact:"minor",selector:"[id]",matches:"duplicate-id-misc-matches",excludeHidden:!1,tags:["cat.parsing","wcag2a-obsolete","wcag411","deprecated"],enabled:!1,actIds:["3ea0c8"],all:[],any:["duplicate-id"],none:[]},{id:"empty-heading",impact:"minor",selector:'h1, h2, h3, h4, h5, h6, [role="heading"]',matches:"heading-matches",tags:["cat.name-role-value","best-practice"],actIds:["ffd0e9"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"empty-table-header",impact:"minor",selector:'th:not([role]), [role="rowheader"], [role="columnheader"]',tags:["cat.name-role-value","best-practice"],all:[],any:["has-visible-text"],none:[]},{id:"focus-order-semantics",impact:"minor",s\
elector:"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span",matches:"inserted-into-focus-order-matches",tags:["cat.keyboard","best-practice","RGAAv4","RGAA-12.8.1","experimental"],all:[],any:[{options:[],id:"has-widget-role"},{options:{roles:["tooltip"]},id:"valid-scrollable-semantics"}],none:[]},{id:"form-field-multiple-labels",impact:"moderate",selector:"input, select, textarea",matches:"label-matches",tags:["cat.forms","wcag2a","wcag332","TTv5","TT5.c","EN-301-549","EN-9.3.3.2","RGAAv4","RGAA-11.2.1"],all:[],any:[],none:["multiple-label"]},{id:"frame-focusable-content",impact:"serious",selector:"html:not(html *)",matches:"frame-focusable-content-matches",tags:["cat.keyboard","wcag2a","wcag211","TTv5","TT4.a","EN-301-549","EN-9.2.1.1","RGAAv4","RGAA-7.3.2"],actIds:["akn7bn"],all:[],any:["frame-focusable-content"],none:[]},{id:"frame-tested",impact:"critical",selector:"html:not(html *), frame, iframe",tags:["cat.structure","best-practice","review-item"],all:[{options:{isViolation:!\
1},id:"frame-tested"}],any:[],none:[]},{id:"frame-title-unique",impact:"serious",selector:"frame[title], iframe[title]",matches:"frame-title-has-text-matches",tags:["cat.text-alternatives","wcag2a","wcag412","TTv5","TT12.d","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-2.2.1"],actIds:["4b1c6c"],all:[],any:[],none:["unique-frame-title"],reviewOnFail:!0},{id:"frame-title",impact:"serious",selector:"frame, iframe",matches:"no-negative-tabindex-matches",tags:["cat.text-alternatives","wcag2a","wcag412","section508","section508.22.i","TTv5","TT12.d","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-2.1.1"],actIds:["cae760"],all:[],any:[{options:{attribute:"title"},id:"non-empty-title"},"aria-label","aria-labelledby","presentational-role"],none:[]},{id:"heading-order",impact:"moderate",selector:"h1, h2, h3, h4, h5, h6, [role=heading]",matches:"heading-matches",tags:["cat.semantics","best-practice"],all:[],any:["heading-order"],none:[]},{id:"hidden-content",impact:"minor",selector:"*",excludeHidden:!1,tags:\
["cat.structure","best-practice","experimental","review-item"],all:[],any:["hidden-content"],none:[]},{id:"html-has-lang",impact:"serious",selector:"html:not(html *)",matches:"is-initiator-matches",tags:["cat.language","wcag2a","wcag311","TTv5","TT11.a","EN-301-549","EN-9.3.1.1","ACT","RGAAv4","RGAA-8.3.1"],actIds:["b5c3f8"],all:[],any:[{options:{attributes:["lang","xml:lang"]},id:"has-lang"}],none:[]},{id:"html-lang-valid",impact:"serious",selector:'html[lang]:not([lang=""]):not(html *), html[xml\\\\:lang]:not([xml\\\\:lang=""]):not(html *)',tags:["cat.language","wcag2a","wcag311","TTv5","TT11.a","EN-301-549","EN-9.3.1.1","ACT","RGAAv4","RGAA-8.4.1"],actIds:["bf051a"],all:[],any:[],none:[{options:{attributes:["lang","xml:lang"]},id:"valid-lang"}]},{id:"html-xml-lang-mismatch",impact:"moderate",selector:"html[lang][xml\\\\:lang]:not(html *)",matches:"xml-lang-mismatch-matches",tags:["cat.language","wcag2a","wcag311","EN-301-549","EN-9.3.1.1","ACT","RGAAv4","RGAA-8.3.1"],actIds:["5b7ae0"],all\
:["xml-lang-mismatch"],any:[],none:[]},{id:"identical-links-same-purpose",impact:"minor",selector:'a[href], area[href], [role="link"]',excludeHidden:!1,enabled:!1,matches:"identical-links-same-purpose-matches",tags:["cat.semantics","wcag2aaa","wcag249"],actIds:["b20e66"],all:["identical-links-same-purpose"],any:[],none:[]},{id:"image-alt",impact:"critical",selector:"img",matches:"no-explicit-name-required-matches",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a","TTv5","TT7.a","TT7.b","EN-301-549","EN-9.1.1.1","ACT","RGAAv4","RGAA-1.1.1"],actIds:["23a2a8"],all:[],any:["has-alt","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},"presentational-role"],none:["alt-space-value"]},{id:"image-redundant-alt",impact:"minor",selector:"img",tags:["cat.text-alternatives","best-practice"],all:[],any:[],none:[{options:{parentSelector:"button, [role=button], a[href], p, li, td, th"},id:"duplicate-img-label"}]},{id:"input-button-name",impa\
ct:"critical",selector:'input[type="button"], input[type="submit"], input[type="reset"]',matches:"no-explicit-name-required-matches",tags:["cat.name-role-value","wcag2a","wcag412","section508","section508.22.a","TTv5","TT5.c","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.9.1"],actIds:["97a4e1"],all:[],any:["non-empty-if-present",{options:{attribute:"value"},id:"non-empty-value"},"aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},"implicit-label","explicit-label","presentational-role"],none:[]},{id:"input-image-alt",impact:"critical",selector:'input[type="image"]',matches:"no-explicit-name-required-matches",tags:["cat.text-alternatives","wcag2a","wcag111","wcag412","section508","section508.22.a","TTv5","TT7.a","EN-301-549","EN-9.1.1.1","EN-9.4.1.2","ACT","RGAAv4","RGAA-1.1.3"],actIds:["59796f"],all:[],any:[{options:{attribute:"alt"},id:"non-empty-alt"},"aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},"implicit-label","e\
xplicit-label"],none:[]},{id:"label-content-name-mismatch",impact:"serious",matches:"label-content-name-mismatch-matches",tags:["cat.semantics","wcag21a","wcag253","EN-301-549","EN-9.2.5.3","RGAAv4","RGAA-6.1.5","experimental"],actIds:["2ee8b8"],all:[],any:[{options:{pixelThreshold:.1,occurrenceThreshold:3},id:"label-content-name-mismatch"}],none:[]},{id:"label-title-only",impact:"serious",selector:"input, select, textarea",matches:"label-matches",tags:["cat.forms","best-practice"],all:[],any:[],none:["title-only"]},{id:"label",impact:"critical",selector:"input, textarea",matches:"label-matches",tags:["cat.forms","wcag2a","wcag412","section508","section508.22.n","TTv5","TT5.c","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.1.1"],actIds:["e086e5"],all:[],any:["implicit-label","explicit-label","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},{options:{attribute:"placeholder"},id:"non-empty-placeholder"},"presentational-role"],none:["hidden-explicit-lab\
el"]},{id:"landmark-banner-is-top-level",impact:"moderate",selector:"header:not([role]), [role=banner]",matches:"landmark-has-body-context-matches",tags:["cat.semantics","best-practice"],all:[],any:["landmark-is-top-level"],none:[]},{id:"landmark-complementary-is-top-level",impact:"moderate",selector:"aside:not([role]), [role=complementary]",tags:["cat.semantics","best-practice"],all:[],any:["landmark-is-top-level"],none:[]},{id:"landmark-contentinfo-is-top-level",impact:"moderate",selector:"footer:not([role]), [role=contentinfo]",matches:"landmark-has-body-context-matches",tags:["cat.semantics","best-practice"],all:[],any:["landmark-is-top-level"],none:[]},{id:"landmark-main-is-top-level",impact:"moderate",selector:"main:not([role]), [role=main]",tags:["cat.semantics","best-practice"],all:[],any:["landmark-is-top-level"],none:[]},{id:"landmark-no-duplicate-banner",impact:"moderate",selector:"header:not([role]), [role=banner]",tags:["cat.semantics","best-practice"],all:[],any:[{options\
:{selector:"header:not([role]), [role=banner]",role:"banner"},id:"page-no-duplicate-banner"}],none:[]},{id:"landmark-no-duplicate-contentinfo",impact:"moderate",selector:"footer:not([role]), [role=contentinfo]",tags:["cat.semantics","best-practice"],all:[],any:[{options:{selector:"footer:not([role]), [role=contentinfo]",role:"contentinfo"},id:"page-no-duplicate-contentinfo"}],none:[]},{id:"landmark-no-duplicate-main",impact:"moderate",selector:"main:not([role]), [role=main]",tags:["cat.semantics","best-practice"],all:[],any:[{options:{selector:"main:not([role]), [role='main']"},id:"page-no-duplicate-main"}],none:[]},{id:"landmark-one-main",impact:"moderate",selector:"html:not(html *)",tags:["cat.semantics","best-practice"],all:[{options:{selector:"main:not([role]), [role='main']",passForModal:!0},id:"page-has-main"}],any:[],none:[]},{id:"landmark-unique",impact:"moderate",selector:"[role=banner], [role=complementary], [role=contentinfo], [role=main], [role=navigation], [role=region], [\
role=search], [role=form], form, footer, header, aside, main, nav, section",tags:["cat.semantics","best-practice"],matches:"landmark-unique-matches",all:[],any:["landmark-is-unique"],none:[]},{id:"link-in-text-block",impact:"serious",selector:"a[href], [role=link]",matches:"link-in-text-block-matches",excludeHidden:!1,tags:["cat.color","wcag2a","wcag141","TTv5","TT13.a","EN-301-549","EN-9.1.4.1","RGAAv4","RGAA-10.6.1"],all:[],any:[{options:{requiredContrastRatio:3,allowSameColor:!0},id:"link-in-text-block"},"link-in-text-block-style"],none:[]},{id:"link-name",impact:"serious",selector:"a[href]",tags:["cat.name-role-value","wcag2a","wcag244","wcag412","section508","section508.22.a","TTv5","TT6.a","EN-301-549","EN-9.2.4.4","EN-9.4.1.2","ACT","RGAAv4","RGAA-6.2.1"],actIds:["c487ae"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:["focusable-no-name"]},{id:"list",impact:"serious",selector:"ul, ol",matches:"no-role-matc\
hes",tags:["cat.structure","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.3.1"],all:[],any:[],none:[{options:{validRoles:["listitem"],validNodeNames:["li"]},id:"only-listitems"}]},{id:"listitem",impact:"serious",selector:"li",matches:"no-role-matches",tags:["cat.structure","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.3.1"],all:[],any:["listitem"],none:[]},{id:"marquee",impact:"serious",selector:"marquee",excludeHidden:!1,tags:["cat.parsing","wcag2a","wcag222","TTv5","TT2.b","EN-301-549","EN-9.2.2.2","RGAAv4","RGAA-13.8.1"],all:[],any:[],none:["is-on-screen"]},{id:"meta-refresh-no-exceptions",impact:"minor",selector:'meta[http-equiv="refresh"][content]',excludeHidden:!1,enabled:!1,tags:["cat.time-and-media","wcag2aaa","wcag224","wcag325"],actIds:["bisz58"],all:[],any:[{options:{minDelay:72e3,maxDelay:!1},id:"meta-refresh-no-exceptions"}],none:[]},{id:"meta-refresh",impact:"critical",selector:'meta[http-equiv="refresh"][content]',excludeHidden:!1,tags:["ca\
t.time-and-media","wcag2a","wcag221","TTv5","TT8.a","EN-301-549","EN-9.2.2.1","RGAAv4","RGAA-13.1.2"],actIds:["bc659a","bisz58"],all:[],any:[{options:{minDelay:0,maxDelay:72e3},id:"meta-refresh"}],none:[]},{id:"meta-viewport-large",impact:"minor",selector:'meta[name="viewport"]',matches:"is-initiator-matches",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",impact:"moderate",selector:'meta[name="viewport"]',matches:"is-initiator-matches",excludeHidden:!1,tags:["cat.sensory-and-visual-cues","wcag2aa","wcag144","EN-301-549","EN-9.1.4.4","ACT","RGAAv4","RGAA-10.4.2"],actIds:["b4f0c3"],all:[],any:[{options:{scaleMinimum:2},id:"meta-viewport"}],none:[]},{id:"nested-interactive",impact:"serious",matches:"nested-interactive-matches",tags:["cat.keyboard","wcag2a","wcag412","TTv5","TT6.a","EN-301-549","EN-9.4.1.2","RGAAv4","RGAA-7.1.1"],actIds:["307n5z"],all:[],any:["n\
o-focusable-content"],none:[]},{id:"no-autoplay-audio",impact:"moderate",excludeHidden:!1,selector:"audio[autoplay], video[autoplay]",matches:"no-autoplay-audio-matches",reviewOnFail:!0,tags:["cat.time-and-media","wcag2a","wcag142","TTv5","TT2.a","EN-301-549","EN-9.1.4.2","ACT","RGAAv4","RGAA-4.10.1"],actIds:["80f0bf"],preload:!0,all:[{options:{allowedDuration:3},id:"no-autoplay-audio"}],any:[],none:[]},{id:"object-alt",impact:"serious",selector:"object[data]",matches:"object-is-loaded-matches",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a","EN-301-549","EN-9.1.1.1","RGAAv4","RGAA-1.1.6"],actIds:["8fc3b6"],all:[],any:["aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},"presentational-role"],none:[]},{id:"p-as-heading",impact:"serious",selector:"p",matches:"p-as-heading-matches",tags:["cat.semantics","wcag2a","wcag131","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-9.1.3","experimental"],all:[{options:{margins:[{weight:150,italic\
:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}],passLength:1,failLength:.5},id:"p-as-heading"}],any:[],none:[]},{id:"page-has-heading-one",impact:"moderate",selector:"html:not(html *)",tags:["cat.semantics","best-practice"],all:[{options:{selector:"h1:not([role], [aria-level]), :is(h1, h2, h3, h4, h5, h6):not([role])[aria-level=1], [role=heading][aria-level=1]",passForModal:!0},id:"page-has-heading-one"}],any:[],none:[]},{id:"presentation-role-conflict",impact:"minor",selector:'img[alt=\\'\\'], [role="none"], [role="presentation"]',matches:"has-implicit-chromium-role-matches",tags:["cat.aria","best-practice","ACT"],actIds:["46ca7f"],all:[],any:[],none:["is-element-focusable","has-global-aria-attribute"]},{id:"region",impact:"moderate",selector:"body *",tags:["cat.keyboard","best-practice","RGAAv4","RGAA-9.2.1"],all:[],any:[{options:{regionMatcher:"dialog, [role=dialog], [role=alertdialog], svg"},id:"region"}],none:[]},{id:"role-img-alt",impact:"serious",selector:"[role='img\
']:not(img, area, input, object)",matches:"html-namespace-matches",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a","TTv5","TT7.a","EN-301-549","EN-9.1.1.1","ACT","RGAAv4","RGAA-1.1.1"],actIds:["23a2a8"],all:[],any:["aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"scope-attr-valid",impact:"moderate",selector:"td[scope], th[scope]",tags:["cat.tables","best-practice"],all:["html5-scope",{options:{values:["row","col","rowgroup","colgroup"]},id:"scope-value"}],any:[],none:[]},{id:"scrollable-region-focusable",impact:"serious",selector:"*:not(select,textarea)",matches:"scrollable-region-focusable-matches",tags:["cat.keyboard","wcag2a","wcag211","wcag213","TTv5","TT4.a","EN-301-549","EN-9.2.1.1","EN-9.2.1.3","RGAAv4","RGAA-7.3.2"],actIds:["0ssw9k"],all:[],any:["focusable-content","focusable-element"],none:[]},{id:"select-name",impact:"critical",selector:"select",tags:["cat.forms","wcag2a","wcag412","section508","s\
ection508.22.n","TTv5","TT5.c","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.1.1"],actIds:["e086e5"],all:[],any:["implicit-label","explicit-label","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"},"presentational-role"],none:["hidden-explicit-label"]},{id:"server-side-image-map",impact:"minor",selector:"img[ismap]",tags:["cat.text-alternatives","wcag2a","wcag211","section508","section508.22.f","TTv5","TT4.a","EN-301-549","EN-9.2.1.1","RGAAv4","RGAA-1.1.4"],all:[],any:[],none:["exists"]},{id:"skip-link",impact:"moderate",selector:'a[href^="#"], a[href^="/#"]',matches:"skip-link-matches",tags:["cat.keyboard","best-practice","RGAAv4","RGAA-12.7.1"],all:[],any:["skip-link"],none:[]},{id:"summary-name",impact:"serious",selector:"summary",matches:"summary-interactive-matches",tags:["cat.name-role-value","wcag2a","wcag412","section508","section508.22.a","TTv5","TT6.a","EN-301-549","EN-9.4.1.2"],all:[],any:["has-visible-text","aria-label","aria-labelledby",{\
options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"svg-img-alt",impact:"serious",selector:'[role="img"], [role="graphics-symbol"], svg[role="graphics-document"]',matches:"svg-namespace-matches",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a","TTv5","TT7.a","EN-301-549","EN-9.1.1.1","ACT","RGAAv4","RGAA-1.1.5"],actIds:["7d6734"],all:[],any:["svg-non-empty-title","aria-label","aria-labelledby",{options:{attribute:"title"},id:"non-empty-title"}],none:[]},{id:"tabindex",impact:"serious",selector:"[tabindex]",tags:["cat.keyboard","best-practice"],all:[],any:["tabindex"],none:[]},{id:"table-duplicate-name",impact:"minor",selector:"table",tags:["cat.tables","best-practice","RGAAv4","RGAA-5.2.1"],all:[],any:[],none:["same-caption-summary"]},{id:"table-fake-caption",impact:"serious",selector:"table",matches:"data-table-matches",tags:["cat.tables","experimental","wcag2a","wcag131","section508","section508.22.g","EN-301-549","EN-9.1.3.1","RGAAv4","RGA\
A-5.4.1"],all:["caption-faked"],any:[],none:[]},{id:"target-size",impact:"serious",selector:"*",enabled:!1,matches:"widget-not-inline-matches",tags:["cat.sensory-and-visual-cues","wcag22aa","wcag258"],all:[],any:[{options:{minSize:24},id:"target-size"},{options:{minOffset:24},id:"target-offset"}],none:[]},{id:"td-has-header",impact:"critical",selector:"table",matches:"data-table-large-matches",tags:["cat.tables","experimental","wcag2a","wcag131","section508","section508.22.g","TTv5","TT14.b","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-5.7.4"],all:["td-has-header"],any:[],none:[]},{id:"td-headers-attr",impact:"serious",selector:"table",matches:"table-or-grid-role-matches",tags:["cat.tables","wcag2a","wcag131","section508","section508.22.g","TTv5","TT14.b","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-5.7.4"],actIds:["a25f45"],all:["td-headers-attr"],any:[],none:[]},{id:"th-has-data-cells",impact:"serious",selector:"table",matches:"data-table-matches",tags:["cat.tables","wcag2a","wcag131","secti\
on508","section508.22.g","TTv5","TT14.b","EN-301-549","EN-9.1.3.1","RGAAv4","RGAA-5.7.1"],actIds:["d0f69e"],all:["th-has-data-cells"],any:[],none:[]},{id:"valid-lang",impact:"serious",selector:"[lang]:not(html), [xml\\\\:lang]:not(html)",tags:["cat.language","wcag2aa","wcag312","TTv5","TT11.b","EN-301-549","EN-9.3.1.2","ACT","RGAAv4","RGAA-8.8.1"],actIds:["de46e4"],all:[],any:[],none:[{options:{attributes:["lang","xml:lang"]},id:"valid-lang"}]},{id:"video-caption",impact:"critical",selector:"video",tags:["cat.text-alternatives","wcag2a","wcag122","section508","section508.22.a","TTv5","TT17.a","EN-301-549","EN-9.1.2.2","RGAAv4","RGAA-4.3.1"],actIds:["eac66b"],all:[],any:[],none:["caption"]}],checks:[{id:"abstractrole",evaluate:"abstractrole-evaluate"},{id:"aria-allowed-attr-elm",evaluate:"aria-allowed-attr-elm-evaluate"},{id:"aria-allowed-attr",evaluate:"aria-allowed-attr-evaluate",options:{validTreeRowAttrs:["aria-posinset","aria-setsize","aria-expanded","aria-level"]}},{id:"aria-allowed\
-role",evaluate:"aria-allowed-role-evaluate",options:{allowImplicit:!0,ignoredTags:[]}},{id:"aria-busy",evaluate:"aria-busy-evaluate",deprecated:!0},{id:"aria-conditional-attr",evaluate:"aria-conditional-attr-evaluate",options:{invalidTableRowAttrs:["aria-posinset","aria-setsize","aria-expanded","aria-level"]}},{id:"aria-errormessage",evaluate:"aria-errormessage-evaluate"},{id:"aria-hidden-body",evaluate:"aria-hidden-body-evaluate"},{id:"aria-level",evaluate:"aria-level-evaluate"},{id:"aria-prohibited-attr",evaluate:"aria-prohibited-attr-evaluate",options:{elementsAllowedAriaLabel:["applet","input"]}},{id:"aria-required-attr",evaluate:"aria-required-attr-evaluate"},{id:"aria-required-children",evaluate:"aria-required-children-evaluate",options:{reviewEmpty:["doc-bibliography","doc-endnotes","grid","list","listbox","menu","menubar","table","tablist","tree","treegrid","rowgroup"]}},{id:"aria-required-parent",evaluate:"aria-required-parent-evaluate",options:{ownGroupRoles:["listitem","tre\
eitem"]}},{id:"aria-roledescription",evaluate:"aria-roledescription-evaluate",options:{supportedRoles:["button","img","checkbox","radio","combobox","menuitemcheckbox","menuitemradio"]}},{id:"aria-unsupported-attr",evaluate:"aria-unsupported-attr-evaluate"},{id:"aria-valid-attr-value",evaluate:"aria-valid-attr-value-evaluate",options:[]},{id:"aria-valid-attr",evaluate:"aria-valid-attr-evaluate",options:[]},{id:"braille-label-equivalent",evaluate:"braille-label-equivalent-evaluate"},{id:"braille-roledescription-equivalent",evaluate:"braille-roledescription-equivalent-evaluate"},{id:"deprecatedrole",evaluate:"deprecatedrole-evaluate"},{id:"fallbackrole",evaluate:"fallbackrole-evaluate"},{id:"has-global-aria-attribute",evaluate:"has-global-aria-attribute-evaluate"},{id:"has-widget-role",evaluate:"has-widget-role-evaluate",options:[]},{id:"invalidrole",evaluate:"invalidrole-evaluate"},{id:"is-element-focusable",evaluate:"is-element-focusable-evaluate"},{id:"no-implicit-explicit-label",evalu\
ate:"no-implicit-explicit-label-evaluate"},{id:"unsupportedrole",evaluate:"unsupportedrole-evaluate"},{id:"valid-scrollable-semantics",evaluate:"valid-scrollable-semantics-evaluate",options:{roles:["tooltip"]}},{id:"color-contrast-enhanced",evaluate:"color-contrast-evaluate",options:{ignoreUnicode:!0,ignoreLength:!1,ignorePseudo:!1,boldValue:700,boldTextPt:14,largeTextPt:18,contrastRatio:{normal:{expected:7,minThreshold:4.5},large:{expected:4.5,minThreshold:3}},pseudoSizeThreshold:.25,shadowOutlineEmMax:.1,textStrokeEmMin:.03}},{id:"color-contrast",evaluate:"color-contrast-evaluate",options:{ignoreUnicode:!0,ignoreLength:!1,ignorePseudo:!1,boldValue:700,boldTextPt:14,largeTextPt:18,contrastRatio:{normal:{expected:4.5},large:{expected:3}},pseudoSizeThreshold:.25,shadowOutlineEmMax:.2,textStrokeEmMin:.03}},{id:"link-in-text-block-style",evaluate:"link-in-text-block-style-evaluate"},{id:"link-in-text-block",evaluate:"link-in-text-block-evaluate",options:{requiredContrastRatio:3,allowSameC\
olor:!0}},{id:"autocomplete-appropriate",evaluate:"autocomplete-appropriate-evaluate",deprecated:!0},{id:"autocomplete-valid",evaluate:"autocomplete-valid-evaluate",options:{stateTerms:["none","false","true","disabled","enabled","undefined","null","xoff","xon"],ignoredValues:["text","pronouns","gender","message","content"]}},{id:"accesskeys",evaluate:"accesskeys-evaluate",after:"accesskeys-after"},{id:"focusable-content",evaluate:"focusable-content-evaluate"},{id:"focusable-disabled",evaluate:"focusable-disabled-evaluate"},{id:"focusable-element",evaluate:"focusable-element-evaluate"},{id:"focusable-modal-open",evaluate:"focusable-modal-open-evaluate"},{id:"focusable-no-name",evaluate:"focusable-no-name-evaluate"},{id:"focusable-not-tabbable",evaluate:"focusable-not-tabbable-evaluate"},{id:"frame-focusable-content",evaluate:"frame-focusable-content-evaluate"},{id:"landmark-is-top-level",evaluate:"landmark-is-top-level-evaluate"},{id:"no-focusable-content",evaluate:"no-focusable-content\
-evaluate"},{id:"page-has-heading-one",evaluate:"has-descendant-evaluate",after:"has-descendant-after",options:{selector:"h1:not([role], [aria-level]), :is(h1, h2, h3, h4, h5, h6):not([role])[aria-level=1], [role=heading][aria-level=1]",passForModal:!0}},{id:"page-has-main",evaluate:"has-descendant-evaluate",after:"has-descendant-after",options:{selector:"main:not([role]), [role='main']",passForModal:!0}},{id:"page-no-duplicate-banner",evaluate:"page-no-duplicate-evaluate",after:"page-no-duplicate-after",options:{selector:"header:not([role]), [role=banner]",role:"banner"}},{id:"page-no-duplicate-contentinfo",evaluate:"page-no-duplicate-evaluate",after:"page-no-duplicate-after",options:{selector:"footer:not([role]), [role=contentinfo]",role:"contentinfo"}},{id:"page-no-duplicate-main",evaluate:"page-no-duplicate-evaluate",after:"page-no-duplicate-after",options:{selector:"main:not([role]), [role='main']"}},{id:"tabindex",evaluate:"tabindex-evaluate"},{id:"alt-space-value",evaluate:"alt-\
space-value-evaluate"},{id:"duplicate-img-label",evaluate:"duplicate-img-label-evaluate",options:{parentSelector:"button, [role=button], a[href], p, li, td, th"}},{id:"explicit-label",evaluate:"explicit-evaluate"},{id:"help-same-as-label",evaluate:"help-same-as-label-evaluate"},{id:"hidden-explicit-label",evaluate:"hidden-explicit-label-evaluate"},{id:"implicit-label",evaluate:"implicit-evaluate"},{id:"label-content-name-mismatch",evaluate:"label-content-name-mismatch-evaluate",options:{pixelThreshold:.1,occurrenceThreshold:3}},{id:"multiple-label",evaluate:"multiple-label-evaluate"},{id:"title-only",evaluate:"title-only-evaluate"},{id:"landmark-is-unique",evaluate:"landmark-is-unique-evaluate",after:"landmark-is-unique-after"},{id:"has-lang",evaluate:"has-lang-evaluate",options:{attributes:["lang","xml:lang"]}},{id:"valid-lang",evaluate:"valid-lang-evaluate",options:{attributes:["lang","xml:lang"]}},{id:"xml-lang-mismatch",evaluate:"xml-lang-mismatch-evaluate"},{id:"dlitem",evaluate:"\
dlitem-evaluate"},{id:"listitem",evaluate:"listitem-evaluate"},{id:"only-dlitems",evaluate:"invalid-children-evaluate",options:{validRoles:["definition","term","listitem"],validNodeNames:["dt","dd"],divGroups:!0}},{id:"only-listitems",evaluate:"invalid-children-evaluate",options:{validRoles:["listitem"],validNodeNames:["li"]}},{id:"structured-dlitems",evaluate:"structured-dlitems-evaluate"},{id:"caption",evaluate:"caption-evaluate"},{id:"frame-tested",evaluate:"frame-tested-evaluate",after:"frame-tested-after",options:{isViolation:!1}},{id:"no-autoplay-audio",evaluate:"no-autoplay-audio-evaluate",options:{allowedDuration:3}},{id:"css-orientation-lock",evaluate:"css-orientation-lock-evaluate",options:{degreeThreshold:2}},{id:"meta-viewport-large",evaluate:"meta-viewport-scale-evaluate",options:{scaleMinimum:5,lowerBound:2}},{id:"meta-viewport",evaluate:"meta-viewport-scale-evaluate",options:{scaleMinimum:2}},{id:"target-offset",evaluate:"target-offset-evaluate",options:{minOffset:24}},{\
id:"target-size",evaluate:"target-size-evaluate",options:{minSize:24}},{id:"header-present",evaluate:"has-descendant-evaluate",after:"has-descendant-after",options:{selector:":is(h1, h2, h3, h4, h5, h6):not([role]), [role=heading]"}},{id:"heading-order",evaluate:"heading-order-evaluate",after:"heading-order-after"},{id:"identical-links-same-purpose",evaluate:"identical-links-same-purpose-evaluate",after:"identical-links-same-purpose-after"},{id:"internal-link-present",evaluate:"internal-link-present-evaluate"},{id:"landmark",evaluate:"has-descendant-evaluate",options:{selector:"main, [role=main]"}},{id:"meta-refresh-no-exceptions",evaluate:"meta-refresh-evaluate",options:{minDelay:72e3,maxDelay:!1}},{id:"meta-refresh",evaluate:"meta-refresh-evaluate",options:{minDelay:0,maxDelay:72e3}},{id:"p-as-heading",evaluate:"p-as-heading-evaluate",options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}],passLength:1,failLength:.5}},{id:"region",evaluate:"r\
egion-evaluate",after:"region-after",options:{regionMatcher:"dialog, [role=dialog], [role=alertdialog], svg"}},{id:"skip-link",evaluate:"skip-link-evaluate"},{id:"unique-frame-title",evaluate:"unique-frame-title-evaluate",after:"unique-frame-title-after"},{id:"duplicate-id-active",evaluate:"duplicate-id-evaluate",after:"duplicate-id-after"},{id:"duplicate-id-aria",evaluate:"duplicate-id-evaluate",after:"duplicate-id-after"},{id:"duplicate-id",evaluate:"duplicate-id-evaluate",after:"duplicate-id-after"},{id:"aria-label",evaluate:"aria-label-evaluate"},{id:"aria-labelledby",evaluate:"aria-labelledby-evaluate"},{id:"avoid-inline-spacing",evaluate:"avoid-inline-spacing-evaluate",options:{cssProperties:["line-height","letter-spacing","word-spacing"]}},{id:"button-has-visible-text",evaluate:"has-text-content-evaluate"},{id:"doc-has-title",evaluate:"doc-has-title-evaluate"},{id:"error-occurred",evaluate:"exists-evaluate"},{id:"exists",evaluate:"exists-evaluate"},{id:"has-alt",evaluate:"has-al\
t-evaluate"},{id:"has-visible-text",evaluate:"has-text-content-evaluate"},{id:"important-letter-spacing",evaluate:"inline-style-property-evaluate",options:{cssProperty:"letter-spacing",minValue:.12}},{id:"important-line-height",evaluate:"inline-style-property-evaluate",options:{multiLineOnly:!0,cssProperty:"line-height",minValue:1.5,normalValue:1}},{id:"important-word-spacing",evaluate:"inline-style-property-evaluate",options:{cssProperty:"word-spacing",minValue:.16}},{id:"is-on-screen",evaluate:"is-on-screen-evaluate"},{id:"non-empty-alt",evaluate:"attr-non-space-content-evaluate",options:{attribute:"alt"}},{id:"non-empty-if-present",evaluate:"non-empty-if-present-evaluate"},{id:"non-empty-placeholder",evaluate:"attr-non-space-content-evaluate",options:{attribute:"placeholder"}},{id:"non-empty-title",evaluate:"attr-non-space-content-evaluate",options:{attribute:"title"}},{id:"non-empty-value",evaluate:"attr-non-space-content-evaluate",options:{attribute:"value"}},{id:"presentational-r\
ole",evaluate:"presentational-role-evaluate"},{id:"role-none",evaluate:"matches-definition-evaluate",deprecated:!0,options:{matcher:{attributes:{role:"none"}}}},{id:"role-presentation",evaluate:"matches-definition-evaluate",deprecated:!0,options:{matcher:{attributes:{role:"presentation"}}}},{id:"svg-non-empty-title",evaluate:"svg-non-empty-title-evaluate"},{id:"caption-faked",evaluate:"caption-faked-evaluate"},{id:"html5-scope",evaluate:"html5-scope-evaluate"},{id:"same-caption-summary",evaluate:"same-caption-summary-evaluate"},{id:"scope-value",evaluate:"scope-value-evaluate",options:{values:["row","col","rowgroup","colgroup"]}},{id:"td-has-header",evaluate:"td-has-header-evaluate"},{id:"td-headers-attr",evaluate:"td-headers-attr-evaluate"},{id:"th-has-data-cells",evaluate:"th-has-data-cells-evaluate"},{id:"hidden-content",evaluate:"hidden-content-evaluate"}]})}("object"==typeof window?window:this);`;
  }
});

// core/lib/page-functions.js
function wrapRuntimeEvalErrorInBrowser(err) {
  if (!err || typeof err === "string") {
    err = new Error(err);
  }
  return {
    __failedInBrowser: true,
    name: err.name || "Error",
    message: err.message || "unknown error",
    stack: err.stack
  };
}
function getElementsInDocument2(selector) {
  const realMatchesFn = window.__ElementMatches || window.Element.prototype.matches;
  const results = [];
  const _findAllElements = /* @__PURE__ */ __name((nodes) => {
    for (const el of nodes) {
      if (!selector || realMatchesFn.call(el, selector)) {
        const matchedEl = el;
        results.push(matchedEl);
      }
      if (el.shadowRoot) {
        _findAllElements(el.shadowRoot.querySelectorAll("*"));
      }
    }
  }, "_findAllElements");
  _findAllElements(document.querySelectorAll("*"));
  return results;
}
function getOuterHTMLSnippet(element, ignoreAttrs = [], snippetCharacterLimit = 500) {
  const ATTRIBUTE_CHAR_LIMIT = 75;
  const autoFillIgnoreAttrs = ["autofill-information", "autofill-prediction", "title"];
  if (element instanceof ShadowRoot) {
    element = element.host;
  }
  try {
    const clone = element.cloneNode();
    const template = element.ownerDocument.createElement("template");
    template.content.append(clone);
    ignoreAttrs.concat(autoFillIgnoreAttrs).forEach((attribute) => {
      clone.removeAttribute(attribute);
    });
    let charCount = 0;
    for (const attributeName of clone.getAttributeNames()) {
      if (charCount > snippetCharacterLimit) {
        clone.removeAttribute(attributeName);
        continue;
      }
      let attributeValue = clone.getAttribute(attributeName);
      if (attributeValue === null) continue;
      let dirty = false;
      if (attributeName === "src" && "currentSrc" in element) {
        const elementWithSrc = (
          /** @type {HTMLImageElement|HTMLMediaElement} */
          element
        );
        const currentSrc = elementWithSrc.currentSrc;
        const documentHref = elementWithSrc.ownerDocument.location.href;
        if (new URL(attributeValue, documentHref).toString() !== currentSrc) {
          attributeValue = currentSrc;
          dirty = true;
        }
      }
      const truncatedString = truncate(attributeValue, ATTRIBUTE_CHAR_LIMIT);
      if (truncatedString !== attributeValue) dirty = true;
      attributeValue = truncatedString;
      if (dirty) {
        if (attributeName === "style") {
          const elementWithStyle = (
            /** @type {HTMLElement} */
            clone
          );
          elementWithStyle.style.cssText = attributeValue;
        } else {
          clone.setAttribute(attributeName, attributeValue);
        }
      }
      charCount += attributeName.length + attributeValue.length;
    }
    const reOpeningTag = /^[\s\S]*?>/;
    const [match] = clone.outerHTML.match(reOpeningTag) || [];
    if (match && charCount > snippetCharacterLimit) {
      return match.slice(0, match.length - 1) + " …>";
    }
    return match || "";
  } catch (_) {
    return `<${element.localName}>`;
  }
}
function computeBenchmarkIndex() {
  function benchmarkIndexGC() {
    const start = Date.now();
    let iterations = 0;
    while (Date.now() - start < 500) {
      let s = "";
      for (let j = 0; j < 1e4; j++) s += "a";
      if (s.length === 1) throw new Error("will never happen, but prevents compiler optimizations");
      iterations++;
    }
    const durationInSeconds = (Date.now() - start) / 1e3;
    return Math.round(iterations / 10 / durationInSeconds);
  }
  __name(benchmarkIndexGC, "benchmarkIndexGC");
  function benchmarkIndexNoGC() {
    const arrA = [];
    const arrB = [];
    for (let i = 0; i < 1e5; i++) arrA[i] = arrB[i] = i;
    const start = Date.now();
    let iterations = 0;
    while (iterations % 10 !== 0 || Date.now() - start < 500) {
      const src = iterations % 2 === 0 ? arrA : arrB;
      const tgt = iterations % 2 === 0 ? arrB : arrA;
      for (let j = 0; j < src.length; j++) tgt[j] = src[j];
      iterations++;
    }
    const durationInSeconds = (Date.now() - start) / 1e3;
    return Math.round(iterations / 10 / durationInSeconds);
  }
  __name(benchmarkIndexNoGC, "benchmarkIndexNoGC");
  return (benchmarkIndexGC() + benchmarkIndexNoGC()) / 2;
}
function getNodePath(node) {
  const isShadowRoot = /* @__PURE__ */ __name((node2) => node2.nodeType === Node.DOCUMENT_FRAGMENT_NODE, "isShadowRoot");
  const getNodeParent = /* @__PURE__ */ __name((node2) => isShadowRoot(node2) ? node2.host : node2.parentNode, "getNodeParent");
  function getNodeIndex(node2) {
    if (isShadowRoot(node2)) {
      return "a";
    }
    let index = 0;
    let prevNode;
    while (prevNode = node2.previousSibling) {
      node2 = prevNode;
      if (node2.nodeType === Node.TEXT_NODE && (node2.nodeValue || "").trim().length === 0) continue;
      index++;
    }
    return index;
  }
  __name(getNodeIndex, "getNodeIndex");
  let currentNode = node;
  const path7 = [];
  while (currentNode && getNodeParent(currentNode)) {
    const index = getNodeIndex(currentNode);
    path7.push([index, currentNode.nodeName]);
    currentNode = getNodeParent(currentNode);
  }
  path7.reverse();
  return path7.join(",");
}
function getNodeSelector(element) {
  function getSelectorPart(element2) {
    let part = element2.tagName.toLowerCase();
    if (element2.id) {
      part += "#" + element2.id;
    } else if (element2.classList.length > 0) {
      part += "." + element2.classList[0];
    }
    return part;
  }
  __name(getSelectorPart, "getSelectorPart");
  const parts = [];
  while (parts.length < 4) {
    parts.unshift(getSelectorPart(element));
    if (!element.parentElement) {
      break;
    }
    element = element.parentElement;
    if (element.tagName === "HTML") {
      break;
    }
  }
  return parts.join(" > ");
}
function isPositionFixed(element) {
  function getStyleAttrValue(element2, attr) {
    return element2.style[attr] || window.getComputedStyle(element2)[attr];
  }
  __name(getStyleAttrValue, "getStyleAttrValue");
  const htmlEl = document.querySelector("html");
  if (!htmlEl) throw new Error("html element not found in document");
  if (htmlEl.scrollHeight <= htmlEl.clientHeight || !["scroll", "auto", "visible"].includes(getStyleAttrValue(htmlEl, "overflowY"))) {
    return false;
  }
  let currentEl = element;
  while (currentEl) {
    const position = getStyleAttrValue(currentEl, "position");
    if (position === "fixed" || position === "sticky") {
      return true;
    }
    currentEl = currentEl.parentElement;
  }
  return false;
}
function getNodeLabel(element) {
  const tagName = element.tagName.toLowerCase();
  if (tagName !== "html" && tagName !== "body") {
    const nodeLabel = element instanceof HTMLElement && element.innerText || element.getAttribute("alt") || element.getAttribute("aria-label");
    if (nodeLabel) {
      return truncate(nodeLabel, 80);
    } else {
      const nodeToUseForLabel = element.querySelector("[alt], [aria-label]");
      if (nodeToUseForLabel) {
        return getNodeLabel(nodeToUseForLabel);
      }
    }
  }
  return null;
}
function getBoundingClientRect(element) {
  const realBoundingClientRect = window.__HTMLElementBoundingClientRect || window.HTMLElement.prototype.getBoundingClientRect;
  const rect = realBoundingClientRect.call(element);
  return {
    top: Math.round(rect.top),
    bottom: Math.round(rect.bottom),
    left: Math.round(rect.left),
    right: Math.round(rect.right),
    width: Math.round(rect.width),
    height: Math.round(rect.height)
  };
}
function wrapRequestIdleCallback(cpuSlowdownMultiplier) {
  const safetyAllowanceMs = 10;
  const maxExecutionTimeMs = Math.floor((50 - safetyAllowanceMs) / cpuSlowdownMultiplier);
  const nativeRequestIdleCallback = window.requestIdleCallback;
  window.requestIdleCallback = (cb, options) => {
    const cbWrap = /* @__PURE__ */ __name((deadline) => {
      const start = Date.now();
      deadline.__timeRemaining = deadline.timeRemaining;
      deadline.timeRemaining = () => {
        const timeRemaining = deadline.__timeRemaining();
        return Math.min(
          timeRemaining,
          Math.max(0, maxExecutionTimeMs - (Date.now() - start))
        );
      };
      deadline.timeRemaining.toString = () => {
        return "function timeRemaining() { [native code] }";
      };
      cb(deadline);
    }, "cbWrap");
    return nativeRequestIdleCallback(cbWrap, options);
  };
  window.requestIdleCallback.toString = () => {
    return "function requestIdleCallback() { [native code] }";
  };
}
function getNodeDetails2(node) {
  if (!window.__lighthouseNodesDontTouchOrAllVarianceGoesAway) {
    window.__lighthouseNodesDontTouchOrAllVarianceGoesAway = /* @__PURE__ */ new Map();
  }
  let elem = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
  if (!elem && node instanceof ShadowRoot) {
    elem = node.host;
  }
  if (!elem) return null;
  const element = (
    /** @type {Element} */
    elem
  );
  const selector = getNodeSelector(element);
  let lhId = window.__lighthouseNodesDontTouchOrAllVarianceGoesAway.get(element);
  if (!lhId) {
    lhId = [
      window.__lighthouseExecutionContextUniqueIdentifier === void 0 ? "page" : window.__lighthouseExecutionContextUniqueIdentifier,
      window.__lighthouseNodesDontTouchOrAllVarianceGoesAway.size,
      element.tagName
    ].join("-");
    window.__lighthouseNodesDontTouchOrAllVarianceGoesAway.set(element, lhId);
  }
  const details = {
    lhId,
    devtoolsNodePath: getNodePath(element),
    selector,
    boundingRect: getBoundingClientRect(element),
    snippet: getOuterHTMLSnippet(element),
    nodeLabel: getNodeLabel(element) || selector
  };
  return details;
}
function truncate(string, characterLimit) {
  return Util.truncate(string, characterLimit);
}
function isBundledEnvironment() {
  if (global.isDevtools || global.isLightrider) return true;
  const require5 = createRequire({ url: "core/lib/page-functions.js" }.url);
  try {
    require5.resolve("lighthouse-logger");
    return false;
  } catch (err) {
    return true;
  }
}
function createEsbuildFunctionWrapper() {
  if (!isBundledEnvironment()) {
    return "";
  }
  const functionAsString = (() => {
    const a = /* @__PURE__ */ __name(() => {
    }, "a");
  }).toString().replace("/* @__PURE__ */", "");
  const functionStringMatch = functionAsString.match(/=\s*([\w_]+)\(/);
  if (!functionStringMatch) {
    throw new Error("Could not determine esbuild function wrapper name");
  }
  const esbuildFunctionWrapper = /* @__PURE__ */ __name((fn, value) => Object.defineProperty(fn, "name", { value, configurable: true }), "esbuildFunctionWrapper");
  const wrapperFnName = functionStringMatch[1];
  return `let ${wrapperFnName}=${esbuildFunctionWrapper}`;
}
function getRuntimeFunctionName(fn) {
  const match = fn.toString().match(/function ([\w$]+)/);
  if (!match) throw new Error(`could not find function name for: ${fn}`);
  return match[1];
}
var esbuildFunctionWrapperString, names, getNodeLabelRawString, getOuterHTMLSnippetRawString, getNodeDetailsRawString, pageFunctions;
var init_page_functions = __esm({
  "core/lib/page-functions.js"() {
    "use strict";
    init_process_global();
    init_module();
    init_util();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(wrapRuntimeEvalErrorInBrowser, "wrapRuntimeEvalErrorInBrowser");
    __name(getElementsInDocument2, "getElementsInDocument");
    __name(getOuterHTMLSnippet, "getOuterHTMLSnippet");
    __name(computeBenchmarkIndex, "computeBenchmarkIndex");
    __name(getNodePath, "getNodePath");
    __name(getNodeSelector, "getNodeSelector");
    __name(isPositionFixed, "isPositionFixed");
    __name(getNodeLabel, "getNodeLabel");
    __name(getBoundingClientRect, "getBoundingClientRect");
    __name(wrapRequestIdleCallback, "wrapRequestIdleCallback");
    __name(getNodeDetails2, "getNodeDetails");
    __name(truncate, "truncate");
    __name(isBundledEnvironment, "isBundledEnvironment");
    esbuildFunctionWrapperString = createEsbuildFunctionWrapper();
    __name(createEsbuildFunctionWrapper, "createEsbuildFunctionWrapper");
    __name(getRuntimeFunctionName, "getRuntimeFunctionName");
    names = {
      truncate: getRuntimeFunctionName(truncate),
      getNodeLabel: getRuntimeFunctionName(getNodeLabel),
      getOuterHTMLSnippet: getRuntimeFunctionName(getOuterHTMLSnippet),
      getNodeDetails: getRuntimeFunctionName(getNodeDetails2)
    };
    truncate.toString = () => `function ${names.truncate}(string, characterLimit) {
  const Util = { ${Util.truncate} };
  return Util.truncate(string, characterLimit);
}`;
    getNodeLabelRawString = getNodeLabel.toString();
    getNodeLabel.toString = () => `function ${names.getNodeLabel}(element) {
  ${truncate};
  return (${getNodeLabelRawString})(element);
}`;
    getOuterHTMLSnippetRawString = getOuterHTMLSnippet.toString();
    getOuterHTMLSnippet.toString = () => `function ${names.getOuterHTMLSnippet}(element, ignoreAttrs = [], snippetCharacterLimit = 500) {
  ${truncate};
  return (${getOuterHTMLSnippetRawString})(element, ignoreAttrs, snippetCharacterLimit);
}`;
    getNodeDetailsRawString = getNodeDetails2.toString();
    getNodeDetails2.toString = () => `function ${names.getNodeDetails}(element) {
  ${truncate};
  ${getNodePath};
  ${getNodeSelector};
  ${getBoundingClientRect};
  ${getOuterHTMLSnippetRawString};
  ${getNodeLabelRawString};
  return (${getNodeDetailsRawString})(element);
}`;
    pageFunctions = {
      wrapRuntimeEvalErrorInBrowser,
      getElementsInDocument: getElementsInDocument2,
      getOuterHTMLSnippet,
      computeBenchmarkIndex,
      getNodeDetails: getNodeDetails2,
      getNodePath,
      getNodeSelector,
      getNodeLabel,
      isPositionFixed,
      wrapRequestIdleCallback,
      getBoundingClientRect,
      truncate,
      esbuildFunctionWrapperString,
      getRuntimeFunctionName
    };
  }
});

// core/gather/gatherers/accessibility.js
var accessibility_exports = {};
__export(accessibility_exports, {
  default: () => accessibility_default
});
async function runA11yChecks() {
  const axe = window.axe;
  const application = `lighthouse-${Math.random()}`;
  axe.configure({
    branding: {
      application
    },
    noHtml: true
  });
  const axeResults = await axe.run(document, {
    elementRef: true,
    runOnly: {
      type: "tag",
      values: [
        "wcag2a",
        "wcag2aa"
      ]
    },
    // resultTypes doesn't limit the output of the axeResults object. Instead, if it's defined,
    // some expensive element identification is done only for the respective types. https://github.com/dequelabs/axe-core/blob/f62f0cf18f7b69b247b0b6362cf1ae71ffbf3a1b/lib/core/reporters/helpers/process-aggregate.js#L61-L97
    resultTypes: ["violations", "inapplicable"],
    rules: {
      // Consider http://go/prcpg for expert review of the aXe rules.
      "accesskeys": { enabled: true },
      "area-alt": { enabled: false },
      "aria-allowed-role": { enabled: true },
      "aria-braille-equivalent": { enabled: false },
      "aria-conditional-attr": { enabled: true },
      "aria-deprecated-role": { enabled: true },
      "aria-dialog-name": { enabled: true },
      "aria-prohibited-attr": { enabled: true },
      "aria-roledescription": { enabled: false },
      "aria-treeitem-name": { enabled: true },
      "aria-text": { enabled: true },
      "autocomplete-valid": { enabled: true },
      "audio-caption": { enabled: false },
      "blink": { enabled: false },
      "duplicate-id": { enabled: false },
      "empty-heading": { enabled: true },
      "frame-focusable-content": { enabled: false },
      "frame-title-unique": { enabled: false },
      "heading-order": { enabled: true },
      "html-xml-lang-mismatch": { enabled: true },
      "identical-links-same-purpose": { enabled: true },
      "image-redundant-alt": { enabled: true },
      "input-button-name": { enabled: true },
      "label-content-name-mismatch": { enabled: true },
      "landmark-one-main": { enabled: true },
      "link-in-text-block": { enabled: true },
      "marquee": { enabled: false },
      "meta-viewport": { enabled: true },
      // https://github.com/dequelabs/axe-core/issues/2958
      "nested-interactive": { enabled: false },
      "no-autoplay-audio": { enabled: false },
      "presentation-role-conflict": { enabled: true },
      "role-img-alt": { enabled: false },
      "scrollable-region-focusable": { enabled: false },
      "select-name": { enabled: true },
      "server-side-image-map": { enabled: false },
      "skip-link": { enabled: true },
      // https://github.com/GoogleChrome/lighthouse/issues/16163
      "summary-name": { enabled: false },
      "svg-img-alt": { enabled: true },
      "tabindex": { enabled: true },
      "table-duplicate-name": { enabled: true },
      "table-fake-caption": { enabled: true },
      "target-size": { enabled: true },
      "td-has-header": { enabled: true }
    }
  });
  document.documentElement.scrollTop = 0;
  return {
    violations: axeResults.violations.map(createAxeRuleResultArtifact),
    incomplete: axeResults.incomplete.map(createAxeRuleResultArtifact),
    notApplicable: axeResults.inapplicable.map((result) => ({ id: result.id })),
    // FYI: inapplicable => notApplicable!
    passes: axeResults.passes.map((result) => ({ id: result.id })),
    version: axeResults.testEngine.version
  };
}
async function runA11yChecksAndResetScroll() {
  const originalScrollPosition = {
    x: window.scrollX,
    y: window.scrollY
  };
  try {
    return await runA11yChecks();
  } finally {
    window.scrollTo(originalScrollPosition.x, originalScrollPosition.y);
  }
}
function createAxeRuleResultArtifact(result) {
  const nodes = result.nodes.map((node) => {
    const { target, failureSummary, element } = node;
    const nodeDetails = getNodeDetails(
      /** @type {HTMLElement} */
      element
    );
    const relatedNodeElements = /* @__PURE__ */ new Set();
    const impactToNumber = /* @__PURE__ */ __name((impact) => [null, "minor", "moderate", "serious", "critical"].indexOf(impact), "impactToNumber");
    const checkResults = [...node.any, ...node.all, ...node.none].sort((a, b) => impactToNumber(b.impact) - impactToNumber(a.impact));
    for (const checkResult of checkResults) {
      for (const relatedNode of checkResult.relatedNodes || []) {
        const relatedElement = relatedNode.element;
        if (relatedNodeElements.size >= 3) break;
        if (!relatedElement) continue;
        if (element === relatedElement) continue;
        relatedNodeElements.add(relatedElement);
      }
    }
    const relatedNodeDetails = [...relatedNodeElements].map(getNodeDetails);
    return {
      target,
      failureSummary,
      node: nodeDetails,
      relatedNodes: relatedNodeDetails
    };
  });
  const resultError = result.error;
  let error;
  if (resultError instanceof Error) {
    error = {
      name: resultError.name,
      message: resultError.message
    };
  }
  return {
    id: result.id,
    impact: result.impact || void 0,
    tags: result.tags,
    nodes,
    error,
    help: result.help,
    description: result.description
  };
}
var Accessibility, accessibility_default;
var init_accessibility = __esm({
  "core/gather/gatherers/accessibility.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_axe();
    init_page_functions();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(runA11yChecks, "runA11yChecks");
    __name(runA11yChecksAndResetScroll, "runA11yChecksAndResetScroll");
    __name(createAxeRuleResultArtifact, "createAxeRuleResultArtifact");
    Accessibility = class extends base_gatherer_default {
      static {
        __name(this, "Accessibility");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      static pageFns = {
        runA11yChecks,
        createAxeRuleResultArtifact
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts.Accessibility>}
       */
      getArtifact(passContext) {
        const driver = passContext.driver;
        return driver.executionContext.evaluate(runA11yChecksAndResetScroll, {
          args: [],
          useIsolation: true,
          deps: [
            axeSource,
            pageFunctions.getNodeDetails,
            createAxeRuleResultArtifact,
            runA11yChecks
          ]
        });
      }
    };
    accessibility_default = Accessibility;
  }
});

// core/gather/gatherers/agentic/llms-txt.js
var llms_txt_exports = {};
__export(llms_txt_exports, {
  default: () => llms_txt_default
});
var LlmsTxt, llms_txt_default;
var init_llms_txt = __esm({
  "core/gather/gatherers/agentic/llms-txt.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    LlmsTxt = class extends base_gatherer_default {
      static {
        __name(this, "LlmsTxt");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts['LlmsTxt']>}
       */
      async getArtifact(passContext) {
        const { finalDisplayedUrl } = passContext.baseArtifacts.URL;
        const llmUrl = new URL("/llms.txt", finalDisplayedUrl).href;
        return passContext.driver.fetcher.fetchResource(llmUrl).catch((err) => ({ status: null, content: null, errorMessage: err.message }));
      }
    };
    llms_txt_default = LlmsTxt;
  }
});

// core/gather/driver/dom.js
function handlePotentialMissingNodeError(err) {
  if (/No node.*found/.test(err.message) || /Node.*does not belong to the document/.test(err.message)) {
    return void 0;
  }
  throw err;
}
async function resolveNodeIdToObjectId(session, backendNodeId) {
  try {
    const resolveNodeResponse = await session.sendCommand("DOM.resolveNode", { backendNodeId });
    return resolveNodeResponse.object.objectId;
  } catch (err) {
    return handlePotentialMissingNodeError(err);
  }
}
async function resolveDevtoolsNodePathToObjectId(session, path7) {
  try {
    const { nodeId } = await session.sendCommand("DOM.pushNodeByPathToFrontend", { path: path7 });
    const { object: { objectId } } = await session.sendCommand("DOM.resolveNode", { nodeId });
    return objectId;
  } catch (err) {
    return handlePotentialMissingNodeError(err);
  }
}
var init_dom = __esm({
  "core/gather/driver/dom.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(handlePotentialMissingNodeError, "handlePotentialMissingNodeError");
    __name(resolveNodeIdToObjectId, "resolveNodeIdToObjectId");
    __name(resolveDevtoolsNodePathToObjectId, "resolveDevtoolsNodePathToObjectId");
  }
});

// core/gather/gatherers/anchor-elements.js
var anchor_elements_exports = {};
__export(anchor_elements_exports, {
  default: () => anchor_elements_default
});
function collectAnchorElements() {
  const resolveURLOrEmpty = /* @__PURE__ */ __name((url) => {
    try {
      return new URL(url, window.location.href).href;
    } catch (_) {
      return "";
    }
  }, "resolveURLOrEmpty");
  function getTruncatedOnclick(node) {
    const onclick = node.getAttribute("onclick") || "";
    return onclick.slice(0, 1024);
  }
  __name(getTruncatedOnclick, "getTruncatedOnclick");
  function getLangOfInnerText(node) {
    let curNodeLang = null;
    for (const child of node.querySelectorAll("*")) {
      if (!child.textContent) continue;
      const childLang = child.closest("[lang]")?.getAttribute("lang");
      if (!childLang) continue;
      if (!curNodeLang) {
        curNodeLang = childLang;
        continue;
      }
      if (curNodeLang.split("-")[0] !== childLang.split("-")[0]) {
        return null;
      }
    }
    return curNodeLang ?? node.closest("[lang]")?.getAttribute("lang") ?? null;
  }
  __name(getLangOfInnerText, "getLangOfInnerText");
  const anchorElements = getElementsInDocument("a");
  const langElements = getElementsInDocument("[lang]");
  const documentHasSingleLang = langElements.length === 1 && (langElements[0].nodeName === "BODY" || langElements[0].nodeName === "HTML");
  const singleLang = documentHasSingleLang ? langElements[0].getAttribute("lang") : null;
  return anchorElements.map((node) => {
    if (node instanceof HTMLAnchorElement) {
      return {
        href: node.href,
        rawHref: node.getAttribute("href") || "",
        onclick: getTruncatedOnclick(node),
        role: node.getAttribute("role") || "",
        name: node.name,
        text: node.innerText,
        // we don't want to return hidden text, so use innerText
        textLang: singleLang ?? getLangOfInnerText(node) ?? void 0,
        rel: node.rel,
        target: node.target,
        id: node.getAttribute("id") || "",
        attributeNames: node.getAttributeNames(),
        // @ts-expect-error - getNodeDetails put into scope via stringification
        node: getNodeDetails(node)
      };
    }
    return {
      href: resolveURLOrEmpty(node.href.baseVal),
      rawHref: node.getAttribute("href") || "",
      onclick: getTruncatedOnclick(node),
      role: node.getAttribute("role") || "",
      text: node.textContent || "",
      textLang: singleLang ?? getLangOfInnerText(node) ?? void 0,
      rel: "",
      target: node.target.baseVal || "",
      id: node.getAttribute("id") || "",
      attributeNames: node.getAttributeNames(),
      // @ts-expect-error - getNodeDetails put into scope via stringification
      node: getNodeDetails(node)
    };
  });
}
async function getEventListeners(session, devtoolsNodePath) {
  const objectId = await resolveDevtoolsNodePathToObjectId(session, devtoolsNodePath);
  if (!objectId) return [];
  const response = await session.sendCommand("DOMDebugger.getEventListeners", {
    objectId
  });
  return response.listeners.map(({ type }) => ({ type }));
}
var AnchorElements, anchor_elements_default;
var init_anchor_elements = __esm({
  "core/gather/gatherers/anchor-elements.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_page_functions();
    init_dom();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(collectAnchorElements, "collectAnchorElements");
    __name(getEventListeners, "getEventListeners");
    AnchorElements = class extends base_gatherer_default {
      static {
        __name(this, "AnchorElements");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts['AnchorElements']>}
       */
      async getArtifact(passContext) {
        const session = passContext.driver.defaultSession;
        const anchors = await passContext.driver.executionContext.evaluate(collectAnchorElements, {
          args: [],
          useIsolation: true,
          deps: [
            pageFunctions.getElementsInDocument,
            pageFunctions.getNodeDetails
          ]
        });
        await session.sendCommand("DOM.enable");
        await session.sendCommand("DOM.getDocument", { depth: -1, pierce: true });
        const anchorsWithEventListeners = anchors.map((anchor) => {
          return getEventListeners(session, anchor.node.devtoolsNodePath).then((listeners) => {
            return {
              ...anchor,
              listeners
            };
          });
        });
        const result = await Promise.all(anchorsWithEventListeners);
        await session.sendCommand("DOM.disable");
        return result;
      }
    };
    anchor_elements_default = AnchorElements;
  }
});

// core/gather/gatherers/console-messages.js
var console_messages_exports = {};
__export(console_messages_exports, {
  default: () => console_messages_default
});
function remoteObjectToString(obj) {
  if (typeof obj.value !== "undefined" || obj.type === "undefined") {
    return String(obj.value);
  }
  if (typeof obj.description === "string" && obj.description !== obj.className) {
    return obj.description;
  }
  const type = obj.subtype || obj.type;
  const className = obj.className || "Object";
  return `[${type} ${className}]`;
}
var ConsoleMessages, console_messages_default;
var init_console_messages = __esm({
  "core/gather/gatherers/console-messages.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(remoteObjectToString, "remoteObjectToString");
    ConsoleMessages = class extends base_gatherer_default {
      static {
        __name(this, "ConsoleMessages");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["timespan", "navigation"]
      };
      constructor() {
        super();
        this._logEntries = [];
        this._onConsoleAPICalled = this.onConsoleAPICalled.bind(this);
        this._onExceptionThrown = this.onExceptionThrown.bind(this);
        this._onLogEntryAdded = this.onLogEntry.bind(this);
      }
      /**
       * Handles events for when a script invokes a console API.
       * @param {LH.Crdp.Runtime.ConsoleAPICalledEvent} event
       */
      onConsoleAPICalled(event) {
        const { type } = event;
        if (type !== "warning" && type !== "error") {
          return;
        }
        const args = event.args || [];
        const text = args.map(remoteObjectToString).join(" ");
        if (!text && !event.stackTrace) {
          return;
        }
        const { url, lineNumber, columnNumber } = event.stackTrace?.callFrames[0] || {};
        const consoleMessage = {
          eventType: "consoleAPI",
          source: type === "warning" ? "console.warn" : "console.error",
          level: type,
          text,
          stackTrace: event.stackTrace,
          timestamp: event.timestamp,
          url,
          lineNumber,
          columnNumber
        };
        this._logEntries.push(consoleMessage);
      }
      /**
       * Handles exception thrown events.
       * @param {LH.Crdp.Runtime.ExceptionThrownEvent} event
       */
      onExceptionThrown(event) {
        const text = event.exceptionDetails.exception ? event.exceptionDetails.exception.description : event.exceptionDetails.text;
        if (!text) {
          return;
        }
        const consoleMessage = {
          eventType: "exception",
          source: "exception",
          level: "error",
          text,
          stackTrace: event.exceptionDetails.stackTrace,
          timestamp: event.timestamp,
          url: event.exceptionDetails.url,
          scriptId: event.exceptionDetails.scriptId,
          lineNumber: event.exceptionDetails.lineNumber,
          columnNumber: event.exceptionDetails.columnNumber
        };
        this._logEntries.push(consoleMessage);
      }
      /**
       * Handles browser reports logged to the console, including interventions,
       * deprecations, violations, and more.
       * @param {LH.Crdp.Log.EntryAddedEvent} event
       */
      onLogEntry(event) {
        const { source, level, text, stackTrace, timestamp, url, lineNumber } = event.entry;
        const firstStackFrame = event.entry.stackTrace?.callFrames[0];
        this._logEntries.push({
          eventType: "protocolLog",
          source,
          level,
          text,
          stackTrace,
          timestamp,
          url,
          scriptId: firstStackFrame?.scriptId,
          lineNumber,
          columnNumber: firstStackFrame?.columnNumber
        });
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async startInstrumentation(passContext) {
        const session = passContext.driver.defaultSession;
        session.on("Log.entryAdded", this._onLogEntryAdded);
        await session.sendCommand("Log.enable");
        await session.sendCommand("Log.startViolationsReport", {
          config: [{ name: "discouragedAPIUse", threshold: -1 }]
        });
        session.on("Runtime.consoleAPICalled", this._onConsoleAPICalled);
        session.on("Runtime.exceptionThrown", this._onExceptionThrown);
        await session.sendCommand("Runtime.enable");
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<void>}
       */
      async stopInstrumentation({ driver }) {
        await driver.defaultSession.sendCommand("Log.stopViolationsReport");
        await driver.defaultSession.off("Log.entryAdded", this._onLogEntryAdded);
        await driver.defaultSession.sendCommand("Log.disable");
        await driver.defaultSession.off("Runtime.consoleAPICalled", this._onConsoleAPICalled);
        await driver.defaultSession.off("Runtime.exceptionThrown", this._onExceptionThrown);
        await driver.defaultSession.sendCommand("Runtime.disable");
      }
      /**
       * @return {Promise<LH.Artifacts['ConsoleMessages']>}
       */
      async getArtifact() {
        return this._logEntries;
      }
    };
    console_messages_default = ConsoleMessages;
  }
});

// core/gather/gatherers/devtools-log.js
var devtools_log_exports = {};
__export(devtools_log_exports, {
  DevtoolsMessageLog: () => DevtoolsMessageLog,
  default: () => devtools_log_default
});
var DevtoolsLog, DevtoolsMessageLog, devtools_log_default;
var init_devtools_log = __esm({
  "core/gather/gatherers/devtools-log.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    DevtoolsLog = class _DevtoolsLog extends base_gatherer_default {
      static {
        __name(this, "DevtoolsLog");
      }
      static symbol = Symbol("DevtoolsLog");
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        symbol: _DevtoolsLog.symbol,
        supportedModes: ["timespan", "navigation"]
      };
      constructor() {
        super();
        this._messageLog = new DevtoolsMessageLog(/^(Page|Network|Target|Runtime)\./);
        this._onProtocolMessage = (e) => this._messageLog.record(e);
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async startSensitiveInstrumentation({ driver }) {
        this._messageLog.reset();
        this._messageLog.beginRecording();
        driver.targetManager.on("protocolevent", this._onProtocolMessage);
        await driver.defaultSession.sendCommand("Page.enable");
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async stopSensitiveInstrumentation({ driver }) {
        this._messageLog.endRecording();
        driver.targetManager.off("protocolevent", this._onProtocolMessage);
      }
      /**
       * @return {LH.Artifacts['DevtoolsLog']}
       */
      getDebugData() {
        return this._messageLog.messages;
      }
      /**
       * @return {Promise<LH.Artifacts['DevtoolsLog']>}
       */
      async getArtifact() {
        return this._messageLog.messages;
      }
    };
    DevtoolsMessageLog = class {
      static {
        __name(this, "DevtoolsMessageLog");
      }
      /**
       * @param {RegExp=} regexFilter
       */
      constructor(regexFilter) {
        this._filter = regexFilter;
        this._messages = [];
        this._isRecording = false;
      }
      /**
       * @return {LH.DevtoolsLog}
       */
      get messages() {
        return this._messages;
      }
      reset() {
        this._messages = [];
      }
      beginRecording() {
        this._isRecording = true;
      }
      endRecording() {
        this._isRecording = false;
      }
      /**
       * Records a message if method matches filter and recording has been started.
       * @param {LH.Protocol.RawEventMessage} message
       */
      record(message) {
        if (!this._isRecording) return;
        if (typeof message.method !== "string") return;
        if (this._filter && !this._filter.test(message.method)) return;
        this._messages.push(message);
      }
    };
    devtools_log_default = DevtoolsLog;
  }
});

// core/gather/gatherers/dobetterweb/doctype.js
var doctype_exports = {};
__export(doctype_exports, {
  default: () => doctype_default
});
function getDoctype() {
  if (!document.doctype) {
    return null;
  }
  const documentCompatMode = document.compatMode;
  const { name, publicId, systemId } = document.doctype;
  return { name, publicId, systemId, documentCompatMode };
}
var Doctype, doctype_default;
var init_doctype = __esm({
  "core/gather/gatherers/dobetterweb/doctype.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(getDoctype, "getDoctype");
    Doctype = class extends base_gatherer_default {
      static {
        __name(this, "Doctype");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts['Doctype']>}
       */
      getArtifact(passContext) {
        const driver = passContext.driver;
        return driver.executionContext.evaluate(getDoctype, {
          args: [],
          useIsolation: true
        });
      }
    };
    doctype_default = Doctype;
  }
});

// core/gather/gatherers/image-elements.js
var image_elements_exports = {};
__export(image_elements_exports, {
  default: () => image_elements_default
});
function getClientRect(element) {
  const clientRect = element.getBoundingClientRect();
  return {
    // Just grab the DOMRect properties we want, excluding x/y/width/height
    top: clientRect.top,
    bottom: clientRect.bottom,
    left: clientRect.left,
    right: clientRect.right
  };
}
function getPosition(element, computedStyle) {
  if (element.parentElement && element.parentElement.tagName === "PICTURE") {
    const parentStyle = window.getComputedStyle(element.parentElement);
    return parentStyle.getPropertyValue("position");
  }
  return computedStyle.getPropertyValue("position");
}
function getHTMLImages(allElements) {
  const allImageElements = (
    /** @type {Array<HTMLImageElement>} */
    allElements.filter((element) => {
      return element.localName === "img";
    })
  );
  return allImageElements.map((element) => {
    const computedStyle = window.getComputedStyle(element);
    const isPicture = !!element.parentElement && element.parentElement.tagName === "PICTURE";
    const canTrustNaturalDimensions = !isPicture && !element.srcset;
    return {
      // currentSrc used over src to get the url as determined by the browser
      // after taking into account srcset/media/sizes/etc.
      src: element.currentSrc,
      srcset: element.srcset,
      displayedWidth: element.width,
      displayedHeight: element.height,
      clientRect: getClientRect(element),
      attributeWidth: element.getAttribute("width"),
      attributeHeight: element.getAttribute("height"),
      naturalDimensions: canTrustNaturalDimensions ? { width: element.naturalWidth, height: element.naturalHeight } : void 0,
      cssRules: void 0,
      // this will get overwritten below
      computedStyles: {
        position: getPosition(element, computedStyle),
        objectFit: computedStyle.getPropertyValue("object-fit"),
        imageRendering: computedStyle.getPropertyValue("image-rendering")
      },
      isCss: false,
      isPicture,
      loading: element.loading,
      isInShadowDOM: element.getRootNode() instanceof ShadowRoot,
      fetchPriority: element.fetchPriority,
      // @ts-expect-error - getNodeDetails put into scope via stringification
      node: getNodeDetails(element)
    };
  });
}
function getCSSImages(allElements) {
  const CSS_URL_REGEX = /^url\("([^"]+)"\)$/;
  const images = [];
  for (const element of allElements) {
    const style = window.getComputedStyle(element);
    if (!style.backgroundImage || !CSS_URL_REGEX.test(style.backgroundImage)) continue;
    const imageMatch = style.backgroundImage.match(CSS_URL_REGEX);
    const url = imageMatch[1];
    images.push({
      src: url,
      srcset: "",
      displayedWidth: element.clientWidth,
      displayedHeight: element.clientHeight,
      clientRect: getClientRect(element),
      attributeWidth: null,
      attributeHeight: null,
      naturalDimensions: void 0,
      cssEffectiveRules: void 0,
      computedStyles: {
        position: getPosition(element, style),
        objectFit: "",
        imageRendering: style.getPropertyValue("image-rendering")
      },
      isCss: true,
      isPicture: false,
      isInShadowDOM: element.getRootNode() instanceof ShadowRoot,
      // @ts-expect-error - getNodeDetails put into scope via stringification
      node: getNodeDetails(element)
    });
  }
  return images;
}
function collectImageElementInfo() {
  const allElements = getElementsInDocument();
  return getHTMLImages(allElements).concat(getCSSImages(allElements));
}
function determineNaturalSize(url) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.addEventListener("error", (_) => reject(new Error("determineNaturalSize failed img load")));
    img.addEventListener("load", () => {
      resolve({
        naturalWidth: img.naturalWidth,
        naturalHeight: img.naturalHeight
      });
    });
    img.src = url;
  });
}
function findSizeDeclaration(rule, property) {
  if (!rule || !rule.cssProperties) return;
  const definedProp = rule.cssProperties.find(({ name }) => name === property);
  if (!definedProp) return;
  return definedProp.value;
}
function findMostSpecificMatchedCSSRule(matchedCSSRules = [], isDeclarationOfInterest) {
  let mostSpecificRule;
  for (let i = matchedCSSRules.length - 1; i >= 0; i--) {
    if (isDeclarationOfInterest(matchedCSSRules[i].rule.style)) {
      mostSpecificRule = matchedCSSRules[i].rule;
      break;
    }
  }
  if (mostSpecificRule) {
    return {
      type: "Regular",
      ...mostSpecificRule.style,
      parentRule: {
        origin: mostSpecificRule.origin,
        selectors: mostSpecificRule.selectorList.selectors
      }
    };
  }
}
function findMostSpecificCSSRule(matchedCSSRules, property) {
  const isDeclarationofInterest = /* @__PURE__ */ __name((declaration) => findSizeDeclaration(declaration, property), "isDeclarationofInterest");
  const rule = findMostSpecificMatchedCSSRule(matchedCSSRules, isDeclarationofInterest);
  if (!rule) return;
  return findSizeDeclaration(rule, property);
}
function getEffectiveSizingRule({ attributesStyle, inlineStyle, matchedCSSRules }, property) {
  const inlineRule = findSizeDeclaration(inlineStyle, property);
  if (inlineRule) return inlineRule;
  const attributeRule = findSizeDeclaration(attributesStyle, property);
  if (attributeRule) return attributeRule;
  const matchedRule = findMostSpecificCSSRule(matchedCSSRules, property);
  if (matchedRule) return matchedRule;
  return null;
}
function getPixelArea(element) {
  if (element.naturalDimensions) {
    return element.naturalDimensions.height * element.naturalDimensions.width;
  }
  return element.displayedHeight * element.displayedWidth;
}
var ImageElements, image_elements_default;
var init_image_elements = __esm({
  "core/gather/gatherers/image-elements.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_base_gatherer();
    init_page_functions();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(getClientRect, "getClientRect");
    __name(getPosition, "getPosition");
    __name(getHTMLImages, "getHTMLImages");
    __name(getCSSImages, "getCSSImages");
    __name(collectImageElementInfo, "collectImageElementInfo");
    __name(determineNaturalSize, "determineNaturalSize");
    __name(findSizeDeclaration, "findSizeDeclaration");
    __name(findMostSpecificMatchedCSSRule, "findMostSpecificMatchedCSSRule");
    __name(findMostSpecificCSSRule, "findMostSpecificCSSRule");
    __name(getEffectiveSizingRule, "getEffectiveSizingRule");
    __name(getPixelArea, "getPixelArea");
    ImageElements = class extends base_gatherer_default {
      static {
        __name(this, "ImageElements");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "timespan", "navigation"]
      };
      constructor() {
        super();
        this._naturalSizeCache = /* @__PURE__ */ new Map();
      }
      /**
       * @param {LH.Gatherer.Driver} driver
       * @param {LH.Artifacts.ImageElement} element
       */
      async fetchElementWithSizeInformation(driver, element) {
        const url = element.src;
        let size = this._naturalSizeCache.get(url);
        if (!size) {
          try {
            driver.defaultSession.setNextProtocolTimeout(250);
            size = await driver.executionContext.evaluate(determineNaturalSize, {
              args: [url],
              useIsolation: true
            });
            this._naturalSizeCache.set(url, size);
          } catch (_) {
          }
        }
        if (!size) return;
        element.naturalDimensions = { width: size.naturalWidth, height: size.naturalHeight };
      }
      /**
       * Images might be sized via CSS. In order to compute unsized-images failures, we need to collect
       * matched CSS rules to see if this is the case.
       * @url http://go/dwoqq (googlers only)
       * @param {LH.Gatherer.ProtocolSession} session
       * @param {string} devtoolsNodePath
       * @param {LH.Artifacts.ImageElement} element
       */
      async fetchSourceRules(session, devtoolsNodePath, element) {
        try {
          const { nodeId } = await session.sendCommand("DOM.pushNodeByPathToFrontend", {
            path: devtoolsNodePath
          });
          if (!nodeId) return;
          const matchedRules = await session.sendCommand("CSS.getMatchedStylesForNode", {
            nodeId
          });
          const width = getEffectiveSizingRule(matchedRules, "width");
          const height = getEffectiveSizingRule(matchedRules, "height");
          const aspectRatio2 = getEffectiveSizingRule(matchedRules, "aspect-ratio");
          element.cssEffectiveRules = { width, height, aspectRatio: aspectRatio2 };
        } catch (err) {
          if (/No node.*found/.test(err.message)) return;
          throw err;
        }
      }
      /**
       *
       * @param {LH.Gatherer.Driver} driver
       * @param {LH.Artifacts.ImageElement[]} elements
       */
      async collectExtraDetails(driver, elements) {
        let reachedGatheringBudget = false;
        setTimeout((_) => reachedGatheringBudget = true, 5e3);
        let skippedCount = 0;
        for (const element of elements) {
          if (reachedGatheringBudget) {
            skippedCount++;
            continue;
          }
          if (!element.isInShadowDOM && !element.isCss) {
            await this.fetchSourceRules(driver.defaultSession, element.node.devtoolsNodePath, element);
          }
          if (element.isPicture || element.isCss || element.srcset) {
            await this.fetchElementWithSizeInformation(driver, element);
          }
        }
        if (reachedGatheringBudget) {
          lighthouse_logger_default.warn("ImageElements", `Reached gathering budget of 5s. Skipped extra details for ${skippedCount}/${elements.length}`);
        }
      }
      /**
       * @param {LH.Gatherer.Context} context
       * @return {Promise<LH.Artifacts['ImageElements']>}
       */
      async getArtifact(context) {
        const session = context.driver.defaultSession;
        const executionContext = context.driver.executionContext;
        const elements = await executionContext.evaluate(collectImageElementInfo, {
          args: [],
          useIsolation: true,
          deps: [
            pageFunctions.getElementsInDocument,
            pageFunctions.getBoundingClientRect,
            pageFunctions.getNodeDetails,
            getClientRect,
            getPosition,
            getHTMLImages,
            getCSSImages
          ]
        });
        await Promise.all([
          session.sendCommand("DOM.enable"),
          session.sendCommand("CSS.enable"),
          session.sendCommand("DOM.getDocument", { depth: -1, pierce: true })
        ]);
        elements.sort((a, b) => getPixelArea(b) - getPixelArea(a));
        await this.collectExtraDetails(context.driver, elements);
        await Promise.all([
          session.sendCommand("DOM.disable"),
          session.sendCommand("CSS.disable")
        ]);
        return elements;
      }
    };
    image_elements_default = ImageElements;
  }
});

// core/gather/gatherers/inputs.js
var inputs_exports = {};
__export(inputs_exports, {
  default: () => inputs_default
});
function collectElements() {
  const inputArtifacts = [];
  const formElToArtifact = /* @__PURE__ */ new Map();
  const labelElToArtifact = /* @__PURE__ */ new Map();
  const formEls = getElementsInDocument("form");
  for (const formEl of formEls) {
    formElToArtifact.set(formEl, {
      id: formEl.id,
      name: formEl.name,
      autocomplete: formEl.autocomplete,
      // @ts-expect-error - getNodeDetails put into scope via stringification
      node: getNodeDetails(formEl),
      webMcpToolname: formEl.getAttribute("toolname"),
      webMcpTooldescription: formEl.getAttribute("tooldescription")
    });
  }
  const labelEls = getElementsInDocument("label");
  for (const labelEl of labelEls) {
    labelElToArtifact.set(labelEl, {
      for: labelEl.htmlFor,
      // @ts-expect-error - getNodeDetails put into scope via stringification
      node: getNodeDetails(labelEl)
    });
  }
  const inputEls = getElementsInDocument("textarea, input, select");
  for (const inputEl of inputEls) {
    const parentFormEl = inputEl.form;
    const parentFormIndex = parentFormEl ? [...formElToArtifact.keys()].indexOf(parentFormEl) : void 0;
    const labelIndices = [...inputEl.labels || []].map((labelEl) => {
      return [...labelElToArtifact.keys()].indexOf(labelEl);
    });
    let preventsPaste;
    if (!inputEl.readOnly) {
      preventsPaste = !inputEl.dispatchEvent(new ClipboardEvent("paste", { cancelable: true }));
    }
    inputArtifacts.push({
      parentFormIndex,
      labelIndices,
      id: inputEl.id,
      name: inputEl.name,
      type: inputEl.type,
      placeholder: inputEl instanceof HTMLSelectElement ? void 0 : inputEl.placeholder,
      autocomplete: {
        property: inputEl.autocomplete,
        attribute: inputEl.getAttribute("autocomplete"),
        // Requires `--enable-features=AutofillShowTypePredictions`.
        prediction: inputEl.getAttribute("autofill-prediction")
      },
      preventsPaste,
      // @ts-expect-error - getNodeDetails put into scope via stringification
      node: getNodeDetails(inputEl)
    });
  }
  return {
    inputs: inputArtifacts,
    forms: [...formElToArtifact.values()],
    labels: [...labelElToArtifact.values()]
  };
}
var Inputs, inputs_default;
var init_inputs = __esm({
  "core/gather/gatherers/inputs.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_page_functions();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(collectElements, "collectElements");
    Inputs = class extends base_gatherer_default {
      static {
        __name(this, "Inputs");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts['Inputs']>}
       */
      async getArtifact(passContext) {
        return passContext.driver.executionContext.evaluate(collectElements, {
          args: [],
          useIsolation: true,
          deps: [
            pageFunctions.getElementsInDocument,
            pageFunctions.getNodeDetails
          ]
        });
      }
    };
    inputs_default = Inputs;
  }
});

// core/gather/gatherers/inspector-issues.js
var inspector_issues_exports = {};
__export(inspector_issues_exports, {
  default: () => inspector_issues_default
});
var InspectorIssues, inspector_issues_default;
var init_inspector_issues = __esm({
  "core/gather/gatherers/inspector-issues.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_network_records();
    init_devtools_log();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    InspectorIssues = class extends base_gatherer_default {
      static {
        __name(this, "InspectorIssues");
      }
      /** @type {LH.Gatherer.GathererMeta<'DevtoolsLog'>} */
      meta = {
        supportedModes: ["timespan", "navigation"],
        dependencies: { DevtoolsLog: devtools_log_default.symbol }
      };
      constructor() {
        super();
        this._issues = [];
        this._onIssueAdded = this.onIssueAdded.bind(this);
      }
      /**
       * @param {LH.Crdp.Audits.IssueAddedEvent} entry
       */
      onIssueAdded(entry) {
        this._issues.push(entry.issue);
      }
      /**
       * @param {LH.Gatherer.Context} context
       */
      async startInstrumentation(context) {
        const session = context.driver.defaultSession;
        session.on("Audits.issueAdded", this._onIssueAdded);
        await session.sendCommand("Audits.enable");
      }
      /**
       * @param {LH.Gatherer.Context} context
       */
      async stopInstrumentation(context) {
        const session = context.driver.defaultSession;
        session.off("Audits.issueAdded", this._onIssueAdded);
        await session.sendCommand("Audits.disable");
      }
      /**
       * @param {LH.Gatherer.Context<'DevtoolsLog'>} context
       * @return {Promise<LH.Artifacts.InspectorIssues>}
       */
      async getArtifact(context) {
        const devtoolsLog = context.dependencies.DevtoolsLog;
        const networkRecords = await NetworkRecordsComputed.request(devtoolsLog, context);
        const artifact = {};
        for (const issue of this._issues) {
          const detailsKey = (
            /** @type {keyof LH.Crdp.Audits.InspectorIssueDetails} */
            Object.keys(issue.details)[0]
          );
          const details = issue.details[detailsKey];
          if (!details) {
            continue;
          }
          const artifactKey = (
            /** @type {LH.Artifacts.InspectorIssuesKeyToArtifactKey<typeof detailsKey>} */
            detailsKey.replace("Details", "")
          );
          const requestId = "request" in details && details.request && details.request.requestId;
          if (requestId) {
            if (networkRecords.find((req) => req.requestId === requestId)) {
              if (!artifact[artifactKey]) {
                artifact[artifactKey] = [];
              }
              artifact[artifactKey].push(details);
            }
          } else {
            if (!artifact[artifactKey]) {
              artifact[artifactKey] = [];
            }
            artifact[artifactKey].push(details);
          }
        }
        return artifact;
      }
    };
    inspector_issues_default = InspectorIssues;
  }
});

// node_modules/http-link-header/lib/link.js
var require_link = __commonJS({
  "node_modules/http-link-header/lib/link.js"(exports2, module2) {
    "use strict";
    init_process_global();
    var COMPATIBLE_ENCODING_PATTERN = /^utf-?8|ascii|utf-?16-?le|ucs-?2|base-?64|latin-?1$/i;
    var WS_TRIM_PATTERN = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
    var WS_CHAR_PATTERN = /\s|\uFEFF|\xA0/;
    var WS_FOLD_PATTERN = /\r?\n[\x20\x09]+/g;
    var DELIMITER_PATTERN = /[;,"]/;
    var WS_DELIMITER_PATTERN = /[;,"]|\s/;
    var TOKEN_PATTERN = /^[!#$%&'*+\-\.^_`|~\da-zA-Z]+$/;
    var STATE = {
      IDLE: 1 << 0,
      URI: 1 << 1,
      ATTR: 1 << 2
    };
    function trim(value) {
      return value.replace(WS_TRIM_PATTERN, "");
    }
    __name(trim, "trim");
    function hasWhitespace(value) {
      return WS_CHAR_PATTERN.test(value);
    }
    __name(hasWhitespace, "hasWhitespace");
    function skipWhitespace(value, offset) {
      while (hasWhitespace(value[offset])) {
        offset++;
      }
      return offset;
    }
    __name(skipWhitespace, "skipWhitespace");
    function needsQuotes(value) {
      return WS_DELIMITER_PATTERN.test(value) || !TOKEN_PATTERN.test(value);
    }
    __name(needsQuotes, "needsQuotes");
    function shallowCompareObjects(object1, object2) {
      return Object.keys(object1).length === Object.keys(object2).length && Object.keys(object1).every(
        (key) => key in object2 && object1[key] === object2[key]
      );
    }
    __name(shallowCompareObjects, "shallowCompareObjects");
    var Link = class _Link {
      static {
        __name(this, "Link");
      }
      /**
       * Link
       * @constructor
       * @param {String} [value]
       * @returns {Link}
       */
      constructor(value) {
        this.refs = [];
        if (value) {
          this.parse(value);
        }
      }
      /**
       * Get refs with given relation type
       * @param {String} value
       * @returns {Array<Object>}
       */
      rel(value) {
        var links = [];
        var type = value.toLowerCase();
        for (var i = 0; i < this.refs.length; i++) {
          if (this.refs[i].rel.toLowerCase() === type) {
            links.push(this.refs[i]);
          }
        }
        return links;
      }
      /**
       * Get refs where given attribute has a given value
       * @param {String} attr
       * @param {String} value
       * @returns {Array<Object>}
       */
      get(attr, value) {
        attr = attr.toLowerCase();
        var links = [];
        for (var i = 0; i < this.refs.length; i++) {
          if (this.refs[i][attr] === value) {
            links.push(this.refs[i]);
          }
        }
        return links;
      }
      /** Sets a reference. */
      set(link) {
        this.refs.push(link);
        return this;
      }
      /**
       * Sets a reference if a reference with similar properties isn’t already set.
       */
      setUnique(link) {
        if (!this.refs.some((ref) => shallowCompareObjects(ref, link))) {
          this.refs.push(link);
        }
        return this;
      }
      has(attr, value) {
        attr = attr.toLowerCase();
        for (var i = 0; i < this.refs.length; i++) {
          if (this.refs[i][attr] === value) {
            return true;
          }
        }
        return false;
      }
      parse(value, offset) {
        offset = offset || 0;
        value = offset ? value.slice(offset) : value;
        value = trim(value).replace(WS_FOLD_PATTERN, "");
        var state = STATE.IDLE;
        var length = value.length;
        var offset = 0;
        var ref = null;
        while (offset < length) {
          if (state === STATE.IDLE) {
            if (hasWhitespace(value[offset])) {
              offset++;
              continue;
            } else if (value[offset] === "<") {
              if (ref != null) {
                ref.rel != null ? this.refs.push(..._Link.expandRelations(ref)) : this.refs.push(ref);
              }
              var end = value.indexOf(">", offset);
              if (end === -1) throw new Error("Expected end of URI delimiter at offset " + offset);
              ref = { uri: value.slice(offset + 1, end) };
              offset = end;
              state = STATE.URI;
            } else {
              throw new Error('Unexpected character "' + value[offset] + '" at offset ' + offset);
            }
            offset++;
          } else if (state === STATE.URI) {
            if (hasWhitespace(value[offset])) {
              offset++;
              continue;
            } else if (value[offset] === ";") {
              state = STATE.ATTR;
              offset++;
            } else if (value[offset] === ",") {
              state = STATE.IDLE;
              offset++;
            } else {
              throw new Error('Unexpected character "' + value[offset] + '" at offset ' + offset);
            }
          } else if (state === STATE.ATTR) {
            if (value[offset] === ";" || hasWhitespace(value[offset])) {
              offset++;
              continue;
            }
            var end = value.indexOf("=", offset);
            if (end === -1) end = value.indexOf(";", offset);
            if (end === -1) end = value.length;
            var attr = trim(value.slice(offset, end)).toLowerCase();
            var attrValue = "";
            offset = end + 1;
            offset = skipWhitespace(value, offset);
            if (value[offset] === '"') {
              offset++;
              while (offset < length) {
                if (value[offset] === '"') {
                  offset++;
                  break;
                }
                if (value[offset] === "\\") {
                  offset++;
                }
                attrValue += value[offset];
                offset++;
              }
            } else {
              var end = offset + 1;
              while (!DELIMITER_PATTERN.test(value[end]) && end < length) {
                end++;
              }
              attrValue = value.slice(offset, end);
              offset = end;
            }
            if (ref[attr] && _Link.isSingleOccurenceAttr(attr)) {
            } else if (attr[attr.length - 1] === "*") {
              ref[attr] = _Link.parseExtendedValue(attrValue);
            } else {
              attrValue = attr === "type" ? attrValue.toLowerCase() : attrValue;
              if (ref[attr] != null) {
                if (Array.isArray(ref[attr])) {
                  ref[attr].push(attrValue);
                } else {
                  ref[attr] = [ref[attr], attrValue];
                }
              } else {
                ref[attr] = attrValue;
              }
            }
            switch (value[offset]) {
              case ",":
                state = STATE.IDLE;
                break;
              case ";":
                state = STATE.ATTR;
                break;
            }
            offset++;
          } else {
            throw new Error('Unknown parser state "' + state + '"');
          }
        }
        if (ref != null) {
          ref.rel != null ? this.refs.push(..._Link.expandRelations(ref)) : this.refs.push(ref);
        }
        ref = null;
        return this;
      }
      toString() {
        var refs = [];
        var link = "";
        var ref = null;
        for (var i = 0; i < this.refs.length; i++) {
          ref = this.refs[i];
          link = Object.keys(this.refs[i]).reduce(function(link2, attr) {
            if (attr === "uri") return link2;
            return link2 + "; " + _Link.formatAttribute(attr, ref[attr]);
          }, "<" + ref.uri + ">");
          refs.push(link);
        }
        return refs.join(", ");
      }
    };
    Link.isCompatibleEncoding = function(value) {
      return COMPATIBLE_ENCODING_PATTERN.test(value);
    };
    Link.parse = function(value, offset) {
      return new Link().parse(value, offset);
    };
    Link.isSingleOccurenceAttr = function(attr) {
      return attr === "rel" || attr === "type" || attr === "media" || attr === "title" || attr === "title*";
    };
    Link.isTokenAttr = function(attr) {
      return attr === "rel" || attr === "type" || attr === "anchor";
    };
    Link.escapeQuotes = function(value) {
      return value.replace(/"/g, '\\"');
    };
    Link.expandRelations = function(ref) {
      var rels = ref.rel.split(" ");
      return rels.map(function(rel) {
        var value = Object.assign({}, ref);
        value.rel = rel;
        return value;
      });
    };
    Link.parseExtendedValue = function(value) {
      var parts = /([^']+)?(?:'([^']*)')?(.+)/.exec(value);
      return {
        language: parts[2].toLowerCase(),
        encoding: Link.isCompatibleEncoding(parts[1]) ? null : parts[1].toLowerCase(),
        value: Link.isCompatibleEncoding(parts[1]) ? decodeURIComponent(parts[3]) : parts[3]
      };
    };
    Link.formatExtendedAttribute = function(attr, data31) {
      var encoding = (data31.encoding || "utf-8").toUpperCase();
      var language = data31.language || "en";
      var encodedValue = "";
      if (Buffer.isBuffer(data31.value) && Link.isCompatibleEncoding(encoding)) {
        encodedValue = data31.value.toString(encoding);
      } else if (Buffer.isBuffer(data31.value)) {
        encodedValue = data31.value.toString("hex").replace(/[0-9a-f]{2}/gi, "%$1");
      } else {
        encodedValue = encodeURIComponent(data31.value);
      }
      return attr + "=" + encoding + "'" + language + "'" + encodedValue;
    };
    Link.formatAttribute = function(attr, value) {
      if (Array.isArray(value)) {
        return value.map((item) => {
          return Link.formatAttribute(attr, item);
        }).join("; ");
      }
      if (attr[attr.length - 1] === "*" || typeof value !== "string") {
        return Link.formatExtendedAttribute(attr, value);
      }
      if (Link.isTokenAttr(attr)) {
        value = needsQuotes(value) ? '"' + Link.escapeQuotes(value) + '"' : Link.escapeQuotes(value);
      } else if (needsQuotes(value)) {
        value = encodeURIComponent(value);
        value = value.replace(/%20/g, " ").replace(/%2C/g, ",").replace(/%3B/g, ";");
        value = '"' + value + '"';
      }
      return attr + "=" + value;
    };
    module2.exports = Link;
  }
});

// core/computed/main-resource.js
var MainResource, MainResourceComputed;
var init_main_resource = __esm({
  "core/computed/main-resource.js"() {
    "use strict";
    init_process_global();
    init_lantern2();
    init_computed_artifact();
    init_network_records();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    MainResource = class {
      static {
        __name(this, "MainResource");
      }
      /**
       * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog}} data
       * @param {LH.Artifacts.ComputedContext} context
       * @return {Promise<LH.Artifacts.NetworkRequest>}
       */
      static async compute_(data31, context) {
        const { mainDocumentUrl } = data31.URL;
        if (!mainDocumentUrl) throw new Error("mainDocumentUrl must exist to get the main resource");
        const records = await NetworkRecordsComputed.request(data31.devtoolsLog, context);
        const mainResource = core_exports.NetworkAnalyzer.findLastDocumentForUrl(
          records,
          mainDocumentUrl
        );
        if (!mainResource) {
          throw new Error("Unable to identify the main resource");
        }
        return mainResource;
      }
    };
    MainResourceComputed = makeComputedArtifact(MainResource, ["URL", "devtoolsLog"]);
  }
});

// core/gather/gatherers/link-elements.js
var link_elements_exports = {};
__export(link_elements_exports, {
  UIStrings: () => UIStrings23,
  default: () => link_elements_default
});
function normalizeUrlOrNull(url, finalDisplayedUrl) {
  try {
    return new URL(url, finalDisplayedUrl).href;
  } catch (_) {
    return null;
  }
}
function getCrossoriginFromHeader(value) {
  if (value === "anonymous") return "anonymous";
  if (value === "use-credentials") return "use-credentials";
  return null;
}
function getLinkElementsInDOM() {
  const browserElements = getElementsInDocument("link");
  const linkElements = [];
  for (const link of browserElements) {
    if (!(link instanceof HTMLLinkElement)) continue;
    const hrefRaw = link.getAttribute("href") || "";
    const source = link.closest("head") ? "head" : "body";
    linkElements.push({
      rel: link.rel,
      href: link.href,
      hreflang: link.hreflang,
      as: link.as,
      crossOrigin: link.crossOrigin,
      hrefRaw,
      source,
      fetchPriority: link.fetchPriority,
      // @ts-expect-error - put into scope via stringification
      node: getNodeDetails(link)
    });
  }
  return linkElements;
}
var import_http_link_header, UIStrings23, str_3, LinkElements, link_elements_default;
var init_link_elements = __esm({
  "core/gather/gatherers/link-elements.js"() {
    "use strict";
    init_process_global();
    import_http_link_header = __toESM(require_link(), 1);
    init_base_gatherer();
    init_page_functions();
    init_devtools_log();
    init_main_resource();
    init_util();
    init_i18n();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings23 = {
      /**
       * @description Warning message explaining that there was an error parsing a link header in an HTTP response. `error` will be an english string with more details on the error. `header` will be the value of the header that caused the error. `link` is a type of HTTP header and should not be translated.
       * @example {Expected attribute delimiter at offset 94} error
       * @example {<https://assets.calendly.com/assets/booking/css/booking-d0ac32b1.css>; rel=preload; as=style; nopush} error
       */
      headerParseWarning: "Error parsing `link` header ({error}): `{header}`"
    };
    str_3 = createIcuMessageFn({ url: "core/gather/gatherers/link-elements.js" }.url, UIStrings23);
    __name(normalizeUrlOrNull, "normalizeUrlOrNull");
    __name(getCrossoriginFromHeader, "getCrossoriginFromHeader");
    __name(getLinkElementsInDOM, "getLinkElementsInDOM");
    LinkElements = class _LinkElements extends base_gatherer_default {
      static {
        __name(this, "LinkElements");
      }
      /** @type {LH.Gatherer.GathererMeta<'DevtoolsLog'>} */
      meta = {
        supportedModes: ["timespan", "navigation"],
        dependencies: { DevtoolsLog: devtools_log_default.symbol }
      };
      /**
       * @param {LH.Gatherer.Context} context
       * @return {Promise<LH.Artifacts['LinkElements']>}
       */
      static getLinkElementsInDOM(context) {
        return context.driver.executionContext.evaluate(getLinkElementsInDOM, {
          args: [],
          useIsolation: true,
          deps: [
            pageFunctions.getNodeDetails,
            pageFunctions.getElementsInDocument
          ]
        });
      }
      /**
       * @param {LH.Gatherer.Context} context
       * @param {LH.Artifacts['DevtoolsLog']} devtoolsLog
       * @return {Promise<LH.Artifacts['LinkElements']>}
       */
      static async getLinkElementsInHeaders(context, devtoolsLog) {
        const mainDocument = await MainResourceComputed.request({ devtoolsLog, URL: context.baseArtifacts.URL }, context);
        const linkElements = [];
        for (const header of mainDocument.responseHeaders) {
          if (header.name.toLowerCase() !== "link") continue;
          let parsedRefs = [];
          try {
            parsedRefs = import_http_link_header.default.parse(header.value).refs;
          } catch (err) {
            const truncatedHeader = Util.truncate(header.value, 100);
            const warning = str_3(UIStrings23.headerParseWarning, {
              error: err.message,
              header: truncatedHeader
            });
            context.baseArtifacts.LighthouseRunWarnings.push(warning);
          }
          for (const link of parsedRefs) {
            linkElements.push({
              rel: link.rel || "",
              href: normalizeUrlOrNull(link.uri, context.baseArtifacts.URL.finalDisplayedUrl),
              hrefRaw: link.uri || "",
              hreflang: link.hreflang || "",
              as: link.as || "",
              crossOrigin: getCrossoriginFromHeader(link.crossorigin),
              source: "headers",
              fetchPriority: link.fetchpriority,
              node: null
            });
          }
        }
        return linkElements;
      }
      /**
       * @param {LH.Gatherer.Context<'DevtoolsLog'>} context
       * @return {Promise<LH.Artifacts['LinkElements']>}
       */
      async getArtifact(context) {
        const devtoolsLog = context.dependencies.DevtoolsLog;
        const fromDOM = await _LinkElements.getLinkElementsInDOM(context);
        const fromHeaders = await _LinkElements.getLinkElementsInHeaders(context, devtoolsLog);
        const linkElements = fromDOM.concat(fromHeaders);
        for (const link of linkElements) {
          link.rel = link.rel.toLowerCase();
        }
        return linkElements;
      }
    };
    link_elements_default = LinkElements;
  }
});

// core/gather/driver/network.js
async function fetchResponseBodyFromCache(session, requestId, timeout = 1e3) {
  requestId = NetworkRequest.getRequestIdForBackend(requestId);
  session.setNextProtocolTimeout(timeout);
  const result = await session.sendCommand("Network.getResponseBody", { requestId });
  return result.body;
}
var init_network = __esm({
  "core/gather/driver/network.js"() {
    "use strict";
    init_process_global();
    init_network_request();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(fetchResponseBodyFromCache, "fetchResponseBodyFromCache");
  }
});

// core/gather/gatherers/main-document-content.js
var main_document_content_exports = {};
__export(main_document_content_exports, {
  default: () => main_document_content_default
});
var MainDocumentContent, main_document_content_default;
var init_main_document_content = __esm({
  "core/gather/gatherers/main-document-content.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_devtools_log();
    init_network();
    init_main_resource();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    MainDocumentContent = class extends base_gatherer_default {
      static {
        __name(this, "MainDocumentContent");
      }
      /** @type {LH.Gatherer.GathererMeta<'DevtoolsLog'>} */
      meta = {
        supportedModes: ["navigation"],
        dependencies: { DevtoolsLog: devtools_log_default.symbol }
      };
      /**
       * @param {LH.Gatherer.Context<'DevtoolsLog'>} context
       * @return {Promise<LH.Artifacts['MainDocumentContent']>}
       */
      async getArtifact(context) {
        const devtoolsLog = context.dependencies.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: context.baseArtifacts.URL }, context);
        const session = context.driver.defaultSession;
        return fetchResponseBodyFromCache(session, mainResource.requestId);
      }
    };
    main_document_content_default = MainDocumentContent;
  }
});

// core/gather/gatherers/meta-elements.js
var meta_elements_exports = {};
__export(meta_elements_exports, {
  default: () => meta_elements_default
});
function collectMetaElements() {
  const functions = (
    /** @type {typeof pageFunctions} */
    {
      // @ts-expect-error - getElementsInDocument put into scope via stringification
      getElementsInDocument,
      // @ts-expect-error - getNodeDetails put into scope via stringification
      getNodeDetails
    }
  );
  const metas = functions.getElementsInDocument("head meta");
  return metas.map((meta) => {
    const getAttribute = /* @__PURE__ */ __name((name) => {
      const attr = meta.attributes.getNamedItem(name);
      if (!attr) return;
      return attr.value;
    }, "getAttribute");
    return {
      name: meta.name.toLowerCase(),
      content: meta.content,
      property: getAttribute("property"),
      httpEquiv: meta.httpEquiv ? meta.httpEquiv.toLowerCase() : void 0,
      charset: getAttribute("charset"),
      node: (
        /** @type {LH.Artifacts.NodeDetails} */
        functions.getNodeDetails(meta)
      )
    };
  });
}
var MetaElements, meta_elements_default;
var init_meta_elements = __esm({
  "core/gather/gatherers/meta-elements.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_page_functions();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(collectMetaElements, "collectMetaElements");
    MetaElements = class extends base_gatherer_default {
      static {
        __name(this, "MetaElements");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts['MetaElements']>}
       */
      getArtifact(passContext) {
        const driver = passContext.driver;
        return driver.executionContext.evaluate(collectMetaElements, {
          args: [],
          useIsolation: true,
          deps: [
            pageFunctions.getElementsInDocument,
            pageFunctions.getNodeDetails
          ]
        });
      }
    };
    meta_elements_default = MetaElements;
  }
});

// core/gather/gatherers/scripts.js
var scripts_exports = {};
__export(scripts_exports, {
  default: () => scripts_default
});
async function runInSeriesOrParallel(values, promiseMapper, runInSeries) {
  if (runInSeries) {
    const results = [];
    for (const value of values) {
      const result = await promiseMapper(value);
      results.push(result);
    }
    return results;
  } else {
    const promises = values.map(promiseMapper);
    return await Promise.all(promises);
  }
}
function isLighthouseRuntimeEvaluateScript(script) {
  if (!script.embedderName) return true;
  return script.hasSourceURL && script.url === "_lighthouse-eval.js";
}
var Scripts, scripts_default;
var init_scripts = __esm({
  "core/gather/gatherers/scripts.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2022 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(runInSeriesOrParallel, "runInSeriesOrParallel");
    __name(isLighthouseRuntimeEvaluateScript, "isLighthouseRuntimeEvaluateScript");
    Scripts = class _Scripts extends base_gatherer_default {
      static {
        __name(this, "Scripts");
      }
      static symbol = Symbol("Scripts");
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        symbol: _Scripts.symbol,
        supportedModes: ["timespan", "navigation"]
      };
      /** @type {LH.Crdp.Debugger.ScriptParsedEvent[]} */
      _scriptParsedEvents = [];
      /** @type {Array<string | undefined>} */
      _scriptContents = [];
      constructor() {
        super();
        this.onScriptParsed = this.onScriptParsed.bind(this);
      }
      /**
       * @param {LH.Crdp.Debugger.ScriptParsedEvent} params
       */
      onScriptParsed(params) {
        if (!isLighthouseRuntimeEvaluateScript(params)) {
          this._scriptParsedEvents.push(params);
        }
      }
      /**
       * @param {LH.Gatherer.Context} context
       */
      async startInstrumentation(context) {
        const session = context.driver.defaultSession;
        session.on("Debugger.scriptParsed", this.onScriptParsed);
        await session.sendCommand("Debugger.enable");
      }
      /**
       * @param {LH.Gatherer.Context} context
       */
      async stopInstrumentation(context) {
        const session = context.driver.defaultSession;
        const formFactor = context.baseArtifacts.HostFormFactor;
        session.off("Debugger.scriptParsed", this.onScriptParsed);
        this._scriptContents = await runInSeriesOrParallel(
          this._scriptParsedEvents,
          ({ scriptId }) => {
            return session.sendCommand("Debugger.getScriptSource", { scriptId }).then((resp) => resp.scriptSource).catch(() => void 0);
          },
          formFactor === "mobile"
          /* runInSeries */
        );
        await session.sendCommand("Debugger.disable");
      }
      async getArtifact() {
        const scripts = this._scriptParsedEvents.map((event, i) => {
          return {
            name: event.url,
            ...event,
            // embedderName is optional on the protocol because backends like Node may not set it.
            // For our purposes, it is always set. But just in case it isn't... fallback to the url.
            url: event.embedderName || event.url,
            content: this._scriptContents[i]
          };
        });
        return scripts;
      }
    };
    scripts_default = Scripts;
  }
});

// core/gather/gatherers/seo/robots-txt.js
var robots_txt_exports = {};
__export(robots_txt_exports, {
  default: () => robots_txt_default
});
var RobotsTxt, robots_txt_default;
var init_robots_txt = __esm({
  "core/gather/gatherers/seo/robots-txt.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    RobotsTxt = class extends base_gatherer_default {
      static {
        __name(this, "RobotsTxt");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts['RobotsTxt']>}
       */
      async getArtifact(passContext) {
        const { finalDisplayedUrl } = passContext.baseArtifacts.URL;
        const robotsUrl = new URL("/robots.txt", finalDisplayedUrl).href;
        return passContext.driver.fetcher.fetchResource(robotsUrl).catch((err) => ({ status: null, content: null, errorMessage: err.message }));
      }
    };
    robots_txt_default = RobotsTxt;
  }
});

// core/lib/cdt/generated/ParsedURL.js
var require_ParsedURL = __commonJS({
  "core/lib/cdt/generated/ParsedURL.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.ParsedURL = void 0;
    exports2.normalizePath = normalizePath2;
    exports2.schemeIs = schemeIs2;
    function normalizePath2(path7) {
      if (path7.indexOf("..") === -1 && path7.indexOf(".") === -1) {
        return path7;
      }
      const segments = (path7[0] === "/" ? path7.substring(1) : path7).split("/");
      const normalizedSegments = [];
      for (const segment of segments) {
        if (segment === ".") {
          continue;
        } else if (segment === "..") {
          normalizedSegments.pop();
        } else {
          normalizedSegments.push(segment);
        }
      }
      let normalizedPath = normalizedSegments.join("/");
      if (path7[0] === "/" && normalizedPath) {
        normalizedPath = "/" + normalizedPath;
      }
      if (normalizedPath[normalizedPath.length - 1] !== "/" && (path7[path7.length - 1] === "/" || segments[segments.length - 1] === "." || segments[segments.length - 1] === "..")) {
        normalizedPath = normalizedPath + "/";
      }
      return normalizedPath;
    }
    __name(normalizePath2, "normalizePath");
    function schemeIs2(url, scheme) {
      try {
        return new URL(url).protocol === scheme;
      } catch {
        return false;
      }
    }
    __name(schemeIs2, "schemeIs");
    var ParsedURL3 = class _ParsedURL {
      static {
        __name(this, "ParsedURL");
      }
      isValid;
      url;
      scheme;
      user;
      host;
      port;
      path;
      queryParams;
      fragment;
      folderPathComponents;
      lastPathComponent;
      blobInnerScheme;
      #displayNameInternal;
      #dataURLDisplayNameInternal;
      constructor(url) {
        this.isValid = false;
        this.url = url;
        this.scheme = "";
        this.user = "";
        this.host = "";
        this.port = "";
        this.path = "";
        this.queryParams = "";
        this.fragment = "";
        this.folderPathComponents = "";
        this.lastPathComponent = "";
        const isBlobUrl = this.url.startsWith("blob:");
        const urlToMatch = isBlobUrl ? url.substring(5) : url;
        const match = urlToMatch.match(_ParsedURL.urlRegex());
        if (match) {
          this.isValid = true;
          if (isBlobUrl) {
            this.blobInnerScheme = match[2].toLowerCase();
            this.scheme = "blob";
          } else {
            this.scheme = match[2].toLowerCase();
          }
          this.user = match[3] ?? "";
          this.host = match[4] ?? "";
          this.port = match[5] ?? "";
          this.path = match[6] ?? "/";
          this.queryParams = match[7] ?? "";
          this.fragment = match[8] ?? "";
        } else {
          if (this.url.startsWith("data:")) {
            this.scheme = "data";
            return;
          }
          if (this.url.startsWith("blob:")) {
            this.scheme = "blob";
            return;
          }
          if (this.url === "about:blank") {
            this.scheme = "about";
            return;
          }
          this.path = this.url;
        }
        const lastSlashExceptTrailingIndex = this.path.lastIndexOf("/", this.path.length - 2);
        if (lastSlashExceptTrailingIndex !== -1) {
          this.lastPathComponent = this.path.substring(lastSlashExceptTrailingIndex + 1);
        } else {
          this.lastPathComponent = this.path;
        }
        const lastSlashIndex = this.path.lastIndexOf("/");
        if (lastSlashIndex !== -1) {
          this.folderPathComponents = this.path.substring(0, lastSlashIndex);
        }
      }
      static concatenate(devToolsPath, ...appendage) {
        return devToolsPath.concat(...appendage);
      }
      static beginsWithWindowsDriveLetter(url) {
        return /^[A-Za-z]:/.test(url);
      }
      static beginsWithScheme(url) {
        return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(url);
      }
      static isRelativeURL(url) {
        return !this.beginsWithScheme(url) || this.beginsWithWindowsDriveLetter(url);
      }
      get displayName() {
        if (this.#displayNameInternal) {
          return this.#displayNameInternal;
        }
        if (this.isDataURL()) {
          return this.dataURLDisplayName();
        }
        if (this.isBlobURL()) {
          return this.url;
        }
        if (this.isAboutBlank()) {
          return this.url;
        }
        this.#displayNameInternal = this.lastPathComponent;
        if (!this.#displayNameInternal) {
          this.#displayNameInternal = (this.host || "") + "/";
        }
        if (this.#displayNameInternal === "/") {
          this.#displayNameInternal = this.url;
        }
        return this.#displayNameInternal;
      }
      static urlRegexInstance = null;
    };
    exports2.ParsedURL = ParsedURL3;
  }
});

// core/lib/cdt/Common.js
var require_Common = __commonJS({
  "core/lib/cdt/Common.js"(exports2, module2) {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2022 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    var ParsedURL3 = require_ParsedURL();
    module2.exports = {
      ParsedURL: ParsedURL3
    };
  }
});

// core/lib/cdt/Platform.js
var require_Platform = __commonJS({
  "core/lib/cdt/Platform.js"(exports2, module2) {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    function lowerBound2(array, needle, comparator, left, right) {
      let l = left || 0;
      let r = right !== void 0 ? right : array.length;
      while (l < r) {
        const m = l + r >> 1;
        if (comparator(needle, array[m]) > 0) {
          l = m + 1;
        } else {
          r = m;
        }
      }
      return r;
    }
    __name(lowerBound2, "lowerBound");
    function upperBound2(array, needle, comparator, left, right) {
      let l = left || 0;
      let r = right !== void 0 ? right : array.length;
      while (l < r) {
        const m = l + r >> 1;
        if (comparator(needle, array[m]) >= 0) {
          l = m + 1;
        } else {
          r = m;
        }
      }
      return r;
    }
    __name(upperBound2, "upperBound");
    module2.exports = {
      ArrayUtilities: {
        lowerBound: lowerBound2,
        upperBound: upperBound2
      },
      DevToolsPath: {
        EmptyUrlString: ""
      }
    };
  }
});

// core/lib/cdt/generated/SourceMap.js
var require_SourceMap = __commonJS({
  "core/lib/cdt/generated/SourceMap.js"(exports2, module2) {
    "use strict";
    init_process_global();
    var Common = require_Common();
    var Platform = require_Platform();
    var BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var BASE64_CODES = new Uint8Array(123);
    for (let index = 0; index < BASE64_CHARS.length; ++index) {
      BASE64_CODES[BASE64_CHARS.charCodeAt(index)] = index;
    }
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.TokenIterator = exports2.SourceMap = exports2.SourceMapEntry = void 0;
    exports2.parseSourceMap = parseSourceMap;
    function parseSourceMap(content) {
      if (content.startsWith(")]}")) {
        content = content.substring(content.indexOf("\n"));
      }
      if (content.charCodeAt(0) === 65279) {
        content = content.slice(1);
      }
      return JSON.parse(content);
    }
    __name(parseSourceMap, "parseSourceMap");
    var SourceMapEntry = class {
      static {
        __name(this, "SourceMapEntry");
      }
      lineNumber;
      columnNumber;
      sourceIndex;
      sourceURL;
      sourceLineNumber;
      sourceColumnNumber;
      name;
      constructor(lineNumber, columnNumber, sourceIndex, sourceURL, sourceLineNumber, sourceColumnNumber, name) {
        this.lineNumber = lineNumber;
        this.columnNumber = columnNumber;
        this.sourceIndex = sourceIndex;
        this.sourceURL = sourceURL;
        this.sourceLineNumber = sourceLineNumber;
        this.sourceColumnNumber = sourceColumnNumber;
        this.name = name;
      }
      static compare(entry1, entry2) {
        if (entry1.lineNumber !== entry2.lineNumber) {
          return entry1.lineNumber - entry2.lineNumber;
        }
        return entry1.columnNumber - entry2.columnNumber;
      }
    };
    exports2.SourceMapEntry = SourceMapEntry;
    var SourceMap = class {
      static {
        __name(this, "SourceMap");
      }
      #json;
      #compiledURLInternal;
      #sourceMappingURL;
      #baseURL;
      #mappingsInternal;
      #sourceInfos = [];
      #sourceInfoByURL = /* @__PURE__ */ new Map();
      #scopesInfo = null;
      /**
       * @param {string} compiledURL
       * @param {string} sourceMappingURL
       * @param {object} payload
       * Implements Source Map V3 model. See https://github.com/google/closure-compiler/wiki/Source-Maps
       * for format description.
       */
      constructor(compiledURL, sourceMappingURL, payload) {
        this.#json = payload;
        this.#compiledURLInternal = compiledURL;
        this.#sourceMappingURL = sourceMappingURL;
        this.#baseURL = Common.ParsedURL.schemeIs(sourceMappingURL, "data:") ? compiledURL : sourceMappingURL;
        this.#mappingsInternal = null;
        if ("sections" in this.#json) {
          if (this.#json.sections.find((section) => "url" in section)) {
            console.warn(`SourceMap "${sourceMappingURL}" contains unsupported "URL" field in one of its sections.`);
          }
        }
        this.eachSection(this.parseSources.bind(this));
      }
      #sourceIndex(sourceURL) {
        return this.#sourceInfos.findIndex((info) => info.sourceURL === sourceURL);
      }
      compiledURL() {
        return this.#compiledURLInternal;
      }
      url() {
        return this.#sourceMappingURL;
      }
      sourceURLs() {
        return [...this.#sourceInfoByURL.keys()];
      }
      embeddedContentByURL(sourceURL) {
        const entry = this.#sourceInfoByURL.get(sourceURL);
        if (!entry) {
          return null;
        }
        return entry.content;
      }
      hasScopeInfo() {
        this.#ensureMappingsProcessed();
        return this.#scopesInfo !== null;
      }
      findEntry(lineNumber, columnNumber, inlineFrameIndex) {
        this.#ensureMappingsProcessed();
        if (inlineFrameIndex && this.#scopesInfo !== null) {
          const { inlinedFunctions } = this.#scopesInfo.findInlinedFunctions(lineNumber, columnNumber);
          const { callsite } = inlinedFunctions[inlineFrameIndex - 1];
          if (!callsite) {
            console.error("Malformed source map. Expected to have a callsite info for index", inlineFrameIndex);
            return null;
          }
          return {
            lineNumber,
            columnNumber,
            sourceIndex: callsite.sourceIndex,
            sourceURL: this.sourceURLs()[callsite.sourceIndex],
            sourceLineNumber: callsite.line,
            sourceColumnNumber: callsite.column,
            name: void 0
          };
        }
        const mappings = this.mappings();
        const index = Platform.ArrayUtilities.upperBound(mappings, void 0, (unused, entry) => lineNumber - entry.lineNumber || columnNumber - entry.columnNumber);
        return index ? mappings[index - 1] : null;
      }
      findEntryRanges(lineNumber, columnNumber) {
        const mappings = this.mappings();
        const endIndex = Platform.ArrayUtilities.upperBound(mappings, void 0, (unused, entry) => lineNumber - entry.lineNumber || columnNumber - entry.columnNumber);
        if (!endIndex) {
          return null;
        }
        const startIndex = endIndex - 1;
        const sourceURL = mappings[startIndex].sourceURL;
        if (!sourceURL) {
          return null;
        }
        const endLine = endIndex < mappings.length ? mappings[endIndex].lineNumber : 2 ** 31 - 1;
        const endColumn = endIndex < mappings.length ? mappings[endIndex].columnNumber : 2 ** 31 - 1;
        const range = new TextUtils.TextRange.TextRange(mappings[startIndex].lineNumber, mappings[startIndex].columnNumber, endLine, endColumn);
        const reverseMappings = this.reversedMappings(sourceURL);
        const startSourceLine = mappings[startIndex].sourceLineNumber;
        const startSourceColumn = mappings[startIndex].sourceColumnNumber;
        const endReverseIndex = Platform.ArrayUtilities.upperBound(reverseMappings, void 0, (unused, i) => startSourceLine - mappings[i].sourceLineNumber || startSourceColumn - mappings[i].sourceColumnNumber);
        if (!endReverseIndex) {
          return null;
        }
        const endSourceLine = endReverseIndex < reverseMappings.length ? mappings[reverseMappings[endReverseIndex]].sourceLineNumber : 2 ** 31 - 1;
        const endSourceColumn = endReverseIndex < reverseMappings.length ? mappings[reverseMappings[endReverseIndex]].sourceColumnNumber : 2 ** 31 - 1;
        const sourceRange = new TextUtils.TextRange.TextRange(startSourceLine, startSourceColumn, endSourceLine, endSourceColumn);
        return { range, sourceRange, sourceURL };
      }
      sourceLineMapping(sourceURL, lineNumber, columnNumber) {
        const mappings = this.mappings();
        const reverseMappings = this.reversedMappings(sourceURL);
        const first = Platform.ArrayUtilities.lowerBound(reverseMappings, lineNumber, lineComparator);
        const last = Platform.ArrayUtilities.upperBound(reverseMappings, lineNumber, lineComparator);
        if (first >= reverseMappings.length || mappings[reverseMappings[first]].sourceLineNumber !== lineNumber) {
          return null;
        }
        const columnMappings = reverseMappings.slice(first, last);
        if (!columnMappings.length) {
          return null;
        }
        const index = Platform.ArrayUtilities.lowerBound(columnMappings, columnNumber, (columnNumber2, i) => columnNumber2 - mappings[i].sourceColumnNumber);
        return index >= columnMappings.length ? mappings[columnMappings[columnMappings.length - 1]] : mappings[columnMappings[index]];
        function lineComparator(lineNumber2, i) {
          return lineNumber2 - mappings[i].sourceLineNumber;
        }
        __name(lineComparator, "lineComparator");
      }
      findReverseIndices(sourceURL, lineNumber, columnNumber) {
        const mappings = this.mappings();
        const reverseMappings = this.reversedMappings(sourceURL);
        const endIndex = Platform.ArrayUtilities.upperBound(reverseMappings, void 0, (unused, i) => lineNumber - mappings[i].sourceLineNumber || columnNumber - mappings[i].sourceColumnNumber);
        let startIndex = endIndex;
        while (startIndex > 0 && mappings[reverseMappings[startIndex - 1]].sourceLineNumber === mappings[reverseMappings[endIndex - 1]].sourceLineNumber && mappings[reverseMappings[startIndex - 1]].sourceColumnNumber === mappings[reverseMappings[endIndex - 1]].sourceColumnNumber) {
          --startIndex;
        }
        return reverseMappings.slice(startIndex, endIndex);
      }
      findReverseEntries(sourceURL, lineNumber, columnNumber) {
        const mappings = this.mappings();
        return this.findReverseIndices(sourceURL, lineNumber, columnNumber).map((i) => mappings[i]);
      }
      findReverseRanges(sourceURL, lineNumber, columnNumber) {
        const mappings = this.mappings();
        const indices = this.findReverseIndices(sourceURL, lineNumber, columnNumber);
        const ranges = [];
        for (let i = 0; i < indices.length; ++i) {
          const startIndex = indices[i];
          let endIndex = startIndex + 1;
          while (i + 1 < indices.length && endIndex === indices[i + 1]) {
            ++endIndex;
            ++i;
          }
          const startLine = mappings[startIndex].lineNumber;
          const startColumn = mappings[startIndex].columnNumber;
          const endLine = endIndex < mappings.length ? mappings[endIndex].lineNumber : 2 ** 31 - 1;
          const endColumn = endIndex < mappings.length ? mappings[endIndex].columnNumber : 2 ** 31 - 1;
          ranges.push(new TextUtils.TextRange.TextRange(startLine, startColumn, endLine, endColumn));
        }
        return ranges;
      }
      /** @return {Array<{lineNumber: number, columnNumber: number, sourceURL?: string, sourceLineNumber: number, sourceColumnNumber: number, name?: string, lastColumnNumber?: number}>} */
      mappings() {
        this.#ensureMappingsProcessed();
        return this.#mappingsInternal ?? [];
      }
      reversedMappings(sourceURL) {
        this.#ensureMappingsProcessed();
        return this.#sourceInfoByURL.get(sourceURL)?.reverseMappings ?? [];
      }
      #ensureMappingsProcessed() {
        if (this.#mappingsInternal === null) {
          this.#mappingsInternal = [];
          try {
            this.eachSection(this.parseMap.bind(this));
          } catch (e) {
            console.error("Failed to parse source map", e);
            this.#mappingsInternal = [];
          }
          this.mappings().sort(SourceMapEntry.compare);
          this.#computeReverseMappings(this.#mappingsInternal);
          this.#json = null;
        }
      }
      #computeReverseMappings(mappings) {
        const reverseMappingsPerUrl = /* @__PURE__ */ new Map();
        for (let i = 0; i < mappings.length; i++) {
          const entryUrl = mappings[i].sourceURL;
          if (!entryUrl) {
            continue;
          }
          let reverseMap = reverseMappingsPerUrl.get(entryUrl);
          if (!reverseMap) {
            reverseMap = [];
            reverseMappingsPerUrl.set(entryUrl, reverseMap);
          }
          reverseMap.push(i);
        }
        for (const [url, reverseMap] of reverseMappingsPerUrl.entries()) {
          const info = this.#sourceInfoByURL.get(url);
          if (!info) {
            continue;
          }
          reverseMap.sort(sourceMappingComparator);
          info.reverseMappings = reverseMap;
        }
        function sourceMappingComparator(indexA, indexB) {
          const a = mappings[indexA];
          const b = mappings[indexB];
          return a.sourceLineNumber - b.sourceLineNumber || a.sourceColumnNumber - b.sourceColumnNumber || a.lineNumber - b.lineNumber || a.columnNumber - b.columnNumber;
        }
        __name(sourceMappingComparator, "sourceMappingComparator");
      }
      eachSection(callback) {
        if (!this.#json) {
          return;
        }
        if ("sections" in this.#json) {
          let sourcesIndex = 0;
          for (const section of this.#json.sections) {
            if ("map" in section) {
              callback(section.map, sourcesIndex, section.offset.line, section.offset.column);
              sourcesIndex += section.map.sources.length;
            }
          }
        } else {
          callback(this.#json, 0, 0, 0);
        }
      }
      parseSources(sourceMap) {
        const sourceRoot = sourceMap.sourceRoot ?? "";
        const ignoreList = new Set(sourceMap.ignoreList ?? sourceMap.x_google_ignoreList);
        for (let i = 0; i < sourceMap.sources.length; ++i) {
          let href = sourceMap.sources[i];
          if (Common.ParsedURL.ParsedURL.isRelativeURL(href)) {
            if (sourceRoot && !sourceRoot.endsWith("/") && href && !href.startsWith("/")) {
              href = sourceRoot.concat("/", href);
            } else {
              href = sourceRoot.concat(href);
            }
          }
          const url = href;
          const source = sourceMap.sourcesContent && sourceMap.sourcesContent[i];
          const sourceInfo = {
            sourceURL: url,
            content: source ?? null,
            ignoreListHint: ignoreList.has(i),
            reverseMappings: null
          };
          this.#sourceInfos.push(sourceInfo);
          if (!this.#sourceInfoByURL.has(url)) {
            this.#sourceInfoByURL.set(url, sourceInfo);
          }
        }
      }
      parseMap(map, baseSourceIndex, baseLineNumber, baseColumnNumber) {
        let sourceIndex = baseSourceIndex;
        let lineNumber = baseLineNumber;
        let columnNumber = baseColumnNumber;
        let sourceLineNumber = 0;
        let sourceColumnNumber = 0;
        let nameIndex = 0;
        const names2 = map.names ?? [];
        const tokenIter = new TokenIterator(map.mappings);
        let sourceURL = this.#sourceInfos[sourceIndex]?.sourceURL;
        while (true) {
          if (tokenIter.peek() === ",") {
            tokenIter.next();
          } else {
            while (tokenIter.peek() === ";") {
              lineNumber += 1;
              columnNumber = 0;
              tokenIter.next();
            }
            if (!tokenIter.hasNext()) {
              break;
            }
          }
          columnNumber += tokenIter.nextVLQ();
          if (!tokenIter.hasNext() || this.isSeparator(tokenIter.peek())) {
            this.mappings().push(new SourceMapEntry(lineNumber, columnNumber));
            continue;
          }
          const sourceIndexDelta = tokenIter.nextVLQ();
          if (sourceIndexDelta) {
            sourceIndex += sourceIndexDelta;
            sourceURL = this.#sourceInfos[sourceIndex]?.sourceURL;
          }
          sourceLineNumber += tokenIter.nextVLQ();
          sourceColumnNumber += tokenIter.nextVLQ();
          if (!tokenIter.hasNext() || this.isSeparator(tokenIter.peek())) {
            this.mappings().push(new SourceMapEntry(lineNumber, columnNumber, sourceIndex, sourceURL, sourceLineNumber, sourceColumnNumber));
            continue;
          }
          nameIndex += tokenIter.nextVLQ();
          this.mappings().push(new SourceMapEntry(lineNumber, columnNumber, sourceIndex, sourceURL, sourceLineNumber, sourceColumnNumber, names2[nameIndex]));
        }
        if (false) {
          if (!this.#scopesInfo) {
            this.#scopesInfo = new SourceMapScopesInfo_js_1.SourceMapScopesInfo(this, [], []);
          }
          if (map.originalScopes && map.generatedRanges) {
            const { originalScopes, generatedRanges } = (0, SourceMapScopes_js_1.decodeScopes)(map, { line: baseLineNumber, column: baseColumnNumber });
            this.#scopesInfo.addOriginalScopes(originalScopes);
            this.#scopesInfo.addGeneratedRanges(generatedRanges);
          } else if (map.x_com_bloomberg_sourcesFunctionMappings) {
            const originalScopes = this.parseBloombergScopes(map);
            this.#scopesInfo.addOriginalScopes(originalScopes);
          } else {
            this.#scopesInfo.addOriginalScopes(new Array(map.sources.length));
          }
        }
      }
      isSeparator(char) {
        return char === "," || char === ";";
      }
      mapsOrigin() {
        const mappings = this.mappings();
        if (mappings.length > 0) {
          const firstEntry = mappings[0];
          return firstEntry?.lineNumber === 0 || firstEntry.columnNumber === 0;
        }
        return false;
      }
      hasIgnoreListHint(sourceURL) {
        return this.#sourceInfoByURL.get(sourceURL)?.ignoreListHint ?? false;
      }
      /**
       * Returns a list of ranges in the generated script for original sources that
       * match a predicate. Each range is a [begin, end) pair, meaning that code at
       * the beginning location, up to but not including the end location, matches
       * the predicate.
       */
      findRanges(predicate, options) {
        const mappings = this.mappings();
        const ranges = [];
        if (!mappings.length) {
          return [];
        }
        let current = null;
        if ((mappings[0].lineNumber !== 0 || mappings[0].columnNumber !== 0) && options?.isStartMatching) {
          current = TextUtils.TextRange.TextRange.createUnboundedFromLocation(0, 0);
          ranges.push(current);
        }
        for (const { sourceURL, lineNumber, columnNumber } of mappings) {
          const ignoreListHint = sourceURL && predicate(sourceURL);
          if (!current && ignoreListHint) {
            current = TextUtils.TextRange.TextRange.createUnboundedFromLocation(lineNumber, columnNumber);
            ranges.push(current);
            continue;
          }
          if (current && !ignoreListHint) {
            current.endLine = lineNumber;
            current.endColumn = columnNumber;
            current = null;
          }
        }
        return ranges;
      }
      expandCallFrame(frame) {
        this.#ensureMappingsProcessed();
        if (this.#scopesInfo === null) {
          return [frame];
        }
        return this.#scopesInfo.expandCallFrame(frame);
      }
      resolveScopeChain(frame) {
        this.#ensureMappingsProcessed();
        if (this.#scopesInfo === null) {
          return null;
        }
        return this.#scopesInfo.resolveMappedScopeChain(frame);
      }
      findOriginalFunctionName(position) {
        this.#ensureMappingsProcessed();
        return this.#scopesInfo?.findOriginalFunctionName(position) ?? null;
      }
    };
    exports2.SourceMap = SourceMap;
    var VLQ_BASE_SHIFT = 5;
    var VLQ_BASE_MASK = (1 << 5) - 1;
    var VLQ_CONTINUATION_MASK = 1 << 5;
    var TokenIterator = class {
      static {
        __name(this, "TokenIterator");
      }
      #string;
      #position;
      constructor(string) {
        this.#string = string;
        this.#position = 0;
      }
      next() {
        return this.#string.charAt(this.#position++);
      }
      /** Returns the unicode value of the next character and advances the iterator  */
      nextCharCode() {
        return this.#string.charCodeAt(this.#position++);
      }
      peek() {
        return this.#string.charAt(this.#position);
      }
      hasNext() {
        return this.#position < this.#string.length;
      }
      nextVLQ() {
        let result = 0;
        let shift = 0;
        let digit = VLQ_CONTINUATION_MASK;
        while (digit & VLQ_CONTINUATION_MASK) {
          if (!this.hasNext()) {
            throw new Error("Unexpected end of input while decodling VLQ number!");
          }
          const charCode = this.nextCharCode();
          digit = BASE64_CODES[charCode];
          if (charCode !== 65 && digit === 0) {
            throw new Error(`Unexpected char '${String.fromCharCode(charCode)}' encountered while decoding`);
          }
          result += (digit & VLQ_BASE_MASK) << shift;
          shift += VLQ_BASE_SHIFT;
        }
        const negative = result & 1;
        result >>= 1;
        return negative ? -result : result;
      }
      /**
       * @returns the next VLQ number without iterating further. Or returns null if
       * the iterator is at the end or it's not a valid number.
       */
      peekVLQ() {
        const pos = this.#position;
        try {
          return this.nextVLQ();
        } catch {
          return null;
        } finally {
          this.#position = pos;
        }
      }
    };
    exports2.TokenIterator = TokenIterator;
    module2.exports = SourceMap;
    SourceMap.parseSourceMap = parseSourceMap;
  }
});

// core/lib/cdt/SDK.js
var require_SDK = __commonJS({
  "core/lib/cdt/SDK.js"(exports2, module2) {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    var SDK3 = {
      SourceMap: require_SourceMap()
    };
    SDK3.SourceMap.prototype.computeLastGeneratedColumns = function() {
      const mappings = this.mappings();
      if (mappings.length && mappings[0].lastColumnNumber !== void 0) return;
      for (let i = 0; i < mappings.length - 1; i++) {
        const mapping = mappings[i];
        const nextMapping = mappings[i + 1];
        if (mapping.lineNumber === nextMapping.lineNumber) {
          mapping.lastColumnNumber = nextMapping.columnNumber;
        }
      }
    };
    module2.exports = SDK3;
  }
});

// core/gather/gatherers/source-maps.js
var source_maps_exports = {};
__export(source_maps_exports, {
  default: () => source_maps_default
});
var import_SDK, SourceMaps, source_maps_default;
var init_source_maps = __esm({
  "core/gather/gatherers/source-maps.js"() {
    "use strict";
    init_process_global();
    import_SDK = __toESM(require_SDK(), 1);
    init_base_gatherer();
    init_scripts();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    SourceMaps = class _SourceMaps extends base_gatherer_default {
      static {
        __name(this, "SourceMaps");
      }
      static symbol = Symbol("SourceMaps");
      /** @type {LH.Gatherer.GathererMeta<'Scripts'>} */
      meta = {
        symbol: _SourceMaps.symbol,
        supportedModes: ["timespan", "navigation"],
        dependencies: { Scripts: scripts_default.symbol }
      };
      /**
       * @param {LH.Gatherer.Driver} driver
       * @param {string} sourceMapUrl
       * @return {Promise<LH.Artifacts.RawSourceMap>}
       */
      async fetchSourceMap(driver, sourceMapUrl) {
        const response = await driver.fetcher.fetchResource(sourceMapUrl, { timeout: 1500 });
        if (response.content === null) {
          throw new Error(`Failed fetching source map (${response.status})`);
        }
        return import_SDK.default.SourceMap.parseSourceMap(response.content);
      }
      /**
       * @param {string} sourceMapURL
       * @return {LH.Artifacts.RawSourceMap}
       */
      parseSourceMapFromDataUrl(sourceMapURL) {
        const buffer = Buffer.from(sourceMapURL.split(",")[1], "base64");
        return import_SDK.default.SourceMap.parseSourceMap(buffer.toString());
      }
      /**
       * @param {string} url
       * @param {string} base
       * @return {string|undefined}
       */
      _resolveUrl(url, base) {
        try {
          return new URL(url, base).href;
        } catch (e) {
          return;
        }
      }
      /**
       * @param {LH.Gatherer.Driver} driver
       * @param {LH.Artifacts.Script} script
       * @return {Promise<LH.Artifacts.SourceMap>}
       */
      async _retrieveMapFromScript(driver, script) {
        if (!script.sourceMapURL) {
          throw new Error("precondition failed: event.sourceMapURL should exist");
        }
        const isSourceMapADataUri = script.sourceMapURL.startsWith("data:");
        const scriptUrl = script.name;
        const rawSourceMapUrl = isSourceMapADataUri ? script.sourceMapURL : this._resolveUrl(script.sourceMapURL, script.name);
        if (!rawSourceMapUrl) {
          return {
            scriptId: script.scriptId,
            scriptUrl,
            errorMessage: `Could not resolve map url: ${script.sourceMapURL}`
          };
        }
        const sourceMapUrl = isSourceMapADataUri ? void 0 : rawSourceMapUrl;
        try {
          const map = isSourceMapADataUri ? this.parseSourceMapFromDataUrl(rawSourceMapUrl) : await this.fetchSourceMap(driver, rawSourceMapUrl);
          if (typeof map.version !== "number") throw new Error("Map has no numeric `version` field");
          if (!Array.isArray(map.sources)) throw new Error("Map has no `sources` list");
          if (typeof map.mappings !== "string") throw new Error("Map has no `mappings` field");
          if (map.sections) {
            map.sections = map.sections.filter((section) => section.map);
          }
          return {
            scriptId: script.scriptId,
            scriptUrl,
            sourceMapUrl,
            map
          };
        } catch (err) {
          return {
            scriptId: script.scriptId,
            scriptUrl,
            sourceMapUrl,
            errorMessage: err.toString()
          };
        }
      }
      /**
       * @param {LH.Gatherer.Context<'Scripts'>} context
       * @return {Promise<LH.Artifacts['SourceMaps']>}
       */
      async getArtifact(context) {
        const eventProcessPromises = context.dependencies.Scripts.filter((script) => script.sourceMapURL).map((script) => this._retrieveMapFromScript(context.driver, script));
        return Promise.all(eventProcessPromises);
      }
    };
    source_maps_default = SourceMaps;
  }
});

// core/gather/gatherers/stacks.js
var stacks_exports = {};
__export(stacks_exports, {
  default: () => stacks_default
});
async function detectLibraries() {
  const libraries = [];
  const libraryDetectorTests = d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests;
  for (const [name, lib] of Object.entries(libraryDetectorTests)) {
    try {
      let timeout;
      const timeoutPromise = new Promise((r) => timeout = setTimeout(() => r(false), 1e3));
      const result = await Promise.race([lib.test(window), timeoutPromise]);
      if (timeout) clearTimeout(timeout);
      if (result) {
        libraries.push({
          id: lib.id,
          name,
          version: result.version,
          npm: lib.npm
        });
      }
    } catch (e) {
    }
  }
  return libraries;
}
var require3, libDetectorSource, Stacks, stacks_default;
var init_stacks = __esm({
  "core/gather/gatherers/stacks.js"() {
    "use strict";
    init_process_global();
    init_module();
    init_lighthouse_logger();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    require3 = /* @__PURE__ */ createRequire({ url: "core/gather/gatherers/stacks.js" }.url);
    libDetectorSource = `function _createTimeoutHelper(){let e;return{timeoutPromise:new Promise(((t,o)=>{e=setTimeout((()=>o(new Error("Timed out"))),5e3)})),clearTimeout:()=>clearTimeout(e)}}var UNKNOWN_VERSION=null,d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests={GWT:{id:"gwt",icon:"gwt",url:"http://www.gwtproject.org/",test:function(e){var t=e.document,o=t.getElementById("__gwt_historyFrame"),n=t.gwt_uid,r=t.body.__listener,i=t.body.__eventBits,s=e.__gwt_activeModules,c=e.__gwt_jsonp__,u=e.__gwt_scriptsLoaded||e.__gwt_stylesLoaded||e.__gwt_activeModules;if(o||n||r||i||s||c||u){for(var a=t.getElementsByTagName("iframe"),l=UNKNOWN_VERSION,N=0;N<a.length;N++)try{if(a[N].tabIndex<0&&a[N].contentWindow&&a[N].contentWindow.$gwt_version){l=a[N].contentWindow.$gwt_version;break}}catch(e){}return"0.0.999"==l&&(l="Google Internal"),{version:l}}return!1}},Ink:{id:"ink",icon:"ink",url:"http://ink.sapo.pt/",test:function(e){return!(!e.Ink||!e.Ink.createModule)&&{version:UNKNOWN_VERSION}}}\
,Vaadin:{id:"vaadin",icon:"vaadin",url:"https://vaadin.com/",test:function(e){return!(!e.vaadin||!e.vaadin.registerWidgetset)&&{version:UNKNOWN_VERSION}}},Bootstrap:{id:"bootstrap",icon:"bootstrap",url:"http://getbootstrap.com/",npm:"bootstrap",test:function(e){var t,o=e.$&&e.$.fn;if(o&&(["affix","alert","button","carousel","collapse","dropdown","modal","popover","scrollspy","tab","tooltip"].some((function(o){if(e.$.fn[o]){if(e.$.fn[o].Constructor&&e.$.fn[o].Constructor.VERSION)return t=e.$.fn[o].Constructor.VERSION,!0;if(new RegExp("\\\\$this\\\\.data\\\\((?:'|\\")(?:bs\\\\.){1}"+o).test(e.$.fn[o].toString()))return t=">= 3.0.0 & <= 3.1.1",!0;if(new RegExp("\\\\$this\\\\.data\\\\((?:'|\\")"+o).test(e.$.fn[o].toString()))return t=">= 2.0.0 & <= 2.3.2",!0}return!1})),t))return{version:t};return!1}},Zurb:{id:"zurb",icon:"zurb",url:"https://foundation.zurb.com/",npm:"foundation-sites",test:function(e){return!(!e.Foundation||!e.Foundation.Toggler)&&{version:e.Foundation.version||UNKNOWN_VERSION}}},Polymer\
:{id:"polymer",icon:"polymer",url:"https://www.polymer-project.org/",npm:"@polymer/polymer",test:function(e){return!(!e.Polymer||!e.Polymer.dom)&&{version:e.Polymer.version||UNKNOWN_VERSION}}},LitElement:{id:"litelement",icon:"polymer",url:"https://lit-element.polymer-project.org/",npm:"lit-element",test:function(e){if(e.litElementVersions&&e.litElementVersions.length){var t=[...e.litElementVersions].sort(((e,t)=>e.localeCompare(t,void 0,{numeric:!0})));return{version:t[t.length-1]}}return!1}},"lit-html":{id:"lit-html",icon:"polymer",url:"https://lit-html.polymer-project.org/",npm:"lit-element",test:function(e){if(e.litHtmlVersions&&e.litHtmlVersions.length){var t=[...e.litHtmlVersions].sort(((e,t)=>e.localeCompare(t,void 0,{numeric:!0})));return{version:t[t.length-1]}}return!1}},Highcharts:{id:"highcharts",icon:"highcharts",url:"http://www.highcharts.com",npm:"highcharts",test:function(e){return!(!e.Highcharts||!e.Highcharts.Point)&&{version:e.Highcharts.version||UNKNOWN_VERSION}}},In\
foVis:{id:"jit",icon:"jit",url:"http://philogb.github.com/jit/",test:function(e){return!(!e.$jit||!e.$jit.PieChart)&&{version:e.$jit.version||UNKNOWN_VERSION}}},FlotCharts:{id:"flotcharts",icon:"flotcharts",url:"http://www.flotcharts.org/",npm:"flot",test:function(e){return!(!e.$||!e.$.plot)&&{version:e.$.plot.version||UNKNOWN_VERSION}}},CreateJS:{id:"createjs",icon:"createjs",url:"https://createjs.com/",npm:"createjs",test:function(e){return!(!e.createjs||!e.createjs.promote)&&{version:UNKNOWN_VERSION}}},"Google Maps":{id:"gmaps",icon:"gmaps",url:"https://developers.google.com/maps/",test:function(e){return!(!e.google||!e.google.maps)&&{version:e.google.maps.version||UNKNOWN_VERSION}}},jQuery:{id:"jquery",icon:"jquery",url:"http://jquery.com",npm:"jquery",test:function(e){var t=e.jQuery||e.$;return!!(t&&t.fn&&t.fn.jquery)&&{version:t.fn.jquery.replace(/[^\\d+\\.+]/g,"")||UNKNOWN_VERSION}}},"jQuery (Fast path)":{id:"jquery-fast",icon:"jquery",url:"http://jquery.com",npm:"jquery",test:fun\
ction(e){var t=e.jQuery||e.$;return!(!t||!t.fn)&&{version:UNKNOWN_VERSION}}},"jQuery UI":{id:"jquery_ui",icon:"jquery_ui",url:"http://jqueryui.com",npm:"jquery-ui",test:function(e){var t=e.jQuery||e.$||e.$jq||e.$j;if(t&&t.fn&&t.fn.jquery&&t.ui){for(var o="accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs".split(","),n=[],r=0;r<o.length;r++)t.ui[o[r]]&&n.push(o[r].substr(0,1).toUpperCase()+o[r].substr(1));return{version:t.ui.version||UNKNOWN_VERSION,details:n.length?"Plugins used: "+n.join(","):""}}return!1}},Dojo:{id:"dojo",icon:"dojo",url:"http://dojotoolkit.org",npm:"dojo",test:function(e){return!(!e.dojo||!e.dojo.delegate)&&{version:e.dojo.version?e.dojo.version.toString():UNKNOWN_VERSION,details:"Details: "+(e.dijit?"Uses Dijit":"none")}}},Prototype:{id:"prototype",icon:"prototype",url:"http://prototypejs.org",test:function(e){return!(!e.Prototype||!e.Prototype.BrowserFeatures)&&{version:e.Prototype.Version||UNKNOWN_VERSION}}},Sc\
riptaculous:{id:"scriptaculous",icon:"scriptaculous",url:"http://script.aculo.us",test:function(e){return!(!e.Scriptaculous||!e.Scriptaculous.load)&&{version:e.Scriptaculous.Version||UNKNOWN_VERSION}}},MooTools:{id:"mootools",icon:"mootools",url:"https://mootools.net/",test:function(e){return!(!e.MooTools||!e.MooTools.build)&&{version:e.MooTools.version||UNKNOWN_VERSION}}},Spry:{id:"spry",icon:"spry",url:"http://labs.adobe.com/technologies/spry",test:function(e){return!(!e.Spry||!e.Spry.Data)&&{version:UNKNOWN_VERSION}}},"YUI 2":{id:"yui",icon:"yui",url:"http://developer.yahoo.com/yui/2/",test:function(e){return!(!e.YAHOO||!e.YAHOO.util)&&{version:e.YAHOO.VERSION||UNKNOWN_VERSION}}},"YUI 3":{id:"yui3",icon:"yui3",url:"https://yuilibrary.com/",npm:"yui",test:function(e){return!(!e.YUI||!e.YUI.Env)&&{version:e.YUI.version||UNKNOWN_VERSION}}},Qooxdoo:{id:"qooxdoo",icon:"qooxdoo",url:"http://www.qooxdoo.org/",npm:"qooxdoo",test:function(e){return!(!e.qx||!e.qx.Bootstrap)&&{version:UNKNOWN_\
VERSION}}},"Ext JS":{id:"extjs",icon:"extjs",url:"https://www.sencha.com/products/extjs/",test:function(e){return e.Ext&&e.Ext.versions?{version:e.Ext.versions.core.version}:!!e.Ext&&{version:e.Ext.version||UNKNOWN_VERSION}}},Ezoic:{id:"ezoic",icon:"ezoic",url:"https://www.ezoic.com/",test:function(e){return!(!e.__ez||!e.__ez.template)&&{version:UNKNOWN_VERSION}}},base2:{id:"base2",icon:"base2",url:"http://code.google.com/p/base2",test:function(e){return!(!e.base2||!e.base2.dom)&&{version:e.base2.version||UNKNOWN_VERSION}}},"Closure Library":{id:"closure",icon:"closure",url:"https://developers.google.com/closure/library/",npm:"google-closure-library",test:function(e){return!(!e.goog||!e.goog.provide)&&{version:UNKNOWN_VERSION}}},"Rapha&euml;l":{id:"raphael",icon:"raphael",url:"http://dmitrybaranovskiy.github.io/raphael/",test:function(e){return!(!e.Raphael||!e.Raphael.circle)&&{version:e.Raphael.version||UNKNOWN_VERSION}}},React:{id:"react",icon:"react",url:"https://reactjs.org/",npm:"\
react",test:function(e){function t(e){return null!=e&&null!=e._reactRootContainer}var o=document.getElementById("react-root"),n=document.querySelector("*[data-reactroot]");return!!(t(document.body)||t(document.body.firstElementChild)||null!=document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,(function(e){return t(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP})).nextNode()||o&&o.innerText.length>0||n||e.React&&e.React.Component)&&{version:e.React&&e.React.version||UNKNOWN_VERSION}}},"React (Fast path)":{id:"react-fast",icon:"react",url:"https://reactjs.org/",npm:"react",test:function(e){function t(e){return null!=e&&null!=e._reactRootContainer}var o=document.getElementById("react-root"),n=document.querySelector("*[data-reactroot]");return!!(t(document.body)||t(document.body.firstElementChild)||o||n||e.React)&&{version:e.React&&e.React.version||UNKNOWN_VERSION}}},"Next.js":{id:"next",icon:"next",url:"https://nextjs.org/",npm:"next",test:function(e){return!(!e.__NEXT_DATA\
__||!e.__NEXT_DATA__.buildId)&&{version:window.next&&window.next.version||UNKNOWN_VERSION}}},"Next.js (Fast path)":{id:"next-fast",icon:"next",url:"https://nextjs.org/",npm:"next",test:function(e){return!!e.__NEXT_DATA__&&{version:UNKNOWN_VERSION}}},Preact:{id:"preact",icon:"preact",url:"https://preactjs.com/",npm:"preact",test:function(e){var t="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("preactattr");function o(e){return"__k"in e&&"props"in e.__k&&"type"in e.__k||("_component"in e||"__preactattr_"in e||t&&null!=e[t])}function n(e){return null!=e&&o(e)&&e}var r=n(document.body)||n(document.body.firstElementChild);if(r||(r=document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,(function(e){return o(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP})).nextNode()),r||e.preact){var i=UNKNOWN_VERSION;return r&&("__k"in r&&(i="10"),"__preactattr_"in r&&(i="8"),t&&null!=r[t]&&(i="7")),{version:i}}return!1}},"Preact (Fast path)":{id:"preact-fast",icon:"preact",url:"https://pr\
eactjs.com/",npm:"preact",test:function(e){var t=UNKNOWN_VERSION;function o(e){return null!=e&&function(e){return null!=e.__k?(t="10",!0):null!=e._component||null!=e.__preactattr_}(e)}return!(!o(document.body)&&!o(document.body.firstElementChild)&&!e.preact)&&{version:t}}},Modernizr:{id:"modernizr",icon:"modernizr",url:"https://modernizr.com/",npm:"modernizr",test:function(e){return!(!e.Modernizr||!e.Modernizr.addTest)&&{version:e.Modernizr._version||UNKNOWN_VERSION}}},"Processing.js":{id:"processingjs",icon:"processingjs",url:"http://processingjs.org",npm:"processing-js",test:function(e){return!(!e.Processing||!e.Processing.box)&&{version:Processing.version||UNKNOWN_VERSION}}},Backbone:{id:"backbone",icon:"backbone",url:"http://backbonejs.org/",npm:"backbone",test:function(e){return!(!e.Backbone||!e.Backbone.Model.extend)&&{version:e.Backbone.VERSION||UNKNOWN_VERSION}}},Leaflet:{id:"leaflet",icon:"leaflet",url:"http://leafletjs.com",npm:"leaflet",test:function(e){return!(!e.L||!e.L.Ge\
oJSON||!e.L.marker&&!e.L.Marker)&&{version:e.L.version||e.L.VERSION||UNKNOWN_VERSION}}},Mapbox:{id:"mapbox",icon:"mapbox",url:"https://www.mapbox.com/",npm:"mapbox-gl",test:function(e){return!!(e.L&&e.L.mapbox&&e.L.mapbox.geocoder)&&{version:e.L.mapbox.VERSION||UNKNOWN_VERSION}}},"Lo-Dash":{id:"lodash",icon:"lodash",url:"https://lodash.com/",npm:"lodash",test:function(e){var t="function"==typeof(t=e._)&&t,o="function"==typeof(o=t&&t.chain)&&o,n=(o||t||function(){return{}})(1);return!(!t||!n.__wrapped__)&&{version:t.VERSION||UNKNOWN_VERSION}}},Underscore:{id:"underscore",icon:"underscore",url:"http://underscorejs.org/",npm:"underscore",test:function(e){return!(!e._||"function"!=typeof e._.tap||d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests["Lo-Dash"].test(e))&&{version:e._.VERSION||UNKNOWN_VERSION}}},Sammy:{id:"sammy",icon:"sammy",url:"http://sammyjs.org",test:function(e){return!(!e.Sammy||!e.Sammy.Application.curry)&&{version:e.Sammy.VERSION||UNKNOWN_VERSION}}},Rico:{id:"rico",i\
con:"rico",url:"http://openrico.sourceforge.net/examples/index.html",test:function(e){return!(!e.Rico||!window.Rico.checkIfComplete)&&{version:e.Rico.Version||UNKNOWN_VERSION}}},MochiKit:{id:"mochikit",icon:"mochikit",url:"https://mochi.github.io/mochikit/",test:function(e){return!(!e.MochiKit||!e.MochiKit.Base.module)&&{version:MochiKit.VERSION||UNKNOWN_VERSION}}},"gRapha&euml;l":{id:"graphael",icon:"graphael",url:"https://github.com/DmitryBaranovskiy/g.raphael",test:function(e){return!(!e.Raphael||!e.Raphael.fn.g)&&{version:UNKNOWN_VERSION}}},Glow:{id:"glow",icon:"glow",url:"http://www.bbc.co.uk/glow/",test:function(e){return e.gloader&&e.gloader.getRequests?{version:UNKNOWN_VERSION}:e.glow&&e.glow.dom?{version:e.glow.VERSION||UNKNOWN_VERSION}:!!e.Glow&&{version:e.Glow.version||UNKNOWN_VERSION}}},"Socket.IO":{id:"socketio",icon:"socketio",url:"https://socket.io/",npm:"socket.io",test:function(e){return!(!e.io||!e.io.sockets&&!e.io.Socket)&&{version:e.io.version||UNKNOWN_VERSION}}},Mu\
stache:{id:"mustache",icon:"mustache",url:"http://mustache.github.io/",npm:"mustache",test:function(e){return!(!e.Mustache||!e.Mustache.to_html)&&{version:e.Mustache.version||UNKNOWN_VERSION}}},"Fabric.js":{id:"fabricjs",icon:"icon38",url:"http://fabricjs.com/",npm:"fabric",test:function(e){return!(!e.fabric||!e.fabric.util)&&{version:e.fabric.version||UNKNOWN_VERSION}}},FuseJS:{id:"fusejs",icon:"fusejs",url:"http://fusejs.io/",npm:"fuse.js",test:function(e){return!!e.Fuse&&{version:UNKNOWN_VERSION}}},"Tween.js":{id:"tweenjs",icon:"icon38",url:"https://github.com/tweenjs/tween.js",npm:"tween.js",test:function(e){return!(!e.TWEEN||!e.TWEEN.Easing)&&{version:UNKNOWN_VERSION}}},SproutCore:{id:"sproutcore",icon:"sproutcore",url:"http://sproutcore.com/",test:function(e){return!(!e.SC||!e.SC.Application)&&{version:UNKNOWN_VERSION}}},"Zepto.js":{id:"zepto",icon:"zepto",url:"http://zeptojs.com",npm:"zepto",test:function(e){return!(!e.Zepto||!e.Zepto.fn)&&{version:UNKNOWN_VERSION}}},"three.js":\
{id:"threejs",icon:"icon38",url:"https://threejs.org/",npm:"three",test:function(e){return e.THREE&&e.THREE.REVISION?{version:"r"+e.THREE.REVISION}:!!e.THREE&&{version:UNKNOWN_VERSION}}},PhiloGL:{id:"philogl",icon:"philogl",url:"http://www.senchalabs.org/philogl/",npm:"philogl",test:function(e){return!(!e.PhiloGL||!e.PhiloGL.Camera)&&{version:e.PhiloGL.version||UNKNOWN_VERSION}}},CamanJS:{id:"camanjs",icon:"camanjs",url:"http://camanjs.com/",npm:"caman",test:function(e){return e.Caman&&e.Caman.version?{version:e.Caman.version.release}:!!e.Caman&&{version:UNKNOWN_VERSION}}},yepnope:{id:"yepnope",icon:"yepnope",url:"http://yepnopejs.com/",test:function(e){return!(!e.yepnope||!e.yepnope.injectJs)&&{version:UNKNOWN_VERSION}}},LABjs:{id:"labjs",icon:"icon38",url:"https://github.com/getify/LABjs",test:function(e){return!(!e.$LAB||!e.$LAB.setOptions)&&{version:UNKNOWN_VERSION}}},"Head JS":{id:"headjs",icon:"headjs",url:"http://headjs.com/",npm:"headjs",test:function(e){return!(!e.head||!e.hea\
d.js)&&{version:UNKNOWN_VERSION}}},ControlJS:{id:"controljs",icon:"icon38",url:"http://stevesouders.com/controljs/",test:function(e){return!(!e.CJS||!e.CJS.start)&&{version:UNKNOWN_VERSION}}},RequireJS:{id:"requirejs",icon:"requirejs",url:"http://requirejs.org/",npm:"requirejs",test:function(e){var t=e.require||e.requirejs;return!(!t||!(t.load||t.s&&t.s.contexts&&t.s.contexts._&&(t.s.contexts._.loaded||t.s.contexts._.load)))&&{version:t.version||UNKNOWN_VERSION}}},RightJS:{id:"rightjs",icon:"rightjs",url:"http://rightjs.org/",test:function(e){return!(!e.RightJS||!e.RightJS.isNode)&&{version:e.RightJS.version||UNKNOWN_VERSION}}},"jQuery Tools":{id:"jquerytools",icon:"jquerytools",url:"http://jquerytools.github.io/",test:function(e){var t=e.jQuery||e.$;return!(!t||!t.tools)&&{version:t.tools.version||UNKNOWN_VERSION}}},Pusher:{id:"pusher",icon:"pusher",url:"https://pusher.com/docs/",npm:"pusher-js",test:function(e){return!(!e.Pusher||!e.Pusher.Channel)&&{version:e.Pusher.VERSION||UNKNOWN\
_VERSION}}},"Paper.js":{id:"paperjs",icon:"paperjs",url:"http://paperjs.org/",npm:"paper",test:function(e){return!(!e.paper||!e.paper.Point)&&{version:e.paper.version||UNKNOWN_VERSION}}},Swiffy:{id:"swiffy",icon:"icon38",url:"https://developers.google.com/swiffy/",test:function(e){return!(!e.swiffy||!e.swiffy.Stage)&&{version:UNKNOWN_VERSION}}},Move:{id:"move",icon:"move",url:"https://github.com/rsms/move",npm:"move",test:function(e){return!(!e.move||!e.move.compile)&&{version:e.move.version()||UNKNOWN_VERSION}}},AmplifyJS:{id:"amplifyjs",icon:"amplifyjs",url:"http://amplifyjs.com/",npm:"amplifyjs",test:function(e){return!(!e.amplify||!e.amplify.publish)&&{version:UNKNOWN_VERSION}}},"Popcorn.js":{id:"popcornjs",icon:"popcornjs",url:"https://github.com/mozilla/popcorn-js/",test:function(e){return!(!e.Popcorn||!e.Popcorn.Events)&&{version:e.Popcorn.version||UNKNOWN_VERSION}}},D3:{id:"d3",icon:"d3",url:"https://d3js.org/",npm:"d3",test:function(e){return!(!e.d3||!e.d3.select)&&{version:e.\
d3.version||UNKNOWN_VERSION}}},Handlebars:{id:"handlebars",icon:"handlebars",url:"http://handlebarsjs.com/",npm:"handlebars",test:function(e){return!(!e.Handlebars||!e.Handlebars.compile)&&{version:e.Handlebars.VERSION||UNKNOWN_VERSION}}},Handsontable:{id:"handsontable",icon:"handsontable",url:"https://handsontable.com/",npm:"handsontable",test:function(e){return!(!e.Handsontable||!e.Handsontable.Core)&&{version:e.Handsontable.version||UNKNOWN_VERSION}}},Knockout:{id:"knockout",icon:"knockout",url:"http://knockoutjs.com/",npm:"knockout",test:function(e){return!(!e.ko||!e.ko.applyBindings)&&{version:e.ko.version||UNKNOWN_VERSION}}},Spine:{id:"spine",icon:"icon38",url:"http://spine.github.io/",test:function(e){return!(!e.Spine||!e.Spine.Controller)&&{version:e.Spine.version||UNKNOWN_VERSION}}},"jQuery Mobile":{id:"jquery-mobile",icon:"jquery_mobile",url:"http://jquerymobile.com/",npm:"jquery-mobile",test:function(e){var t=e.jQuery||e.$||e.$jq||e.$j;return!!(t&&t.fn&&t.fn.jquery&&t.mobile\
)&&{version:t.mobile.version||UNKNOWN_VERSION}}},"WebFont Loader":{id:"webfontloader",icon:"icon38",url:"https://github.com/typekit/webfontloader",npm:"webfontloader",test:function(e){return!(!e.WebFont||!e.WebFont.load)&&{version:UNKNOWN_VERSION}}},Angular:{id:"angular",icon:"angular",url:"https://angular.io/",npm:"@angular/core",test:function(e){var t=e.document.querySelector("[ng-version]");return t?{version:t.getAttribute("ng-version")||UNKNOWN_VERSION}:!!(e.ng&&e.ng.probe instanceof Function)&&{version:UNKNOWN_VERSION}}},AngularJS:{id:"angularjs",icon:"angularjs",url:"https://angularjs.org/",npm:"angular",test:function(e){var t=e.angular;return!!(t&&t.version&&t.version.full)&&{version:t.version.full}}},Ionic:{id:"ionic",icon:"ionic",url:"https://ionicframework.com/",npm:"@ionic/cli",test:function(e){var t=e.document.querySelector("ion-app");return!(!t||"ION-APP"!==t.nodeName)&&{version:UNKNOWN_VERSION}}},"Ember.js":{id:"emberjs",icon:"emberjs",url:"https://emberjs.com/",npm:"embe\
r-source",test:function(e){var t=e.Ember||e.Em;return!(!t||!t.GUID_KEY)&&{version:t.VERSION||UNKNOWN_VERSION}}},"Hammer.js":{id:"hammerjs",icon:"hammerjs",url:"http://eightmedia.github.io/hammer.js/",npm:"hammerjs",test:function(e){return!(!e.Hammer||!e.Hammer.Pinch)&&{version:e.Hammer.VERSION||"&lt; 1.0.10"}}},"Visibility.js":{id:"visibilityjs",icon:"icon38",url:"https://github.com/ai/visibilityjs",npm:"visibilityjs",test:function(e){return!(!e.Visibility||!e.Visibility.every)&&{version:UNKNOWN_VERSION}}},"Velocity.js":{id:"velocityjs",icon:"icon38",url:"http://velocityjs.org/",npm:"velocity-animate",test:function(e){var t=e.jQuery||e.$,o=t?t.Velocity:e.Velocity;return o&&o.RegisterEffect&&o.version?{version:o.version.major+"."+o.version.minor+"."+o.version.patch}:!(!o||!o.RegisterEffect)&&{version:UNKNOWN_VERSION}}},"IfVisible.js":{id:"ifvisiblejs",icon:"icon38",url:"http://serkanyersen.github.io/ifvisible.js/",npm:"ifvisible.js",test:function(e){var t=e.ifvisible;return!(!t||"ifvisi\
ble.object.event.identifier"!==t.__ceGUID)&&{version:UNKNOWN_VERSION}}},"Pixi.js":{id:"pixi",icon:"pixi",url:"http://www.pixijs.com/",npm:"pixi.js",test:function(e){var t=e.PIXI;return!!(t&&t.WebGLRenderer&&t.VERSION)&&{version:t.VERSION.replace("v","")||UNKNOWN_VERSION}}},"DC.js":{id:"dcjs",icon:"dcjs",url:"http://dc-js.github.io/dc.js/",npm:"dc",test:function(e){var t=e.dc;return!(!t||!t.registerChart)&&{version:t.version||UNKNOWN_VERSION}}},"GreenSock JS":{id:"greensock",icon:"greensock",url:"https://greensock.com/gsap",npm:"gsap",test:function(e){return!(!e.TweenMax||!e.TweenMax.pauseAll)&&{version:e.TweenMax.version||UNKNOWN_VERSION}}},FastClick:{id:"fastclick",icon:"fastclick",url:"https://github.com/ftlabs/fastclick",npm:"fastclick",test:function(e){return!(!e.FastClick||!e.FastClick.notNeeded)&&{version:UNKNOWN_VERSION}}},Isotope:{id:"isotope",icon:"isotope",url:"https://isotope.metafizzy.co/",npm:"isotope-layout",test:function(e){return!!(e.Isotope||null!=e.$&&e.$.Isotope)&&{v\
ersion:UNKNOWN_VERSION}}},Marionette:{id:"marionette",icon:"marionette",url:"https://marionettejs.com/",npm:"backbone.marionette",test:function(e){return!(!e.Marionette||!e.Marionette.Application)&&{version:e.Marionette.VERSION||UNKNOWN_VERSION}}},Can:{id:"canjs",icon:"canjs",url:"https://canjs.com/",npm:"can",test:function(e){return!(!e.can||!e.can.Construct)&&{version:e.can.VERSION||UNKNOWN_VERSION}}},Vue:{id:"vue",icon:"vue",url:"https://vuejs.org/",npm:"vue",test:function(e){return!(null===document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,(function(e){return null!=e.__vue__?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP})).nextNode()&&!e.Vue)&&{version:e.Vue&&e.Vue.version||UNKNOWN_VERSION}}},"Vue (Fast path)":{id:"vue-fast",icon:"vue",url:"https://vuejs.org/",npm:"vue",test:function(e){return!!e.Vue&&{version:e.Vue&&e.Vue.version||UNKNOWN_VERSION}}},"Nuxt.js":{id:"nuxt",icon:"nuxt",url:"https://nuxtjs.org/",npm:"nuxt",test:function(e){return!!(e.__NUXT__||e.$nuxt||[\
...e.document.querySelectorAll("*")].some((e=>e.__vue__?.nuxt)))&&{version:UNKNOWN_VERSION}}},"Nuxt.js (Fast path)":{id:"nuxt-fast",icon:"nuxt",url:"https://nuxtjs.org/",npm:"nuxt",test:function(e){return!(!e.__NUXT__&&!e.$nuxt)&&{version:UNKNOWN_VERSION}}},Two:{id:"two",icon:"two",url:"https://two.js.org/",npm:"two.js",test:function(e){return!(!e.Two||!e.Two.Utils)&&{version:e.Two.Version||UNKNOWN_VERSION}}},Brewser:{id:"brewser",icon:"brewser",url:"https://robertpataki.github.io/brewser/",npm:"brewser",test:function(e){return!(!e.BREWSER||!e.BREWSER.ua)&&{version:BREWSER.VERSION||UNKNOWN_VERSION}}},"Material Design Lite":{id:"materialdesignlite",icon:"mdl",url:"https://getmdl.io/",npm:"material-design-lite",test:function(e){return!(!e.componentHandler||!e.componentHandler.upgradeElement)&&{version:UNKNOWN_VERSION}}},"Kendo UI":{id:"kendoui",icon:"kendoui",url:"https://github.com/telerik/kendo-ui-core",npm:"kendo-ui-core",test:function(e){return!!(e.kendo&&e.kendo.View&&e.kendo.View.e\
xtend)&&{version:e.kendo.version||UNKNOWN_VERSION}}},"Matter.js":{id:"matterjs",icon:"matter-js",url:"http://brm.io/matter-js/",npm:"matter-js",test:function(e){return!(!e.Matter||!e.Matter.Engine)&&{version:UNKNOWN_VERSION}}},Riot:{id:"riot",icon:"riot",url:"http://riotjs.com/",npm:"riot",test:function(e){return!(!e.riot||!e.riot.mixin)&&{version:e.riot.version||UNKNOWN_VERSION}}},"Sea.js":{id:"seajs",icon:"icon38",url:"https://seajs.github.io/seajs/docs/",npm:"seajs",test:function(e){return!(!e.seajs||!e.seajs.use)&&{version:e.seajs.version||UNKNOWN_VERSION}}},"Moment.js":{id:"momentjs",icon:"momentjs",url:"http://momentjs.com/",npm:"moment",test:function(e){return!(!e.moment||!e.moment.isMoment&&!e.moment.lang)&&{version:e.moment.version||UNKNOWN_VERSION}}},"Moment Timezone":{id:"moment-timezone",icon:"momentjs",url:"http://momentjs.com/timezone/",npm:"moment-timezone",test:function(e){return!(!e.moment||!e.moment.tz)&&{version:e.moment.tz.version||UNKNOWN_VERSION}}},ScrollMagic:{id\
:"scrollmagic",icon:"scrollmagic",url:"http://scrollmagic.io/",npm:"scrollmagic",test:function(e){return!(!e.ScrollMagic||!e.ScrollMagic.Controller)&&{version:ScrollMagic.version||UNKNOWN_VERSION}}},SWFObject:{id:"swfobject",icon:"icon38",url:"https://github.com/swfobject/swfobject",test:function(e){return e.swfobject&&e.swfobject.embedSWF?{version:e.swfobject.version||UNKNOWN_VERSION}:!(!e.deconcept||!e.deconcept.SWFObject)&&{version:UNKNOWN_VERSION}}},FlexSlider:{id:"flexslider",icon:"icon38",url:"https://woocommerce.com/flexslider/",npm:"flexslider",test:function(e){var t=e.jQuery||e.$||e.$jq||e.$j;return!!(t&&t.fn&&t.fn.jquery&&t.flexslider)&&{version:UNKNOWN_VERSION}}},SPF:{id:"spf",icon:"icon38",url:"https://youtube.github.io/spfjs/",npm:"spf",test:function(e){return!(!e.spf||!e.spf.init)&&{version:UNKNOWN_VERSION}}},"Numeral.js":{id:"numeraljs",icon:"icon38",url:"http://numeraljs.com/",npm:"numeraljs",test:function(e){return!(!e.numeral||!e.isNumeral)&&{version:e.numeral.version\
||UNKNOWN_VERSION}}},"boomerang.js":{id:"boomerangjs",icon:"icon38",url:"https://soasta.github.io/boomerang/",npm:"boomerangjs",test:function(e){return!!(e.BOOMR&&e.BOOMR.utils&&e.BOOMR.init)&&{version:e.BOOMR.version||UNKNOWN_VERSION}}},Framer:{id:"framer",icon:"framer",url:"https://framer.com/",npm:"framerjs",test:function(e){return!(!e.Framer||!e.Framer.Layer)&&{version:e.Framer.Version.build||UNKNOWN_VERSION}}},Marko:{id:"marko",icon:"marko",url:"https://markojs.com/",npm:"marko",test:function(e){return!!document.querySelector("[data-marko-key], [data-marko]")&&{version:UNKNOWN_VERSION}}},AMP:{id:"amp",icon:"amp",url:"https://amp.dev/",npm:"https://www.npmjs.com/org/ampproject",test:function(e){var t=e.document.documentElement.getAttribute("amp-version");return!!t&&{version:t}}},Gatsby:{id:"gatsby",icon:"gatsby",url:"https://www.gatsbyjs.org/",npm:"gatsby",test:function(e){return!!document.getElementById("___gatsby")&&{version:UNKNOWN_VERSION}}},Shopify:{id:"shopify",icon:"shopify"\
,url:"https://www.shopify.com/",npm:null,test:function(e){return!(!e.Shopify||!e.Shopify.shop)&&{version:UNKNOWN_VERSION}}},Magento:{id:"magento",icon:"magento",url:"https://magento.com/",npm:null,test:function(e){const t=/\\/static(?:\\/version\\d+)?\\/frontend\\/.+\\/.+\\/requirejs\\/require(?:\\.min)?\\.js/;return!!Array.from(document.querySelectorAll("script[src]")||[]).some((e=>t.test(e.src)))&&{version:2}}},WordPress:{id:"wordpress",icon:"wordpress",url:"https://wordpress.org/",npm:null,test:function(e){const t=!!document.querySelector('link[rel="https://api.w.org/"]'),o=!!document.querySelectorAll('link[href*="wp-includes"], script[src*="wp-includes"]').length;if(!t&&!o)return!1;const n=document.querySelector('meta[name=generator][content^="WordPress"]');return{version:n?n.getAttribute("content").replace(/^\\w+\\s/,""):UNKNOWN_VERSION}}},Wix:{id:"wix",icon:"wix",url:"https://www.wix.com/",npm:null,test:function(e){return(e.wixPerformanceMeasurements&&e.wixPerformanceMeasurements.info||!(!e.\
wixBiSession||!e.wixBiSession.info))&&{version:UNKNOWN_VERSION}}},Workbox:{id:"workbox",icon:"workbox",url:"https://developers.google.com/web/tools/workbox/",npm:"workbox-sw",test:async function(e){var t=e.navigator;if(!("serviceWorker"in t))return!1;const{timeoutPromise:o,clearTimeout:n}=_createTimeoutHelper(),r=t.serviceWorker.getRegistration().then((function(e){var o=t.serviceWorker.controller?t.serviceWorker.controller.scriptURL:e.active.scriptURL;return fetch(o,{credentials:"include",headers:{"service-worker":"script"}}).then((function(e){return e.text()})).then((function(e){if(/new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm.test(e)){var t=/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.exec(e),o=UNKNOWN_VERSION;return Array.isArray(t)&&t.length>1&&t[1]&&(o=t[1]),{version:o}}return!1}))})).catch((function(e){return!1}));return\
 Promise.race([r,o]).catch((function(e){return!1})).finally((e=>(n(),e)))}},Boq:{id:"boq",icon:"icon38",url:"https://github.com/johnmichel/Library-Detector-for-Chrome/pull/143",npm:null,test:function(e){return!!e.WIZ_global_data&&{version:UNKNOWN_VERSION}}},Wiz:{id:"wiz",icon:"icon38",url:"https://github.com/johnmichel/Library-Detector-for-Chrome/pull/147",npm:null,test:function(e){return!!document.__wizdispatcher&&{version:UNKNOWN_VERSION}}},"core-js":{id:"corejs",icon:"icon38",url:"https://github.com/zloirock/core-js",npm:"core-js",test:function(e){const t=e["__core-js_shared__"],o=e.core;if(t){const e=t.versions;return{version:Array.isArray(e)?e.map((e=>\`core-js-\${e.mode}@\${e.version}\`)).join("; "):UNKNOWN_VERSION}}return!!o&&{version:o.version||UNKNOWN_VERSION}}},Drupal:{id:"drupal",icon:"drupal",url:"https://www.drupal.org/",npm:null,test:function(e){const t=document.querySelector('meta[name="generator"][content^="Drupal"]'),o=t?t.getAttribute("content").replace(/\\D+/gi,""):UNKNOW\
N_VERSION,n=/\\/sites\\/(?:default|all)\\/(?:themes|modules|files)/,r=Array.from(document.querySelectorAll("link,style,script")||[]);return!!(r.some((e=>n.test(e.src)))||r.some((e=>n.test(e.href)))||t||e.Drupal&&e.Drupal.behaviors)&&{version:o}}},TYPO3:{id:"typo3",icon:"typo3",url:"https://typo3.org/",npm:null,test:function(e){const t=document.querySelector('meta[name="generator"][content^="TYPO3"]'),o=/\\/(typo3conf|typo3temp|fileadmin)/,n=Array.from(document.querySelectorAll("link,style,script")||[]);return!!(t||n.some((e=>o.test(e.src)))||n.some((e=>o.test(e.href))))&&{version:UNKNOWN_VERSION}}},"Create React App":{id:"create-react-app",icon:"cra",url:"https://create-react-app.dev/",npm:"react-scripts",test:function(e){let t,o,n=e.document.body.firstElementChild;do{"noscript"===n.localName?t=n:"root"===n.id&&(o=n)}while(n=n.nextElementSibling);return!!(o&&t&&/You need to enable JavaScript to run this app/.test(t.textContent))&&{version:UNKNOWN_VERSION}}},"Guess.js":{id:"guessjs",icon:"g\
uessjs",url:"https://guess-js.github.io/",test:function(e){return!(!e.__GUESS__||!e.__GUESS__.guess)&&{version:UNKNOWN_VERSION}}},"October CMS":{id:"octobercms",icon:"october",url:"https://octobercms.com/",npm:null,test:function(e){const t=document.querySelector('meta[name="generator"][content^="OctoberCMS"]'),o=document.querySelector('meta[name="generator"][content^="October CMS"]'),n=/\\/modules\\/system\\/assets\\/(css|js)\\/framework(\\.extras|\\.combined)?(-min)?/,r=Array.from(document.querySelectorAll("link,style,script")||[]);return!!(t||o||r.some((e=>n.test(e.src||e.href))))&&{version:UNKNOWN_VERSION}}},Joomla:{id:"joomla",icon:"joomla",url:"https://www.joomla.org/",npm:null,test:function(e){const t=document.querySelector('meta[name=generator][content^="Joomla"]'),o=!!document.querySelectorAll('script[src*="/media/jui/js/bootstrap.min.js"]').length;return t?{version:t.getAttribute("content").replace(/^\\w+\\s/,"")}:!(!e.Joomla&&!o)&&{version:UNKNOWN_VERSION}}},Sugar:{id:"sugar",icon:"su\
gar",url:"https://sugarjs.com",npm:"sugar",test:function(e){return e.Sugar?{version:e.Sugar.VERSION||UNKNOWN_VERSION}:!!e.Array.SugarMethods&&{version:UNKNOWN_VERSION}}},Bento:{id:"bentojs",icon:"bentojs",url:"https://bentojs.dev",npm:"https://www.npmjs.com/org/bentoproject",test:function(e){return!(!e.BENTO||!e.BENTO.push)&&{version:UNKNOWN_VERSION}}},"WP Rocket":{id:"wp-rocket",icon:"wp-rocket",url:"https://wp-rocket.me/",npm:null,test:async function(e){const t="undefined"!=typeof RocketLazyLoadScripts||"undefined"!=typeof RocketPreloadLinksConfig||"undefined"!=typeof rocket_lazy,o=!!document.querySelector("style#wpr-usedcss"),n=document.lastChild.nodeType===Node.COMMENT_NODE&&document.lastChild.textContent.includes("WP Rocket");return!!(o||t||n)&&{version:UNKNOWN_VERSION}}},NitroPack:{id:"nitropack",icon:"nitropack",url:"https://nitropack.io/",npm:null,test:async function(e){return!!document.querySelector('meta[name="generator"][content="NitroPack"]')&&{version:UNKNOWN_VERSION}}},Re\
mix:{id:"remix",icon:"remix",url:"https://remix.run/",npm:"remix",test:function(e){return!!e.__remixContext&&{version:UNKNOWN_VERSION}}}};`;
    __name(detectLibraries, "detectLibraries");
    Stacks = class _Stacks extends base_gatherer_default {
      static {
        __name(this, "Stacks");
      }
      constructor() {
        super();
        this.meta = {
          supportedModes: ["snapshot", "navigation"]
        };
      }
      /**
       * @param {LH.Gatherer.Driver['executionContext']} executionContext
       * @return {Promise<LH.Artifacts['Stacks']>}
       */
      static async collectStacks(executionContext) {
        const status = { msg: "Collect stacks", id: "lh:gather:collectStacks" };
        lighthouse_logger_default.time(status);
        const jsLibraries = await executionContext.evaluate(detectLibraries, {
          args: [],
          deps: [libDetectorSource]
        });
        const stacks = jsLibraries.map((lib) => ({
          detector: "js",
          id: lib.id,
          name: lib.name,
          version: typeof lib.version === "number" ? String(lib.version) : lib.version || void 0,
          npm: lib.npm || void 0
        }));
        lighthouse_logger_default.timeEnd(status);
        return stacks;
      }
      /**
       * @param {LH.Gatherer.Context} context
       * @return {Promise<LH.Artifacts['Stacks']>}
       */
      async getArtifact(context) {
        try {
          return await _Stacks.collectStacks(context.driver.executionContext);
        } catch {
          return [];
        }
      }
    };
    stacks_default = Stacks;
  }
});

// core/gather/gatherers/viewport-dimensions.js
var viewport_dimensions_exports = {};
__export(viewport_dimensions_exports, {
  default: () => viewport_dimensions_default
});
function getViewportDimensions() {
  return {
    innerWidth: window.innerWidth,
    innerHeight: window.innerHeight,
    outerWidth: window.outerWidth,
    outerHeight: window.outerHeight,
    devicePixelRatio: window.devicePixelRatio
  };
}
var ViewportDimensions, viewport_dimensions_default;
var init_viewport_dimensions = __esm({
  "core/gather/gatherers/viewport-dimensions.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(getViewportDimensions, "getViewportDimensions");
    ViewportDimensions = class extends base_gatherer_default {
      static {
        __name(this, "ViewportDimensions");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["snapshot", "timespan", "navigation"]
      };
      /**
       * @param {LH.Gatherer.Context} passContext
       * @return {Promise<LH.Artifacts.ViewportDimensions>}
       */
      async getArtifact(passContext) {
        const driver = passContext.driver;
        const dimensions = await driver.executionContext.evaluate(getViewportDimensions, {
          args: [],
          useIsolation: true
        });
        const allNumeric = Object.values(dimensions).every(Number.isFinite);
        if (!allNumeric) {
          const results = JSON.stringify(dimensions);
          throw new Error(`ViewportDimensions results were not numeric: ${results}`);
        }
        return dimensions;
      }
    };
    viewport_dimensions_default = ViewportDimensions;
  }
});

// core/gather/driver/execution-context.js
var ExecutionContext;
var init_execution_context = __esm({
  "core/gather/driver/execution-context.js"() {
    "use strict";
    init_process_global();
    init_lh();
    init_page_functions();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ExecutionContext = class _ExecutionContext {
      static {
        __name(this, "ExecutionContext");
      }
      /** @param {LH.Gatherer.ProtocolSession} session */
      constructor(session) {
        this._session = session;
        this._executionContextId = void 0;
        this._executionContextIdentifiersCreated = 0;
        session.on("Page.frameNavigated", () => this.clearContextId());
        session.on("Runtime.executionContextDestroyed", (event) => {
          if (event.executionContextId === this._executionContextId) {
            this.clearContextId();
          }
        });
      }
      /**
       * Returns the isolated context ID currently in use.
       */
      getContextId() {
        return this._executionContextId;
      }
      /**
       * Clears the remembered context ID. Use this method when we have knowledge that the runtime context
       * we were using has been destroyed by the browser and is no longer available.
       */
      clearContextId() {
        this._executionContextId = void 0;
      }
      /**
       * Returns the cached isolated execution context ID or creates a new execution context for the main
       * frame. The cached execution context is cleared on every gotoURL invocation, so a new one will
       * always be created on the first call on a new page.
       * @return {Promise<number>}
       */
      async _getOrCreateIsolatedContextId() {
        if (typeof this._executionContextId === "number") return this._executionContextId;
        await this._session.sendCommand("Page.enable");
        await this._session.sendCommand("Runtime.enable");
        const frameTreeResponse = await this._session.sendCommand("Page.getFrameTree");
        const mainFrameId2 = frameTreeResponse.frameTree.frame.id;
        const isolatedWorldResponse = await this._session.sendCommand("Page.createIsolatedWorld", {
          frameId: mainFrameId2,
          worldName: "lighthouse_isolated_context"
        });
        this._executionContextId = isolatedWorldResponse.executionContextId;
        this._executionContextIdentifiersCreated++;
        return isolatedWorldResponse.executionContextId;
      }
      /**
       * Evaluate an expression in the given execution context; an undefined contextId implies the main
       * page without isolation.
       * @param {string} expression
       * @param {number|undefined} contextId
       * @param {number} timeout
       * @return {Promise<*>}
       */
      async _evaluateInContext(expression, contextId, timeout) {
        const uniqueExecutionContextIdentifier = contextId === void 0 ? void 0 : this._executionContextIdentifiersCreated;
        const evaluationParams = {
          // We need to explicitly wrap the raw expression for several purposes:
          // 1. Ensure that the expression will be a native Promise and not a polyfill/non-Promise.
          // 2. Ensure that errors in the expression are captured by the Promise.
          // 3. Ensure that errors captured in the Promise are converted into plain-old JS Objects
          //    so that they can be serialized properly b/c JSON.stringify(new Error('foo')) === '{}'
          //
          // `__lighthouseExecutionContextUniqueIdentifier` is only used by the FullPageScreenshot gatherer.
          // See `getNodeDetails` in page-functions.
          expression: `(function wrapInNativePromise() {
        ${_ExecutionContext._cachedNativesPreamble};
        globalThis.__lighthouseExecutionContextUniqueIdentifier =
          ${uniqueExecutionContextIdentifier};
        ${pageFunctions.esbuildFunctionWrapperString}
        return new Promise(function (resolve) {
          return Promise.resolve()
            .then(_ => ${expression})
            .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowser})
            .then(resolve);
        });
      }())
      //# sourceURL=_lighthouse-eval.js`,
          includeCommandLineAPI: true,
          awaitPromise: true,
          returnByValue: true,
          timeout,
          contextId
        };
        this._session.setNextProtocolTimeout(timeout);
        const response = await this._session.sendCommand("Runtime.evaluate", evaluationParams);
        const ex = response.exceptionDetails;
        if (ex) {
          const elidedExpression = expression.replace(/\s+/g, " ").substring(0, 100);
          const messageLines = [
            "Runtime.evaluate exception",
            `Expression: ${elidedExpression}
---- (elided)`,
            !ex.stackTrace ? `Parse error at: ${ex.lineNumber + 1}:${ex.columnNumber + 1}` : null,
            ex.exception?.description || ex.text
          ].filter(Boolean);
          const evaluationError = new Error(messageLines.join("\n"));
          return Promise.reject(evaluationError);
        }
        if (response.result === void 0) {
          return Promise.reject(
            new Error('Runtime.evaluate response did not contain a "result" object')
          );
        }
        const value = response.result.value;
        if (value?.__failedInBrowser) {
          return Promise.reject(Object.assign(new Error(), value));
        } else {
          return value;
        }
      }
      /**
       * Evaluate an expression in the context of the current page. If useIsolation is true, the expression
       * will be evaluated in a content script that has access to the page's DOM but whose JavaScript state
       * is completely separate.
       * Returns a promise that resolves on the expression's value.
       *
       * @deprecated Use `evaluate` instead! It has a better API, and unlike `evaluateAsync` doesn't sometimes
       * execute invalid code.
       * @param {string} expression
       * @param {{useIsolation?: boolean}=} options
       * @return {Promise<*>}
       */
      async evaluateAsync(expression, options = {}) {
        const timeout = this._session.hasNextProtocolTimeout() ? this._session.getNextProtocolTimeout() : 6e4;
        const contextId = options.useIsolation ? await this._getOrCreateIsolatedContextId() : void 0;
        try {
          return await this._evaluateInContext(expression, contextId, timeout);
        } catch (err) {
          if (contextId && err.message.includes("Cannot find context")) {
            this.clearContextId();
            const freshContextId = await this._getOrCreateIsolatedContextId();
            return this._evaluateInContext(expression, freshContextId, timeout);
          }
          throw err;
        }
      }
      /**
       * Evaluate a function in the context of the current page.
       * If `useIsolation` is true, the function will be evaluated in a content script that has
       * access to the page's DOM but whose JavaScript state is completely separate.
       * Returns a promise that resolves on a value of `mainFn`'s return type.
       * @template {unknown[]} T, R
       * @param {((...args: T) => R)} mainFn The main function to call.
       * @param {{args: T, useIsolation?: boolean, deps?: Array<Function|string>}} options `args` should
       *   match the args of `mainFn`, and can be any serializable value. `deps` are functions that must be
       *   defined for `mainFn` to work.
       * @return {Promise<Awaited<R>>}
       */
      evaluate(mainFn, options) {
        const argsSerialized = _ExecutionContext.serializeArguments(options.args);
        const depsSerialized = _ExecutionContext.serializeDeps(options.deps);
        const expression = `(() => {
      ${depsSerialized}
      return (${mainFn})(${argsSerialized});
    })()`;
        return this.evaluateAsync(expression, options);
      }
      /**
       * Evaluate a function on every new frame from now on.
       * @template {unknown[]} T
       * @param {((...args: T) => void)} mainFn The main function to call.
       * @param {{args: T, deps?: Array<Function|string>}} options `args` should
       *   match the args of `mainFn`, and can be any serializable value. `deps` are functions that must be
       *   defined for `mainFn` to work.
       * @return {Promise<void>}
       */
      async evaluateOnNewDocument(mainFn, options) {
        const argsSerialized = _ExecutionContext.serializeArguments(options.args);
        const depsSerialized = _ExecutionContext.serializeDeps(options.deps);
        const expression = `(() => {
      ${_ExecutionContext._cachedNativesPreamble};
      ${depsSerialized};
      (${mainFn})(${argsSerialized});
    })()
    //# sourceURL=_lighthouse-eval.js`;
        await this._session.sendCommand("Page.addScriptToEvaluateOnNewDocument", { source: expression });
      }
      /**
       * Cache native functions/objects inside window so we are sure polyfills do not overwrite the
       * native implementations when the page loads.
       * @return {Promise<void>}
       */
      async cacheNativesOnNewDocument() {
        await this.evaluateOnNewDocument(() => {
          window.__nativePromise = window.Promise;
          window.__nativeURL = window.URL;
          window.__nativePerformance = window.performance;
          window.__nativeFetch = window.fetch;
          window.__ElementMatches = window.Element.prototype.matches;
          window.__HTMLElementBoundingClientRect = window.HTMLElement.prototype.getBoundingClientRect;
        }, { args: [] });
      }
      /**
       * Prefix every script evaluation with a shadowing of common globals that tend to be ponyfilled
       * incorrectly by many sites. This allows functions to still refer to `Promise` instead of
       * Lighthouse-specific backups like `__nativePromise` (injected by `cacheNativesOnNewDocument` above).
       */
      static _cachedNativesPreamble = [
        "const Promise = globalThis.__nativePromise || globalThis.Promise",
        "const URL = globalThis.__nativeURL || globalThis.URL",
        "const performance = globalThis.__nativePerformance || globalThis.performance",
        "const fetch = globalThis.__nativeFetch || globalThis.fetch"
      ].join(";\n");
      /**
       * Serializes an array of arguments for use in an `eval` string across the protocol.
       * @param {unknown[]} args
       * @return {string}
       */
      static serializeArguments(args) {
        return args.map((arg) => arg === void 0 ? "undefined" : JSON.stringify(arg)).join(",");
      }
      /**
       * Serializes an array of functions or strings.
       *
       * Also makes sure that an esbuild-bundled version of Lighthouse will
       * continue to create working code to be executed within the browser.
       * @param {Array<Function|string>=} deps
       * @return {string}
       */
      static serializeDeps(deps17) {
        deps17 = [pageFunctions.esbuildFunctionWrapperString, ...deps17 || []];
        return deps17.map((dep) => {
          if (typeof dep === "function") {
            const output = dep.toString();
            const runtimeName = pageFunctions.getRuntimeFunctionName(dep);
            if (runtimeName !== dep.name) {
              return `${output}; const ${dep.name} = ${runtimeName};`;
            } else {
              return output;
            }
          } else {
            return dep;
          }
        }).join("\n");
      }
    };
  }
});

// core/gather/gatherers/webmcp-schema.js
var webmcp_schema_exports = {};
__export(webmcp_schema_exports, {
  default: () => webmcp_schema_default
});
var WebMcpSchemaIssues, webmcp_schema_default;
var init_webmcp_schema = __esm({
  "core/gather/gatherers/webmcp-schema.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_dom();
    init_page_functions();
    init_execution_context();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    WebMcpSchemaIssues = class extends base_gatherer_default {
      static {
        __name(this, "WebMcpSchemaIssues");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["navigation", "snapshot"]
      };
      constructor() {
        super();
        this._issues = [];
        this._onIssueAdded = this.onIssueAdded.bind(this);
      }
      /**
       * @param {Record<string, any>} event
       */
      onIssueAdded(event) {
        const issue = event.issue;
        if (!issue || issue.code !== "GenericIssue") return;
        const details = issue.details?.genericIssueDetails;
        if (!details) return;
        const errorType = details.errorType;
        if (errorType && (errorType === "FormModelContextMissingToolName" || errorType === "FormModelContextMissingToolDescription" || errorType === "FormModelContextRequiredParameterMissingName" || errorType === "FormModelContextParameterMissingTitleAndDescription" || errorType === "FormModelContextParameterMissingName")) {
          this._issues.push(details);
        }
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async startInstrumentation(passContext) {
        const session = passContext.driver.defaultSession;
        session.on("Audits.issueAdded", this._onIssueAdded);
        await session.sendCommand("Audits.enable");
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async stopInstrumentation(passContext) {
        const session = passContext.driver.defaultSession;
        session.off("Audits.issueAdded", this._onIssueAdded);
      }
      /**
       * @param {LH.Gatherer.Context} context
       * @return {Promise<LH.Artifacts.WebMcpSchemaIssue[]>}
       */
      async getArtifact(context) {
        const session = context.driver.defaultSession;
        const deps17 = ExecutionContext.serializeDeps([
          pageFunctions.getNodeDetails
        ]);
        const promises = this._issues.map(async (issue) => {
          const processedIssue = { ...issue };
          if (issue.violatingNodeId) {
            try {
              const objectId = await resolveNodeIdToObjectId(session, issue.violatingNodeId);
              if (objectId) {
                const response = await session.sendCommand("Runtime.callFunctionOn", {
                  objectId,
                  functionDeclaration: `function () {
                ${deps17}
                return getNodeDetails(this);
              }`,
                  returnByValue: true,
                  awaitPromise: true
                });
                if (response && response.result && response.result.value) {
                  processedIssue.nodeDetails = response.result.value;
                }
              }
            } catch (err) {
            }
          }
          return processedIssue;
        });
        return Promise.all(promises);
      }
    };
    webmcp_schema_default = WebMcpSchemaIssues;
  }
});

// core/gather/gatherers/webmcp.js
var webmcp_exports = {};
__export(webmcp_exports, {
  default: () => webmcp_default
});
var WebMCP, webmcp_default;
var init_webmcp = __esm({
  "core/gather/gatherers/webmcp.js"() {
    "use strict";
    init_process_global();
    init_base_gatherer();
    init_dom();
    init_page_functions();
    init_execution_context();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    WebMCP = class extends base_gatherer_default {
      static {
        __name(this, "WebMCP");
      }
      /** @type {LH.Gatherer.GathererMeta} */
      meta = {
        supportedModes: ["navigation", "snapshot"]
      };
      constructor() {
        super();
        this._tools = [];
        this._isSupported = true;
        this._onToolsAdded = this.onToolsAdded.bind(this);
        this._onToolsRemoved = this.onToolsRemoved.bind(this);
      }
      /**
       * @param {{tools: WebMCPTool[]}} event
       */
      // TODO: Handle WebMCP tools per frame.
      onToolsAdded(event) {
        if (event.tools) {
          this._tools.push(...event.tools);
        }
      }
      /**
       * @param {{tools: WebMCPTool[]}} event
       */
      onToolsRemoved(event) {
        if (event.tools) {
          const removedNames = new Set(event.tools.map((t) => t.name));
          this._tools = this._tools.filter((t) => !removedNames.has(t.name));
        }
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async startInstrumentation(passContext) {
        const session = passContext.driver.defaultSession;
        session.on("WebMCP.toolsAdded", this._onToolsAdded);
        session.on("WebMCP.toolsRemoved", this._onToolsRemoved);
        try {
          await session.sendCommand("WebMCP.enable");
        } catch (err) {
          if (err.message.includes("'WebMCP.enable' wasn't found")) {
            this._isSupported = false;
            return;
          }
          throw err;
        }
      }
      /**
       * @param {LH.Gatherer.Context} passContext
       */
      async stopInstrumentation(passContext) {
        const session = passContext.driver.defaultSession;
        session.off("WebMCP.toolsAdded", this._onToolsAdded);
        session.off("WebMCP.toolsRemoved", this._onToolsRemoved);
        try {
          await session.sendCommand("WebMCP.disable");
        } catch (err) {
        }
      }
      /**
       * @param {LH.Gatherer.Context} context
       * @return {Promise<LH.Artifacts['WebMCP']>}
       */
      async getArtifact(context) {
        const isSupported = await context.driver.executionContext.evaluate(
          // @ts-expect-error - modelContext is not in types
          () => typeof navigator.modelContext !== "undefined",
          { args: [], useIsolation: true }
        );
        if (!isSupported || !this._isSupported) {
          return { isSupported: false, tools: [] };
        }
        const session = context.driver.defaultSession;
        const toolMap = /* @__PURE__ */ new Map();
        for (const tool of this._tools) {
          toolMap.set(tool.name, tool);
        }
        const resolvedTools = [];
        for (const tool of toolMap.values()) {
          if (tool.backendNodeId) {
            try {
              const objectId = await resolveNodeIdToObjectId(session, tool.backendNodeId);
              if (objectId) {
                const deps17 = ExecutionContext.serializeDeps([
                  pageFunctions.getNodeDetails
                ]);
                const response = await session.sendCommand("Runtime.callFunctionOn", {
                  objectId,
                  functionDeclaration: `function () {
                ${deps17}
                return getNodeDetails(this);
              }`,
                  returnByValue: true,
                  awaitPromise: true
                });
                if (response && response.result && response.result.value) {
                  tool.nodeDetails = response.result.value;
                }
              }
            } catch (err) {
            }
          }
          resolvedTools.push(tool);
        }
        return {
          isSupported: true,
          tools: resolvedTools
        };
      }
    };
    webmcp_default = WebMCP;
  }
});

// core/audits/accessibility/axe-audit.js
var UIStrings24, str_4, AxeAudit, axe_audit_default;
var init_axe_audit = __esm({
  "core/audits/accessibility/axe-audit.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings24 = {
      /** Label of a table column that identifies HTML elements that have failed an audit. */
      failingElementsHeader: "Failing Elements"
    };
    str_4 = createIcuMessageFn({ url: "core/audits/accessibility/axe-audit.js" }.url, UIStrings24);
    AxeAudit = class extends Audit {
      static {
        __name(this, "AxeAudit");
      }
      /**
       * Base class for audit rules which reflect assessment performed by the aXe accessibility library
       * See https://github.com/dequelabs/axe-core/blob/6b444546cff492a62a70a74a8fc3c62bd4729400/doc/API.md#results-object for result type and format details
       *
       * @param {LH.Artifacts} artifacts Accessibility gatherer artifacts. Note that AxeAudit
       * expects the meta name for the class to match the rule id from aXe.
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const notApplicables = artifacts.Accessibility.notApplicable || [];
        const isNotApplicable = notApplicables.find((result) => result.id === this.meta.id);
        if (isNotApplicable) {
          return {
            score: null,
            notApplicable: true
          };
        }
        const incomplete = artifacts.Accessibility.incomplete || [];
        const incompleteResult = incomplete.find((result) => result.id === this.meta.id);
        if (incompleteResult?.error) {
          return {
            score: null,
            errorMessage: `axe-core Error: ${incompleteResult.error.message || "Unknown error"}`
          };
        }
        const isInformative = this.meta.scoreDisplayMode === Audit.SCORING_MODES.INFORMATIVE;
        const violations = artifacts.Accessibility.violations || [];
        const failureCases = isInformative ? violations.concat(incomplete) : violations;
        const rule = failureCases.find((result) => result.id === this.meta.id);
        const impact = rule?.impact;
        const tags = rule?.tags;
        if (isInformative && !rule) {
          return {
            score: null,
            notApplicable: true
          };
        }
        let items = [];
        if (rule?.nodes) {
          items = rule.nodes.map((axeNode) => ({
            node: {
              ...Audit.makeNodeItem(axeNode.node),
              explanation: axeNode.failureSummary
            },
            subItems: axeNode.relatedNodes.length ? {
              type: "subitems",
              items: axeNode.relatedNodes.map((node) => ({ relatedNode: Audit.makeNodeItem(node) }))
            } : void 0
          }));
        }
        const headings = [
          /* eslint-disable max-len */
          { key: "node", valueType: "node", subItemsHeading: { key: "relatedNode", valueType: "node" }, label: str_4(UIStrings24.failingElementsHeader) }
          /* eslint-enable max-len */
        ];
        let debugData;
        if (impact || tags) {
          debugData = {
            type: "debugdata",
            impact,
            tags
          };
        }
        return {
          score: Number(rule === void 0),
          details: { ...Audit.makeTableDetails(headings, items), debugData }
        };
      }
    };
    axe_audit_default = AxeAudit;
  }
});

// core/audits/accessibility/accesskeys.js
var accesskeys_exports = {};
__export(accesskeys_exports, {
  UIStrings: () => UIStrings25,
  default: () => accesskeys_default
});
var UIStrings25, str_5, Accesskeys, accesskeys_default;
var init_accesskeys = __esm({
  "core/audits/accessibility/accesskeys.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings25 = {
      /** Title of an accessibility audit that evaluates if the accesskey HTML attribute values are unique across all elements. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[accesskey]` values are unique",
      /** Title of an accessibility audit that evaluates if the ARIA HTML attributes are misaligned with the aria-role HTML attribute specificed on the element, such mismatches are invalid. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[accesskey]` values are not unique",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Access keys let users quickly focus a part of the page. For proper navigation, each access key must be unique. [Learn more about access keys](https://dequeuniversity.com/rules/axe/4.11/accesskeys)."
    };
    str_5 = createIcuMessageFn({ url: "core/audits/accessibility/accesskeys.js" }.url, UIStrings25);
    Accesskeys = class extends axe_audit_default {
      static {
        __name(this, "Accesskeys");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "accesskeys",
          title: str_5(UIStrings25.title),
          failureTitle: str_5(UIStrings25.failureTitle),
          description: str_5(UIStrings25.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    accesskeys_default = Accesskeys;
  }
});

// core/audits/accessibility/aria-allowed-attr.js
var aria_allowed_attr_exports = {};
__export(aria_allowed_attr_exports, {
  UIStrings: () => UIStrings26,
  default: () => aria_allowed_attr_default
});
var UIStrings26, str_6, ARIAAllowedAttr, aria_allowed_attr_default;
var init_aria_allowed_attr = __esm({
  "core/audits/accessibility/aria-allowed-attr.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings26 = {
      /** Title of an accessibility audit that evaluates if the ARIA HTML attributes are misaligned with the aria-role HTML attribute specificed on the element, such mismatches are invalid. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[aria-*]` attributes match their roles",
      /** Title of an accessibility audit that evaluates if the ARIA HTML attributes are misaligned with the aria-role HTML attribute specificed on the element, such mismatches are invalid. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[aria-*]` attributes do not match their roles",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn how to match ARIA attributes to their roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-attr)."
    };
    str_6 = createIcuMessageFn({ url: "core/audits/accessibility/aria-allowed-attr.js" }.url, UIStrings26);
    ARIAAllowedAttr = class extends axe_audit_default {
      static {
        __name(this, "ARIAAllowedAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-allowed-attr",
          title: str_6(UIStrings26.title),
          failureTitle: str_6(UIStrings26.failureTitle),
          description: str_6(UIStrings26.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_allowed_attr_default = ARIAAllowedAttr;
  }
});

// core/audits/accessibility/aria-allowed-role.js
var aria_allowed_role_exports = {};
__export(aria_allowed_role_exports, {
  UIStrings: () => UIStrings27,
  default: () => aria_allowed_role_default
});
var UIStrings27, str_7, ARIAAllowedRole, aria_allowed_role_default;
var init_aria_allowed_role = __esm({
  "core/audits/accessibility/aria-allowed-role.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings27 = {
      /** Title of an accessibility audit that evaluates if the ARIA role attributes are valid for the HTML element. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Uses ARIA roles only on compatible elements",
      /** Title of an accessibility audit that evaluates if the ARIA role attributes are valid for the HTML element. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Uses ARIA roles on incompatible elements",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Many HTML elements can only be assigned certain ARIA roles. Using ARIA roles where they are not allowed can interfere with the accessibility of the web page. [Learn more about ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-role)."
    };
    str_7 = createIcuMessageFn({ url: "core/audits/accessibility/aria-allowed-role.js" }.url, UIStrings27);
    ARIAAllowedRole = class extends axe_audit_default {
      static {
        __name(this, "ARIAAllowedRole");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-allowed-role",
          title: str_7(UIStrings27.title),
          failureTitle: str_7(UIStrings27.failureTitle),
          description: str_7(UIStrings27.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_allowed_role_default = ARIAAllowedRole;
  }
});

// core/audits/accessibility/aria-command-name.js
var aria_command_name_exports = {};
__export(aria_command_name_exports, {
  UIStrings: () => UIStrings28,
  default: () => aria_command_name_default
});
var UIStrings28, str_8, AriaCommandName, aria_command_name_default;
var init_aria_command_name = __esm({
  "core/audits/accessibility/aria-command-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings28 = {
      /** Title of an accessibility audit that evaluates if important HTML elements have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`button`, `link`, and `menuitem` elements have accessible names",
      /** Title of an accessibility audit that evaluates if important HTML elements do not have accessible names. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`button`, `link`, and `menuitem` elements do not have accessible names.",
      /** Description of a Lighthouse audit that tells the user *why* they should have accessible names for HTML elements. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to make command elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-command-name)."
    };
    str_8 = createIcuMessageFn({ url: "core/audits/accessibility/aria-command-name.js" }.url, UIStrings28);
    AriaCommandName = class extends axe_audit_default {
      static {
        __name(this, "AriaCommandName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-command-name",
          title: str_8(UIStrings28.title),
          failureTitle: str_8(UIStrings28.failureTitle),
          description: str_8(UIStrings28.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_command_name_default = AriaCommandName;
  }
});

// core/audits/accessibility/aria-conditional-attr.js
var aria_conditional_attr_exports = {};
__export(aria_conditional_attr_exports, {
  UIStrings: () => UIStrings29,
  default: () => aria_conditional_attr_default
});
var UIStrings29, str_9, AriaConditionalAttr, aria_conditional_attr_default;
var init_aria_conditional_attr = __esm({
  "core/audits/accessibility/aria-conditional-attr.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings29 = {
      /** Title of an accessibility audit that checks if ARIA attributes are used as specified for element roles. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA attributes are used as specified for the element's role",
      /** Title of an accessibility audit that checks if ARIA attributes are used as specified for element roles. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA attributes are not used as specified for the element's role",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Some ARIA attributes are only allowed on an element under certain conditions. [Learn more about conditional ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-conditional-attr)."
    };
    str_9 = createIcuMessageFn({ url: "core/audits/accessibility/aria-conditional-attr.js" }.url, UIStrings29);
    AriaConditionalAttr = class extends axe_audit_default {
      static {
        __name(this, "AriaConditionalAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-conditional-attr",
          title: str_9(UIStrings29.title),
          failureTitle: str_9(UIStrings29.failureTitle),
          description: str_9(UIStrings29.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_conditional_attr_default = AriaConditionalAttr;
  }
});

// core/audits/accessibility/aria-deprecated-role.js
var aria_deprecated_role_exports = {};
__export(aria_deprecated_role_exports, {
  UIStrings: () => UIStrings30,
  default: () => aria_deprecated_role_default
});
var UIStrings30, str_10, AriaDeprecatedRole, aria_deprecated_role_default;
var init_aria_deprecated_role = __esm({
  "core/audits/accessibility/aria-deprecated-role.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings30 = {
      /** Title of an accessibility audit that checks if deprecated ARIA roles are used. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Deprecated ARIA roles were not used",
      /** Title of an accessibility audit that checks if deprecated ARIA roles are used. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Deprecated ARIA roles were used",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Deprecated ARIA roles may not be processed correctly by assistive technology. [Learn more about deprecated ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-deprecated-role)."
    };
    str_10 = createIcuMessageFn({ url: "core/audits/accessibility/aria-deprecated-role.js" }.url, UIStrings30);
    AriaDeprecatedRole = class extends axe_audit_default {
      static {
        __name(this, "AriaDeprecatedRole");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-deprecated-role",
          title: str_10(UIStrings30.title),
          failureTitle: str_10(UIStrings30.failureTitle),
          description: str_10(UIStrings30.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_deprecated_role_default = AriaDeprecatedRole;
  }
});

// core/audits/accessibility/aria-dialog-name.js
var aria_dialog_name_exports = {};
__export(aria_dialog_name_exports, {
  UIStrings: () => UIStrings31,
  default: () => aria_dialog_name_default
});
var UIStrings31, str_11, AriaDialogName, aria_dialog_name_default;
var init_aria_dialog_name = __esm({
  "core/audits/accessibility/aria-dialog-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings31 = {
      /** Title of an accessibility audit that evaluates if ARIA dialog elements have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: 'Elements with `role="dialog"` or `role="alertdialog"` have accessible names.',
      /** Title of an accessibility audit that evaluates if ARIA dialog elements do not have accessible names. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: 'Elements with `role="dialog"` or `role="alertdialog"` do not have accessible names.',
      /** Description of a Lighthouse audit that tells the user *why* they should have accessible names for ARIA dialog elements. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "ARIA dialog elements without accessible names may prevent screen readers users from discerning the purpose of these elements. [Learn how to make ARIA dialog elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-dialog-name)."
    };
    str_11 = createIcuMessageFn({ url: "core/audits/accessibility/aria-dialog-name.js" }.url, UIStrings31);
    AriaDialogName = class extends axe_audit_default {
      static {
        __name(this, "AriaDialogName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-dialog-name",
          title: str_11(UIStrings31.title),
          failureTitle: str_11(UIStrings31.failureTitle),
          description: str_11(UIStrings31.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_dialog_name_default = AriaDialogName;
  }
});

// core/audits/accessibility/aria-hidden-body.js
var aria_hidden_body_exports = {};
__export(aria_hidden_body_exports, {
  UIStrings: () => UIStrings32,
  default: () => aria_hidden_body_default
});
var UIStrings32, str_12, AriaHiddenBody, aria_hidden_body_default;
var init_aria_hidden_body = __esm({
  "core/audits/accessibility/aria-hidden-body.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings32 = {
      /** Title of an accessibility audit that checks if the html <body> element does not have an aria-hidden attribute set on it. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: '`[aria-hidden="true"]` is not present on the document `<body>`',
      /** Title of an accessibility audit that checks if the html <body> element does not have an aria-hidden attribute set on it. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: '`[aria-hidden="true"]` is present on the document `<body>`',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: 'Assistive technologies, like screen readers, work inconsistently when `aria-hidden="true"` is set on the document `<body>`. [Learn how `aria-hidden` affects the document body](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-body).'
    };
    str_12 = createIcuMessageFn({ url: "core/audits/accessibility/aria-hidden-body.js" }.url, UIStrings32);
    AriaHiddenBody = class extends axe_audit_default {
      static {
        __name(this, "AriaHiddenBody");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-hidden-body",
          title: str_12(UIStrings32.title),
          failureTitle: str_12(UIStrings32.failureTitle),
          description: str_12(UIStrings32.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_hidden_body_default = AriaHiddenBody;
  }
});

// core/audits/accessibility/aria-hidden-focus.js
var aria_hidden_focus_exports = {};
__export(aria_hidden_focus_exports, {
  UIStrings: () => UIStrings33,
  default: () => aria_hidden_focus_default
});
var UIStrings33, str_13, AriaHiddenFocus, aria_hidden_focus_default;
var init_aria_hidden_focus = __esm({
  "core/audits/accessibility/aria-hidden-focus.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings33 = {
      /** Title of an accessibility audit that checks if all elements that have an aria-hidden attribute do not contain focusable descendent elements. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: '`[aria-hidden="true"]` elements do not contain focusable descendents',
      /** Title of an accessibility audit that checks if all elements that have an aria-hidden attribute do not contain focusable descendent elements. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: '`[aria-hidden="true"]` elements contain focusable descendents',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: 'Focusable descendents within an `[aria-hidden="true"]` element prevent those interactive elements from being available to users of assistive technologies like screen readers. [Learn how `aria-hidden` affects focusable elements](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-focus).'
    };
    str_13 = createIcuMessageFn({ url: "core/audits/accessibility/aria-hidden-focus.js" }.url, UIStrings33);
    AriaHiddenFocus = class extends axe_audit_default {
      static {
        __name(this, "AriaHiddenFocus");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-hidden-focus",
          title: str_13(UIStrings33.title),
          failureTitle: str_13(UIStrings33.failureTitle),
          description: str_13(UIStrings33.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_hidden_focus_default = AriaHiddenFocus;
  }
});

// core/audits/accessibility/aria-input-field-name.js
var aria_input_field_name_exports = {};
__export(aria_input_field_name_exports, {
  UIStrings: () => UIStrings34,
  default: () => aria_input_field_name_default
});
var UIStrings34, str_14, AriaInputFieldName, aria_input_field_name_default;
var init_aria_input_field_name = __esm({
  "core/audits/accessibility/aria-input-field-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings34 = {
      /** Title of an accessibility audit that checks that all ARIA input fields have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA input fields have accessible names",
      /** Title of an accessibility audit that checks that all ARIA input fields have an accessible name. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA input fields do not have accessible names",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When an input field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about input field labels](https://dequeuniversity.com/rules/axe/4.11/aria-input-field-name)."
    };
    str_14 = createIcuMessageFn({ url: "core/audits/accessibility/aria-input-field-name.js" }.url, UIStrings34);
    AriaInputFieldName = class extends axe_audit_default {
      static {
        __name(this, "AriaInputFieldName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-input-field-name",
          title: str_14(UIStrings34.title),
          failureTitle: str_14(UIStrings34.failureTitle),
          description: str_14(UIStrings34.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_input_field_name_default = AriaInputFieldName;
  }
});

// core/audits/accessibility/aria-meter-name.js
var aria_meter_name_exports = {};
__export(aria_meter_name_exports, {
  UIStrings: () => UIStrings35,
  default: () => aria_meter_name_default
});
var UIStrings35, str_15, AriaMeterName, aria_meter_name_default;
var init_aria_meter_name = __esm({
  "core/audits/accessibility/aria-meter-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings35 = {
      /** Title of an accessibility audit that evaluates if meter HTML elements have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA `meter` elements have accessible names",
      /** Title of an accessibility audit that evaluates if meter HTML elements do not have accessible names. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA `meter` elements do not have accessible names.",
      /** Description of a Lighthouse audit that tells the user *why* they should have accessible names for HTML 'meter' elements. This is displayed after a user expands the section to see more. No character length limits. 'Learn how...' becomes link text to additional documentation. */
      description: "When a meter element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `meter` elements](https://dequeuniversity.com/rules/axe/4.11/aria-meter-name)."
    };
    str_15 = createIcuMessageFn({ url: "core/audits/accessibility/aria-meter-name.js" }.url, UIStrings35);
    AriaMeterName = class extends axe_audit_default {
      static {
        __name(this, "AriaMeterName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-meter-name",
          title: str_15(UIStrings35.title),
          failureTitle: str_15(UIStrings35.failureTitle),
          description: str_15(UIStrings35.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_meter_name_default = AriaMeterName;
  }
});

// core/audits/accessibility/aria-progressbar-name.js
var aria_progressbar_name_exports = {};
__export(aria_progressbar_name_exports, {
  UIStrings: () => UIStrings36,
  default: () => aria_progressbar_name_default
});
var UIStrings36, str_16, AriaProgressbarName, aria_progressbar_name_default;
var init_aria_progressbar_name = __esm({
  "core/audits/accessibility/aria-progressbar-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings36 = {
      /** Title of an accessibility audit that evaluates if progressbar HTML elements have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA `progressbar` elements have accessible names",
      /** Title of an accessibility audit that evaluates if progressbar HTML elements do not have accessible names. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA `progressbar` elements do not have accessible names.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When a `progressbar` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to label `progressbar` elements](https://dequeuniversity.com/rules/axe/4.11/aria-progressbar-name)."
    };
    str_16 = createIcuMessageFn({ url: "core/audits/accessibility/aria-progressbar-name.js" }.url, UIStrings36);
    AriaProgressbarName = class extends axe_audit_default {
      static {
        __name(this, "AriaProgressbarName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-progressbar-name",
          title: str_16(UIStrings36.title),
          failureTitle: str_16(UIStrings36.failureTitle),
          description: str_16(UIStrings36.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_progressbar_name_default = AriaProgressbarName;
  }
});

// core/audits/accessibility/aria-prohibited-attr.js
var aria_prohibited_attr_exports = {};
__export(aria_prohibited_attr_exports, {
  UIStrings: () => UIStrings37,
  default: () => aria_prohibited_attr_default
});
var UIStrings37, str_17, AriaProhibitedAttr, aria_prohibited_attr_default;
var init_aria_prohibited_attr = __esm({
  "core/audits/accessibility/aria-prohibited-attr.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings37 = {
      /** Title of an accessibility audit that checks if elements use prohibited ARIA attributes. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Elements use only permitted ARIA attributes",
      /** Title of an accessibility audit that checks if elements use prohibited ARIA attributes. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Elements use prohibited ARIA attributes",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Using ARIA attributes in roles where they are prohibited can mean that important information is not communicated to users of assistive technologies. [Learn more about prohibited ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-prohibited-attr)."
    };
    str_17 = createIcuMessageFn({ url: "core/audits/accessibility/aria-prohibited-attr.js" }.url, UIStrings37);
    AriaProhibitedAttr = class extends axe_audit_default {
      static {
        __name(this, "AriaProhibitedAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-prohibited-attr",
          title: str_17(UIStrings37.title),
          failureTitle: str_17(UIStrings37.failureTitle),
          description: str_17(UIStrings37.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_prohibited_attr_default = AriaProhibitedAttr;
  }
});

// core/audits/accessibility/aria-required-attr.js
var aria_required_attr_exports = {};
__export(aria_required_attr_exports, {
  UIStrings: () => UIStrings38,
  default: () => aria_required_attr_default
});
var UIStrings38, str_18, ARIARequiredAttr, aria_required_attr_default;
var init_aria_required_attr = __esm({
  "core/audits/accessibility/aria-required-attr.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings38 = {
      /** Title of an accessibility audit that evaluates if all elements with the aria-role attribute have the other corresponding ARIA attributes set as well. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[role]`s have all required `[aria-*]` attributes",
      /** Title of an accessibility audit that evaluates if all elements with the aria-role attribute have the other corresponding ARIA attributes set as well. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[role]`s do not have all required `[aria-*]` attributes",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more about roles and required attributes](https://dequeuniversity.com/rules/axe/4.11/aria-required-attr)."
    };
    str_18 = createIcuMessageFn({ url: "core/audits/accessibility/aria-required-attr.js" }.url, UIStrings38);
    ARIARequiredAttr = class extends axe_audit_default {
      static {
        __name(this, "ARIARequiredAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-required-attr",
          title: str_18(UIStrings38.title),
          failureTitle: str_18(UIStrings38.failureTitle),
          description: str_18(UIStrings38.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_required_attr_default = ARIARequiredAttr;
  }
});

// core/audits/accessibility/aria-required-children.js
var aria_required_children_exports = {};
__export(aria_required_children_exports, {
  UIStrings: () => UIStrings39,
  default: () => aria_required_children_default
});
var UIStrings39, str_19, AriaRequiredChildren, aria_required_children_default;
var init_aria_required_children = __esm({
  "core/audits/accessibility/aria-required-children.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings39 = {
      /** Title of an accessibility audit that evaluates if the elements with an aria-role that require child elements have the required children. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Elements with an ARIA `[role]` that require children to contain a specific `[role]` have all required children.",
      /** Title of an accessibility audit that evaluates if the elements with an aria-role that require child elements have the required children. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Elements with an ARIA `[role]` that require children to contain a specific `[role]` are missing some or all of those required children.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Some ARIA parent roles must contain specific child roles to perform their intended accessibility functions. [Learn more about roles and required children elements](https://dequeuniversity.com/rules/axe/4.11/aria-required-children)."
    };
    str_19 = createIcuMessageFn({ url: "core/audits/accessibility/aria-required-children.js" }.url, UIStrings39);
    AriaRequiredChildren = class extends axe_audit_default {
      static {
        __name(this, "AriaRequiredChildren");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-required-children",
          title: str_19(UIStrings39.title),
          failureTitle: str_19(UIStrings39.failureTitle),
          description: str_19(UIStrings39.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_required_children_default = AriaRequiredChildren;
  }
});

// core/audits/accessibility/aria-required-parent.js
var aria_required_parent_exports = {};
__export(aria_required_parent_exports, {
  UIStrings: () => UIStrings40,
  default: () => aria_required_parent_default
});
var UIStrings40, str_20, AriaRequiredParent, aria_required_parent_default;
var init_aria_required_parent = __esm({
  "core/audits/accessibility/aria-required-parent.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings40 = {
      /** Title of an accessibility audit that evaluates valid aria-role usage. Some ARIA roles require that elements must be a child of specific parent element. This audit checks that when those roles are used, the element with the role is in fact a child of the required parent. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[role]`s are contained by their required parent element",
      /** Title of an accessibility audit that evaluates valid aria-role usage. Some ARIA roles require that elements must be a child of specific parent element. This audit checks that when those roles are used, the element with the role is in fact a child of the required parent. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[role]`s are not contained by their required parent element",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Some ARIA child roles must be contained by specific parent roles to properly perform their intended accessibility functions. [Learn more about ARIA roles and required parent element](https://dequeuniversity.com/rules/axe/4.11/aria-required-parent)."
    };
    str_20 = createIcuMessageFn({ url: "core/audits/accessibility/aria-required-parent.js" }.url, UIStrings40);
    AriaRequiredParent = class extends axe_audit_default {
      static {
        __name(this, "AriaRequiredParent");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-required-parent",
          title: str_20(UIStrings40.title),
          failureTitle: str_20(UIStrings40.failureTitle),
          description: str_20(UIStrings40.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_required_parent_default = AriaRequiredParent;
  }
});

// core/audits/accessibility/aria-roles.js
var aria_roles_exports = {};
__export(aria_roles_exports, {
  UIStrings: () => UIStrings41,
  default: () => aria_roles_default
});
var UIStrings41, str_21, AriaRoles, aria_roles_default;
var init_aria_roles = __esm({
  "core/audits/accessibility/aria-roles.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings41 = {
      /** Title of an accessibility audit that evaluates if all elements have valid aria-role HTML attributes. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[role]` values are valid",
      /** Title of an accessibility audit that evaluates if all elements have valid aria-role HTML attributes. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[role]` values are not valid",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "ARIA roles must have valid values in order to perform their intended accessibility functions. [Learn more about valid ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-roles)."
    };
    str_21 = createIcuMessageFn({ url: "core/audits/accessibility/aria-roles.js" }.url, UIStrings41);
    AriaRoles = class extends axe_audit_default {
      static {
        __name(this, "AriaRoles");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-roles",
          title: str_21(UIStrings41.title),
          failureTitle: str_21(UIStrings41.failureTitle),
          description: str_21(UIStrings41.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_roles_default = AriaRoles;
  }
});

// core/audits/accessibility/aria-text.js
var aria_text_exports = {};
__export(aria_text_exports, {
  UIStrings: () => UIStrings42,
  default: () => aria_text_default
});
var UIStrings42, str_22, AriaText, aria_text_default;
var init_aria_text = __esm({
  "core/audits/accessibility/aria-text.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings42 = {
      /** Title of an accessibility audit that evaluates if elements with `role=text` have no focusable descendents. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Elements with the `role=text` attribute do not have focusable descendents.",
      /** Title of an accessibility audit that evaluates if elements with `role=text` have focusable descendents. This title is descriptive of the successful state and is shown to users when no user action is required. */
      failureTitle: "Elements with the `role=text` attribute do have focusable descendents.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Adding `role=text` around a text node split by markup enables VoiceOver to treat it as one phrase, but the element's focusable descendents will not be announced. [Learn more about the `role=text` attribute](https://dequeuniversity.com/rules/axe/4.11/aria-text)."
    };
    str_22 = createIcuMessageFn({ url: "core/audits/accessibility/aria-text.js" }.url, UIStrings42);
    AriaText = class extends axe_audit_default {
      static {
        __name(this, "AriaText");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-text",
          title: str_22(UIStrings42.title),
          failureTitle: str_22(UIStrings42.failureTitle),
          description: str_22(UIStrings42.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_text_default = AriaText;
  }
});

// core/audits/accessibility/aria-toggle-field-name.js
var aria_toggle_field_name_exports = {};
__export(aria_toggle_field_name_exports, {
  UIStrings: () => UIStrings43,
  default: () => aria_toggle_field_name_default
});
var UIStrings43, str_23, AriaToggleFieldName, aria_toggle_field_name_default;
var init_aria_toggle_field_name = __esm({
  "core/audits/accessibility/aria-toggle-field-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings43 = {
      /** Title of an accessibility audit that checks that all ARIA toggle fields have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA toggle fields have accessible names",
      /** Title of an accessibility audit that checks that all ARIA toggle fields have an accessible name. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA toggle fields do not have accessible names",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When a toggle field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about toggle fields](https://dequeuniversity.com/rules/axe/4.11/aria-toggle-field-name)."
    };
    str_23 = createIcuMessageFn({ url: "core/audits/accessibility/aria-toggle-field-name.js" }.url, UIStrings43);
    AriaToggleFieldName = class extends axe_audit_default {
      static {
        __name(this, "AriaToggleFieldName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-toggle-field-name",
          title: str_23(UIStrings43.title),
          failureTitle: str_23(UIStrings43.failureTitle),
          description: str_23(UIStrings43.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_toggle_field_name_default = AriaToggleFieldName;
  }
});

// core/audits/accessibility/aria-tooltip-name.js
var aria_tooltip_name_exports = {};
__export(aria_tooltip_name_exports, {
  UIStrings: () => UIStrings44,
  default: () => aria_tooltip_name_default
});
var UIStrings44, str_24, AriaTooltipName, aria_tooltip_name_default;
var init_aria_tooltip_name = __esm({
  "core/audits/accessibility/aria-tooltip-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings44 = {
      /** Title of an accessibility audit that evaluates if tooltip HTML elements have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA `tooltip` elements have accessible names",
      /** Title of an accessibility audit that evaluates if tooltip HTML elements do not have accessible names. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA `tooltip` elements do not have accessible names.",
      /** Description of a Lighthouse audit that tells the user *why* they should have accessible names for HTML 'tooltip' elements. This is displayed after a user expands the section to see more. No character length limits. 'Learn how...' becomes link text to additional documentation. */
      description: "When a tooltip element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `tooltip` elements](https://dequeuniversity.com/rules/axe/4.11/aria-tooltip-name)."
    };
    str_24 = createIcuMessageFn({ url: "core/audits/accessibility/aria-tooltip-name.js" }.url, UIStrings44);
    AriaTooltipName = class extends axe_audit_default {
      static {
        __name(this, "AriaTooltipName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-tooltip-name",
          title: str_24(UIStrings44.title),
          failureTitle: str_24(UIStrings44.failureTitle),
          description: str_24(UIStrings44.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_tooltip_name_default = AriaTooltipName;
  }
});

// core/audits/accessibility/aria-treeitem-name.js
var aria_treeitem_name_exports = {};
__export(aria_treeitem_name_exports, {
  UIStrings: () => UIStrings45,
  default: () => aria_treeitem_name_default
});
var UIStrings45, str_25, AriaTreeitemName, aria_treeitem_name_default;
var init_aria_treeitem_name = __esm({
  "core/audits/accessibility/aria-treeitem-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings45 = {
      /** Title of an accessibility audit that evaluates if treeitem HTML elements have an accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA `treeitem` elements have accessible names",
      /** Title of an accessibility audit that evaluates if treeitem HTML elements do not have accessible names. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA `treeitem` elements do not have accessible names.",
      /** Description of a Lighthouse audit that tells the user *why* they should have accessible names for HTML elements. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When a `treeitem` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about labeling `treeitem` elements](https://dequeuniversity.com/rules/axe/4.11/aria-treeitem-name)."
    };
    str_25 = createIcuMessageFn({ url: "core/audits/accessibility/aria-treeitem-name.js" }.url, UIStrings45);
    AriaTreeitemName = class extends axe_audit_default {
      static {
        __name(this, "AriaTreeitemName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-treeitem-name",
          title: str_25(UIStrings45.title),
          failureTitle: str_25(UIStrings45.failureTitle),
          description: str_25(UIStrings45.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_treeitem_name_default = AriaTreeitemName;
  }
});

// core/audits/accessibility/aria-valid-attr-value.js
var aria_valid_attr_value_exports = {};
__export(aria_valid_attr_value_exports, {
  UIStrings: () => UIStrings46,
  default: () => aria_valid_attr_value_default
});
var UIStrings46, str_26, ARIAValidAttr, aria_valid_attr_value_default;
var init_aria_valid_attr_value = __esm({
  "core/audits/accessibility/aria-valid-attr-value.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings46 = {
      /** Title of an accessibility audit that evaluates if all elements that have an ARIA HTML attribute have a valid value for that attribute. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[aria-*]` attributes have valid values",
      /** Title of an accessibility audit that evaluates if all elements that have an ARIA HTML attribute have a valid value for that attribute. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[aria-*]` attributes do not have valid values",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more about valid values for ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr-value)."
    };
    str_26 = createIcuMessageFn({ url: "core/audits/accessibility/aria-valid-attr-value.js" }.url, UIStrings46);
    ARIAValidAttr = class extends axe_audit_default {
      static {
        __name(this, "ARIAValidAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-valid-attr-value",
          title: str_26(UIStrings46.title),
          failureTitle: str_26(UIStrings46.failureTitle),
          description: str_26(UIStrings46.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_valid_attr_value_default = ARIAValidAttr;
  }
});

// core/audits/accessibility/aria-valid-attr.js
var aria_valid_attr_exports = {};
__export(aria_valid_attr_exports, {
  UIStrings: () => UIStrings47,
  default: () => aria_valid_attr_default
});
var UIStrings47, str_27, ARIAValidAttr2, aria_valid_attr_default;
var init_aria_valid_attr = __esm({
  "core/audits/accessibility/aria-valid-attr.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings47 = {
      /** Title of an accessibility audit that evaluates if all elements with ARIA HTML attributes have spelled the name of attribute correctly. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[aria-*]` attributes are valid and not misspelled",
      /** Title of an accessibility audit that evaluates if all elements with ARIA HTML attributes have spelled the name of attribute correctly. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[aria-*]` attributes are not valid or misspelled",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more about valid ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr)."
    };
    str_27 = createIcuMessageFn({ url: "core/audits/accessibility/aria-valid-attr.js" }.url, UIStrings47);
    ARIAValidAttr2 = class extends axe_audit_default {
      static {
        __name(this, "ARIAValidAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "aria-valid-attr",
          title: str_27(UIStrings47.title),
          failureTitle: str_27(UIStrings47.failureTitle),
          description: str_27(UIStrings47.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    aria_valid_attr_default = ARIAValidAttr2;
  }
});

// core/audits/accessibility/autocomplete-valid.js
var autocomplete_valid_exports = {};
__export(autocomplete_valid_exports, {
  UIStrings: () => UIStrings48,
  default: () => autocomplete_valid_default
});
var UIStrings48, str_28, AutocompleteValid, autocomplete_valid_default;
var init_autocomplete_valid = __esm({
  "core/audits/accessibility/autocomplete-valid.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings48 = {
      /** Title of an accessibility audit that evaluates if all form fields have valid autocomplete attributes. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`autocomplete` attributes are used correctly",
      /** Title of an accessibility audit that evaluates if all form fields have valid autocomplete attributes. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`autocomplete` attributes are not used correctly",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "The `autocomplete` attribute values must be valid and correctly applied for screen readers to function correctly. [Learn more about valid autocomplete values](https://dequeuniversity.com/rules/axe/4.11/autocomplete-valid)."
    };
    str_28 = createIcuMessageFn({ url: "core/audits/accessibility/autocomplete-valid.js" }.url, UIStrings48);
    AutocompleteValid = class extends axe_audit_default {
      static {
        __name(this, "AutocompleteValid");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "autocomplete-valid",
          title: str_28(UIStrings48.title),
          failureTitle: str_28(UIStrings48.failureTitle),
          description: str_28(UIStrings48.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    autocomplete_valid_default = AutocompleteValid;
  }
});

// core/audits/accessibility/button-name.js
var button_name_exports = {};
__export(button_name_exports, {
  UIStrings: () => UIStrings49,
  default: () => button_name_default
});
var UIStrings49, str_29, ButtonName, button_name_default;
var init_button_name = __esm({
  "core/audits/accessibility/button-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings49 = {
      /** Title of an accessibility audit that evaluates if all button elements have names accessible to screen readers. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Buttons have an accessible name",
      /** Title of an accessibility audit that evaluates if all button elements have names accessible to screen readers. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Buttons do not have an accessible name",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: `When a button doesn't have an accessible name, screen readers announce it as "button", making it unusable for users who rely on screen readers. [Learn how to make buttons more accessible](https://dequeuniversity.com/rules/axe/4.11/button-name).`
    };
    str_29 = createIcuMessageFn({ url: "core/audits/accessibility/button-name.js" }.url, UIStrings49);
    ButtonName = class extends axe_audit_default {
      static {
        __name(this, "ButtonName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "button-name",
          title: str_29(UIStrings49.title),
          failureTitle: str_29(UIStrings49.failureTitle),
          description: str_29(UIStrings49.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    button_name_default = ButtonName;
  }
});

// core/audits/accessibility/bypass.js
var bypass_exports = {};
__export(bypass_exports, {
  UIStrings: () => UIStrings50,
  default: () => bypass_default
});
var UIStrings50, str_30, Bypass, bypass_default;
var init_bypass = __esm({
  "core/audits/accessibility/bypass.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings50 = {
      /** Title of an accessibility audit that evaluates if the page has elements that let screen reader users skip over repetitive content. `heading`, `skip link`, and `landmark region` are technical terms for the elements that enable quick page navigation. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "The page contains a heading, skip link, or landmark region",
      /** Title of an accessibility audit that evaluates if the page has elements that let screen reader users skip over repetitive content. `heading`, `skip link`, and `landmark region` are technical terms for the elements that enable quick page navigation. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "The page does not contain a heading, skip link, or landmark region",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Adding ways to bypass repetitive content lets keyboard users navigate the page more efficiently. [Learn more about bypass blocks](https://dequeuniversity.com/rules/axe/4.11/bypass)."
    };
    str_30 = createIcuMessageFn({ url: "core/audits/accessibility/bypass.js" }.url, UIStrings50);
    Bypass = class extends axe_audit_default {
      static {
        __name(this, "Bypass");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "bypass",
          title: str_30(UIStrings50.title),
          failureTitle: str_30(UIStrings50.failureTitle),
          description: str_30(UIStrings50.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    bypass_default = Bypass;
  }
});

// core/audits/accessibility/color-contrast.js
var color_contrast_exports = {};
__export(color_contrast_exports, {
  UIStrings: () => UIStrings51,
  default: () => color_contrast_default
});
var UIStrings51, str_31, ColorContrast, color_contrast_default;
var init_color_contrast = __esm({
  "core/audits/accessibility/color-contrast.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings51 = {
      /** Title of an accessibility audit that evaluates if all foreground colors are distinct enough from their background colors to be legible for users. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Background and foreground colors have a sufficient contrast ratio",
      /** Title of an accessibility audit that evaluates if all foreground colors are distinct enough from their background colors to be legible for users. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Background and foreground colors do not have a sufficient contrast ratio.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Low-contrast text is difficult or impossible for many users to read. [Learn how to provide sufficient color contrast](https://dequeuniversity.com/rules/axe/4.11/color-contrast)."
    };
    str_31 = createIcuMessageFn({ url: "core/audits/accessibility/color-contrast.js" }.url, UIStrings51);
    ColorContrast = class extends axe_audit_default {
      static {
        __name(this, "ColorContrast");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "color-contrast",
          title: str_31(UIStrings51.title),
          failureTitle: str_31(UIStrings51.failureTitle),
          description: str_31(UIStrings51.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    color_contrast_default = ColorContrast;
  }
});

// core/audits/accessibility/definition-list.js
var definition_list_exports = {};
__export(definition_list_exports, {
  UIStrings: () => UIStrings52,
  default: () => definition_list_default
});
var UIStrings52, str_32, DefinitionList, definition_list_default;
var init_definition_list = __esm({
  "core/audits/accessibility/definition-list.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings52 = {
      /** Title of an accessibility audit that evaluates if all the definition list elements have valid markup for screen readers. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<dl>`'s contain only properly-ordered `<dt>` and `<dd>` groups, `<script>`, `<template>` or `<div>` elements.",
      /** Title of an accessibility audit that evaluates if all the definition list elements have valid markup for screen readers. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<dl>`'s do not contain only properly-ordered `<dt>` and `<dd>` groups, `<script>`, `<template>` or `<div>` elements.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When definition lists are not properly marked up, screen readers may produce confusing or inaccurate output. [Learn how to structure definition lists correctly](https://dequeuniversity.com/rules/axe/4.11/definition-list)."
    };
    str_32 = createIcuMessageFn({ url: "core/audits/accessibility/definition-list.js" }.url, UIStrings52);
    DefinitionList = class extends axe_audit_default {
      static {
        __name(this, "DefinitionList");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "definition-list",
          title: str_32(UIStrings52.title),
          failureTitle: str_32(UIStrings52.failureTitle),
          description: str_32(UIStrings52.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    definition_list_default = DefinitionList;
  }
});

// core/audits/accessibility/dlitem.js
var dlitem_exports = {};
__export(dlitem_exports, {
  UIStrings: () => UIStrings53,
  default: () => dlitem_default
});
var UIStrings53, str_33, DLItem, dlitem_default;
var init_dlitem = __esm({
  "core/audits/accessibility/dlitem.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings53 = {
      /** Title of an accessibility audit that evaluates if all definition list item elements (`<dt>`/`<dd>`) have a definition list parent element (`<dl>`). This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Definition list items are wrapped in `<dl>` elements",
      /** Title of an accessibility audit that evaluates if all definition list item elements (`<dt>`/`<dd>`) have a definition list parent element (`<dl>`). This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Definition list items are not wrapped in `<dl>` elements",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Definition list items (`<dt>` and `<dd>`) must be wrapped in a parent `<dl>` element to ensure that screen readers can properly announce them. [Learn how to structure definition lists correctly](https://dequeuniversity.com/rules/axe/4.11/dlitem)."
    };
    str_33 = createIcuMessageFn({ url: "core/audits/accessibility/dlitem.js" }.url, UIStrings53);
    DLItem = class extends axe_audit_default {
      static {
        __name(this, "DLItem");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "dlitem",
          title: str_33(UIStrings53.title),
          failureTitle: str_33(UIStrings53.failureTitle),
          description: str_33(UIStrings53.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    dlitem_default = DLItem;
  }
});

// core/audits/accessibility/document-title.js
var document_title_exports = {};
__export(document_title_exports, {
  UIStrings: () => UIStrings54,
  default: () => document_title_default
});
var UIStrings54, str_34, DocumentTitle, document_title_default;
var init_document_title = __esm({
  "core/audits/accessibility/document-title.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings54 = {
      /** Title of an accessibility audit that evaluates if the page has a <title> element that describes the page. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Document has a `<title>` element",
      /** Title of an accessibility audit that evaluates if the page has a <title> element that describes the page. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Document doesn't have a `<title>` element",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "The title gives screen reader users an overview of the page, and search engine users rely on it heavily to determine if a page is relevant to their search. [Learn more about document titles](https://dequeuniversity.com/rules/axe/4.11/document-title)."
    };
    str_34 = createIcuMessageFn({ url: "core/audits/accessibility/document-title.js" }.url, UIStrings54);
    DocumentTitle = class extends axe_audit_default {
      static {
        __name(this, "DocumentTitle");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "document-title",
          title: str_34(UIStrings54.title),
          failureTitle: str_34(UIStrings54.failureTitle),
          description: str_34(UIStrings54.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    document_title_default = DocumentTitle;
  }
});

// core/audits/accessibility/duplicate-id-aria.js
var duplicate_id_aria_exports = {};
__export(duplicate_id_aria_exports, {
  UIStrings: () => UIStrings55,
  default: () => duplicate_id_aria_default
});
var UIStrings55, str_35, DuplicateIdAria, duplicate_id_aria_default;
var init_duplicate_id_aria = __esm({
  "core/audits/accessibility/duplicate-id-aria.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings55 = {
      /** Title of an accessibility audit that checks if there are any duplicate ARIA IDs on the page. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "ARIA IDs are unique",
      /** Title of an accessibility audit that checks if there are any duplicate ARIA IDs on the page. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "ARIA IDs are not unique",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "The value of an ARIA ID must be unique to prevent other instances from being overlooked by assistive technologies. [Learn how to fix duplicate ARIA IDs](https://dequeuniversity.com/rules/axe/4.11/duplicate-id-aria)."
    };
    str_35 = createIcuMessageFn({ url: "core/audits/accessibility/duplicate-id-aria.js" }.url, UIStrings55);
    DuplicateIdAria = class extends axe_audit_default {
      static {
        __name(this, "DuplicateIdAria");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "duplicate-id-aria",
          title: str_35(UIStrings55.title),
          failureTitle: str_35(UIStrings55.failureTitle),
          description: str_35(UIStrings55.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    duplicate_id_aria_default = DuplicateIdAria;
  }
});

// core/audits/accessibility/empty-heading.js
var empty_heading_exports = {};
__export(empty_heading_exports, {
  UIStrings: () => UIStrings56,
  default: () => empty_heading_default
});
var UIStrings56, str_36, EmptyHeading, empty_heading_default;
var init_empty_heading = __esm({
  "core/audits/accessibility/empty-heading.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings56 = {
      /** Title of an accessibility audit that checks if all heading elements have content. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "All heading elements contain content.",
      /** Title of an accessibility audit that checks if all heading elements have content. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Heading elements do not contain content.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "A heading with no content or inaccessible text prevent screen reader users from accessing information on the page's structure. [Learn more about headings](https://dequeuniversity.com/rules/axe/4.11/empty-heading)."
    };
    str_36 = createIcuMessageFn({ url: "core/audits/accessibility/empty-heading.js" }.url, UIStrings56);
    EmptyHeading = class extends axe_audit_default {
      static {
        __name(this, "EmptyHeading");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "empty-heading",
          title: str_36(UIStrings56.title),
          failureTitle: str_36(UIStrings56.failureTitle),
          description: str_36(UIStrings56.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    empty_heading_default = EmptyHeading;
  }
});

// core/audits/accessibility/form-field-multiple-labels.js
var form_field_multiple_labels_exports = {};
__export(form_field_multiple_labels_exports, {
  UIStrings: () => UIStrings57,
  default: () => form_field_multiple_labels_default
});
var UIStrings57, str_37, FormFieldMultipleLabels, form_field_multiple_labels_default;
var init_form_field_multiple_labels = __esm({
  "core/audits/accessibility/form-field-multiple-labels.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings57 = {
      /** Title of an accessibility audit that checks if any form fields have multiple label elements. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "No form fields have multiple labels",
      /** Title of an accessibility audit that checks if any form fields have multiple label elements. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Form fields have multiple labels",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Form fields with multiple labels can be confusingly announced by assistive technologies like screen readers which use either the first, the last, or all of the labels. [Learn how to use form labels](https://dequeuniversity.com/rules/axe/4.11/form-field-multiple-labels)."
    };
    str_37 = createIcuMessageFn({ url: "core/audits/accessibility/form-field-multiple-labels.js" }.url, UIStrings57);
    FormFieldMultipleLabels = class extends axe_audit_default {
      static {
        __name(this, "FormFieldMultipleLabels");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "form-field-multiple-labels",
          title: str_37(UIStrings57.title),
          failureTitle: str_37(UIStrings57.failureTitle),
          description: str_37(UIStrings57.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    form_field_multiple_labels_default = FormFieldMultipleLabels;
  }
});

// core/audits/accessibility/frame-title.js
var frame_title_exports = {};
__export(frame_title_exports, {
  UIStrings: () => UIStrings58,
  default: () => frame_title_default
});
var UIStrings58, str_38, FrameTitle, frame_title_default;
var init_frame_title = __esm({
  "core/audits/accessibility/frame-title.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings58 = {
      /** Title of an accessibility audit that evaluates if all `<frame>` and `<iframe>` elements on the page have a title HTML attribute to describe their contents. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<frame>` or `<iframe>` elements have a title",
      /** Title of an accessibility audit that evaluates if all `<frame>` and `<iframe>` elements on the page have a title HTML attribute to describe their contents. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<frame>` or `<iframe>` elements do not have a title",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen reader users rely on frame titles to describe the contents of frames. [Learn more about frame titles](https://dequeuniversity.com/rules/axe/4.11/frame-title)."
    };
    str_38 = createIcuMessageFn({ url: "core/audits/accessibility/frame-title.js" }.url, UIStrings58);
    FrameTitle = class extends axe_audit_default {
      static {
        __name(this, "FrameTitle");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "frame-title",
          title: str_38(UIStrings58.title),
          failureTitle: str_38(UIStrings58.failureTitle),
          description: str_38(UIStrings58.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    frame_title_default = FrameTitle;
  }
});

// core/audits/accessibility/heading-order.js
var heading_order_exports = {};
__export(heading_order_exports, {
  UIStrings: () => UIStrings59,
  default: () => heading_order_default
});
var UIStrings59, str_39, HeadingOrder, heading_order_default;
var init_heading_order = __esm({
  "core/audits/accessibility/heading-order.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings59 = {
      /** Title of an accessibility audit that checks if heading elements (<h1>, <h2>, etc) appear in numeric order and only ever increase in steps of 1. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Heading elements appear in a sequentially-descending order",
      /** Title of an accessibility audit that checks if heading elements (<h1>, <h2>, etc) appear in numeric order and only ever increase in steps of 1. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Heading elements are not in a sequentially-descending order",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. [Learn more about heading order](https://dequeuniversity.com/rules/axe/4.11/heading-order)."
    };
    str_39 = createIcuMessageFn({ url: "core/audits/accessibility/heading-order.js" }.url, UIStrings59);
    HeadingOrder = class extends axe_audit_default {
      static {
        __name(this, "HeadingOrder");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "heading-order",
          title: str_39(UIStrings59.title),
          failureTitle: str_39(UIStrings59.failureTitle),
          description: str_39(UIStrings59.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    heading_order_default = HeadingOrder;
  }
});

// core/audits/accessibility/html-has-lang.js
var html_has_lang_exports = {};
__export(html_has_lang_exports, {
  UIStrings: () => UIStrings60,
  default: () => html_has_lang_default
});
var UIStrings60, str_40, HTMLHasLang, html_has_lang_default;
var init_html_has_lang = __esm({
  "core/audits/accessibility/html-has-lang.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings60 = {
      /** Title of an accessibility audit that evaluates if the root HTML tag has a lang attribute identifying the page's language. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<html>` element has a `[lang]` attribute",
      /** Title of an accessibility audit that evaluates if the root HTML tag has a lang attribute identifying the page's language. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<html>` element does not have a `[lang]` attribute",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "If a page doesn't specify a `lang` attribute, a screen reader assumes that the page is in the default language that the user chose when setting up the screen reader. If the page isn't actually in the default language, then the screen reader might not announce the page's text correctly. [Learn more about the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-has-lang)."
    };
    str_40 = createIcuMessageFn({ url: "core/audits/accessibility/html-has-lang.js" }.url, UIStrings60);
    HTMLHasLang = class extends axe_audit_default {
      static {
        __name(this, "HTMLHasLang");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "html-has-lang",
          title: str_40(UIStrings60.title),
          failureTitle: str_40(UIStrings60.failureTitle),
          description: str_40(UIStrings60.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    html_has_lang_default = HTMLHasLang;
  }
});

// core/audits/accessibility/html-lang-valid.js
var html_lang_valid_exports = {};
__export(html_lang_valid_exports, {
  UIStrings: () => UIStrings61,
  default: () => html_lang_valid_default
});
var UIStrings61, str_41, HTMLLangValid, html_lang_valid_default;
var init_html_lang_valid = __esm({
  "core/audits/accessibility/html-lang-valid.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings61 = {
      /** Title of an accessibility audit that evaluates if the value for root HTML tag's lang attribute is a valid BCP 47 language. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<html>` element has a valid value for its `[lang]` attribute",
      /** Title of an accessibility audit that evaluates if the value for root HTML tag's lang attribute is a valid BCP 47 language. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<html>` element does not have a valid value for its `[lang]` attribute.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) helps screen readers announce text properly. [Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-lang-valid)."
    };
    str_41 = createIcuMessageFn({ url: "core/audits/accessibility/html-lang-valid.js" }.url, UIStrings61);
    HTMLLangValid = class extends axe_audit_default {
      static {
        __name(this, "HTMLLangValid");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "html-lang-valid",
          title: str_41(UIStrings61.title),
          failureTitle: str_41(UIStrings61.failureTitle),
          description: str_41(UIStrings61.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    html_lang_valid_default = HTMLLangValid;
  }
});

// core/audits/accessibility/html-xml-lang-mismatch.js
var html_xml_lang_mismatch_exports = {};
__export(html_xml_lang_mismatch_exports, {
  UIStrings: () => UIStrings62,
  default: () => html_xml_lang_mismatch_default
});
var UIStrings62, str_42, HTMLXMLLangMismatch, html_xml_lang_mismatch_default;
var init_html_xml_lang_mismatch = __esm({
  "core/audits/accessibility/html-xml-lang-mismatch.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings62 = {
      /** Title of an accessibility audit that evaluates if the xml:lang attribute, if present, has the same base language as the `lang` attribute. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<html>` element has an `[xml:lang]` attribute with the same base language as the `[lang]` attribute.",
      /** Title of an accessibility audit that evaluates if the xml:lang attribute, if present, has the same base language as the `lang` attribute. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<html>` element does not have an `[xml:lang]` attribute with the same base language as the `[lang]` attribute.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "If the webpage does not specify a consistent language, then the screen reader might not announce the page's text correctly. [Learn more about the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/html-xml-lang-mismatch)."
    };
    str_42 = createIcuMessageFn({ url: "core/audits/accessibility/html-xml-lang-mismatch.js" }.url, UIStrings62);
    HTMLXMLLangMismatch = class extends axe_audit_default {
      static {
        __name(this, "HTMLXMLLangMismatch");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "html-xml-lang-mismatch",
          title: str_42(UIStrings62.title),
          failureTitle: str_42(UIStrings62.failureTitle),
          description: str_42(UIStrings62.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    html_xml_lang_mismatch_default = HTMLXMLLangMismatch;
  }
});

// core/audits/accessibility/identical-links-same-purpose.js
var identical_links_same_purpose_exports = {};
__export(identical_links_same_purpose_exports, {
  UIStrings: () => UIStrings63,
  default: () => identical_links_same_purpose_default
});
var UIStrings63, str_43, IdenticalLinksSamePurpose, identical_links_same_purpose_default;
var init_identical_links_same_purpose = __esm({
  "core/audits/accessibility/identical-links-same-purpose.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings63 = {
      /** Title of an accessibility audit that checks if identical links have the same purpose. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Identical links have the same purpose.",
      /** Title of an accessibility audit that checks if identical links have the same purpose. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Identical links do not have the same purpose.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Links with the same destination should have the same description, to help users understand the link's purpose and decide whether to follow it. [Learn more about identical links](https://dequeuniversity.com/rules/axe/4.11/identical-links-same-purpose)."
    };
    str_43 = createIcuMessageFn({ url: "core/audits/accessibility/identical-links-same-purpose.js" }.url, UIStrings63);
    IdenticalLinksSamePurpose = class extends axe_audit_default {
      static {
        __name(this, "IdenticalLinksSamePurpose");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "identical-links-same-purpose",
          title: str_43(UIStrings63.title),
          failureTitle: str_43(UIStrings63.failureTitle),
          description: str_43(UIStrings63.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    identical_links_same_purpose_default = IdenticalLinksSamePurpose;
  }
});

// core/audits/accessibility/image-alt.js
var image_alt_exports = {};
__export(image_alt_exports, {
  UIStrings: () => UIStrings64,
  default: () => image_alt_default
});
var UIStrings64, str_44, ImageAlt, image_alt_default;
var init_image_alt = __esm({
  "core/audits/accessibility/image-alt.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings64 = {
      /** Title of an accessibility audit that evaluates if all image elements have the alt HTML attribute to describe their contents. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Image elements have `[alt]` attributes",
      /** Title of an accessibility audit that evaluates if all image elements have the alt HTML attribute to describe their contents. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Image elements do not have `[alt]` attributes",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Informative elements should aim for short, descriptive alternate text. Decorative elements can be ignored with an empty alt attribute. [Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.11/image-alt)."
    };
    str_44 = createIcuMessageFn({ url: "core/audits/accessibility/image-alt.js" }.url, UIStrings64);
    ImageAlt = class extends axe_audit_default {
      static {
        __name(this, "ImageAlt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "image-alt",
          title: str_44(UIStrings64.title),
          failureTitle: str_44(UIStrings64.failureTitle),
          description: str_44(UIStrings64.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    image_alt_default = ImageAlt;
  }
});

// core/audits/accessibility/image-redundant-alt.js
var image_redundant_alt_exports = {};
__export(image_redundant_alt_exports, {
  UIStrings: () => UIStrings65,
  default: () => image_redundant_alt_default
});
var UIStrings65, str_45, ImageRedundantAlt, image_redundant_alt_default;
var init_image_redundant_alt = __esm({
  "core/audits/accessibility/image-redundant-alt.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings65 = {
      /** Title of an accessibility audit that evaluates if all image elements have the alt HTML attribute that is not redundant. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Image elements do not have `[alt]` attributes that are redundant text.",
      /** Title of an accessibility audit that evaluates if all image elements have the alt HTML attribute that is not redundant. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Image elements have `[alt]` attributes that are redundant text.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Informative elements should aim for short, descriptive alternative text. Alternative text that is exactly the same as the text adjacent to the link or image is potentially confusing for screen reader users, because the text will be read twice. [Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.11/image-redundant-alt)."
    };
    str_45 = createIcuMessageFn({ url: "core/audits/accessibility/image-redundant-alt.js" }.url, UIStrings65);
    ImageRedundantAlt = class extends axe_audit_default {
      static {
        __name(this, "ImageRedundantAlt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "image-redundant-alt",
          title: str_45(UIStrings65.title),
          failureTitle: str_45(UIStrings65.failureTitle),
          description: str_45(UIStrings65.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    image_redundant_alt_default = ImageRedundantAlt;
  }
});

// core/audits/accessibility/input-button-name.js
var input_button_name_exports = {};
__export(input_button_name_exports, {
  UIStrings: () => UIStrings66,
  default: () => input_button_name_default
});
var UIStrings66, str_46, InputButtonName, input_button_name_default;
var init_input_button_name = __esm({
  "core/audits/accessibility/input-button-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings66 = {
      /** Title of an accessibility audit that evaluates if all input buttons have discernible text. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Input buttons have discernible text.",
      /** Title of an accessibility audit that evaluates if all input buttons have discernible text. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Input buttons do not have discernible text.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Adding discernable and accessible text to input buttons may help screen reader users understand the purpose of the input button. [Learn more about input buttons](https://dequeuniversity.com/rules/axe/4.11/input-button-name)."
    };
    str_46 = createIcuMessageFn({ url: "core/audits/accessibility/input-button-name.js" }.url, UIStrings66);
    InputButtonName = class extends axe_audit_default {
      static {
        __name(this, "InputButtonName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "input-button-name",
          title: str_46(UIStrings66.title),
          failureTitle: str_46(UIStrings66.failureTitle),
          description: str_46(UIStrings66.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    input_button_name_default = InputButtonName;
  }
});

// core/audits/accessibility/input-image-alt.js
var input_image_alt_exports = {};
__export(input_image_alt_exports, {
  UIStrings: () => UIStrings67,
  default: () => input_image_alt_default
});
var UIStrings67, str_47, InputImageAlt, input_image_alt_default;
var init_input_image_alt = __esm({
  "core/audits/accessibility/input-image-alt.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings67 = {
      /** Title of an accessibility audit that evaluates if all input elements of type image have an alt HTML attribute to describe their contents. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: '`<input type="image">` elements have `[alt]` text',
      /** Title of an accessibility audit that evaluates if all input elements of type image have an alt HTML attribute to describe their contents. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: '`<input type="image">` elements do not have `[alt]` text',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When an image is being used as an `<input>` button, providing alternative text can help screen reader users understand the purpose of the button. [Learn about input image alt text](https://dequeuniversity.com/rules/axe/4.11/input-image-alt)."
    };
    str_47 = createIcuMessageFn({ url: "core/audits/accessibility/input-image-alt.js" }.url, UIStrings67);
    InputImageAlt = class extends axe_audit_default {
      static {
        __name(this, "InputImageAlt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "input-image-alt",
          title: str_47(UIStrings67.title),
          failureTitle: str_47(UIStrings67.failureTitle),
          description: str_47(UIStrings67.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    input_image_alt_default = InputImageAlt;
  }
});

// core/audits/accessibility/label-content-name-mismatch.js
var label_content_name_mismatch_exports = {};
__export(label_content_name_mismatch_exports, {
  UIStrings: () => UIStrings68,
  default: () => label_content_name_mismatch_default
});
var UIStrings68, str_48, LabelContentNameMismatch, label_content_name_mismatch_default;
var init_label_content_name_mismatch = __esm({
  "core/audits/accessibility/label-content-name-mismatch.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings68 = {
      /** Title of an accessibility audit that evaluates if elements labeled through their content have their visible text as part of their accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Elements with visible text labels have matching accessible names.",
      /** Title of an accessibility audit that evaluates if elements labeled through their content have their visible text as part of their accessible name. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Elements with visible text labels do not have matching accessible names.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Visible text labels that do not match the accessible name can result in a confusing experience for screen reader users. [Learn more about accessible names](https://dequeuniversity.com/rules/axe/4.11/label-content-name-mismatch)."
    };
    str_48 = createIcuMessageFn({ url: "core/audits/accessibility/label-content-name-mismatch.js" }.url, UIStrings68);
    LabelContentNameMismatch = class extends axe_audit_default {
      static {
        __name(this, "LabelContentNameMismatch");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "label-content-name-mismatch",
          title: str_48(UIStrings68.title),
          failureTitle: str_48(UIStrings68.failureTitle),
          description: str_48(UIStrings68.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    label_content_name_mismatch_default = LabelContentNameMismatch;
  }
});

// core/audits/accessibility/label.js
var label_exports = {};
__export(label_exports, {
  UIStrings: () => UIStrings69,
  default: () => label_default
});
var UIStrings69, str_49, Label, label_default;
var init_label = __esm({
  "core/audits/accessibility/label.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings69 = {
      /** Title of an accessibility audit that evaluates if all form elements have corresponding label elements. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Form elements have associated labels",
      /** Title of an accessibility audit that evaluates if all form elements have corresponding label elements. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Form elements do not have associated labels",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more about form element labels](https://dequeuniversity.com/rules/axe/4.11/label)."
    };
    str_49 = createIcuMessageFn({ url: "core/audits/accessibility/label.js" }.url, UIStrings69);
    Label = class extends axe_audit_default {
      static {
        __name(this, "Label");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "label",
          title: str_49(UIStrings69.title),
          failureTitle: str_49(UIStrings69.failureTitle),
          description: str_49(UIStrings69.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    label_default = Label;
  }
});

// core/audits/accessibility/landmark-one-main.js
var landmark_one_main_exports = {};
__export(landmark_one_main_exports, {
  UIStrings: () => UIStrings70,
  default: () => landmark_one_main_default
});
var UIStrings70, str_50, LandmarkOneMain, landmark_one_main_default;
var init_landmark_one_main = __esm({
  "core/audits/accessibility/landmark-one-main.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings70 = {
      /** Title of an accessibility audit that checks if the document has a main landmark. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Document has a main landmark.",
      /** Title of an accessibility audit that checks if the document has a main landmark. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Document does not have a main landmark.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "One main landmark helps screen reader users navigate a web page. [Learn more about landmarks](https://dequeuniversity.com/rules/axe/4.11/landmark-one-main)."
    };
    str_50 = createIcuMessageFn({ url: "core/audits/accessibility/landmark-one-main.js" }.url, UIStrings70);
    LandmarkOneMain = class extends axe_audit_default {
      static {
        __name(this, "LandmarkOneMain");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "landmark-one-main",
          title: str_50(UIStrings70.title),
          failureTitle: str_50(UIStrings70.failureTitle),
          description: str_50(UIStrings70.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    landmark_one_main_default = LandmarkOneMain;
  }
});

// core/audits/accessibility/link-in-text-block.js
var link_in_text_block_exports = {};
__export(link_in_text_block_exports, {
  UIStrings: () => UIStrings71,
  default: () => link_in_text_block_default
});
var UIStrings71, str_51, LinkInTextBlock, link_in_text_block_default;
var init_link_in_text_block = __esm({
  "core/audits/accessibility/link-in-text-block.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings71 = {
      /** Title of an accessibility audit that evaluates if all link elements can be distinguished without relying on color. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Links are distinguishable without relying on color.",
      /** Title of an accessibility audit that evaluates if all link elements can be distinguished without relying on color. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Links rely on color to be distinguishable.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Low-contrast text is difficult or impossible for many users to read. Link text that is discernible improves the experience for users with low vision. [Learn how to make links distinguishable](https://dequeuniversity.com/rules/axe/4.11/link-in-text-block)."
    };
    str_51 = createIcuMessageFn({ url: "core/audits/accessibility/link-in-text-block.js" }.url, UIStrings71);
    LinkInTextBlock = class extends axe_audit_default {
      static {
        __name(this, "LinkInTextBlock");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "link-in-text-block",
          title: str_51(UIStrings71.title),
          failureTitle: str_51(UIStrings71.failureTitle),
          description: str_51(UIStrings71.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    link_in_text_block_default = LinkInTextBlock;
  }
});

// core/audits/accessibility/link-name.js
var link_name_exports = {};
__export(link_name_exports, {
  UIStrings: () => UIStrings72,
  default: () => link_name_default
});
var UIStrings72, str_52, LinkName, link_name_default;
var init_link_name = __esm({
  "core/audits/accessibility/link-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings72 = {
      /** Title of an accessibility audit that evaluates if all link elements have a non-generic name to screen readers. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Links have a discernible name",
      /** Title of an accessibility audit that evaluates if all link elements have a non-generic name to screen readers. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Links do not have a discernible name",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Link text (and alternate text for images, when used as links) that is discernible, unique, and focusable improves the navigation experience for screen reader users. [Learn how to make links accessible](https://dequeuniversity.com/rules/axe/4.11/link-name)."
    };
    str_52 = createIcuMessageFn({ url: "core/audits/accessibility/link-name.js" }.url, UIStrings72);
    LinkName = class extends axe_audit_default {
      static {
        __name(this, "LinkName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "link-name",
          title: str_52(UIStrings72.title),
          failureTitle: str_52(UIStrings72.failureTitle),
          description: str_52(UIStrings72.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    link_name_default = LinkName;
  }
});

// core/audits/accessibility/list.js
var list_exports = {};
__export(list_exports, {
  UIStrings: () => UIStrings73,
  default: () => list_default
});
var UIStrings73, str_53, List, list_default;
var init_list = __esm({
  "core/audits/accessibility/list.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings73 = {
      /** Title of an accessibility audit that evaluates if all list elements have a valid structure containing only list items. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Lists contain only `<li>` elements and script supporting elements (`<script>` and `<template>`).",
      /** Title of an accessibility audit that evaluates if all list elements have a valid structure containing only list items. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Lists do not contain only `<li>` elements and script supporting elements (`<script>` and `<template>`).",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers have a specific way of announcing lists. Ensuring proper list structure aids screen reader output. [Learn more about proper list structure](https://dequeuniversity.com/rules/axe/4.11/list)."
    };
    str_53 = createIcuMessageFn({ url: "core/audits/accessibility/list.js" }.url, UIStrings73);
    List = class extends axe_audit_default {
      static {
        __name(this, "List");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "list",
          title: str_53(UIStrings73.title),
          failureTitle: str_53(UIStrings73.failureTitle),
          description: str_53(UIStrings73.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    list_default = List;
  }
});

// core/audits/accessibility/listitem.js
var listitem_exports = {};
__export(listitem_exports, {
  UIStrings: () => UIStrings74,
  default: () => listitem_default
});
var UIStrings74, str_54, ListItem, listitem_default;
var init_listitem = __esm({
  "core/audits/accessibility/listitem.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings74 = {
      /** Title of an accessibility audit that evaluates if any list item elements do not have list parent elements. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "List items (`<li>`) are contained within `<ul>`, `<ol>` or `<menu>` parent elements",
      /** Title of an accessibility audit that evaluates if any list item elements do not have list parent elements. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "List items (`<li>`) are not contained within `<ul>`, `<ol>` or `<menu>` parent elements.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers require list items (`<li>`) to be contained within a parent `<ul>`, `<ol>` or `<menu>` to be announced properly. [Learn more about proper list structure](https://dequeuniversity.com/rules/axe/4.11/listitem)."
    };
    str_54 = createIcuMessageFn({ url: "core/audits/accessibility/listitem.js" }.url, UIStrings74);
    ListItem = class extends axe_audit_default {
      static {
        __name(this, "ListItem");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "listitem",
          title: str_54(UIStrings74.title),
          failureTitle: str_54(UIStrings74.failureTitle),
          description: str_54(UIStrings74.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    listitem_default = ListItem;
  }
});

// core/audits/manual/manual-audit.js
var ManualAudit, manual_audit_default;
var init_manual_audit = __esm({
  "core/audits/manual/manual-audit.js"() {
    "use strict";
    init_process_global();
    init_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ManualAudit = class extends Audit {
      static {
        __name(this, "ManualAudit");
      }
      /**
       * @return {Pick<LH.Audit.Meta, 'scoreDisplayMode'|'requiredArtifacts'>}
       */
      static get partialMeta() {
        return {
          scoreDisplayMode: Audit.SCORING_MODES.MANUAL,
          requiredArtifacts: []
        };
      }
      /**
       * @return {LH.Audit.Product}
       */
      static audit() {
        return {
          score: 0
          // displayValue: '(needs manual verification)'
        };
      }
    };
    manual_audit_default = ManualAudit;
  }
});

// core/audits/accessibility/manual/custom-controls-labels.js
var custom_controls_labels_exports = {};
__export(custom_controls_labels_exports, {
  default: () => custom_controls_labels_default
});
var CustomControlsLabels, custom_controls_labels_default;
var init_custom_controls_labels = __esm({
  "core/audits/accessibility/manual/custom-controls-labels.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    CustomControlsLabels = class extends manual_audit_default {
      static {
        __name(this, "CustomControlsLabels");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "custom-controls-labels",
          description: "Custom interactive controls have associated labels, provided by aria-label or aria-labelledby. [Learn more about custom controls and labels](https://developer.chrome.com/docs/lighthouse/accessibility/custom-controls-labels/).",
          title: "Custom controls have associated labels"
        }, super.partialMeta);
      }
    };
    custom_controls_labels_default = CustomControlsLabels;
  }
});

// core/audits/accessibility/manual/custom-controls-roles.js
var custom_controls_roles_exports = {};
__export(custom_controls_roles_exports, {
  default: () => custom_controls_roles_default
});
var CustomControlsRoles, custom_controls_roles_default;
var init_custom_controls_roles = __esm({
  "core/audits/accessibility/manual/custom-controls-roles.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    CustomControlsRoles = class extends manual_audit_default {
      static {
        __name(this, "CustomControlsRoles");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "custom-controls-roles",
          description: "Custom interactive controls have appropriate ARIA roles. [Learn how to add roles to custom controls](https://developer.chrome.com/docs/lighthouse/accessibility/custom-control-roles/).",
          title: "Custom controls have ARIA roles"
        }, super.partialMeta);
      }
    };
    custom_controls_roles_default = CustomControlsRoles;
  }
});

// core/audits/accessibility/manual/focus-traps.js
var focus_traps_exports = {};
__export(focus_traps_exports, {
  default: () => focus_traps_default
});
var FocusTraps, focus_traps_default;
var init_focus_traps = __esm({
  "core/audits/accessibility/manual/focus-traps.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    FocusTraps = class extends manual_audit_default {
      static {
        __name(this, "FocusTraps");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "focus-traps",
          description: "A user can tab into and out of any control or region without accidentally trapping their focus. [Learn how to avoid focus traps](https://developer.chrome.com/docs/lighthouse/accessibility/focus-traps/).",
          title: "User focus is not accidentally trapped in a region"
        }, super.partialMeta);
      }
    };
    focus_traps_default = FocusTraps;
  }
});

// core/audits/accessibility/manual/focusable-controls.js
var focusable_controls_exports = {};
__export(focusable_controls_exports, {
  default: () => focusable_controls_default
});
var FocusableControls, focusable_controls_default;
var init_focusable_controls = __esm({
  "core/audits/accessibility/manual/focusable-controls.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    FocusableControls = class extends manual_audit_default {
      static {
        __name(this, "FocusableControls");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "focusable-controls",
          description: "Custom interactive controls are keyboard focusable and display a focus indicator. [Learn how to make custom controls focusable](https://developer.chrome.com/docs/lighthouse/accessibility/focusable-controls/).",
          title: "Interactive controls are keyboard focusable"
        }, super.partialMeta);
      }
    };
    focusable_controls_default = FocusableControls;
  }
});

// core/audits/accessibility/manual/interactive-element-affordance.js
var interactive_element_affordance_exports = {};
__export(interactive_element_affordance_exports, {
  default: () => interactive_element_affordance_default
});
var InteractiveElementAffordance, interactive_element_affordance_default;
var init_interactive_element_affordance = __esm({
  "core/audits/accessibility/manual/interactive-element-affordance.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    InteractiveElementAffordance = class extends manual_audit_default {
      static {
        __name(this, "InteractiveElementAffordance");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "interactive-element-affordance",
          description: "Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn how to decorate interactive elements with affordance hints](https://developer.chrome.com/docs/lighthouse/accessibility/interactive-element-affordance/).",
          title: "Interactive elements indicate their purpose and state"
        }, super.partialMeta);
      }
    };
    interactive_element_affordance_default = InteractiveElementAffordance;
  }
});

// core/audits/accessibility/manual/logical-tab-order.js
var logical_tab_order_exports = {};
__export(logical_tab_order_exports, {
  default: () => logical_tab_order_default
});
var LogicalTabOrder, logical_tab_order_default;
var init_logical_tab_order = __esm({
  "core/audits/accessibility/manual/logical-tab-order.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    LogicalTabOrder = class extends manual_audit_default {
      static {
        __name(this, "LogicalTabOrder");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "logical-tab-order",
          description: "Tabbing through the page follows the visual layout. Users cannot focus elements that are offscreen. [Learn more about logical tab ordering](https://developer.chrome.com/docs/lighthouse/accessibility/logical-tab-order/).",
          title: "The page has a logical tab order"
        }, super.partialMeta);
      }
    };
    logical_tab_order_default = LogicalTabOrder;
  }
});

// core/audits/accessibility/manual/managed-focus.js
var managed_focus_exports = {};
__export(managed_focus_exports, {
  default: () => managed_focus_default
});
var ManagedFocus, managed_focus_default;
var init_managed_focus = __esm({
  "core/audits/accessibility/manual/managed-focus.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ManagedFocus = class extends manual_audit_default {
      static {
        __name(this, "ManagedFocus");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "managed-focus",
          description: "If new content, such as a dialog, is added to the page, the user's focus is directed to it. [Learn how to direct focus to new content](https://developer.chrome.com/docs/lighthouse/accessibility/managed-focus/).",
          title: "The user's focus is directed to new content added to the page"
        }, super.partialMeta);
      }
    };
    managed_focus_default = ManagedFocus;
  }
});

// core/audits/accessibility/manual/offscreen-content-hidden.js
var offscreen_content_hidden_exports = {};
__export(offscreen_content_hidden_exports, {
  default: () => offscreen_content_hidden_default
});
var OffscreenContentHidden, offscreen_content_hidden_default;
var init_offscreen_content_hidden = __esm({
  "core/audits/accessibility/manual/offscreen-content-hidden.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    OffscreenContentHidden = class extends manual_audit_default {
      static {
        __name(this, "OffscreenContentHidden");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "offscreen-content-hidden",
          description: "Offscreen content is hidden with display: none or aria-hidden=true. [Learn how to properly hide offscreen content](https://developer.chrome.com/docs/lighthouse/accessibility/offscreen-content-hidden/).",
          title: "Offscreen content is hidden from assistive technology"
        }, super.partialMeta);
      }
    };
    offscreen_content_hidden_default = OffscreenContentHidden;
  }
});

// core/audits/accessibility/manual/use-landmarks.js
var use_landmarks_exports = {};
__export(use_landmarks_exports, {
  default: () => use_landmarks_default
});
var UseLandmarks, use_landmarks_default;
var init_use_landmarks = __esm({
  "core/audits/accessibility/manual/use-landmarks.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UseLandmarks = class extends manual_audit_default {
      static {
        __name(this, "UseLandmarks");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "use-landmarks",
          description: "Landmark elements (`<main>`, `<nav>`, etc.) are used to improve the keyboard navigation of the page for assistive technology. [Learn more about landmark elements](https://developer.chrome.com/docs/lighthouse/accessibility/use-landmarks/).",
          title: "HTML5 landmark elements are used to improve navigation"
        }, super.partialMeta);
      }
    };
    use_landmarks_default = UseLandmarks;
  }
});

// core/audits/accessibility/manual/visual-order-follows-dom.js
var visual_order_follows_dom_exports = {};
__export(visual_order_follows_dom_exports, {
  default: () => visual_order_follows_dom_default
});
var VisualOrderFollowsDOM, visual_order_follows_dom_default;
var init_visual_order_follows_dom = __esm({
  "core/audits/accessibility/manual/visual-order-follows-dom.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    VisualOrderFollowsDOM = class extends manual_audit_default {
      static {
        __name(this, "VisualOrderFollowsDOM");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "visual-order-follows-dom",
          description: "DOM order matches the visual order, improving navigation for assistive technology. [Learn more about DOM and visual ordering](https://developer.chrome.com/docs/lighthouse/accessibility/visual-order-follows-dom/).",
          title: "Visual order on the page follows DOM order"
        }, super.partialMeta);
      }
    };
    visual_order_follows_dom_default = VisualOrderFollowsDOM;
  }
});

// core/audits/accessibility/meta-refresh.js
var meta_refresh_exports = {};
__export(meta_refresh_exports, {
  UIStrings: () => UIStrings75,
  default: () => meta_refresh_default
});
var UIStrings75, str_55, MetaRefresh, meta_refresh_default;
var init_meta_refresh = __esm({
  "core/audits/accessibility/meta-refresh.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings75 = {
      /** Title of an accessibility audit that evaluates if the page uses a meta tag that refreshes the page automatically. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: 'The document does not use `<meta http-equiv="refresh">`',
      /** Title of an accessibility audit that evaluates if the page uses a meta tag that refreshes the page automatically. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: 'The document uses `<meta http-equiv="refresh">`',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Users do not expect a page to refresh automatically, and doing so will move focus back to the top of the page. This may create a frustrating or confusing experience. [Learn more about the refresh meta tag](https://dequeuniversity.com/rules/axe/4.11/meta-refresh)."
    };
    str_55 = createIcuMessageFn({ url: "core/audits/accessibility/meta-refresh.js" }.url, UIStrings75);
    MetaRefresh = class extends axe_audit_default {
      static {
        __name(this, "MetaRefresh");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "meta-refresh",
          title: str_55(UIStrings75.title),
          failureTitle: str_55(UIStrings75.failureTitle),
          description: str_55(UIStrings75.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    meta_refresh_default = MetaRefresh;
  }
});

// core/audits/accessibility/meta-viewport.js
var meta_viewport_exports = {};
__export(meta_viewport_exports, {
  UIStrings: () => UIStrings76,
  default: () => meta_viewport_default
});
var UIStrings76, str_56, MetaViewport, meta_viewport_default;
var init_meta_viewport = __esm({
  "core/audits/accessibility/meta-viewport.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings76 = {
      /** Title of an accessibility audit that evaluates if the page has limited the scaling properties of the page in a way that harms users with low vision. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: '`[user-scalable="no"]` is not used in the `<meta name="viewport">` element and the `[maximum-scale]` attribute is not less than 5.',
      /** Title of an accessibility audit that evaluates if the page has limited the scaling properties of the page in a way that harms users with low vision. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: '`[user-scalable="no"]` is used in the `<meta name="viewport">` element or the `[maximum-scale]` attribute is less than 5.',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Disabling zooming is problematic for users with low vision who rely on screen magnification to properly see the contents of a web page. [Learn more about the viewport meta tag](https://dequeuniversity.com/rules/axe/4.11/meta-viewport)."
    };
    str_56 = createIcuMessageFn({ url: "core/audits/accessibility/meta-viewport.js" }.url, UIStrings76);
    MetaViewport = class extends axe_audit_default {
      static {
        __name(this, "MetaViewport");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "meta-viewport",
          title: str_56(UIStrings76.title),
          failureTitle: str_56(UIStrings76.failureTitle),
          description: str_56(UIStrings76.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    meta_viewport_default = MetaViewport;
  }
});

// core/audits/accessibility/object-alt.js
var object_alt_exports = {};
__export(object_alt_exports, {
  UIStrings: () => UIStrings77,
  default: () => object_alt_default
});
var UIStrings77, str_57, ObjectAlt, object_alt_default;
var init_object_alt = __esm({
  "core/audits/accessibility/object-alt.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings77 = {
      /** Title of an accessibility audit that evaluates if all object elements have an alt HTML attribute that describes their contents. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<object>` elements have alternate text",
      /** Title of an accessibility audit that evaluates if all object elements have an alt HTML attribute that describes their contents. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<object>` elements do not have alternate text",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers cannot translate non-text content. Adding alternate text to `<object>` elements helps screen readers convey meaning to users. [Learn more about alt text for `object` elements](https://dequeuniversity.com/rules/axe/4.11/object-alt)."
    };
    str_57 = createIcuMessageFn({ url: "core/audits/accessibility/object-alt.js" }.url, UIStrings77);
    ObjectAlt = class extends axe_audit_default {
      static {
        __name(this, "ObjectAlt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "object-alt",
          title: str_57(UIStrings77.title),
          failureTitle: str_57(UIStrings77.failureTitle),
          description: str_57(UIStrings77.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    object_alt_default = ObjectAlt;
  }
});

// core/audits/accessibility/presentation-role-conflict.js
var presentation_role_conflict_exports = {};
__export(presentation_role_conflict_exports, {
  UIStrings: () => UIStrings78,
  default: () => presentation_role_conflict_default
});
var UIStrings78, str_58, PresentationRoleConflict, presentation_role_conflict_default;
var init_presentation_role_conflict = __esm({
  "core/audits/accessibility/presentation-role-conflict.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings78 = {
      /** Title of an accessibility audit that evaluates if elements with presentation role have conflicts. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: 'Elements with `role="none"` or `role="presentation"` do not have conflicts',
      /** Title of an accessibility audit that evaluates if elements with presentation role have conflicts. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: 'Elements with `role="none"` or `role="presentation"` have conflicts',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with \'Learn\' becomes link text to additional documentation. */
      description: 'There are certain cases where the semantic role of an element with `role="none"` or `role="presentation"` does not resolve to none or presentation. To ensure the element remains removed from the accessibility tree, you should not add any global ARIA attributes to the element or make it focusable. [Learn more about presentation role conflict](https://dequeuniversity.com/rules/axe/4.11/presentation-role-conflict).'
    };
    str_58 = createIcuMessageFn({ url: "core/audits/accessibility/presentation-role-conflict.js" }.url, UIStrings78);
    PresentationRoleConflict = class extends axe_audit_default {
      static {
        __name(this, "PresentationRoleConflict");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "presentation-role-conflict",
          title: str_58(UIStrings78.title),
          failureTitle: str_58(UIStrings78.failureTitle),
          description: str_58(UIStrings78.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    presentation_role_conflict_default = PresentationRoleConflict;
  }
});

// core/audits/accessibility/select-name.js
var select_name_exports = {};
__export(select_name_exports, {
  UIStrings: () => UIStrings79,
  default: () => select_name_default
});
var UIStrings79, str_59, SelectName, select_name_default;
var init_select_name = __esm({
  "core/audits/accessibility/select-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings79 = {
      /** Title of an accessibility audit that evaluates if all select elements have programmatically associated label elements. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Select elements have associated label elements.",
      /** Title of an accessibility audit that evaluates if all select elements have programmatically associated label elements. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Select elements do not have associated label elements.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Form elements without effective labels can create frustrating experiences for screen reader users. [Learn more about the `select` element](https://dequeuniversity.com/rules/axe/4.11/select-name)."
    };
    str_59 = createIcuMessageFn({ url: "core/audits/accessibility/select-name.js" }.url, UIStrings79);
    SelectName = class extends axe_audit_default {
      static {
        __name(this, "SelectName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "select-name",
          title: str_59(UIStrings79.title),
          failureTitle: str_59(UIStrings79.failureTitle),
          description: str_59(UIStrings79.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    select_name_default = SelectName;
  }
});

// core/audits/accessibility/skip-link.js
var skip_link_exports = {};
__export(skip_link_exports, {
  UIStrings: () => UIStrings80,
  default: () => skip_link_default
});
var UIStrings80, str_60, SkipLink, skip_link_default;
var init_skip_link = __esm({
  "core/audits/accessibility/skip-link.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings80 = {
      /** Title of an accessibility audit that evaluates if the skip link is focusable. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Skip links are focusable.",
      /** Title of an accessibility audit that evaluates if the skip link is focusable. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Skip links are not focusable.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Including a skip link can help users skip to the main content to save time. [Learn more about skip links](https://dequeuniversity.com/rules/axe/4.11/skip-link)."
    };
    str_60 = createIcuMessageFn({ url: "core/audits/accessibility/skip-link.js" }.url, UIStrings80);
    SkipLink = class extends axe_audit_default {
      static {
        __name(this, "SkipLink");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "skip-link",
          title: str_60(UIStrings80.title),
          failureTitle: str_60(UIStrings80.failureTitle),
          description: str_60(UIStrings80.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    skip_link_default = SkipLink;
  }
});

// core/audits/accessibility/svg-img-alt.js
var svg_img_alt_exports = {};
__export(svg_img_alt_exports, {
  UIStrings: () => UIStrings81,
  default: () => svg_img_alt_default
});
var UIStrings81, str_61, SvgImgAlt, svg_img_alt_default;
var init_svg_img_alt = __esm({
  "core/audits/accessibility/svg-img-alt.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings81 = {
      /** Title of an accessibility audit that evaluates if SVG elements with an img role have an accessible text alternative. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "SVG elements with an `img` role have an accessible text alternative",
      /** Title of an accessibility audit that evaluates if SVG elements with an img role have an accessible text alternative. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "SVG elements with an `img` role do not have an accessible text alternative",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with \'Learn\' becomes link text to additional documentation. */
      description: "Ensures SVG elements with an `img`, `graphics-document` or `graphics-symbol` role have an accessible text alternative. [Learn more about SVG alt text](https://dequeuniversity.com/rules/axe/4.11/svg-img-alt)."
    };
    str_61 = createIcuMessageFn({ url: "core/audits/accessibility/svg-img-alt.js" }.url, UIStrings81);
    SvgImgAlt = class extends axe_audit_default {
      static {
        __name(this, "SvgImgAlt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "svg-img-alt",
          title: str_61(UIStrings81.title),
          failureTitle: str_61(UIStrings81.failureTitle),
          description: str_61(UIStrings81.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    svg_img_alt_default = SvgImgAlt;
  }
});

// core/audits/accessibility/tabindex.js
var tabindex_exports = {};
__export(tabindex_exports, {
  UIStrings: () => UIStrings82,
  default: () => tabindex_default
});
var UIStrings82, str_62, TabIndex, tabindex_default;
var init_tabindex = __esm({
  "core/audits/accessibility/tabindex.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings82 = {
      /** Title of an accessibility audit that evaluates if any elements have custom tabindex HTML attributes that might frustrate users of assitive technology. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "No element has a `[tabindex]` value greater than 0",
      /** Title of an accessibility audit that evaluates if any elements have custom tabindex HTML attributes that might frustrate users of assitive technology. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Some elements have a `[tabindex]` value greater than 0",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more about the `tabindex` attribute](https://dequeuniversity.com/rules/axe/4.11/tabindex)."
    };
    str_62 = createIcuMessageFn({ url: "core/audits/accessibility/tabindex.js" }.url, UIStrings82);
    TabIndex = class extends axe_audit_default {
      static {
        __name(this, "TabIndex");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "tabindex",
          title: str_62(UIStrings82.title),
          failureTitle: str_62(UIStrings82.failureTitle),
          description: str_62(UIStrings82.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    tabindex_default = TabIndex;
  }
});

// core/audits/accessibility/table-duplicate-name.js
var table_duplicate_name_exports = {};
__export(table_duplicate_name_exports, {
  UIStrings: () => UIStrings83,
  default: () => table_duplicate_name_default
});
var UIStrings83, str_63, TableDuplicateName, table_duplicate_name_default;
var init_table_duplicate_name = __esm({
  "core/audits/accessibility/table-duplicate-name.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings83 = {
      /** Title of an accessibility audit that evaluates if tables have different content in the summary attribute and caption element. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Tables have different content in the summary attribute and `<caption>`.",
      /** Title of an accessibility audit that evaluates if tables have different content in the summary attribute and caption element. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Tables have the same content in the summary attribute and `<caption>.`",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "The summary attribute should describe the table structure, while `<caption>` should have the onscreen title. Accurate table mark-up helps users of screen readers. [Learn more about summary and caption](https://dequeuniversity.com/rules/axe/4.11/table-duplicate-name)."
    };
    str_63 = createIcuMessageFn({ url: "core/audits/accessibility/table-duplicate-name.js" }.url, UIStrings83);
    TableDuplicateName = class extends axe_audit_default {
      static {
        __name(this, "TableDuplicateName");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "table-duplicate-name",
          title: str_63(UIStrings83.title),
          failureTitle: str_63(UIStrings83.failureTitle),
          description: str_63(UIStrings83.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    table_duplicate_name_default = TableDuplicateName;
  }
});

// core/audits/accessibility/table-fake-caption.js
var table_fake_caption_exports = {};
__export(table_fake_caption_exports, {
  UIStrings: () => UIStrings84,
  default: () => table_fake_caption_default
});
var UIStrings84, str_64, TableFakeCaption, table_fake_caption_default;
var init_table_fake_caption = __esm({
  "core/audits/accessibility/table-fake-caption.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings84 = {
      /** Title of an accessibility audit that evaluates if all tables use caption instead of colspan to indicate a caption. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Tables use `<caption>` instead of cells with the `[colspan]` attribute to indicate a caption.",
      /** Title of an accessibility audit that evaluates if all tables use caption instead of colspan to indicate a caption. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Tables do not use `<caption>` instead of cells with the `[colspan]` attribute to indicate a caption.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers have features to make navigating tables easier. Ensuring that tables use the actual caption element instead of cells with the `[colspan]` attribute may improve the experience for screen reader users. [Learn more about captions](https://dequeuniversity.com/rules/axe/4.11/table-fake-caption)."
    };
    str_64 = createIcuMessageFn({ url: "core/audits/accessibility/table-fake-caption.js" }.url, UIStrings84);
    TableFakeCaption = class extends axe_audit_default {
      static {
        __name(this, "TableFakeCaption");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "table-fake-caption",
          title: str_64(UIStrings84.title),
          failureTitle: str_64(UIStrings84.failureTitle),
          description: str_64(UIStrings84.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    table_fake_caption_default = TableFakeCaption;
  }
});

// core/audits/accessibility/target-size.js
var target_size_exports = {};
__export(target_size_exports, {
  UIStrings: () => UIStrings85,
  default: () => target_size_default
});
var UIStrings85, str_65, TargetSize, target_size_default;
var init_target_size = __esm({
  "core/audits/accessibility/target-size.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings85 = {
      /** Title of an accessibility audit that checks if all touch targets have sufficient size and spacing. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Touch targets have sufficient size and spacing.",
      /** Title of an accessibility audit that checks if all touch targets have sufficient size and spacing. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Touch targets do not have sufficient size or spacing.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Touch targets with sufficient size and spacing help users who may have difficulty targeting small controls to activate the targets. [Learn more about touch targets](https://dequeuniversity.com/rules/axe/4.11/target-size)."
    };
    str_65 = createIcuMessageFn({ url: "core/audits/accessibility/target-size.js" }.url, UIStrings85);
    TargetSize = class extends axe_audit_default {
      static {
        __name(this, "TargetSize");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "target-size",
          title: str_65(UIStrings85.title),
          failureTitle: str_65(UIStrings85.failureTitle),
          description: str_65(UIStrings85.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    target_size_default = TargetSize;
  }
});

// core/audits/accessibility/td-has-header.js
var td_has_header_exports = {};
__export(td_has_header_exports, {
  UIStrings: () => UIStrings86,
  default: () => td_has_header_default
});
var UIStrings86, str_66, TDHasHeader, td_has_header_default;
var init_td_has_header = __esm({
  "core/audits/accessibility/td-has-header.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings86 = {
      /** Title of an accessibility audit that evaluates if all large table elements use the headers HTML attribute. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`<td>` elements in a large `<table>` have one or more table headers.",
      /** Title of an accessibility audit that evaluates if all large table elements use the headers HTML attribute. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`<td>` elements in a large `<table>` do not have table headers.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers have features to make navigating tables easier. Ensuring that `<td>` elements in a large table (3 or more cells in width and height) have an associated table header may improve the experience for screen reader users. [Learn more about table headers](https://dequeuniversity.com/rules/axe/4.11/td-has-header)."
    };
    str_66 = createIcuMessageFn({ url: "core/audits/accessibility/td-has-header.js" }.url, UIStrings86);
    TDHasHeader = class extends axe_audit_default {
      static {
        __name(this, "TDHasHeader");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "td-has-header",
          title: str_66(UIStrings86.title),
          failureTitle: str_66(UIStrings86.failureTitle),
          description: str_66(UIStrings86.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    td_has_header_default = TDHasHeader;
  }
});

// core/audits/accessibility/td-headers-attr.js
var td_headers_attr_exports = {};
__export(td_headers_attr_exports, {
  UIStrings: () => UIStrings87,
  default: () => td_headers_attr_default
});
var UIStrings87, str_67, TDHeadersAttr, td_headers_attr_default;
var init_td_headers_attr = __esm({
  "core/audits/accessibility/td-headers-attr.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings87 = {
      /** Title of an accessibility audit that evaluates if all table cell elements in a table that use the headers HTML attribute use it correctly to refer to header cells within the same table. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "Cells in a `<table>` element that use the `[headers]` attribute refer to table cells within the same table.",
      /** Title of an accessibility audit that evaluates if all table cell elements in a table that use the headers HTML attribute use it correctly to refer to header cells within the same table. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "Cells in a `<table>` element that use the `[headers]` attribute refer to an element `id` not found within the same table.",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers have features to make navigating tables easier. Ensuring `<td>` cells using the `[headers]` attribute only refer to other cells in the same table may improve the experience for screen reader users. [Learn more about the `headers` attribute](https://dequeuniversity.com/rules/axe/4.11/td-headers-attr)."
    };
    str_67 = createIcuMessageFn({ url: "core/audits/accessibility/td-headers-attr.js" }.url, UIStrings87);
    TDHeadersAttr = class extends axe_audit_default {
      static {
        __name(this, "TDHeadersAttr");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "td-headers-attr",
          title: str_67(UIStrings87.title),
          failureTitle: str_67(UIStrings87.failureTitle),
          description: str_67(UIStrings87.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    td_headers_attr_default = TDHeadersAttr;
  }
});

// core/audits/accessibility/th-has-data-cells.js
var th_has_data_cells_exports = {};
__export(th_has_data_cells_exports, {
  UIStrings: () => UIStrings88,
  default: () => th_has_data_cells_default
});
var UIStrings88, str_68, THHasDataCells, th_has_data_cells_default;
var init_th_has_data_cells = __esm({
  "core/audits/accessibility/th-has-data-cells.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings88 = {
      /** Title of an accessibility audit that evaluates if all table header elements have children. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: '`<th>` elements and elements with `[role="columnheader"/"rowheader"]` have data cells they describe.',
      /** Title of an accessibility audit that evaluates if all table header elements have children. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: '`<th>` elements and elements with `[role="columnheader"/"rowheader"]` do not have data cells they describe.',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Screen readers have features to make navigating tables easier. Ensuring table headers always refer to some set of cells may improve the experience for screen reader users. [Learn more about table headers](https://dequeuniversity.com/rules/axe/4.11/th-has-data-cells)."
    };
    str_68 = createIcuMessageFn({ url: "core/audits/accessibility/th-has-data-cells.js" }.url, UIStrings88);
    THHasDataCells = class extends axe_audit_default {
      static {
        __name(this, "THHasDataCells");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "th-has-data-cells",
          title: str_68(UIStrings88.title),
          failureTitle: str_68(UIStrings88.failureTitle),
          description: str_68(UIStrings88.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    th_has_data_cells_default = THHasDataCells;
  }
});

// core/audits/accessibility/valid-lang.js
var valid_lang_exports = {};
__export(valid_lang_exports, {
  UIStrings: () => UIStrings89,
  default: () => valid_lang_default
});
var UIStrings89, str_69, ValidLang, valid_lang_default;
var init_valid_lang = __esm({
  "core/audits/accessibility/valid-lang.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings89 = {
      /** Title of an accessibility audit that evaluates if all lang HTML attributes are valid BCP 47 languages. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: "`[lang]` attributes have a valid value",
      /** Title of an accessibility audit that evaluates if all lang HTML attributes are valid BCP 47 languages. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: "`[lang]` attributes do not have a valid value",
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) on elements helps ensure that text is pronounced correctly by a screen reader. [Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.11/valid-lang)."
    };
    str_69 = createIcuMessageFn({ url: "core/audits/accessibility/valid-lang.js" }.url, UIStrings89);
    ValidLang = class extends axe_audit_default {
      static {
        __name(this, "ValidLang");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "valid-lang",
          title: str_69(UIStrings89.title),
          failureTitle: str_69(UIStrings89.failureTitle),
          description: str_69(UIStrings89.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    valid_lang_default = ValidLang;
  }
});

// core/audits/accessibility/video-caption.js
var video_caption_exports = {};
__export(video_caption_exports, {
  UIStrings: () => UIStrings90,
  default: () => video_caption_default
});
var UIStrings90, str_70, VideoCaption, video_caption_default;
var init_video_caption = __esm({
  "core/audits/accessibility/video-caption.js"() {
    "use strict";
    init_process_global();
    init_axe_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings90 = {
      /** Title of an accessibility audit that evaluates if all video elements contain a child track element that has captions describing their audio. This title is descriptive of the successful state and is shown to users when no user action is required. */
      title: '`<video>` elements contain a `<track>` element with `[kind="captions"]`',
      /** Title of an accessibility audit that evaluates if all video elements contain a child track element that has captions describing their audio. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
      failureTitle: '`<video>` elements do not contain a `<track>` element with `[kind="captions"]`.',
      /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "When a video provides a caption it is easier for deaf and hearing impaired users to access its information. [Learn more about video captions](https://dequeuniversity.com/rules/axe/4.11/video-caption)."
    };
    str_70 = createIcuMessageFn({ url: "core/audits/accessibility/video-caption.js" }.url, UIStrings90);
    VideoCaption = class extends axe_audit_default {
      static {
        __name(this, "VideoCaption");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "video-caption",
          title: str_70(UIStrings90.title),
          failureTitle: str_70(UIStrings90.failureTitle),
          description: str_70(UIStrings90.description),
          scoreDisplayMode: axe_audit_default.SCORING_MODES.INFORMATIVE,
          requiredArtifacts: ["Accessibility"]
        };
      }
    };
    video_caption_default = VideoCaption;
  }
});

// core/audits/agentic/agent-accessibility-tree.js
var agent_accessibility_tree_exports = {};
__export(agent_accessibility_tree_exports, {
  UIStrings: () => UIStrings91,
  default: () => agent_accessibility_tree_default
});
var UIStrings91, str_71, TARGET_RULES, AgentAccessibilityTree, agent_accessibility_tree_default;
var init_agent_accessibility_tree = __esm({
  "core/audits/agentic/agent-accessibility-tree.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings91 = {
      /** Title shown when all agent accessibility checks pass. */
      title: "Accessibility tree is well-formed",
      /** Title shown when one or more agent accessibility checks fail. */
      failureTitle: "Accessibility tree is not well-formed",
      /** Description of a Lighthouse audit that tells the user *why* they need a well-formed accessibility tree. */
      description: "A well-formed accessibility tree helps AI agents to navigate and interact with the page.",
      /** Label of a table column that identifies the accessibility rule that failed. */
      columnRule: "Failing Rule",
      /** Label of a table column that identifies the HTML element that failed the rule. */
      columnElement: "Failing Element",
      /** Title of the section containing failed accessibility checks. */
      failedSectionTitle: "Failed Audits",
      /** Message shown when all accessibility checks pass. */
      displayValuePassed: "All audits passed"
    };
    str_71 = createIcuMessageFn({ url: "core/audits/agentic/agent-accessibility-tree.js" }.url, UIStrings91);
    TARGET_RULES = /* @__PURE__ */ new Set([
      "button-name",
      "input-button-name",
      "input-image-alt",
      "label",
      "link-name",
      "select-name",
      "document-title",
      "aria-allowed-attr",
      "aria-allowed-role",
      "aria-command-name",
      "aria-conditional-attr",
      "aria-dialog-name",
      "aria-hidden-body",
      "aria-hidden-focus",
      "aria-input-field-name",
      "aria-prohibited-attr",
      "aria-required-attr",
      "aria-required-children",
      "aria-required-parent",
      "aria-roles",
      "aria-text",
      "aria-toggle-field-name",
      "aria-tooltip-name",
      "aria-treeitem-name",
      "aria-valid-attr",
      "aria-valid-attr-value",
      "duplicate-id-aria",
      "definition-list",
      "table-duplicate-name",
      "tabindex",
      "autocomplete-valid",
      "presentation-role-conflict",
      "svg-img-alt"
    ]);
    AgentAccessibilityTree = class extends Audit {
      static {
        __name(this, "AgentAccessibilityTree");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "agent-accessibility-tree",
          title: str_71(UIStrings91.title),
          failureTitle: str_71(UIStrings91.failureTitle),
          description: str_71(UIStrings91.description),
          requiredArtifacts: ["Accessibility"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const violations = artifacts.Accessibility && artifacts.Accessibility.violations || [];
        const failedRules = violations.filter((v) => TARGET_RULES.has(v.id));
        const headings = [
          { key: "description", valueType: "text", label: str_71(UIStrings.columnDescription) },
          { key: "node", valueType: "node", label: str_71(UIStrings91.columnElement) }
        ];
        const items = failedRules.map((rule) => ({
          description: rule.help || rule.description,
          node: rule.nodes?.[0] ? Audit.makeNodeItem(rule.nodes[0].node) : void 0
        }));
        const listItems = [];
        if (items.length > 0) {
          const table = Audit.makeTableDetails(headings, items);
          listItems.push(Audit.makeListDetailSectionItem(table, str_71(UIStrings91.failedSectionTitle)));
        }
        return {
          score: Number(items.length === 0),
          details: listItems.length > 0 ? Audit.makeListDetails(listItems) : void 0,
          displayValue: items.length === 0 ? str_71(UIStrings91.displayValuePassed) : void 0
        };
      }
    };
    agent_accessibility_tree_default = AgentAccessibilityTree;
  }
});

// core/audits/agentic/llms-txt.js
var llms_txt_exports2 = {};
__export(llms_txt_exports2, {
  UIStrings: () => UIStrings92,
  default: () => llms_txt_default2
});
var HTTP_CLIENT_ERROR_CODE_LOW, HTTP_SERVER_ERROR_CODE_LOW, UIStrings92, str_72, LlmsTxt2, llms_txt_default2;
var init_llms_txt2 = __esm({
  "core/audits/agentic/llms-txt.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    HTTP_CLIENT_ERROR_CODE_LOW = 400;
    HTTP_SERVER_ERROR_CODE_LOW = 500;
    UIStrings92 = {
      /** Title of a Lighthouse audit that provides detail on the site's llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This descriptive title is shown when the llms.txt file is present and configured correctly. */
      title: "llms.txt is present",
      /** Title of a Lighthouse audit that provides detail on the site's llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This descriptive title is shown when the llms.txt file is misconfigured. */
      failureTitle: "llms.txt is missing or incomplete",
      /** Description of a Lighthouse audit that tells the user *why* they need to have a valid llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This is displayed after a user expands the section to see more. No character length limits. */
      description: "If your llms.txt file is malformed, large language models may not be able to understand how you want your website to be crawled or used for training. A valid llms.txt should be a Markdown file containing at least one H1 header. [Learn more about llms.txt](https://llmstxt.org/).",
      /**
       * @description Label for the audit identifying that the request failed with a specific HTTP status code.
       * @example {500} statusCode
       * */
      displayValueHttpBadCode: "Failed with HTTP status {statusCode}",
      /** Explanatory message stating that there was a failure in an audit caused by Lighthouse not being able to download the llms.txt file for the site.  Note: "llms.txt" is a canonical filename and should not be translated. */
      explanation: "Fetch of llms.txt failed",
      /** Message indicating that the file is missing a required H1 header. */
      missingH1: 'File is missing a required H1 header (e.g., "# Title").',
      /** Message indicating that the file is suspiciously short. */
      tooShort: "File is suspiciously short.",
      /** Message indicating that the file is missing links. */
      missingLinks: "File does not appear to contain any links."
    };
    str_72 = createIcuMessageFn({ url: "core/audits/agentic/llms-txt.js" }.url, UIStrings92);
    LlmsTxt2 = class extends Audit {
      static {
        __name(this, "LlmsTxt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "llms-txt",
          title: str_72(UIStrings92.title),
          failureTitle: str_72(UIStrings92.failureTitle),
          description: str_72(UIStrings92.description),
          requiredArtifacts: ["LlmsTxt"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const {
          status,
          content
        } = artifacts.LlmsTxt;
        if (!status) {
          return {
            score: 0,
            explanation: str_72(UIStrings92.explanation)
          };
        }
        if (status >= HTTP_SERVER_ERROR_CODE_LOW) {
          return {
            score: 0,
            displayValue: str_72(UIStrings92.displayValueHttpBadCode, { statusCode: status })
          };
        } else if (status >= HTTP_CLIENT_ERROR_CODE_LOW) {
          return {
            score: 1,
            notApplicable: true
          };
        }
        if (content === null) {
          throw new Error(`Status ${status} was valid, but content was null`);
        }
        const hasH1 = /^#\s+.+/m.test(content);
        const hasLink = /\[.+\]\(.+\)/.test(content);
        const isTooShort = content.length < 50;
        const errors = [];
        if (!hasH1) errors.push(str_72(UIStrings92.missingH1));
        if (!hasLink) errors.push(str_72(UIStrings92.missingLinks));
        if (isTooShort) errors.push(str_72(UIStrings92.tooShort));
        const headings = [
          { key: "message", valueType: "text", label: "Error" }
        ];
        const details = Audit.makeTableDetails(headings, errors.map((m) => ({ message: m })));
        return {
          score: Number(errors.length === 0),
          details: errors.length ? details : void 0
        };
      }
    };
    llms_txt_default2 = LlmsTxt2;
  }
});

// node_modules/web-features/data.json
var data_default;
var init_data = __esm({
  "node_modules/web-features/data.json"() {
    data_default = { browsers: { chrome: { name: "Chrome", releases: [{ date: "2008-12-11", version: "1" }, { date: "2009-05-21", version: "2" }, { date: "2009-09-15", version: "3" }, { date: "2010-01-25", version: "4" }, { date: "2010-05-25", version: "5" }, { date: "2010-09-02", version: "6" }, { date: "2010-10-19", version: "7" }, { date: "2010-12-02", version: "8" }, { date: "2011-02-03", version: "9" }, { date: "2011-03-08", version: "10" }, { date: "2011-04-27", version: "11" }, { date: "2011-06-07", version: "12" }, { date: "2011-08-02", version: "13" }, { date: "2011-09-16", version: "14" }, { date: "2011-10-25", version: "15" }, { date: "2011-12-13", version: "16" }, { date: "2012-02-08", version: "17" }, { date: "2012-03-28", version: "18" }, { date: "2012-05-15", version: "19" }, { date: "2012-06-26", version: "20" }, { date: "2012-07-31", version: "21" }, { date: "2012-09-25", version: "22" }, { date: "2012-11-06", version: "23" }, { date: "2013-01-10", version: "24" }, { date: "\
2013-02-21", version: "25" }, { date: "2013-03-26", version: "26" }, { date: "2013-05-21", version: "27" }, { date: "2013-07-09", version: "28" }, { date: "2013-08-20", version: "29" }, { date: "2013-10-01", version: "30" }, { date: "2013-11-12", version: "31" }, { date: "2014-01-14", version: "32" }, { date: "2014-02-20", version: "33" }, { date: "2014-04-08", version: "34" }, { date: "2014-05-20", version: "35" }, { date: "2014-07-16", version: "36" }, { date: "2014-08-26", version: "37" }, { date: "2014-10-07", version: "38" }, { date: "2014-11-18", version: "39" }, { date: "2015-01-21", version: "40" }, { date: "2015-03-03", version: "41" }, { date: "2015-04-14", version: "42" }, { date: "2015-05-19", version: "43" }, { date: "2015-07-21", version: "44" }, { date: "2015-09-01", version: "45" }, { date: "2015-10-13", version: "46" }, { date: "2015-12-01", version: "47" }, { date: "2016-01-20", version: "48" }, { date: "2016-03-02", version: "49" }, { date: "2016-04-13", version: "50" },
    { date: "2016-05-25", version: "51" }, { date: "2016-07-20", version: "52" }, { date: "2016-08-31", version: "53" }, { date: "2016-10-12", version: "54" }, { date: "2016-12-01", version: "55" }, { date: "2017-01-25", version: "56" }, { date: "2017-03-09", version: "57" }, { date: "2017-04-19", version: "58" }, { date: "2017-06-05", version: "59" }, { date: "2017-07-25", version: "60" }, { date: "2017-09-05", version: "61" }, { date: "2017-10-17", version: "62" }, { date: "2017-12-06", version: "63" }, { date: "2018-01-23", version: "64" }, { date: "2018-03-06", version: "65" }, { date: "2018-04-17", version: "66" }, { date: "2018-05-29", version: "67" }, { date: "2018-07-24", version: "68" }, { date: "2018-09-04", version: "69" }, { date: "2018-10-16", version: "70" }, { date: "2018-12-04", version: "71" }, { date: "2019-01-29", version: "72" }, { date: "2019-03-12", version: "73" }, { date: "2019-04-23", version: "74" }, { date: "2019-06-04", version: "75" }, { date: "2019-07-30",
    version: "76" }, { date: "2019-09-10", version: "77" }, { date: "2019-10-22", version: "78" }, { date: "2019-12-10", version: "79" }, { date: "2020-02-04", version: "80" }, { date: "2020-04-07", version: "81" }, { date: "2020-05-19", version: "83" }, { date: "2020-07-27", version: "84" }, { date: "2020-08-25", version: "85" }, { date: "2020-10-20", version: "86" }, { date: "2020-11-17", version: "87" }, { date: "2021-01-19", version: "88" }, { date: "2021-03-02", version: "89" }, { date: "2021-04-13", version: "90" }, { date: "2021-05-25", version: "91" }, { date: "2021-07-20", version: "92" }, { date: "2021-08-31", version: "93" }, { date: "2021-09-21", version: "94" }, { date: "2021-10-19", version: "95" }, { date: "2021-11-15", version: "96" }, { date: "2022-01-04", version: "97" }, { date: "2022-02-01", version: "98" }, { date: "2022-03-01", version: "99" }, { date: "2022-03-29", version: "100" }, { date: "2022-04-26", version: "101" }, { date: "2022-05-24", version: "102" }, {
    date: "2022-06-21", version: "103" }, { date: "2022-08-02", version: "104" }, { date: "2022-09-02", version: "105" }, { date: "2022-09-27", version: "106" }, { date: "2022-10-25", version: "107" }, { date: "2022-11-29", version: "108" }, { date: "2023-01-10", version: "109" }, { date: "2023-02-07", version: "110" }, { date: "2023-03-07", version: "111" }, { date: "2023-04-04", version: "112" }, { date: "2023-05-02", version: "113" }, { date: "2023-05-30", version: "114" }, { date: "2023-07-18", version: "115" }, { date: "2023-08-15", version: "116" }, { date: "2023-09-12", version: "117" }, { date: "2023-10-10", version: "118" }, { date: "2023-10-31", version: "119" }, { date: "2023-12-05", version: "120" }, { date: "2024-01-23", version: "121" }, { date: "2024-02-20", version: "122" }, { date: "2024-03-19", version: "123" }, { date: "2024-04-16", version: "124" }, { date: "2024-05-14", version: "125" }, { date: "2024-06-11", version: "126" }, { date: "2024-07-23", version: "127" },
    { date: "2024-08-20", version: "128" }, { date: "2024-09-17", version: "129" }, { date: "2024-10-15", version: "130" }, { date: "2024-11-12", version: "131" }, { date: "2025-01-14", version: "132" }, { date: "2025-02-04", version: "133" }, { date: "2025-03-04", version: "134" }, { date: "2025-04-01", version: "135" }, { date: "2025-04-29", version: "136" }, { date: "2025-05-27", version: "137" }, { date: "2025-06-24", version: "138" }, { date: "2025-08-05", version: "139" }, { date: "2025-09-02", version: "140" }, { date: "2025-09-30", version: "141" }, { date: "2025-10-28", version: "142" }, { date: "2025-12-02", version: "143" }, { date: "2026-01-13", version: "144" }, { date: "2026-02-10", version: "145" }, { date: "2026-03-10", version: "146" }, { date: "2026-04-07", version: "147" }] }, chrome_android: { name: "Chrome Android", releases: [{ date: "2012-06-27", version: "18" }, { date: "2013-02-27", version: "25" }, { date: "2013-04-03", version: "26" }, { date: "2013-05-22", version: "\
27" }, { date: "2013-07-10", version: "28" }, { date: "2013-08-21", version: "29" }, { date: "2013-10-02", version: "30" }, { date: "2013-11-14", version: "31" }, { date: "2014-01-15", version: "32" }, { date: "2014-02-26", version: "33" }, { date: "2014-04-02", version: "34" }, { date: "2014-05-20", version: "35" }, { date: "2014-07-16", version: "36" }, { date: "2014-09-03", version: "37" }, { date: "2014-10-08", version: "38" }, { date: "2014-11-12", version: "39" }, { date: "2015-01-21", version: "40" }, { date: "2015-03-11", version: "41" }, { date: "2015-04-15", version: "42" }, { date: "2015-05-27", version: "43" }, { date: "2015-07-29", version: "44" }, { date: "2015-09-01", version: "45" }, { date: "2015-10-14", version: "46" }, { date: "2015-12-02", version: "47" }, { date: "2016-01-26", version: "48" }, { date: "2016-03-09", version: "49" }, { date: "2016-04-13", version: "50" }, { date: "2016-06-08", version: "51" }, { date: "2016-07-27", version: "52" }, { date: "2016-09-0\
7", version: "53" }, { date: "2016-10-19", version: "54" }, { date: "2016-12-06", version: "55" }, { date: "2017-02-01", version: "56" }, { date: "2017-03-16", version: "57" }, { date: "2017-04-25", version: "58" }, { date: "2017-06-06", version: "59" }, { date: "2017-08-01", version: "60" }, { date: "2017-09-05", version: "61" }, { date: "2017-10-24", version: "62" }, { date: "2017-12-05", version: "63" }, { date: "2018-01-23", version: "64" }, { date: "2018-03-06", version: "65" }, { date: "2018-04-17", version: "66" }, { date: "2018-05-31", version: "67" }, { date: "2018-07-24", version: "68" }, { date: "2018-09-04", version: "69" }, { date: "2018-10-17", version: "70" }, { date: "2018-12-04", version: "71" }, { date: "2019-01-29", version: "72" }, { date: "2019-03-12", version: "73" }, { date: "2019-04-24", version: "74" }, { date: "2019-06-04", version: "75" }, { date: "2019-07-30", version: "76" }, { date: "2019-09-10", version: "77" }, { date: "2019-10-22", version: "78" }, { date: "\
2019-12-17", version: "79" }, { date: "2020-02-04", version: "80" }, { date: "2020-04-07", version: "81" }, { date: "2020-05-19", version: "83" }, { date: "2020-07-27", version: "84" }, { date: "2020-08-25", version: "85" }, { date: "2020-10-20", version: "86" }, { date: "2020-11-17", version: "87" }, { date: "2021-01-19", version: "88" }, { date: "2021-03-02", version: "89" }, { date: "2021-04-13", version: "90" }, { date: "2021-05-25", version: "91" }, { date: "2021-07-20", version: "92" }, { date: "2021-08-31", version: "93" }, { date: "2021-09-21", version: "94" }, { date: "2021-10-19", version: "95" }, { date: "2021-11-15", version: "96" }, { date: "2022-01-04", version: "97" }, { date: "2022-02-01", version: "98" }, { date: "2022-03-01", version: "99" }, { date: "2022-03-29", version: "100" }, { date: "2022-04-26", version: "101" }, { date: "2022-05-24", version: "102" }, { date: "2022-06-21", version: "103" }, { date: "2022-08-02", version: "104" }, { date: "2022-09-02", version: "\
105" }, { date: "2022-09-27", version: "106" }, { date: "2022-10-25", version: "107" }, { date: "2022-11-29", version: "108" }, { date: "2023-01-10", version: "109" }, { date: "2023-02-07", version: "110" }, { date: "2023-03-07", version: "111" }, { date: "2023-04-04", version: "112" }, { date: "2023-05-02", version: "113" }, { date: "2023-05-30", version: "114" }, { date: "2023-07-21", version: "115" }, { date: "2023-08-15", version: "116" }, { date: "2023-09-12", version: "117" }, { date: "2023-10-10", version: "118" }, { date: "2023-10-31", version: "119" }, { date: "2023-12-05", version: "120" }, { date: "2024-01-23", version: "121" }, { date: "2024-02-20", version: "122" }, { date: "2024-03-19", version: "123" }, { date: "2024-04-16", version: "124" }, { date: "2024-05-14", version: "125" }, { date: "2024-06-11", version: "126" }, { date: "2024-07-23", version: "127" }, { date: "2024-08-20", version: "128" }, { date: "2024-09-17", version: "129" }, { date: "2024-10-15", version: "\
130" }, { date: "2024-11-12", version: "131" }, { date: "2025-01-14", version: "132" }, { date: "2025-02-04", version: "133" }, { date: "2025-03-04", version: "134" }, { date: "2025-04-01", version: "135" }, { date: "2025-04-29", version: "136" }, { date: "2025-05-27", version: "137" }, { date: "2025-06-24", version: "138" }, { date: "2025-08-05", version: "139" }, { date: "2025-09-02", version: "140" }, { date: "2025-09-30", version: "141" }, { date: "2025-10-28", version: "142" }, { date: "2025-12-02", version: "143" }, { date: "2026-01-13", version: "144" }, { date: "2026-02-10", version: "145" }, { date: "2026-03-10", version: "146" }, { date: "2026-04-07", version: "147" }] }, edge: { name: "Edge", releases: [{ date: "2015-07-29", version: "12" }, { date: "2015-11-12", version: "13" }, { date: "2016-08-02", version: "14" }, { date: "2017-04-05", version: "15" }, { date: "2017-10-17", version: "16" }, { date: "2018-04-30", version: "17" }, { date: "2018-10-02", version: "18" }, { date: "\
2020-01-15", version: "79" }, { date: "2020-02-07", version: "80" }, { date: "2020-04-13", version: "81" }, { date: "2020-05-21", version: "83" }, { date: "2020-07-16", version: "84" }, { date: "2020-08-27", version: "85" }, { date: "2020-10-09", version: "86" }, { date: "2020-11-19", version: "87" }, { date: "2021-01-21", version: "88" }, { date: "2021-03-04", version: "89" }, { date: "2021-04-15", version: "90" }, { date: "2021-05-27", version: "91" }, { date: "2021-07-22", version: "92" }, { date: "2021-09-02", version: "93" }, { date: "2021-09-24", version: "94" }, { date: "2021-10-21", version: "95" }, { date: "2021-11-19", version: "96" }, { date: "2022-01-06", version: "97" }, { date: "2022-02-03", version: "98" }, { date: "2022-03-03", version: "99" }, { date: "2022-04-01", version: "100" }, { date: "2022-04-28", version: "101" }, { date: "2022-05-31", version: "102" }, { date: "2022-06-23", version: "103" }, { date: "2022-08-05", version: "104" }, { date: "2022-09-01", version: "\
105" }, { date: "2022-10-03", version: "106" }, { date: "2022-10-27", version: "107" }, { date: "2022-12-05", version: "108" }, { date: "2023-01-12", version: "109" }, { date: "2023-02-09", version: "110" }, { date: "2023-03-13", version: "111" }, { date: "2023-04-06", version: "112" }, { date: "2023-05-05", version: "113" }, { date: "2023-06-02", version: "114" }, { date: "2023-07-21", version: "115" }, { date: "2023-08-21", version: "116" }, { date: "2023-09-15", version: "117" }, { date: "2023-10-13", version: "118" }, { date: "2023-11-02", version: "119" }, { date: "2023-12-07", version: "120" }, { date: "2024-01-25", version: "121" }, { date: "2024-02-23", version: "122" }, { date: "2024-03-22", version: "123" }, { date: "2024-04-18", version: "124" }, { date: "2024-05-17", version: "125" }, { date: "2024-06-13", version: "126" }, { date: "2024-07-25", version: "127" }, { date: "2024-08-22", version: "128" }, { date: "2024-09-19", version: "129" }, { date: "2024-10-17", version: "\
130" }, { date: "2024-11-14", version: "131" }, { date: "2025-01-17", version: "132" }, { date: "2025-02-06", version: "133" }, { date: "2025-03-06", version: "134" }, { date: "2025-04-04", version: "135" }, { date: "2025-05-01", version: "136" }, { date: "2025-05-29", version: "137" }, { date: "2025-06-26", version: "138" }, { date: "2025-08-07", version: "139" }, { date: "2025-09-05", version: "140" }, { date: "2025-10-03", version: "141" }, { date: "2025-10-31", version: "142" }, { date: "2025-12-05", version: "143" }, { date: "2026-01-21", version: "144" }, { date: "2026-02-14", version: "145" }, { date: "2026-03-13", version: "146" }, { date: "2026-04-10", version: "147" }] }, firefox: { name: "Firefox", releases: [{ date: "2004-11-09", version: "1" }, { date: "2005-11-29", version: "1.5" }, { date: "2006-10-24", version: "2" }, { date: "2008-06-17", version: "3" }, { date: "2009-06-30", version: "3.5" }, { date: "2010-01-21", version: "3.6" }, { date: "2011-03-22", version: "4" },
    { date: "2011-06-21", version: "5" }, { date: "2011-08-16", version: "6" }, { date: "2011-09-27", version: "7" }, { date: "2011-11-08", version: "8" }, { date: "2011-12-20", version: "9" }, { date: "2012-01-31", version: "10" }, { date: "2012-03-13", version: "11" }, { date: "2012-04-24", version: "12" }, { date: "2012-06-05", version: "13" }, { date: "2012-07-17", version: "14" }, { date: "2012-08-28", version: "15" }, { date: "2012-10-09", version: "16" }, { date: "2012-11-20", version: "17" }, { date: "2013-01-08", version: "18" }, { date: "2013-02-19", version: "19" }, { date: "2013-04-02", version: "20" }, { date: "2013-05-14", version: "21" }, { date: "2013-06-25", version: "22" }, { date: "2013-08-06", version: "23" }, { date: "2013-09-17", version: "24" }, { date: "2013-10-29", version: "25" }, { date: "2013-12-10", version: "26" }, { date: "2014-02-04", version: "27" }, { date: "2014-03-18", version: "28" }, { date: "2014-04-29", version: "29" }, { date: "2014-06-10", version: "\
30" }, { date: "2014-07-22", version: "31" }, { date: "2014-09-02", version: "32" }, { date: "2014-10-14", version: "33" }, { date: "2014-12-01", version: "34" }, { date: "2015-01-13", version: "35" }, { date: "2015-02-24", version: "36" }, { date: "2015-03-31", version: "37" }, { date: "2015-05-12", version: "38" }, { date: "2015-07-02", version: "39" }, { date: "2015-08-11", version: "40" }, { date: "2015-09-22", version: "41" }, { date: "2015-11-03", version: "42" }, { date: "2015-12-15", version: "43" }, { date: "2016-01-26", version: "44" }, { date: "2016-03-08", version: "45" }, { date: "2016-04-26", version: "46" }, { date: "2016-06-07", version: "47" }, { date: "2016-08-02", version: "48" }, { date: "2016-09-20", version: "49" }, { date: "2016-11-15", version: "50" }, { date: "2017-01-24", version: "51" }, { date: "2017-03-07", version: "52" }, { date: "2017-04-19", version: "53" }, { date: "2017-06-13", version: "54" }, { date: "2017-08-08", version: "55" }, { date: "2017-09-2\
8", version: "56" }, { date: "2017-11-14", version: "57" }, { date: "2018-01-23", version: "58" }, { date: "2018-03-13", version: "59" }, { date: "2018-05-09", version: "60" }, { date: "2018-06-26", version: "61" }, { date: "2018-09-05", version: "62" }, { date: "2018-10-23", version: "63" }, { date: "2018-12-11", version: "64" }, { date: "2019-01-29", version: "65" }, { date: "2019-03-19", version: "66" }, { date: "2019-05-21", version: "67" }, { date: "2019-07-09", version: "68" }, { date: "2019-09-03", version: "69" }, { date: "2019-10-22", version: "70" }, { date: "2019-12-10", version: "71" }, { date: "2020-01-07", version: "72" }, { date: "2020-02-11", version: "73" }, { date: "2020-03-10", version: "74" }, { date: "2020-04-07", version: "75" }, { date: "2020-05-05", version: "76" }, { date: "2020-06-02", version: "77" }, { date: "2020-06-30", version: "78" }, { date: "2020-07-28", version: "79" }, { date: "2020-08-25", version: "80" }, { date: "2020-09-22", version: "81" }, { date: "\
2020-10-20", version: "82" }, { date: "2020-11-17", version: "83" }, { date: "2020-12-15", version: "84" }, { date: "2021-01-26", version: "85" }, { date: "2021-02-23", version: "86" }, { date: "2021-03-23", version: "87" }, { date: "2021-04-19", version: "88" }, { date: "2021-06-01", version: "89" }, { date: "2021-07-13", version: "90" }, { date: "2021-08-10", version: "91" }, { date: "2021-09-07", version: "92" }, { date: "2021-10-05", version: "93" }, { date: "2021-11-02", version: "94" }, { date: "2021-12-07", version: "95" }, { date: "2022-01-11", version: "96" }, { date: "2022-02-08", version: "97" }, { date: "2022-03-08", version: "98" }, { date: "2022-04-05", version: "99" }, { date: "2022-05-03", version: "100" }, { date: "2022-05-31", version: "101" }, { date: "2022-06-28", version: "102" }, { date: "2022-07-26", version: "103" }, { date: "2022-08-23", version: "104" }, { date: "2022-09-20", version: "105" }, { date: "2022-10-18", version: "106" }, { date: "2022-11-15", version: "\
107" }, { date: "2022-12-13", version: "108" }, { date: "2023-01-17", version: "109" }, { date: "2023-02-14", version: "110" }, { date: "2023-03-14", version: "111" }, { date: "2023-04-11", version: "112" }, { date: "2023-05-09", version: "113" }, { date: "2023-06-06", version: "114" }, { date: "2023-07-04", version: "115" }, { date: "2023-08-01", version: "116" }, { date: "2023-08-29", version: "117" }, { date: "2023-09-26", version: "118" }, { date: "2023-10-24", version: "119" }, { date: "2023-11-21", version: "120" }, { date: "2023-12-19", version: "121" }, { date: "2024-01-23", version: "122" }, { date: "2024-02-20", version: "123" }, { date: "2024-03-19", version: "124" }, { date: "2024-04-16", version: "125" }, { date: "2024-05-14", version: "126" }, { date: "2024-06-11", version: "127" }, { date: "2024-07-09", version: "128" }, { date: "2024-08-06", version: "129" }, { date: "2024-09-03", version: "130" }, { date: "2024-10-01", version: "131" }, { date: "2024-10-29", version: "\
132" }, { date: "2024-11-26", version: "133" }, { date: "2025-01-07", version: "134" }, { date: "2025-02-04", version: "135" }, { date: "2025-03-04", version: "136" }, { date: "2025-04-01", version: "137" }, { date: "2025-04-29", version: "138" }, { date: "2025-05-27", version: "139" }, { date: "2025-06-24", version: "140" }, { date: "2025-07-22", version: "141" }, { date: "2025-08-19", version: "142" }, { date: "2025-09-16", version: "143" }, { date: "2025-10-14", version: "144" }, { date: "2025-11-11", version: "145" }, { date: "2025-12-09", version: "146" }, { date: "2026-01-13", version: "147" }, { date: "2026-02-24", version: "148" }, { date: "2026-03-24", version: "149" }, { date: "2026-04-21", version: "150" }] }, firefox_android: { name: "Firefox for Android", releases: [{ date: "2011-03-29", version: "4" }, { date: "2011-06-21", version: "5" }, { date: "2011-08-16", version: "6" }, { date: "2011-09-27", version: "7" }, { date: "2011-11-08", version: "8" }, { date: "2011-12-21",
    version: "9" }, { date: "2012-01-31", version: "10" }, { date: "2012-06-26", version: "14" }, { date: "2012-08-28", version: "15" }, { date: "2012-10-09", version: "16" }, { date: "2012-11-20", version: "17" }, { date: "2013-01-08", version: "18" }, { date: "2013-02-19", version: "19" }, { date: "2013-04-02", version: "20" }, { date: "2013-05-14", version: "21" }, { date: "2013-06-25", version: "22" }, { date: "2013-08-06", version: "23" }, { date: "2013-09-17", version: "24" }, { date: "2013-10-29", version: "25" }, { date: "2013-12-10", version: "26" }, { date: "2014-02-04", version: "27" }, { date: "2014-03-18", version: "28" }, { date: "2014-04-29", version: "29" }, { date: "2014-06-10", version: "30" }, { date: "2014-07-22", version: "31" }, { date: "2014-09-02", version: "32" }, { date: "2014-10-14", version: "33" }, { date: "2014-12-01", version: "34" }, { date: "2015-01-13", version: "35" }, { date: "2015-02-27", version: "36" }, { date: "2015-03-31", version: "37" }, { date: "\
2015-05-12", version: "38" }, { date: "2015-07-02", version: "39" }, { date: "2015-08-11", version: "40" }, { date: "2015-09-22", version: "41" }, { date: "2015-11-03", version: "42" }, { date: "2015-12-15", version: "43" }, { date: "2016-01-26", version: "44" }, { date: "2016-03-08", version: "45" }, { date: "2016-04-26", version: "46" }, { date: "2016-06-07", version: "47" }, { date: "2016-08-02", version: "48" }, { date: "2016-09-20", version: "49" }, { date: "2016-11-15", version: "50" }, { date: "2017-01-24", version: "51" }, { date: "2017-03-07", version: "52" }, { date: "2017-04-19", version: "53" }, { date: "2017-06-13", version: "54" }, { date: "2017-08-08", version: "55" }, { date: "2017-09-28", version: "56" }, { date: "2017-11-28", version: "57" }, { date: "2018-01-22", version: "58" }, { date: "2018-03-13", version: "59" }, { date: "2018-05-09", version: "60" }, { date: "2018-06-26", version: "61" }, { date: "2018-09-05", version: "62" }, { date: "2018-10-23", version: "63" },
    { date: "2018-12-11", version: "64" }, { date: "2019-01-29", version: "65" }, { date: "2019-03-19", version: "66" }, { date: "2019-05-21", version: "67" }, { date: "2019-07-09", version: "68" }, { date: "2020-07-28", version: "79" }, { date: "2020-08-31", version: "80" }, { date: "2020-09-22", version: "81" }, { date: "2020-10-20", version: "82" }, { date: "2020-11-17", version: "83" }, { date: "2020-12-15", version: "84" }, { date: "2021-01-26", version: "85" }, { date: "2021-02-23", version: "86" }, { date: "2021-03-23", version: "87" }, { date: "2021-04-19", version: "88" }, { date: "2021-06-01", version: "89" }, { date: "2021-07-13", version: "90" }, { date: "2021-08-10", version: "91" }, { date: "2021-09-07", version: "92" }, { date: "2021-10-05", version: "93" }, { date: "2021-11-02", version: "94" }, { date: "2021-12-07", version: "95" }, { date: "2022-01-11", version: "96" }, { date: "2022-02-08", version: "97" }, { date: "2022-03-08", version: "98" }, { date: "2022-04-05",
    version: "99" }, { date: "2022-05-03", version: "100" }, { date: "2022-05-31", version: "101" }, { date: "2022-06-28", version: "102" }, { date: "2022-07-26", version: "103" }, { date: "2022-08-23", version: "104" }, { date: "2022-09-20", version: "105" }, { date: "2022-10-18", version: "106" }, { date: "2022-11-15", version: "107" }, { date: "2022-12-13", version: "108" }, { date: "2023-01-17", version: "109" }, { date: "2023-02-14", version: "110" }, { date: "2023-03-14", version: "111" }, { date: "2023-04-11", version: "112" }, { date: "2023-05-09", version: "113" }, { date: "2023-06-06", version: "114" }, { date: "2023-07-04", version: "115" }, { date: "2023-08-01", version: "116" }, { date: "2023-08-29", version: "117" }, { date: "2023-09-26", version: "118" }, { date: "2023-10-24", version: "119" }, { date: "2023-11-21", version: "120" }, { date: "2023-12-19", version: "121" }, { date: "2024-01-23", version: "122" }, { date: "2024-02-20", version: "123" }, { date: "2024-03-19",
    version: "124" }, { date: "2024-04-16", version: "125" }, { date: "2024-05-14", version: "126" }, { date: "2024-06-11", version: "127" }, { date: "2024-07-09", version: "128" }, { date: "2024-08-06", version: "129" }, { date: "2024-09-03", version: "130" }, { date: "2024-10-01", version: "131" }, { date: "2024-10-29", version: "132" }, { date: "2024-11-26", version: "133" }, { date: "2025-01-07", version: "134" }, { date: "2025-02-04", version: "135" }, { date: "2025-03-04", version: "136" }, { date: "2025-04-01", version: "137" }, { date: "2025-04-29", version: "138" }, { date: "2025-05-27", version: "139" }, { date: "2025-06-24", version: "140" }, { date: "2025-07-22", version: "141" }, { date: "2025-08-19", version: "142" }, { date: "2025-09-16", version: "143" }, { date: "2025-10-14", version: "144" }, { date: "2025-11-11", version: "145" }, { date: "2025-12-09", version: "146" }, { date: "2026-01-13", version: "147" }, { date: "2026-02-24", version: "148" }, { date: "2026-03-2\
4", version: "149" }, { date: "2026-04-21", version: "150" }] }, safari: { name: "Safari", releases: [{ date: "2003-06-23", version: "1" }, { date: "2003-10-24", version: "1.1" }, { date: "2004-02-02", version: "1.2" }, { date: "2005-04-15", version: "1.3" }, { date: "2005-04-29", version: "2" }, { date: "2007-10-26", version: "3" }, { date: "2008-03-18", version: "3.1" }, { date: "2009-06-08", version: "4" }, { date: "2010-06-07", version: "5" }, { date: "2011-07-20", version: "5.1" }, { date: "2012-07-25", version: "6" }, { date: "2013-10-22", version: "7" }, { date: "2014-10-16", version: "8" }, { date: "2015-09-30", version: "9" }, { date: "2016-03-21", version: "9.1" }, { date: "2016-09-20", version: "10" }, { date: "2017-03-27", version: "10.1" }, { date: "2017-09-19", version: "11" }, { date: "2018-04-12", version: "11.1" }, { date: "2018-09-17", version: "12" }, { date: "2019-03-25", version: "12.1" }, { date: "2019-09-19", version: "13" }, { date: "2020-03-24", version: "13.1" },
    { date: "2020-09-16", version: "14" }, { date: "2021-04-26", version: "14.1" }, { date: "2021-09-20", version: "15" }, { date: "2021-10-25", version: "15.1" }, { date: "2021-12-13", version: "15.2" }, { date: "2022-01-26", version: "15.3" }, { date: "2022-03-14", version: "15.4" }, { date: "2022-05-16", version: "15.5" }, { date: "2022-07-20", version: "15.6" }, { date: "2022-09-12", version: "16" }, { date: "2022-10-24", version: "16.1" }, { date: "2022-12-13", version: "16.2" }, { date: "2023-01-23", version: "16.3" }, { date: "2023-03-27", version: "16.4" }, { date: "2023-05-18", version: "16.5" }, { date: "2023-07-24", version: "16.6" }, { date: "2023-09-18", version: "17" }, { date: "2023-10-25", version: "17.1" }, { date: "2023-12-11", version: "17.2" }, { date: "2024-01-22", version: "17.3" }, { date: "2024-03-05", version: "17.4" }, { date: "2024-05-13", version: "17.5" }, { date: "2024-07-29", version: "17.6" }, { date: "2024-09-16", version: "18" }, { date: "2024-10-28", version: "\
18.1" }, { date: "2024-12-11", version: "18.2" }, { date: "2025-01-27", version: "18.3" }, { date: "2025-03-31", version: "18.4" }, { date: "2025-05-12", version: "18.5" }, { date: "2025-07-29", version: "18.6" }, { date: "2025-09-15", version: "26" }, { date: "2025-11-03", version: "26.1" }, { date: "2025-12-12", version: "26.2" }, { date: "2026-02-11", version: "26.3" }, { date: "2026-03-24", version: "26.4" }] }, safari_ios: { name: "Safari on iOS", releases: [{ date: "2007-06-29", version: "1" }, { date: "2008-07-11", version: "2" }, { date: "2009-06-17", version: "3" }, { date: "2010-04-03", version: "3.2" }, { date: "2010-06-21", version: "4" }, { date: "2010-11-22", version: "4.2" }, { date: "2011-10-12", version: "5" }, { date: "2012-09-10", version: "6" }, { date: "2013-09-18", version: "7" }, { date: "2014-09-17", version: "8" }, { date: "2015-09-16", version: "9" }, { date: "2016-03-21", version: "9.3" }, { date: "2016-09-13", version: "10" }, { date: "2017-03-27", version: "\
10.3" }, { date: "2017-09-19", version: "11" }, { date: "2018-03-29", version: "11.3" }, { date: "2018-09-17", version: "12" }, { date: "2019-03-25", version: "12.2" }, { date: "2019-09-19", version: "13" }, { date: "2020-03-24", version: "13.4" }, { date: "2020-09-16", version: "14" }, { date: "2021-04-26", version: "14.5" }, { date: "2021-09-20", version: "15" }, { date: "2021-10-25", version: "15.1" }, { date: "2021-12-13", version: "15.2" }, { date: "2022-01-26", version: "15.3" }, { date: "2022-03-14", version: "15.4" }, { date: "2022-05-16", version: "15.5" }, { date: "2022-07-20", version: "15.6" }, { date: "2022-09-12", version: "16" }, { date: "2022-10-24", version: "16.1" }, { date: "2022-12-13", version: "16.2" }, { date: "2023-01-23", version: "16.3" }, { date: "2023-03-27", version: "16.4" }, { date: "2023-05-18", version: "16.5" }, { date: "2023-07-24", version: "16.6" }, { date: "2023-09-18", version: "17" }, { date: "2023-10-25", version: "17.1" }, { date: "2023-12-11",
    version: "17.2" }, { date: "2024-01-22", version: "17.3" }, { date: "2024-03-05", version: "17.4" }, { date: "2024-05-13", version: "17.5" }, { date: "2024-07-29", version: "17.6" }, { date: "2024-09-16", version: "18" }, { date: "2024-10-28", version: "18.1" }, { date: "2024-12-11", version: "18.2" }, { date: "2025-01-27", version: "18.3" }, { date: "2025-03-31", version: "18.4" }, { date: "2025-05-12", version: "18.5" }, { date: "2025-07-29", version: "18.6" }, { date: "2025-09-15", version: "26" }, { date: "2025-11-03", version: "26.1" }, { date: "2025-12-12", version: "26.2" }, { date: "2026-02-11", version: "26.3" }, { date: "2026-03-24", version: "26.4" }] } }, features: { a: { compat_features: ["api.HTMLAnchorElement", "api.HTMLAnchorElement.hash", "api.HTMLAnchorElement.host", "api.HTMLAnchorElement.hostname", "api.HTMLAnchorElement.href", "api.HTMLAnchorElement.hreflang", "api.HTMLAnchorElement.origin", "api.HTMLAnchorElement.password", "api.HTMLAnchorElement.pathname", "a\
pi.HTMLAnchorElement.port", "api.HTMLAnchorElement.protocol", "api.HTMLAnchorElement.rel", "api.HTMLAnchorElement.relList", "api.HTMLAnchorElement.search", "api.HTMLAnchorElement.target", "api.HTMLAnchorElement.text", "api.HTMLAnchorElement.toString", "api.HTMLAnchorElement.type", "api.HTMLAnchorElement.username", "html.elements.a", "html.elements.a.href", "html.elements.a.href.href_sms", "html.elements.a.href.href_top", "html.elements.a.hreflang", "html.elements.a.implicit_noopener", "html.elements.a.rel", "html.elements.a.rel.noopener", "html.elements.a.rel.noreferrer", "html.elements.a.target", "html.elements.a.type"], description: "The <a> element creates a hyperlink to any resource that's accessible via a URL, such as web pages, files, email addresses, or locations within the same page.", description_html: "The <code>&#x3C;a></code> element creates a hyperlink to any resource that's accessible via a URL, such as web pages, files, email addresses, or locations within the same page.",
    group: ["html-elements"], kind: "feature", name: "<a>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLAnchorElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.hash": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.host": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTM\
LAnchorElement.hostname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.hreflang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.origin": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "8", chrome_android: "18", edge: "17", firefox: "26", firefox_android: "26", safari: "5.1", safari_ios: "5" } }, "api.HTMLAncho\
rElement.password": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "api.HTMLAnchorElement.pathname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.port": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.protocol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorEl\
ement.rel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.relList": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "65", chrome_android: "65", edge: "18", firefox: "30", firefox_android: "30", safari: "9", safari_ios: "9" } }, "api.HTMLAnchorElement.search": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.text": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.toString": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "22", firefox_android: "22", safari: "3", safari_ios: "1" } }, "api.HTMLAnchorElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAnchorElement.username": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "html.elements.a": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.a.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.a.href.href_sms": { baseline: false, support: { firefox: "12", firefox_android: "14" } }, "html.elements.a.href.href_top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.a.hreflang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "html.elements.a.implicit_noopener": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "79", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "html.elements.a.rel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.a.rel.noopener": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "html.elements.a.rel.noreferrer": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "16", chrome_android: "18", edge: "13", firefox: "33", firefox_android: "\
33", safari: "5", safari_ios: "4.2" } }, "html.elements.a.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.a.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, abbr: { compat_features: ["html.elements.abbr"], description: "The <abbr> HTML element represents an abbreviation or acronym.", description_html: "The <code>&#x3C;abbr></code> HTML element represents an abbreviation or acronym.", group: ["html-elements"], kind: "feature", name: "<abbr>", spec: ["https://html.spec.whatwg.org/multipage/text-level-\
semantics.html#the-abbr-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.abbr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "abortable-fetch": { compat_features: ["api.Request.signal", "api.fetch.init_signal_parameter"], description: "If you construct a fetch request with an AbortSignal, you can cancel the request.", description_html: "If you construct a fetch request with an <code>AbortSignal</code>, you can cancel the request.", group: ["fetch"], kind: "feature", name: "Abortable fetch", spec: ["https://fetch.spec.whatwg.org/#ref-for-dom-request-signal%E2%91%A1"], status: { baseline: "high", baseline_high_date: "\
2021-09-25", baseline_low_date: "2019-03-25", by_compat_key: { "api.Request.signal": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } }, "api.fetch.init_signal_parameter": { baseline: "high", baseline_high_date: "2020-10-17", baseline_low_date: "2018-04-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } } }, aborting: { caniuse: ["abortcontroller"], compat_features: ["api.AbortController", "api.AbortController.AbortController", "api.AbortController.abort", "api.AbortController.abort.reason_parameter", "api.AbortController.signal", "api.AbortSignal", "api.AbortSignal.abort_event", "api.AbortSign\
al.abort_static", "api.AbortSignal.abort_static.reason_parameter", "api.AbortSignal.aborted", "api.AbortSignal.reason", "api.AbortSignal.throwIfAborted"], description: "The AbortController and AbortSignal APIs allow you to cancel an ongoing operation, such as a fetch() request.", description_html: "The <code>AbortController</code> and <code>AbortSignal</code> APIs allow you to cancel an ongoing operation, such as a <code>fetch()</code> request.", kind: "feature", name: "AbortController and AbortSignal", spec: ["https://dom.spec.whatwg.org/#aborting-ongoing-activities"], status: { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", by_compat_key: { "api.AbortController": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } }, "api.AbortController.AbortController": { baseline: "high", baseline_high_date: "\
2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } }, "api.AbortController.abort": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } }, "api.AbortController.abort.reason_parameter": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.AbortController.signal": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } }, "api.AbortSignal": { baseline: "high", baseline_high_date: "\
2020-10-17", baseline_low_date: "2018-04-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "api.AbortSignal.abort_event": { baseline: "high", baseline_high_date: "2020-10-17", baseline_low_date: "2018-04-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "api.AbortSignal.abort_static": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "88", firefox_android: "88", safari: "15", safari_ios: "15" } }, "api.AbortSignal.abort_static.reason_parameter": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.AbortSignal.aborted": { baseline: "\
high", baseline_high_date: "2020-10-17", baseline_low_date: "2018-04-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "api.AbortSignal.reason": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.AbortSignal.throwIfAborted": { baseline: "high", baseline_high_date: "2024-10-01", baseline_low_date: "2022-04-01", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "57", firefox_android: "57", safari: "12.1", safari_ios: "12.2" } } }, "abortsignal-any": { compat_features: ["api.AbortSignal.any_static"], description: "The AbortSignal.any() static method combines an itera\
ble of abort signals into a single signal, with the abort reason taken from the first signal to abort.", description_html: "The <code>AbortSignal.any()</code> static method combines an iterable of abort signals into a single signal, with the abort reason taken from the first signal to abort.", kind: "feature", name: "AbortSignal.any()", spec: ["https://dom.spec.whatwg.org/#dom-abortsignal-any"], status: { baseline: "low", baseline_low_date: "2024-03-19", by_compat_key: { "api.AbortSignal.any_static": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } } }, "abortsignal-timeout": { compat_features: ["api.AbortSignal.timeout_static"], description: "The AbortSignal.timeout() static method returns an abort signa\
l that automatically aborts after a specified duration.", description_html: "The <code>AbortSignal.timeout()</code> static method returns an abort signal that automatically aborts after a specified duration.", kind: "feature", name: "AbortSignal.timeout()", spec: ["https://dom.spec.whatwg.org/#dom-abortsignal-timeout"], status: { baseline: "low", baseline_low_date: "2024-04-18", by_compat_key: { "api.AbortSignal.timeout_static": { baseline: "low", baseline_low_date: "2024-04-18", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "100", firefox_android: "100", safari: "16", safari_ios: "16" } } }, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "100", firefox_android: "100", safari: "16", safari_ios: "16" } } }, "abs-sign": { compat_features: ["css.types.abs", "css.types.sign"], description: "The abs() and sign() CSS functions compute the absolute value or the sign of the input.", description_html: "The <code>abs()</code> and <code>sign()</cod\
e> CSS functions compute the absolute value or the sign of the input.", group: ["css"], kind: "feature", name: "abs() and sign()", spec: ["https://drafts.csswg.org/css-values-4/#sign-funcs"], status: { baseline: "low", baseline_low_date: "2025-06-26", by_compat_key: { "css.types.abs": { baseline: "low", baseline_low_date: "2025-06-26", support: { chrome: "138", chrome_android: "138", edge: "138", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.sign": { baseline: "low", baseline_low_date: "2025-06-26", support: { chrome: "138", chrome_android: "138", edge: "138", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "138", chrome_android: "138", edge: "138", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } } }, "absolute-positioning": { compat_features: ["css.properties.align-self.position_absolute_context", "css.properties.justify-self.position_absolute_context", "css.p\
roperties.place-self.position_absolute_context", "css.properties.position.absolute"], description: "The position: absolute CSS declaration removes an element from the normal flow and positions it relative to its containing block, which is often the root element, or closest positioned ancestor.", description_html: "The <code>position: absolute</code> CSS declaration removes an element from the normal flow and positions it relative to its containing block, which is often the root element, or closest positioned ancestor.", group: ["positioning"], kind: "feature", name: "Absolute positioning", spec: ["https://drafts.csswg.org/css-position-3/#abspos-insets"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.align-self.position_absolute_context": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "134", firefox_android: "134", safari: "26", safari_ios: "\
26" } }, "css.properties.justify-self.position_absolute_context": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "134", firefox_android: "134", safari: "26", safari_ios: "26" } }, "css.properties.place-self.position_absolute_context": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "134", firefox_android: "134", safari: "26", safari_ios: "26" } }, "css.properties.position.absolute": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, accelerometer: { compat_features: ["api.Accelerometer", "api.Accelerometer.Accelerometer", "api.Accelerometer.x", "a\
pi.Accelerometer.y", "api.Accelerometer.z", "api.GravitySensor", "api.GravitySensor.GravitySensor", "api.LinearAccelerationSensor", "api.LinearAccelerationSensor.LinearAccelerationSensor", "api.Permissions.permission_accelerometer", "html.elements.iframe.allow.accelerometer", "http.headers.Permissions-Policy.accelerometer"], description: "The Accelerometer, LinearAccelerationSensor and GravitySensor APIs read the acceleration applied to a device in three dimensions, either including the effect of gravity, without its effect, or only its effect, respectively.", description_html: "The <code>Accelerometer</code>, <code>LinearAccelerationSensor</code> and <code>GravitySensor</code> APIs read the acceleration applied to a device in three dimensions, either including the effect of gravity, without its effect, or only its effect, respectively.", group: ["sensors"], kind: "feature", name: "Accelerometer", spec: ["https://w3c.github.io/accelerometer/"], status: { baseline: false, by_compat_key: {
    "api.Accelerometer": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Accelerometer.Accelerometer": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Accelerometer.x": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Accelerometer.y": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Accelerometer.z": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.GravitySensor": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91" } }, "api.GravitySensor.GravitySensor": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91" } }, "api.LinearAccelerationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.LinearAccelerationSensor.LinearAccelerationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "\
79" } }, "api.Permissions.permission_accelerometer": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "79" } }, "html.elements.iframe.allow.accelerometer": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "http.headers.Permissions-Policy.accelerometer": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "91", chrome_android: "91", edge: "91" } } }, "accent-color": { compat_features: ["css.properties.accent-color", "css.properties.accent-color.auto"], description: "The accent-color CSS property sets a color for checkboxes, radio buttons, and other form controls.", description_html: "The <code>accent-color</code> CSS property sets a color for checkboxes, radio buttons, and other form controls.", group: ["css"], kind: "feature", name: "accent-color", spec: ["https://drafts.csswg.org/css-ui-4/#widget-accent"], status: { baseline: false, by_compat_key: { "css.properties.accent-color": {
    baseline: false, support: { chrome: "93", edge: "93", firefox: "92", firefox_android: "92" } }, "css.properties.accent-color.auto": { baseline: false, support: { chrome: "93", edge: "93", firefox: "92", firefox_android: "92" } } }, support: { chrome: "93", edge: "93", firefox: "92", firefox_android: "92" } } }, accesskey: { compat_features: ["api.HTMLElement.accessKey", "api.HTMLElement.accessKeyLabel", "html.global_attributes.accesskey"], description: "The accesskey global HTML attribute gives a hint for generating a keyboard shortcut for the current element. The attribute value must consist of a single printable character.", description_html: "The <code>accesskey</code> global HTML attribute gives a hint for generating a keyboard shortcut for the current element. The attribute value must consist of a single printable character.", kind: "feature", name: "accesskey", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#the-accesskey-attribute"], status: { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLElement.accessKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "17", chrome_android: "18", edge: "12", firefox: "5", firefox_android: "5", safari: "6", safari_ios: "6" } }, "api.HTMLElement.accessKeyLabel": { baseline: false, support: { firefox: "8", firefox_android: "8", safari: "14", safari_ios: "14" } }, "html.global_attributes.accesskey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "17", chrome_android: "18", edge: "12", firefox: "5", firefox_android: "5", safari: "6", safari_ios: "6" } } }, "accessor-methods": { compat_features: ["javascript.builtins.Object.defineGetter", "javascript.builtins.Object.defineSetter", "javascript.b\
uiltins.Object.lookupGetter", "javascript.builtins.Object.lookupSetter"], description: "The __defineGetter__() and __defineSetter__() methods of objects bind a function to a property, which is called on setting or reading the property.", description_html: "The <code>__defineGetter__()</code> and <code>__defineSetter__()</code> methods of objects bind a function to a property, which is called on setting or reading the property.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers"], reason: 'TC39 included accessor methods in Annex B of the ECMAScript specification, which covers JavaScript features with "one or more undesirable characteristics and in the absence of legacy usage would be removed."', reason_html: 'TC39 included accessor methods in Annex B of the ECMAScript specification, which covers JavaScript features with "one or more undesirable characteristics and in \
the absence of legacy usage would be removed."' }, group: ["javascript"], kind: "feature", name: "Accessor methods", spec: ["https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.prototype-legacy-accessor-methods"], status: { baseline: false, by_compat_key: { "javascript.builtins.Object.defineGetter": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Object.defineSetter": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Object.lookupGetter": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Object.lookupSetter": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4",
    safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "active-view-transition": { compat_features: ["api.ViewTransition.types", "api.ViewTransitionTypeSet", "api.ViewTransitionTypeSet.@@iterator", "api.ViewTransitionTypeSet.add", "api.ViewTransitionTypeSet.clear", "api.ViewTransitionTypeSet.delete", "api.ViewTransitionTypeSet.entries", "api.ViewTransitionTypeSet.forEach", "api.ViewTransitionTypeSet.has", "api.ViewTransitionTypeSet.keys", "api.ViewTransitionTypeSet.size", "api.ViewTransitionTypeSet.values", "css.selectors.active-view-transition", "css.selectors.active-view-transition-type"], description: "The :active-view-transition CSS pseudo-class matches the root element when a view transition is active. The :active-view-transition-type() CSS pseudo-class matches only when the active view transition was started with the specified type.", description_html: "The <code>:ac\
tive-view-transition</code> CSS pseudo-class matches the root element when a view transition is active. The <code>:active-view-transition-type()</code> CSS pseudo-class matches only when the active view transition was started with the specified type.", group: ["view-transitions", "selectors"], kind: "feature", name: "Active view transition", spec: ["https://drafts.csswg.org/css-view-transitions-2/#the-active-view-transition-pseudo"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: { "api.ViewTransition.types": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.@@iterator": {
    baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.add": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.clear": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.delete": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.entries": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "\
125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.forEach": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.has": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.keys": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.ViewTransitionTypeSet.size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "\
18.2" } }, "api.ViewTransitionTypeSet.values": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "css.selectors.active-view-transition": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "css.selectors.active-view-transition-type": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } } }, address: { compat_features: ["html.elements.address"], description: "The <address> element represents contact information for a person or people\
, or for an organization.", description_html: "The <code>&#x3C;address></code> element represents contact information for a person or people, or for an organization.", group: ["html-elements"], kind: "feature", name: "<address>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-address-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.address": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, alerts: { compat_features: ["api.Window.alert", "api.Window.confirm", "api.Window.prompt"], description: "The window.alert(), window.confirm(), and window.prompt() methods open modal dialogs for notifyi\
ng the user, asking for confirmation, or entering text.", description_html: "The <code>window.alert()</code>, <code>window.confirm()</code>, and <code>window.prompt()</code> methods open modal dialogs for notifying the user, asking for confirmation, or entering text.", kind: "feature", name: "Alerts", spec: ["https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#user-prompts"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Window.alert": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.confirm": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.prompt": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "align-content-block": { compat_features: ["css.properties.align-content.block_context"], description: "The align-content property vertically aligns content in block layouts, like it does in flex or grid layouts.", description_html: "The <code>align-content</code> property vertically aligns content in block layouts, like it does in flex or grid layouts.", group: ["layout"], kind: "feature", name: "align-content in block layouts", spec: ["https://drafts.csswg.org/css-align-3/#align-justify-content"], status: { baseline: "low", baseline_low_date: "2024-04-16", by_compat_key: { "css.properties.align-content.block_context": { baseline: "low", baseline_low_date: "\
2024-04-16", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "125", firefox_android: "125", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "125", firefox_android: "125", safari: "17.4", safari_ios: "17.4" } } }, "alignment-baseline": { compat_features: ["css.properties.alignment-baseline", "css.properties.alignment-baseline.alphabetic", "css.properties.alignment-baseline.baseline", "css.properties.alignment-baseline.central", "css.properties.alignment-baseline.ideographic", "css.properties.alignment-baseline.mathematical", "css.properties.alignment-baseline.middle", "css.properties.alignment-baseline.text-after-edge", "css.properties.alignment-baseline.text-before-edge"], description: "The alignment-baseline CSS property sets which baseline of an element is aligned with the corresponding baseline of its parent.", description_html: "The <code>alignment-baseline</code> CSS property sets which baselin\
e of an element is aligned with the corresponding baseline of its parent.", group: ["text"], kind: "feature", name: "alignment-baseline", spec: ["https://drafts.csswg.org/css-inline-3/#alignment-baseline-property"], status: { baseline: false, by_compat_key: { "css.properties.alignment-baseline": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "149", firefox_android: "149", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.alphabetic": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.baseline": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "149", firefox_android: "149", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.central": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "\
5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.ideographic": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.mathematical": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.middle": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "149", firefox_android: "149", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.text-after-edge": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "5.1", safari_ios: "5" } }, "css.properties.alignment-baseline.text-before-edge": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "5.1", safari_ios: "\
5" } } }, all: { caniuse: ["css-all"], compat_features: ["css.properties.all"], description: "The all CSS property is a shorthand for all CSS properties, except for direction and unicode-bidi. It accepts only the keywords for explicit defaulting (such as initial and inherit), since they are the only values supported on all CSS properties.", description_html: "The <code>all</code> CSS property is a shorthand for all CSS properties, except for <code>direction</code> and <code>unicode-bidi</code>. It accepts only the keywords for explicit defaulting (such as <code>initial</code> and <code>inherit</code>), since they are the only values supported on all CSS properties.", group: ["explicit-defaults"], kind: "feature", name: "all", spec: ["https://drafts.csswg.org/css-cascade-6/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.all": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-\
01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "27", firefox_android: "27", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "27", firefox_android: "27", safari: "9.1", safari_ios: "9.3" } } }, "alt-text-generated-content": { compat_features: ["css.properties.content.alt_text"], description: "The / notation in content CSS property values adds alternative text to generated content. For example, the content: url('upvote-icon.svg') / 'Upvote' declaration adds accessible 'Upvote' text to the SVG icon. Also known as alternate text.", description_html: "The <code>/</code> notation in <code>content</code> CSS property values adds alternative text to generated content. For example, the <code>content: url('upvote-icon.svg') / 'Upvote'</code> declaration adds accessible 'Upvote' text to the SVG icon. Also known as alternate text.", group: ["css"], kind: "feature", name: "Alt text for generated content", spec: [
    "https://drafts.csswg.org/css-content-3/#alt"], status: { baseline: "low", baseline_low_date: "2024-07-09", by_compat_key: { "css.properties.content.alt_text": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "128", firefox_android: "128", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "128", firefox_android: "128", safari: "17.4", safari_ios: "17.4" } } }, "alternative-style-sheets": { compat_features: ["html.elements.link.rel.alternate_stylesheet"], description: 'The rel="alternate stylesheet" attribute for the <link> HTML element offers an alternative style option to users.', description_html: 'The <code>rel="alternate stylesheet"</code> attribute for the <code>&#x3C;link></code> HTML element offers an alternative style option to users.', group: ["css"], kind: "feature", name: "Alternative style sheets", spec: ["https://drafts.csswg.org/cssom-1/#c\
oncept-css-style-sheet-alternate-flag"], status: { baseline: false, by_compat_key: { "html.elements.link.rel.alternate_stylesheet": { baseline: false, support: { firefox: "3", firefox_android: "4" } } }, support: { firefox: "3", firefox_android: "4" } } }, "ambient-light": { caniuse: ["ambient-light"], compat_features: ["api.AmbientLightSensor", "api.AmbientLightSensor.AmbientLightSensor", "api.AmbientLightSensor.illuminance", "api.Permissions.permission_ambient-light-sensor", "html.elements.iframe.allow.ambient-light-sensor", "http.headers.Permissions-Policy.ambient-light-sensor"], description: "The AmbientLightSensor API returns the current light level in lux of the ambient light level around the device.", description_html: "The <code>AmbientLightSensor</code> API returns the current light level in lux of the ambient light level around the device.", group: ["sensors"], kind: "feature", name: "Ambient light sensor", spec: ["https://w3c.github.io/ambient-light/"], status: { baseline: false,
    by_compat_key: { "api.AmbientLightSensor": { baseline: false, support: {} }, "api.AmbientLightSensor.AmbientLightSensor": { baseline: false, support: {} }, "api.AmbientLightSensor.illuminance": { baseline: false, support: {} }, "api.Permissions.permission_ambient-light-sensor": { baseline: false, support: {} }, "html.elements.iframe.allow.ambient-light-sensor": { baseline: false, support: {} }, "http.headers.Permissions-Policy.ambient-light-sensor": { baseline: false, support: {} } }, support: {} } }, "anchor-positioning": { caniuse: ["css-anchor-positioning"], compat_features: ["api.CSSPositionTryDescriptors", "api.CSSPositionTryDescriptors.align-self", "api.CSSPositionTryDescriptors.alignSelf", "api.CSSPositionTryDescriptors.block-size", "api.CSSPositionTryDescriptors.blockSize", "api.CSSPositionTryDescriptors.bottom", "api.CSSPositionTryDescriptors.height", "api.CSSPositionTryDescriptors.inline-size", "api.CSSPositionTryDescriptors.inlineSize", "api.CSSPositionTryDescriptors.ins\
et", "api.CSSPositionTryDescriptors.inset-block", "api.CSSPositionTryDescriptors.inset-block-end", "api.CSSPositionTryDescriptors.inset-block-start", "api.CSSPositionTryDescriptors.inset-inline", "api.CSSPositionTryDescriptors.inset-inline-end", "api.CSSPositionTryDescriptors.inset-inline-start", "api.CSSPositionTryDescriptors.insetBlock", "api.CSSPositionTryDescriptors.insetBlockEnd", "api.CSSPositionTryDescriptors.insetBlockStart", "api.CSSPositionTryDescriptors.insetInline", "api.CSSPositionTryDescriptors.insetInlineEnd", "api.CSSPositionTryDescriptors.insetInlineStart", "api.CSSPositionTryDescriptors.justify-self", "api.CSSPositionTryDescriptors.justifySelf", "api.CSSPositionTryDescriptors.left", "api.CSSPositionTryDescriptors.margin", "api.CSSPositionTryDescriptors.margin-block", "api.CSSPositionTryDescriptors.margin-block-end", "api.CSSPositionTryDescriptors.margin-block-start", "api.CSSPositionTryDescriptors.margin-bottom", "api.CSSPositionTryDescriptors.margin-inline", "api.CSS\
PositionTryDescriptors.margin-inline-end", "api.CSSPositionTryDescriptors.margin-inline-start", "api.CSSPositionTryDescriptors.margin-left", "api.CSSPositionTryDescriptors.margin-right", "api.CSSPositionTryDescriptors.margin-top", "api.CSSPositionTryDescriptors.marginBlock", "api.CSSPositionTryDescriptors.marginBlockEnd", "api.CSSPositionTryDescriptors.marginBlockStart", "api.CSSPositionTryDescriptors.marginBottom", "api.CSSPositionTryDescriptors.marginInline", "api.CSSPositionTryDescriptors.marginInlineEnd", "api.CSSPositionTryDescriptors.marginInlineStart", "api.CSSPositionTryDescriptors.marginLeft", "api.CSSPositionTryDescriptors.marginRight", "api.CSSPositionTryDescriptors.marginTop", "api.CSSPositionTryDescriptors.max-block-size", "api.CSSPositionTryDescriptors.max-height", "api.CSSPositionTryDescriptors.max-inline-size", "api.CSSPositionTryDescriptors.max-width", "api.CSSPositionTryDescriptors.maxBlockSize", "api.CSSPositionTryDescriptors.maxHeight", "api.CSSPositionTryDescriptor\
s.maxInlineSize", "api.CSSPositionTryDescriptors.maxWidth", "api.CSSPositionTryDescriptors.min-block-size", "api.CSSPositionTryDescriptors.min-height", "api.CSSPositionTryDescriptors.min-inline-size", "api.CSSPositionTryDescriptors.min-width", "api.CSSPositionTryDescriptors.minBlockSize", "api.CSSPositionTryDescriptors.minHeight", "api.CSSPositionTryDescriptors.minInlineSize", "api.CSSPositionTryDescriptors.minWidth", "api.CSSPositionTryDescriptors.place-self", "api.CSSPositionTryDescriptors.placeSelf", "api.CSSPositionTryDescriptors.position-anchor", "api.CSSPositionTryDescriptors.position-area", "api.CSSPositionTryDescriptors.positionAnchor", "api.CSSPositionTryDescriptors.positionArea", "api.CSSPositionTryDescriptors.right", "api.CSSPositionTryDescriptors.top", "api.CSSPositionTryDescriptors.width", "api.CSSPositionTryRule", "api.CSSPositionTryRule.name", "api.CSSPositionTryRule.style", "api.HTMLButtonElement.popoverTargetElement.implicit_anchor_reference", "api.HTMLElement.showPopo\
ver.options_source_parameter.implicit_anchor_reference", "api.HTMLElement.togglePopover.options_source_parameter.implicit_anchor_reference", "api.HTMLInputElement.popoverTargetElement.implicit_anchor_reference", "css.at-rules.position-try", "css.properties.align-items.anchor-center", "css.properties.align-self.anchor-center", "css.properties.anchor-name", "css.properties.anchor-name.none", "css.properties.anchor-scope", "css.properties.anchor-scope.all", "css.properties.anchor-scope.none", "css.properties.block-size.anchor-size", "css.properties.bottom.anchor", "css.properties.bottom.anchor-size", "css.properties.height.anchor-size", "css.properties.inline-size.anchor-size", "css.properties.inset-block-end.anchor", "css.properties.inset-block-end.anchor-size", "css.properties.inset-block-start.anchor", "css.properties.inset-block-start.anchor-size", "css.properties.inset-block.anchor", "css.properties.inset-block.anchor-size", "css.properties.inset-inline-end.anchor", "css.properties.i\
nset-inline-end.anchor-size", "css.properties.inset-inline-start.anchor", "css.properties.inset-inline-start.anchor-size", "css.properties.inset-inline.anchor", "css.properties.inset-inline.anchor-size", "css.properties.inset.anchor", "css.properties.inset.anchor-size", "css.properties.justify-items.anchor-center", "css.properties.justify-self.anchor-center", "css.properties.left.anchor", "css.properties.left.anchor-size", "css.properties.margin-block-end.anchor-size", "css.properties.margin-block-start.anchor-size", "css.properties.margin-block.anchor-size", "css.properties.margin-bottom.anchor-size", "css.properties.margin-inline-end.anchor-size", "css.properties.margin-inline-start.anchor-size", "css.properties.margin-inline.anchor-size", "css.properties.margin-left.anchor-size", "css.properties.margin-right.anchor-size", "css.properties.margin-top.anchor-size", "css.properties.margin.anchor-size", "css.properties.max-block-size.anchor-size", "css.properties.max-height.anchor-size",
    "css.properties.max-inline-size.anchor-size", "css.properties.max-width.anchor-size", "css.properties.min-block-size.anchor-size", "css.properties.min-height.anchor-size", "css.properties.min-inline-size.anchor-size", "css.properties.min-width.anchor-size", "css.properties.place-items.anchor-center", "css.properties.place-self.anchor-center", "css.properties.position-anchor", "css.properties.position-anchor.auto", "css.properties.position-anchor.none", "css.properties.position-area", "css.properties.position-area.block-end", "css.properties.position-area.block-start", "css.properties.position-area.bottom", "css.properties.position-area.center", "css.properties.position-area.end", "css.properties.position-area.inline-end", "css.properties.position-area.inline-start", "css.properties.position-area.left", "css.properties.position-area.none", "css.properties.position-area.right", "css.properties.position-area.self-block-end", "css.properties.position-area.self-block-start", "css.proper\
ties.position-area.self-end", "css.properties.position-area.self-inline-end", "css.properties.position-area.self-inline-start", "css.properties.position-area.self-start", "css.properties.position-area.self-x-end", "css.properties.position-area.self-x-start", "css.properties.position-area.self-y-end", "css.properties.position-area.self-y-start", "css.properties.position-area.span-all", "css.properties.position-area.span-block-end", "css.properties.position-area.span-block-start", "css.properties.position-area.span-bottom", "css.properties.position-area.span-end", "css.properties.position-area.span-inline-end", "css.properties.position-area.span-inline-start", "css.properties.position-area.span-left", "css.properties.position-area.span-right", "css.properties.position-area.span-self-block-end", "css.properties.position-area.span-self-block-start", "css.properties.position-area.span-self-end", "css.properties.position-area.span-self-inline-end", "css.properties.position-area.span-self-inl\
ine-start", "css.properties.position-area.span-self-start", "css.properties.position-area.span-self-x-end", "css.properties.position-area.span-self-x-start", "css.properties.position-area.span-self-y-end", "css.properties.position-area.span-self-y-start", "css.properties.position-area.span-start", "css.properties.position-area.span-top", "css.properties.position-area.span-x-end", "css.properties.position-area.span-x-start", "css.properties.position-area.span-y-end", "css.properties.position-area.span-y-start", "css.properties.position-area.start", "css.properties.position-area.top", "css.properties.position-area.x-end", "css.properties.position-area.x-start", "css.properties.position-area.y-end", "css.properties.position-area.y-start", "css.properties.position-try", "css.properties.position-try-fallbacks", "css.properties.position-try-fallbacks.flip-block", "css.properties.position-try-fallbacks.flip-inline", "css.properties.position-try-fallbacks.flip-start", "css.properties.position-\
try-fallbacks.none", "css.properties.position-try-fallbacks.position-area", "css.properties.position-try-fallbacks.self-x-end", "css.properties.position-try-fallbacks.self-x-start", "css.properties.position-try-fallbacks.self-y-end", "css.properties.position-try-fallbacks.self-y-start", "css.properties.position-try-fallbacks.span-self-x-end", "css.properties.position-try-fallbacks.span-self-x-start", "css.properties.position-try-fallbacks.span-self-y-end", "css.properties.position-try-fallbacks.span-self-y-start", "css.properties.position-try-order", "css.properties.position-try-order.most-block-size", "css.properties.position-try-order.most-height", "css.properties.position-try-order.most-inline-size", "css.properties.position-try-order.most-width", "css.properties.position-try-order.normal", "css.properties.position-try.self-x-end", "css.properties.position-try.self-x-start", "css.properties.position-try.self-y-end", "css.properties.position-try.self-y-start", "css.properties.positio\
n-try.span-self-x-end", "css.properties.position-try.span-self-x-start", "css.properties.position-try.span-self-y-end", "css.properties.position-try.span-self-y-start", "css.properties.position-visibility", "css.properties.position-visibility.always", "css.properties.position-visibility.anchors-visible", "css.properties.position-visibility.no-overflow", "css.properties.right.anchor", "css.properties.right.anchor-size", "css.properties.top.anchor", "css.properties.top.anchor-size", "css.properties.width.anchor-size", "css.types.anchor", "css.types.anchor-size", "css.types.anchor-size.inset_margin", "html.elements.button.popovertarget.implicit_anchor_reference", "html.elements.input.popovertarget.implicit_anchor_reference"], description: "Anchor positioning places an element based on the position of another element. For example, you can place a tooltip next to the content it references.", description_html: "Anchor positioning places an element based on the position of another element. Fo\
r example, you can place a tooltip next to the content it references.", kind: "feature", name: "Anchor positioning", spec: ["https://drafts.csswg.org/css-anchor-position-1/#anchoring"], status: { baseline: false, by_compat_key: { "api.CSSPositionTryDescriptors": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.align-self": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.alignSelf": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.block-size": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.blockSize": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.bottom": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.height": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inline-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125",
    firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inlineSize": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inset": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inset-block": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inset-block-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "\
26" } }, "api.CSSPositionTryDescriptors.inset-block-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inset-inline": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inset-inline-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.inset-inline-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.i\
nsetBlock": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.insetBlockEnd": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.insetBlockStart": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.insetInline": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.insetInlineEnd": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.insetInlineStart": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.justify-self": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.justifySelf": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.left": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125",
    edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-block": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-block-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-block-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "1\
47", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-bottom": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-inline": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-inline-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-inline-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "\
api.CSSPositionTryDescriptors.margin-left": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-right": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.margin-top": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginBlock": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginBlockEnd": { baseline: "\
low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginBlockStart": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginBottom": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginInline": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginInlineEnd": { baseline: "low", baseline_low_date: "2026-01-13", support: {
    chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginInlineStart": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginLeft": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginRight": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.marginTop": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "\
147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.max-block-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.max-height": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.max-inline-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.max-width": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "\
26" } }, "api.CSSPositionTryDescriptors.maxBlockSize": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.maxHeight": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.maxInlineSize": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.maxWidth": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.min-block-size": { baseline: "\
low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.min-height": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.min-inline-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.min-width": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.minBlockSize": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "\
125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.minHeight": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.minInlineSize": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.minWidth": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.place-self": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "\
147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.placeSelf": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.position-anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.position-area": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.positionAnchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPos\
itionTryDescriptors.positionArea": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.right": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.top": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryDescriptors.width": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryRule": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "\
125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryRule.name": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.CSSPositionTryRule.style": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.HTMLButtonElement.popoverTargetElement.implicit_anchor_reference": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.HTMLElement.showPopover.options_source_parameter.implicit_anchor_reference": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "137", chrome_android: "\
137", edge: "137", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.HTMLElement.togglePopover.options_source_parameter.implicit_anchor_reference": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "api.HTMLInputElement.popoverTargetElement.implicit_anchor_reference": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.at-rules.position-try": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.align-items.anchor-center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "\
125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.align-self.anchor-center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.anchor-name": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.anchor-name.none": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.anchor-scope": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.anc\
hor-scope.all": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.anchor-scope.none": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.block-size.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.bottom.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.bottom.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "\
132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.height.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inline-size.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-block-end.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-block-end.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "\
26" } }, "css.properties.inset-block-start.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-block-start.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-block.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-block.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-inline-end.anchor": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-inline-end.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-inline-start.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-inline-start.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-inline.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "\
125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset-inline.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.inset.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.justify-items.anchor-center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "c\
ss.properties.justify-self.anchor-center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.left.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.left.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-block-end.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-block-start.anchor-size": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-block.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-bottom.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-inline-end.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-inline-start.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "\
132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-inline.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-left.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-right.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.margin-top.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26",
    safari_ios: "26" } }, "css.properties.margin.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.max-block-size.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.max-height.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.max-inline-size.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.max-width.anchor-size": { baseline: "\
low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.min-block-size.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.min-height.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.min-inline-size.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.min-width.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "\
125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.place-items.anchor-center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.place-self.anchor-center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-anchor": { baseline: false, support: {} }, "css.properties.position-anchor.auto": { baseline: false, support: {} }, "css.properties.position-anchor.none": { baseline: false, support: {} }, "css.properties.position-area": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "c\
ss.properties.position-area.block-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.block-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.bottom": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.center": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.end": { baseline: "low", baseline_low_date: "202\
6-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.inline-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.inline-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.left": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.none": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "\
147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.right": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.self-block-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.self-block-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.self-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } },
    "css.properties.position-area.self-inline-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.self-inline-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.self-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.self-x-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.self-x-start": { baseline: "\
low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.self-y-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.self-y-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.span-all": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-block-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "\
147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-block-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-bottom": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-inline-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.\
position-area.span-inline-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-left": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-right": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-block-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-block-start": { baseline: "lo\
w", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-inline-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-inline-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-start": { baseline: "low", baseline_low_date: "2026-01-13", support: {
    chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-self-x-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.span-self-x-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.span-self-y-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.span-self-y-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "\
143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-area.span-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-top": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-x-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-x-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "\
26", safari_ios: "26" } }, "css.properties.position-area.span-y-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.span-y-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-area.top": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.x-end": { baseline: "\
low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.x-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.y-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-area.y-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-try": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "\
125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks.flip-block": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks.flip-inline": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks.flip-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "147", firefox_android: "14\
7", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks.none": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks.position-area": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.position-try-fallbacks.self-x-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try-fallbacks.self-x-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "\
26.2" } }, "css.properties.position-try-fallbacks.self-y-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try-fallbacks.self-y-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try-fallbacks.span-self-x-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try-fallbacks.span-self-x-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26\
.2" } }, "css.properties.position-try-fallbacks.span-self-y-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try-fallbacks.span-self-y-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try-order": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-try-order.most-block-size": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.p\
osition-try-order.most-height": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-try-order.most-inline-size": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-try-order.most-width": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-try-order.normal": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "css.properties.position-try.self-x-end": { baseline: "low", baseline_low_date: "\
2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.self-x-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.self-y-end": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.self-y-start": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "148", firefox_android: "148", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.span-self-x-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "\
143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.span-self-x-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.span-self-y-end": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-try.span-self-y-start": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-visibility": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "\
147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-visibility.always": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-visibility.anchors-visible": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.position-visibility.no-overflow": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "css.properties.right.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "c\
ss.properties.right.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.top.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.top.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.properties.width.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.types.anchor": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "\
125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.types.anchor-size": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "css.types.anchor-size.inset_margin": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132", safari: "26", safari_ios: "26" } }, "html.elements.button.popovertarget.implicit_anchor_reference": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } }, "html.elements.input.popovertarget.implicit_anchor_reference": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "147", firefox_android: "147", safari: "26", safari_ios: "26" } } }, support: {} } }, "angle-in\
stanced-arrays": { compat_features: ["api.ANGLE_instanced_arrays", "api.ANGLE_instanced_arrays.drawArraysInstancedANGLE", "api.ANGLE_instanced_arrays.drawElementsInstancedANGLE", "api.ANGLE_instanced_arrays.vertexAttribDivisorANGLE"], description: "The ANGLE_instanced_arrays extension for WebGL 1.0 contexts draws the same object multiple times or groups of similar objects multiple times, if the group shares the same vertex data, primitive count and type.", description_html: "The <code>ANGLE_instanced_arrays</code> extension for WebGL 1.0 contexts draws the same object multiple times or groups of similar objects multiple times, if the group shares the same vertex data, primitive count and type.", group: ["webgl-extensions"], kind: "feature", name: "ANGLE_instanced_arrays WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/ANGLE_instanced_arrays/"], status: { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", by_compat_key: { "api.ANG\
LE_instanced_arrays": { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", support: { chrome: "32", chrome_android: "30", edge: "12", firefox: "47", firefox_android: "47", safari: "8", safari_ios: "8" } }, "api.ANGLE_instanced_arrays.drawArraysInstancedANGLE": { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", support: { chrome: "32", chrome_android: "30", edge: "12", firefox: "47", firefox_android: "47", safari: "8", safari_ios: "8" } }, "api.ANGLE_instanced_arrays.drawElementsInstancedANGLE": { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", support: { chrome: "32", chrome_android: "30", edge: "12", firefox: "47", firefox_android: "47", safari: "8", safari_ios: "8" } }, "api.ANGLE_instanced_arrays.vertexAttribDivisorANGLE": { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", support: { chrome: "32", chrome_android: "30", edge: "12", firefox: "4\
7", firefox_android: "47", safari: "8", safari_ios: "8" } } }, support: { chrome: "32", chrome_android: "30", edge: "12", firefox: "47", firefox_android: "47", safari: "8", safari_ios: "8" } } }, "animation-composition": { compat_features: ["css.properties.animation-composition"], description: "The animation-composition CSS property chooses how to combine animations that affect the same property.", description_html: "The <code>animation-composition</code> CSS property chooses how to combine animations that affect the same property.", group: ["animation"], kind: "feature", name: "animation-composition", spec: ["https://drafts.csswg.org/css-animations-2/#animation-composition"], status: { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", by_compat_key: { "css.properties.animation-composition": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "115",
    firefox_android: "115", safari: "16", safari_ios: "16" } } }, support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } } }, "animations-css": { caniuse: ["css-animation"], compat_features: ["api.AnimationEvent", "api.AnimationEvent.AnimationEvent", "api.AnimationEvent.animationName", "api.AnimationEvent.elapsedTime", "api.AnimationEvent.pseudoElement", "api.CSSAnimation", "api.CSSAnimation.animationName", "api.CSSKeyframeRule", "api.CSSKeyframeRule.keyText", "api.CSSKeyframeRule.style", "api.CSSKeyframesRule", "api.CSSKeyframesRule.appendRule", "api.CSSKeyframesRule.cssRules", "api.CSSKeyframesRule.deleteRule", "api.CSSKeyframesRule.findRule", "api.CSSKeyframesRule.length", "api.CSSKeyframesRule.name", "css.at-rules.keyframes", "css.at-rules.keyframes.ignore_important_declarations", "css.at-rules.keyframes.named_range_keyframes", "css.properties.animation", "css.properties.animation-delay", "css.propertie\
s.animation-direction", "css.properties.animation-direction.alternate", "css.properties.animation-direction.alternate-reverse", "css.properties.animation-direction.normal", "css.properties.animation-direction.reverse", "css.properties.animation-duration", "css.properties.animation-duration.auto", "css.properties.animation-fill-mode", "css.properties.animation-fill-mode.backwards", "css.properties.animation-fill-mode.both", "css.properties.animation-fill-mode.forwards", "css.properties.animation-fill-mode.none", "css.properties.animation-iteration-count", "css.properties.animation-iteration-count.infinite", "css.properties.animation-name", "css.properties.animation-name.none", "css.properties.animation-play-state", "css.properties.animation-play-state.paused", "css.properties.animation-play-state.running", "css.properties.animation-timing-function", "css.properties.animation-timing-function.ease", "css.properties.animation-timing-function.ease-in", "css.properties.animation-timing-funct\
ion.ease-in-out", "css.properties.animation-timing-function.ease-out", "css.properties.animation-timing-function.jump", "css.properties.animation-timing-function.linear", "css.properties.animation-timing-function.step-end", "css.properties.animation-timing-function.step-start", "css.properties.animation.alternate", "css.properties.animation.alternate-reverse", "css.properties.animation.auto", "css.properties.animation.backwards", "css.properties.animation.both", "css.properties.animation.ease", "css.properties.animation.ease-in", "css.properties.animation.ease-in-out", "css.properties.animation.ease-out", "css.properties.animation.forwards", "css.properties.animation.infinite", "css.properties.animation.linear", "css.properties.animation.none", "css.properties.animation.normal", "css.properties.animation.reverse", "css.properties.animation.step-end", "css.properties.animation.step-start", "css.types.time"], description: "The animation CSS property animates an element's style over time,\
 using keyframes described in @keyframes rules.", description_html: "The <code>animation</code> CSS property animates an element's style over time, using keyframes described in <code>@keyframes</code> rules.", group: ["animation", "css"], kind: "feature", name: "Animations (CSS)", spec: ["https://drafts.csswg.org/css-animations-2/"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "api.AnimationEvent": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "5", firefox_android: "5", safari: "9", safari_ios: "9" } }, "api.AnimationEvent.AnimationEvent": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "43", chrome_android: "43", edge: "14", firefox: "23", firefox_android: "23", safari: "9", safari_ios: "9" } }, "api.AnimationEvent.animationName": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "5", firefox_android: "5", safari: "9", safari_ios: "9" } }, "api.AnimationEvent.elapsedTime": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "5", firefox_android: "5", safari: "9", safari_ios: "9" } }, "api.AnimationEvent.pseudoElement": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "23", firefox_android: "23", safari: "13.1", safari_ios: "13.4" } }, "api.CSSAnimation": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.CSSAnimation.animationName": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.CSSKeyframeRule": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "api.CSSKeyframeRule.keyText": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "api.CSSKeyframeRule.style": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "api.CSSKeyframesRule": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "\
2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9.1", safari_ios: "9.3" } }, "api.CSSKeyframesRule.appendRule": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "48", firefox_android: "48", safari: "9.1", safari_ios: "9.3" } }, "api.CSSKeyframesRule.cssRules": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9.1", safari_ios: "9.3" } }, "api.CSSKeyframesRule.deleteRule": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9.1", safari_ios: "9.3" } }, "api.CSSKeyframesRule.findRule": { baseline: "high", baseline_high_date: "2019-02-0\
2", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9.1", safari_ios: "9.3" } }, "api.CSSKeyframesRule.length": { baseline: "low", baseline_low_date: "2024-03-22", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "109", firefox_android: "109", safari: "17", safari_ios: "17" } }, "api.CSSKeyframesRule.name": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.keyframes": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.at-rules.keyframes.ignore_important_declarations": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "19", firefox_android: "19", safari: "10.1", safari_ios: "10.3" } }, "css.at-rules.keyframes.named_range_keyframes": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.animation": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-delay": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-direction": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "\
16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-direction.alternate": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-direction.alternate-reverse": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-direction.normal": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-direction.reverse": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: {
    chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-duration": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-duration.auto": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "18.4", safari_ios: "18.4" } }, "css.properties.animation-fill-mode": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-fill-mode.backwards": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "\
16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-fill-mode.both": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-fill-mode.forwards": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-fill-mode.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-iteration-count": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "\
43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-iteration-count.infinite": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-name": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-name.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-play-state": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "\
2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-play-state.paused": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-play-state.running": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function.ease": { baseline: "hig\
h", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function.ease-in": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function.ease-in-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function.ease-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "\
9" } }, "css.properties.animation-timing-function.jump": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "css.properties.animation-timing-function.linear": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function.step-end": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation-timing-function.step-start": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "\
43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.alternate": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.alternate-reverse": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.auto": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.backwards": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "\
43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.both": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.ease": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.ease-in": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.ease-in-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: {
    chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.ease-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.forwards": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.infinite": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.linear": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "20\
15-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.normal": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.reverse": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.step-end": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "\
2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.animation.step-start": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.types.time": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } } }, "app-file-handlers": { compat_features: ["api.LaunchParams.files", "manifests.webapp.file_handlers"], description: "The file_handlers web app manifest member registers an installed web app as a handler for files with specific fil\
e extensions or MIME types.", description_html: "The <code>file_handlers</code> web app manifest member registers an installed web app as a handler for files with specific file extensions or MIME types.", group: ["progressive-web-app"], kind: "feature", name: "File handlers", spec: ["https://wicg.github.io/manifest-incubations/#file_handlers-member"], status: { baseline: false, by_compat_key: { "api.LaunchParams.files": { baseline: false, support: { chrome: "102", edge: "102" } }, "manifests.webapp.file_handlers": { baseline: false, support: { chrome: "102", edge: "102" } } }, support: { chrome: "102", edge: "102" } } }, "app-launch-handler": { compat_features: ["api.LaunchParams", "api.LaunchParams.targetURL", "api.LaunchQueue", "api.LaunchQueue.setConsumer", "api.Window.launchQueue", "manifests.webapp.launch_handler", "manifests.webapp.launch_handler.client_mode"], description: "The launch_handler web app manifest member, with the client_mode property, configure how web app launches \
behave when an instance of the app is already open. For example, you can choose to focus the existing app instance instead of launching a new one.", description_html: "The <code>launch_handler</code> web app manifest member, with the <code>client_mode</code> property, configure how web app launches behave when an instance of the app is already open. For example, you can choose to focus the existing app instance instead of launching a new one.", group: ["progressive-web-app"], kind: "feature", name: "Launch handler", spec: ["https://wicg.github.io/web-app-launch/"], status: { baseline: false, by_compat_key: { "api.LaunchParams": { baseline: false, support: { chrome: "102", edge: "102" } }, "api.LaunchParams.targetURL": { baseline: false, support: { chrome: "110", edge: "110" } }, "api.LaunchQueue": { baseline: false, support: { chrome: "102", edge: "102" } }, "api.LaunchQueue.setConsumer": { baseline: false, support: { chrome: "102", edge: "102" } }, "api.Window.launchQueue": { baseline: false,
    support: { chrome: "102", edge: "102" } }, "manifests.webapp.launch_handler": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "manifests.webapp.launch_handler.client_mode": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } } }, support: { chrome: "110", edge: "110" } } }, "app-migration": { compat_features: ["manifests.webapp.migrate_from", "manifests.webapp.migrate_to"], description: "The migrate_to and migrate_from web app manifest members move an installed app from one origin to another, within the same site. They preserve the user's installation settings on the device, like shortcuts.", description_html: "The <code>migrate_to</code> and <code>migrate_from</code> web app manifest members move an installed app from one origin to another, within the same site. They preserve the user's installation settings on the device, like shortcuts.", group: ["progressive-web-app"], kind: "feature", name: "Web app origin migr\
ation", spec: ["https://wicg.github.io/manifest-incubations/#web-application-origin-migration"], status: { baseline: false, by_compat_key: { "manifests.webapp.migrate_from": { baseline: false, support: {} }, "manifests.webapp.migrate_to": { baseline: false, support: {} } }, support: {} } }, "app-protocol-handlers": { compat_features: ["manifests.webapp.protocol_handlers", "manifests.webapp.protocol_handlers.protocol", "manifests.webapp.protocol_handlers.url"], description: "The protocol_handlers web app manifest member registers an installed web app as a handler for a specific protocol. When a user follows a link with the specified protocol, the installed app opens the link.", description_html: "The <code>protocol_handlers</code> web app manifest member registers an installed web app as a handler for a specific protocol. When a user follows a link with the specified protocol, the installed app opens the link.", group: ["progressive-web-app"], kind: "feature", name: "Protocol handlers",
    spec: ["https://wicg.github.io/manifest-incubations/#protocol_handlers-member"], status: { baseline: false, by_compat_key: { "manifests.webapp.protocol_handlers": { baseline: false, support: { chrome: "96", edge: "96" } }, "manifests.webapp.protocol_handlers.protocol": { baseline: false, support: { chrome: "96", edge: "96" } }, "manifests.webapp.protocol_handlers.url": { baseline: false, support: { chrome: "96", edge: "96" } } }, support: { chrome: "96", edge: "96" } } }, "app-share-targets": { compat_features: ["manifests.webapp.share_target"], description: "The share_target web app manifest member registers an installed web app as a handler for shared content. When a user shares content by using the device share dialog, the installed app can be listed as an option for handling the shared content.", description_html: "The <code>share_target</code> web app manifest member registers an installed web app as a handler for shared content. When a user shares content by using the device \
share dialog, the installed app can be listed as an option for handling the shared content.", group: ["progressive-web-app"], kind: "feature", name: "Share targets", spec: ["https://w3c.github.io/web-share-target/#share_target-member"], status: { baseline: false, by_compat_key: { "manifests.webapp.share_target": { baseline: false, support: { chrome: "89", chrome_android: "76", edge: "89" } } }, support: { chrome: "89", chrome_android: "76", edge: "89" } } }, "app-shortcuts": { compat_features: ["manifests.webapp.shortcuts"], description: "The shortcuts web app manifest member registers common actions of an installed web app with the device. The device can present these actions to the user in contextually appropriate locations, such as jump lists on Windows or the app launcher on Android.", description_html: "The <code>shortcuts</code> web app manifest member registers common actions of an installed web app with the device. The device can present these actions to the user in contextuall\
y appropriate locations, such as jump lists on Windows or the app launcher on Android.", group: ["progressive-web-app"], kind: "feature", name: "Application shortcuts", spec: ["https://w3c.github.io/manifest/#shortcuts-member"], status: { baseline: false, by_compat_key: { "manifests.webapp.shortcuts": { baseline: false, support: { chrome: "96", chrome_android: "84", edge: "96", safari: "17.4" } } }, support: { chrome: "96", chrome_android: "84", edge: "96", safari: "17.4" } } }, appearance: { compat_features: ["css.properties.appearance", "css.properties.appearance.auto", "css.properties.appearance.button", "css.properties.appearance.checkbox", "css.properties.appearance.listbox", "css.properties.appearance.menulist", "css.properties.appearance.menulist-button", "css.properties.appearance.meter", "css.properties.appearance.none", "css.properties.appearance.progress-bar", "css.properties.appearance.radio", "css.properties.appearance.searchfield", "css.properties.appearance.textarea", "c\
ss.properties.appearance.textfield"], description: "The appearance CSS property controls the appearance of form controls. Using appearance: none disables any default native appearance and allows the elements to be styled with CSS.", description_html: "The <code>appearance</code> CSS property controls the appearance of form controls. Using <code>appearance: none</code> disables any default native appearance and allows the elements to be styled with CSS.", group: ["css"], kind: "feature", name: "appearance", spec: ["https://drafts.csswg.org/css-ui-4/#appearance-switching"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.appearance": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.auto": { baseline: "high", baseline_high_date: "\
2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.button": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.checkbox": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.listbox": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.menulis\
t": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.menulist-button": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.meter": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.none": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "\
15.4" } }, "css.properties.appearance.progress-bar": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.radio": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.searchfield": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.textarea": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "\
80", safari: "15.4", safari_ios: "15.4" } }, "css.properties.appearance.textfield": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "15.4", safari_ios: "15.4" } } }, "arguments-callee": { compat_features: ["javascript.functions.arguments.callee"], description: "The callee property of the arguments variable in a non-strict function body's local scope is the function that arguments belongs to.", description_html: "The <code>callee</code> property of the <code>arguments</code> variable in a non-strict function body's local scope is the function that <code>arguments</code> belongs to.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-arguments-exot\
ic-objects"], reason: "JavaScript strict mode prohibits accessing arguments.callee.", reason_html: "JavaScript strict mode prohibits accessing <code>arguments.callee</code>." }, group: ["javascript"], kind: "feature", name: "arguments.callee", spec: ["https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-arguments-exotic-objects"], status: { baseline: false, by_compat_key: { "javascript.functions.arguments.callee": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "aria-attribute-reflection": { compat_features: ["api.Element.ariaActiveDescendantElement", "api.Element.ariaAtomic", "api.Element.ariaAutoComplete", "api.Element.ariaBrailleLabel", "api.Element.ariaBrailleRoleDescription", "api.Element.ariaBusy", "api.Element.ariaChecked",
    "api.Element.ariaColCount", "api.Element.ariaColIndex", "api.Element.ariaColIndexText", "api.Element.ariaColSpan", "api.Element.ariaControlsElements", "api.Element.ariaCurrent", "api.Element.ariaDescribedByElements", "api.Element.ariaDescription", "api.Element.ariaDetailsElements", "api.Element.ariaDisabled", "api.Element.ariaErrorMessageElements", "api.Element.ariaExpanded", "api.Element.ariaFlowToElements", "api.Element.ariaHasPopup", "api.Element.ariaHidden", "api.Element.ariaInvalid", "api.Element.ariaKeyShortcuts", "api.Element.ariaLabel", "api.Element.ariaLabelledByElements", "api.Element.ariaLevel", "api.Element.ariaLive", "api.Element.ariaModal", "api.Element.ariaMultiLine", "api.Element.ariaMultiSelectable", "api.Element.ariaOrientation", "api.Element.ariaOwnsElements", "api.Element.ariaPlaceholder", "api.Element.ariaPosInSet", "api.Element.ariaPressed", "api.Element.ariaReadOnly", "api.Element.ariaRelevant", "api.Element.ariaRequired", "api.Element.ariaRoleDescription", "\
api.Element.ariaRowCount", "api.Element.ariaRowIndex", "api.Element.ariaRowIndexText", "api.Element.ariaRowSpan", "api.Element.ariaSelected", "api.Element.ariaSetSize", "api.Element.ariaSort", "api.Element.ariaValueMax", "api.Element.ariaValueMin", "api.Element.ariaValueNow", "api.Element.ariaValueText", "api.Element.role", "api.ElementInternals.ariaActiveDescendantElement", "api.ElementInternals.ariaAtomic", "api.ElementInternals.ariaAutoComplete", "api.ElementInternals.ariaBrailleLabel", "api.ElementInternals.ariaBrailleRoleDescription", "api.ElementInternals.ariaBusy", "api.ElementInternals.ariaChecked", "api.ElementInternals.ariaColCount", "api.ElementInternals.ariaColIndex", "api.ElementInternals.ariaColIndexText", "api.ElementInternals.ariaColSpan", "api.ElementInternals.ariaControlsElements", "api.ElementInternals.ariaCurrent", "api.ElementInternals.ariaDescribedByElements", "api.ElementInternals.ariaDescription", "api.ElementInternals.ariaDetailsElements", "api.ElementInternals\
.ariaDisabled", "api.ElementInternals.ariaErrorMessageElements", "api.ElementInternals.ariaExpanded", "api.ElementInternals.ariaFlowToElements", "api.ElementInternals.ariaHasPopup", "api.ElementInternals.ariaHidden", "api.ElementInternals.ariaInvalid", "api.ElementInternals.ariaKeyShortcuts", "api.ElementInternals.ariaLabel", "api.ElementInternals.ariaLabelledByElements", "api.ElementInternals.ariaLevel", "api.ElementInternals.ariaLive", "api.ElementInternals.ariaModal", "api.ElementInternals.ariaMultiLine", "api.ElementInternals.ariaMultiSelectable", "api.ElementInternals.ariaOrientation", "api.ElementInternals.ariaOwnsElements", "api.ElementInternals.ariaPlaceholder", "api.ElementInternals.ariaPosInSet", "api.ElementInternals.ariaPressed", "api.ElementInternals.ariaReadOnly", "api.ElementInternals.ariaRequired", "api.ElementInternals.ariaRoleDescription", "api.ElementInternals.ariaRowCount", "api.ElementInternals.ariaRowIndex", "api.ElementInternals.ariaRowIndexText", "api.ElementInt\
ernals.ariaRowSpan", "api.ElementInternals.ariaSelected", "api.ElementInternals.ariaSetSize", "api.ElementInternals.ariaSort", "api.ElementInternals.ariaValueMax", "api.ElementInternals.ariaValueMin", "api.ElementInternals.ariaValueNow", "api.ElementInternals.ariaValueText", "api.ElementInternals.role"], description: "WAI-ARIA attributes have corresponding properties on Element and ElementInternals objects.", description_html: "WAI-ARIA attributes have corresponding properties on <code>Element</code> and <code>ElementInternals</code> objects.", kind: "feature", name: "ARIA attribute reflection", spec: ["https://w3c.github.io/aria/#accessibilityroleandproperties-correspondence"], status: { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", by_compat_key: { "api.Element.ariaActiveDescendantElement": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "\
16.4", safari_ios: "16.4" } }, "api.Element.ariaAtomic": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaAutoComplete": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaBrailleLabel": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.Element.ariaBrailleRoleDescription": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.\
Element.ariaBusy": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaChecked": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaColCount": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaColIndex": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } },
    "api.Element.ariaColIndexText": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "119", firefox_android: "119", safari: "26.2", safari_ios: "26.2" } }, "api.Element.ariaColSpan": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaControlsElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaCurrent": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaDescribedByElemen\
ts": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaDescription": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "119", firefox_android: "119", safari: "17.4", safari_ios: "17.4" } }, "api.Element.ariaDetailsElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaDisabled": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaErrorMessageElements": { baseline: "low", baseline_low_date: "2025-04-04", support: {
    chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaExpanded": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaFlowToElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaHasPopup": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaHidden": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "\
81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaInvalid": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaKeyShortcuts": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaLabel": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaLabelledByElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "\
135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaLevel": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaLive": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaModal": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaMultiLine": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "\
81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaMultiSelectable": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaOrientation": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaOwnsElements": { baseline: false, support: { firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.Element.ariaPlaceholder": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "\
12.2" } }, "api.Element.ariaPosInSet": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaPressed": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaReadOnly": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaRelevant": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1",
    safari_ios: "12.2" } }, "api.Element.ariaRequired": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaRoleDescription": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaRowCount": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaRowIndex": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "\
119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaRowIndexText": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "119", firefox_android: "119", safari: "26.2", safari_ios: "26.2" } }, "api.Element.ariaRowSpan": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaSelected": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaSetSize": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "119", firefox_android: "119", safari: "\
12.1", safari_ios: "12.2" } }, "api.Element.ariaSort": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaValueMax": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaValueMin": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaValueNow": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119",
    safari: "12.1", safari_ios: "12.2" } }, "api.Element.ariaValueText": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.Element.role": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "119", firefox_android: "119", safari: "12.1", safari_ios: "12.2" } }, "api.ElementInternals.ariaActiveDescendantElement": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaAtomic": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "\
119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaAutoComplete": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaBrailleLabel": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.ElementInternals.ariaBrailleRoleDescription": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.ElementInternals.ariaBusy": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "11\
9", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaChecked": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaColCount": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaColIndex": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaColIndexText": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "119", firefox_android: "119" } }, "a\
pi.ElementInternals.ariaColSpan": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaControlsElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaCurrent": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaDescribedByElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } },
    "api.ElementInternals.ariaDescription": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "119", firefox_android: "119" } }, "api.ElementInternals.ariaDetailsElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaDisabled": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaErrorMessageElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaExpanded": { baseline: "high", baseline_high_date: "2026-04-24",
    baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaFlowToElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaHasPopup": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaHidden": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaInvalid": { baseline: "high", baseline_high_date: "\
2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaKeyShortcuts": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaLabel": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaLabelledByElements": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaLevel": { baseline: "\
high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaLive": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaModal": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaMultiLine": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api\
.ElementInternals.ariaMultiSelectable": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaOrientation": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaOwnsElements": { baseline: false, support: { firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaPlaceholder": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaPosInSet": { baseline: "h\
igh", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaPressed": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaReadOnly": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaRequired": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "\
api.ElementInternals.ariaRoleDescription": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaRowCount": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaRowIndex": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaRowIndexText": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "119", firefox_android: "119" } }, "api.ElementInternals.ariaRowSpan": { baseline: "\
high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaSelected": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaSetSize": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaSort": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "ap\
i.ElementInternals.ariaValueMax": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaValueMin": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaValueNow": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.ariaValueText": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "119", firefox_android: "\
119", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.role": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } } }, arianotify: { compat_features: ["api.Document.ariaNotify", "api.Element.ariaNotify"], description: "The ariaNotify() method of Element and Document requests assistive technology software, if activated, to announce a message to the user. This can help make dynamic content changes more accessible to users.", description_html: "The <code>ariaNotify()</code> method of <code>Element</code> and <code>Document</code> requests assistive technology software, if activated, to announce a message to the user. This can help make dynamic content changes more\
 accessible to users.", kind: "feature", name: "ariaNotify()", spec: ["https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/Accessibility/AriaNotify/explainer.md"], status: { baseline: false, by_compat_key: { "api.Document.ariaNotify": { baseline: false, support: { firefox: "150", firefox_android: "150" } }, "api.Element.ariaNotify": { baseline: false, support: { firefox: "150", firefox_android: "150" } } }, support: { firefox: "150", firefox_android: "150" } } }, array: { compat_features: ["javascript.builtins.Array", "javascript.builtins.Array.Array", "javascript.builtins.Array.concat", "javascript.builtins.Array.join", "javascript.builtins.Array.length", "javascript.builtins.Array.pop", "javascript.builtins.Array.push", "javascript.builtins.Array.reverse", "javascript.builtins.Array.shift", "javascript.builtins.Array.slice", "javascript.builtins.Array.sort", "javascript.builtins.Array.toString", "javascript.builtins.Array.unshift", "javascript.grammar.array_literals"], description: "\
Arrays are ordered lists of JavaScript values.", description_html: "Arrays are ordered lists of JavaScript values.", group: ["arrays"], kind: "feature", name: "Array (initial support)", snapshot: ["ecmascript-1"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array-objects", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array-constructor", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.concat", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.join", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-properties-of-array-instances-length", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.pop", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.push", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.reverse", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.pro\
totype.shift", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.slice", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.sort", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.tolocalestring", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.tostring", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.unshift", "https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-array-initializer"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.Array": { baseline: "high", baseline_high_date: "201\
8-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.concat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.join": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.pop": { baseline: "high", baseline_high_date: "2018\
-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.push": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.reverse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.shift": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.slice": { baseline: "high", baseline_high_date: "201\
8-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.sort": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.unshift": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.array_literals": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "array-at": { compat_features: ["javascript.builtins.Array.at", "javascript.builtins.TypedArray.at"], description: "The at() method of arrays and typed arrays returns the item at an index, including negative indices for getting items relative to the end of an array. Also known as the relative indexing method.", description_html: "The <code>at()</code> method of arrays and typed arrays returns the item at an index, including negative indices for getting items relative to the end of an array. Also known as the relative indexing method.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array at()", snapshot: ["ecmascript-2022"], spec: ["https://tc39.es/ecma262/multipage/indexed\
-collections.html#sec-array.prototype.at"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "javascript.builtins.Array.at": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.TypedArray.at": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90", safari: "15.4", safari_ios: "15.4" } } }, "array-by-copy": { compat_features: ["javascript.builtins.Array.toReversed", "javascript.builtins.Array.toSorted", "javascript.builtins.Array.toSpliced", "javascript.builtins.Array.with",
    "javascript.builtins.TypedArray.toReversed", "javascript.builtins.TypedArray.toSorted", "javascript.builtins.TypedArray.with"], description: "The toReversed(), toSorted(), toSpliced(), and with() methods of arrays and typed arrays return changed copies of arrays. They stand in contrast to methods such as sort() or reverse() that change arrays in place.", description_html: "The <code>toReversed()</code>, <code>toSorted()</code>, <code>toSpliced()</code>, and <code>with()</code> methods of arrays and typed arrays return changed copies of arrays. They stand in contrast to methods such as <code>sort()</code> or <code>reverse()</code> that change arrays in place.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array by copy", snapshot: ["ecmascript-2023"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.toreversed", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.tosorted", "https://tc39.es/ecma262/multi\
page/indexed-collections.html#sec-array.prototype.tospliced", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.with", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.toreversed", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.tosorted", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.with"], status: { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", by_compat_key: { "javascript.builtins.Array.toReversed": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } }, "javascript.builtins.Array.toSorted": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "110", chrome_android: "1\
10", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } }, "javascript.builtins.Array.toSpliced": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } }, "javascript.builtins.Array.with": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } }, "javascript.builtins.TypedArray.toReversed": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } }, "javascript.builtins.TypedArray.toSorted": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "\
2023-07-04", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } }, "javascript.builtins.TypedArray.with": { baseline: "high", baseline_high_date: "2026-01-04", baseline_low_date: "2023-07-04", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } } }, support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115", safari: "16", safari_ios: "16" } } }, "array-copywithin": { compat_features: ["javascript.builtins.Array.copyWithin", "javascript.builtins.TypedArray.copyWithin"], description: "The copyWithin() method of arrays and typed arrays shifts or copies items of an array to another index of the array without changing its length.", description_html: "The <code>copyWithin()</code> method of arrays and typed arrays shifts or copies items of an array to another index of the array without \
changing its length.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array copyWithin()", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.copywithin"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Array.copyWithin": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } }, "javascript.builtins.TypedArray.copyWithin": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "34", firefox_android: "34", safari: "10", safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "34", firefox_android: "34", safari: "10", safari_ios: "10" } } },
    "array-fill": { compat_features: ["javascript.builtins.Array.fill", "javascript.builtins.TypedArray.fill"], description: "The fill() method of arrays and typed arrays sets all or some items of an array to a given a value.", description_html: "The <code>fill()</code> method of arrays and typed arrays sets all or some items of an array to a given a value.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array fill()", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.fill", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.fill"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Array.fill": { baseline: "high", baseline_high_date: "2018-03-01", baseline_low_date: "2015-09-01", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "31", firefox_android: "31", safari: "8",
    safari_ios: "8" } }, "javascript.builtins.TypedArray.fill": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, "array-find": { caniuse: ["array-find", "array-find-index"], compat_features: ["javascript.builtins.Array.find", "javascript.builtins.Array.findIndex", "javascript.builtins.TypedArray.find", "javascript.builtins.TypedArray.findIndex"], description: "The find() and findIndex() methods of arrays and typed arrays search an array for the first item that satisfies a test function.", description_html: "The <code>find()</code> and <code>findIndex()</code> methods of arrays and typed arrays search an array for the first item that satisfies a test function.", group: ["arrays", "typ\
ed-arrays"], kind: "feature", name: "Array find() and findIndex()", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.findindex", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.find", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.findindex"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Array.find": { baseline: "high", baseline_high_date: "2018-03-01", baseline_low_date: "2015-09-01", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "25", firefox_android: "4", safari: "8", safari_ios: "8" } }, "javascript.builtins.Array.findIndex": { baseline: "high", baseline_high_date: "2018-03-01", baseline_low_date: "2015-09-01", support: { chrome: "45",
    chrome_android: "45", edge: "12", firefox: "25", firefox_android: "4", safari: "8", safari_ios: "8" } }, "javascript.builtins.TypedArray.find": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.findIndex": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, "array-findlast": { compat_features: ["javascript.builtins.Array.findLast", "javascript.builtins.Array.findLastIndex", "javascript.builtins.TypedArray.findLast", "javascript.builtins.TypedArray.findLastIndex"], description: "The fi\
ndLast() and findLastIndex() methods of arrays and typed arrays search an array in reverse order for the first item that satisfies a test function.", description_html: "The <code>findLast()</code> and <code>findLastIndex()</code> methods of arrays and typed arrays search an array in reverse order for the first item that satisfies a test function.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array findLast() and findLastIndex()", snapshot: ["ecmascript-2023"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.findlast", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.findlastindex", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.findlast", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.findlastindex"], status: { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", by_compat_key: { "jav\
ascript.builtins.Array.findLast": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "104", firefox_android: "104", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Array.findLastIndex": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "104", firefox_android: "104", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.TypedArray.findLast": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "104", firefox_android: "104", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.TypedArray.findLastIndex": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "\
104", firefox_android: "104", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "104", firefox_android: "104", safari: "15.4", safari_ios: "15.4" } } }, "array-flat": { caniuse: ["array-flat"], compat_features: ["javascript.builtins.Array.flat", "javascript.builtins.Array.flatMap"], description: "The flat() and flatMap() methods for arrays creates a new array such that each nested array item is concatenated into it.", description_html: "The <code>flat()</code> and <code>flatMap()</code> methods for arrays creates a new array such that each nested array item is concatenated into it.", group: ["arrays"], kind: "feature", name: "Array flat() and flatMap()", snapshot: ["ecmascript-2019"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.flat", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.flatmap"], status: { baseline: "high", baseline_high_date: "2022-07-15",
    baseline_low_date: "2020-01-15", by_compat_key: { "javascript.builtins.Array.flat": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "12", safari_ios: "12" } }, "javascript.builtins.Array.flatMap": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "12", safari_ios: "12" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "12", safari_ios: "12" } } }, "array-from": { compat_features: ["javascript.builtins.Array.from", "javascript.builtins.TypedArray.from"], description: "The Array.from() and typed array .from() static methods copy items from an iterable or array-like object to make a new array.", description_html: "The <code>Array.from()</code>\
 and typed array <code>.from()</code> static methods copy items from an iterable or array-like object to make a new array.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array.from()", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.from", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.of"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Array.from": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } }, "javascript.builtins.TypedArray.from": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10",
    safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } } }, "array-fromasync": { compat_features: ["javascript.builtins.Array.fromAsync"], description: "The Array.fromAsync() static method copies items from an async iterable object to make a new array.", description_html: "The <code>Array.fromAsync()</code> static method copies items from an async iterable object to make a new array.", group: ["arrays"], kind: "feature", name: "Array.fromAsync()", spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.fromasync"], status: { baseline: "low", baseline_low_date: "2024-01-25", by_compat_key: { "javascript.builtins.Array.fromAsync": { baseline: "low", baseline_low_date: "2024-01-25", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "115", firefox_android: "115", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "121", chrome_android: "\
121", edge: "121", firefox: "115", firefox_android: "115", safari: "16.4", safari_ios: "16.4" } } }, "array-group": { compat_features: ["javascript.builtins.Map.groupBy", "javascript.builtins.Object.groupBy"], description: "The Object.groupBy() and Map.groupBy() static methods group values of arrays and iterables based on a function that returns a key for each value.", description_html: "The <code>Object.groupBy()</code> and <code>Map.groupBy()</code> static methods group values of arrays and iterables based on a function that returns a key for each value.", group: ["maps"], kind: "feature", name: "Array grouping", spec: ["https://tc39.es/ecma262/multipage/abstract-operations.html#sec-groupby"], status: { baseline: "low", baseline_low_date: "2024-03-05", by_compat_key: { "javascript.builtins.Map.groupBy": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "119", firefox_android: "119", safari: "17.4", safari_ios: "\
17.4" } }, "javascript.builtins.Object.groupBy": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "119", firefox_android: "119", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "119", firefox_android: "119", safari: "17.4", safari_ios: "17.4" } } }, "array-includes": { caniuse: ["array-includes"], compat_features: ["javascript.builtins.Array.includes", "javascript.builtins.TypedArray.includes"], description: "The includes() method of arrays and typed arrays returns whether a given value appears in the array.", description_html: "The <code>includes()</code> method of arrays and typed arrays returns whether a given value appears in the array.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array includes()", snapshot: ["ecmascript-2016"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.includes", "ht\
tps://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.includes"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Array.includes": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "47", chrome_android: "47", edge: "14", firefox: "43", firefox_android: "43", safari: "9", safari_ios: "9" } }, "javascript.builtins.TypedArray.includes": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "47", chrome_android: "47", edge: "14", firefox: "43", firefox_android: "43", safari: "10", safari_ios: "10" } } }, support: { chrome: "47", chrome_android: "47", edge: "14", firefox: "43", firefox_android: "43", safari: "10", safari_ios: "10" } } }, "array-isarray": { compat_features: ["javascript.builtins.Array.isArray"], description: "The Array.isArray() static method checks wh\
ether a value is an array.", description_html: "The <code>Array.isArray()</code> static method checks whether a value is an array.", group: ["arrays"], kind: "feature", name: "Array.isArray()", snapshot: ["ecmascript-5"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.isarray"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Array.isArray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } } }, "array-iteration-methods": { compat_features: ["javascript.builtins.Array.every", "javascript.builtins.Array.filter", "javascript.builtins.Array.forEach", "javascript.builtins.Array.indexOf", "j\
avascript.builtins.Array.lastIndexOf", "javascript.builtins.Array.map", "javascript.builtins.Array.reduce", "javascript.builtins.Array.reduceRight", "javascript.builtins.Array.some"], description: "Array iteration methods", description_html: "Array iteration methods", group: ["arrays"], kind: "feature", name: "Array iteration methods", snapshot: ["ecmascript-5"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.every", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.filter", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.foreach", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.indexof", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.lastindexof", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.map", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.reduce", "\
https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.reduceright", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.some"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Array.every": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Array.filter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Array.forEach": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Array.indexOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Array.lastIndexOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Array.map": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Array.reduce": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "\
4", safari: "4", safari_ios: "3.2" } }, "javascript.builtins.Array.reduceRight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "javascript.builtins.Array.some": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "array-iterators": { compat_features: ["javascript.builtins.Array.@@iterator", "javascript.builtins.Array.entries", "javascript.builtins.Array.keys", "javascript.builtins.Array.values"], description: "Arrays are iterable with the for … of statement and enumerable with the methods entries(), keys(), and values().",
    description_html: "Arrays are iterable with the <code>for … of</code> statement and enumerable with the methods <code>entries()</code>, <code>keys()</code>, and <code>values()</code>.", group: ["arrays", "iterators"], kind: "feature", name: "Array iterators", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype-@@iterator", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.entries", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.keys", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.values"], status: { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", by_compat_key: { "javascript.builtins.Array.@@iterator": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "\
10", safari_ios: "10" } }, "javascript.builtins.Array.entries": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "28", firefox_android: "28", safari: "8", safari_ios: "8" } }, "javascript.builtins.Array.keys": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "28", firefox_android: "28", safari: "8", safari_ios: "8" } }, "javascript.builtins.Array.values": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "66", chrome_android: "66", edge: "14", firefox: "60", firefox_android: "60", safari: "9", safari_ios: "9" } } }, support: { chrome: "66", chrome_android: "66", edge: "14", firefox: "60", firefox_android: "60", safari: "10", safari_ios: "10" } } }, "array-of": { compat_features: ["javascript.builtins.Array.of", "javascript\
.builtins.TypedArray.of"], description: "The Array.of() and typed array .of() static methods create new arrays from the values of any number of arguments.", description_html: "The <code>Array.of()</code> and typed array <code>.of()</code> static methods create new arrays from the values of any number of arguments.", group: ["arrays", "typed-arrays"], kind: "feature", name: "Array.of()", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.of", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.of"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Array.of": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "45", chrome_android: "39", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "javascript.builtins.TypedArray.of": { baseline: "\
high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } } }, "array-splice": { compat_features: ["javascript.builtins.Array.splice"], description: "The array splice() method changes an array in-place. You can use it to delete items, overwrite items, or insert items, starting from an index.", description_html: "The array <code>splice()</code> method changes an array in-place. You can use it to delete items, overwrite items, or insert items, starting from an index.", group: ["arrays"], kind: "feature", name: "Array splice()", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.splice"], status: { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Array.splice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, article: { compat_features: ["html.elements.article"], description: "The <article> element represents self-contained content, which is intended to be independently distributable or reusable, such as a comment, a blog post, or news article.", description_html: "The <code>&#x3C;article></code> element represents self-contained content, which is intended to be independently distributable or reusable, such as a comment, a blog post, or news article.", group: ["html-elements"], kind: "feature", name: "<article>", spec: ["https://html.spec.whatwg.org/multipage/se\
ctions.html#the-article-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.article": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, aside: { compat_features: ["html.elements.aside"], description: "The <aside> element represents a portion of a document whose content is only indirectly related to the document's main content.", description_html: "The <code>&#x3C;aside></code> element represents a portion of a document whose content is only indirectly related to the document's main content.", group: ["landmark-elements"], kind: "feature", name: "<aside>", spec: ["https://html.spec.whatwg.org/multipage/sect\
ions.html#the-aside-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.aside": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, "aspect-ratio": { compat_features: ["css.properties.aspect-ratio", "css.properties.aspect-ratio.auto", "html.elements.img.aspect_ratio_computed_from_attributes", "html.elements.video.aspect_ratio_computed_from_attributes"], description: "The aspect-ratio CSS property controls the width-to-height ratio of elements. For <img> and <video> elements, the width and height attributes used together with height: auto control the aspect ratio while the image/video is loading.", description_html: "\
The <code>aspect-ratio</code> CSS property controls the width-to-height ratio of elements. For <code>&#x3C;img></code> and <code>&#x3C;video></code> elements, the <code>width</code> and <code>height</code> attributes used together with <code>height: auto</code> control the aspect ratio while the image/video is loading.", group: ["css"], kind: "feature", name: "aspect-ratio", spec: ["https://drafts.csswg.org/css-sizing-4/#aspect-ratio"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "css.properties.aspect-ratio": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "89", firefox_android: "89", safari: "15", safari_ios: "15" } }, "css.properties.aspect-ratio.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "89",
    firefox_android: "89", safari: "15", safari_ios: "15" } }, "html.elements.img.aspect_ratio_computed_from_attributes": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "71", firefox_android: "79", safari: "15", safari_ios: "15" } }, "html.elements.video.aspect_ratio_computed_from_attributes": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "71", firefox_android: "79", safari: "14", safari_ios: "14" } } }, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "89", firefox_android: "89", safari: "15", safari_ios: "15" } } }, "async-await": { caniuse: ["async-functions"], compat_features: ["javascript.builtins.AsyncFunction", "javascript.builtins.AsyncFunction.AsyncFunction", "javascript.operators.async_function", "javascript.operators.await", "javascript.statem\
ents.async_function"], description: "The async and await keywords allow you to use the asynchronous, promise-based behavior of a function without using promise chains.", description_html: "The <code>async</code> and <code>await</code> keywords allow you to use the asynchronous, promise-based behavior of a function without using promise chains.", group: ["javascript"], kind: "feature", name: "Async functions", snapshot: ["ecmascript-2017"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-async-function-definitions"], status: { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", by_compat_key: { "javascript.builtins.AsyncFunction": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "javascript.builtins.AsyncFunction.AsyncFunction": { baseline: "\
high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "javascript.operators.async_function": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "javascript.operators.await": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "55", chrome_android: "55", edge: "14", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "javascript.statements.async_function": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, support: {
    chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, "async-clipboard": { caniuse: ["async-clipboard"], compat_features: ["api.Clipboard", "api.Clipboard.read", "api.Clipboard.readText", "api.Clipboard.type_image-png", "api.Clipboard.type_text-html", "api.Clipboard.type_text-plain", "api.Clipboard.write", "api.Clipboard.writeText", "api.ClipboardItem", "api.ClipboardItem.ClipboardItem", "api.ClipboardItem.getType", "api.ClipboardItem.presentationStyle", "api.ClipboardItem.types", "api.Navigator.clipboard", "api.Permissions.permission_clipboard-write"], description: "The navigator.clipboard API asynchronously reads and writes to the system clipboard.", description_html: "The <code>navigator.clipboard</code> API asynchronously reads and writes to the system clipboard.", group: ["clipboard"], kind: "feature", name: "Async clipboard", spec: ["https://w3c.github.io/clipboard-apis/#async-clipboard-api"], status: {
    baseline: "low", baseline_low_date: "2024-06-11", by_compat_key: { "api.Clipboard": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.read": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.readText": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "125", firefox_android: "125", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.type_image-png": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.type_text-html": { baseline: "\
low", baseline_low_date: "2024-06-11", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.type_text-plain": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.write": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.Clipboard.writeText": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.ClipboardItem": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "84", edge: "79", firefox: "\
127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.ClipboardItem.ClipboardItem": { baseline: "low", baseline_low_date: "2025-02-06", support: { chrome: "133", chrome_android: "98", edge: "133", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.ClipboardItem.getType": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "84", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.ClipboardItem.presentationStyle": { baseline: false, support: { firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.ClipboardItem.types": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "76", chrome_android: "84", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "api.Navigator.clipboard": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: {
    chrome: "66", chrome_android: "66", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.Permissions.permission_clipboard-write": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } } }, support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } } }, "async-generators": { compat_features: ["javascript.builtins.AsyncGenerator", "javascript.builtins.AsyncGenerator.next", "javascript.builtins.AsyncGenerator.return", "javascript.builtins.AsyncGenerator.throw", "javascript.builtins.AsyncGeneratorFunction", "javascript.builtins.AsyncGeneratorFunction.AsyncGeneratorFunction", "javascript.functions.method_definitions.async_generator_methods", "javascript.operators.async_generator_function", "javascript.statements.async_generator_function"], description: "Async generator functions (async function*) create iterators that return multiple promises, o\
ne after another, on-demand.", description_html: "Async generator functions (<code>async function*</code>) create iterators that return multiple promises, one after another, on-demand.", group: ["javascript"], kind: "feature", name: "Async generators", snapshot: ["ecmascript-2017"], spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgeneratorfunction-objects", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgenerator-objects"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.builtins.AsyncGenerator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "55", firefox_android: "55", safari: "12", safari_ios: "12" } }, "javascript.builtins.AsyncGenerator.next": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "63", chrome_android: "63", edge: "79", firefox: "55", firefox_android: "55", safari: "12", safari_ios: "12" } }, "javascript.builtins.AsyncGenerator.return": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "55", firefox_android: "55", safari: "12", safari_ios: "12" } }, "javascript.builtins.AsyncGenerator.throw": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "55", firefox_android: "55", safari: "12", safari_ios: "12" } }, "javascript.builtins.AsyncGeneratorFunction": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "55", firefox_android: "55", safari: "12", safari_ios: "12" } }, "javascript.builtins.AsyncGeneratorFunction.AsyncGeneratorFunction": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "55", firefox_android: "55", safari: "12", safari_ios: "12" } }, "javascript.functions.method_definitions.async_generator_methods": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "12", safari_ios: "12" } }, "javascript.operators.async_generator_function": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "12", safari_ios: "12" } }, "javascript.statements.async_generator_function": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "\
12", safari_ios: "12" } } }, support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "12", safari_ios: "12" } } }, "async-iterable-streams": { compat_features: ["api.ReadableStream.@@asyncIterator", "api.ReadableStream.values"], description: "Asynchronous iteration of a stream allows you to use for await … of loops to iterate through a stream's incoming data.", description_html: "Asynchronous iteration of a stream allows you to use <code>for await … of</code> loops to iterate through a stream's incoming data.", group: ["streams"], kind: "feature", name: "Asynchronously iterable streams", spec: ["https://streams.spec.whatwg.org/#rs-asynciterator"], status: { baseline: false, by_compat_key: { "api.ReadableStream.@@asyncIterator": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "110", firefox_android: "110", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableSt\
ream.values": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "110", firefox_android: "110" } } }, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "110", firefox_android: "110" } } }, "async-iterators": { compat_features: ["javascript.builtins.AsyncIterator", "javascript.builtins.AsyncIterator.@@asyncIterator", "javascript.builtins.Symbol.asyncIterator", "javascript.statements.for_await_of", "javascript.statements.for_of.async_iterators"], description: "Asynchronous iterator objects, such as those returned by promises or generator functions, are iterable with the for await .. of loop.", description_html: "Asynchronous iterator objects, such as those returned by promises or generator functions, are iterable with the <code>for await .. of</code> loop.", group: ["iterators"], kind: "feature", name: "Async iterators and the for await..of loop", snapshot: ["ecmascript-2018"], spec: ["https://tc39.es/ecma262/multipage/control-a\
bstraction-objects.html#sec-asynciteratorprototype", "https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-for-in-and-for-of-statements"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.builtins.AsyncIterator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "javascript.builtins.AsyncIterator.@@asyncIterator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "javascript.builtins.Symbol.asyncIterator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "\
63", edge: "79", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "javascript.statements.for_await_of": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "12", safari_ios: "12" } }, "javascript.statements.for_of.async_iterators": { baseline: "high", baseline_high_date: "2020-06-06", baseline_low_date: "2017-12-06", support: { chrome: "63", chrome_android: "63", edge: "12", firefox: "57", firefox_android: "57", safari: "7", safari_ios: "7" } } }, support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "57", firefox_android: "57", safari: "12", safari_ios: "12" } } }, "atomics-pause": { compat_features: ["javascript.builtins.Atomics.pause"], description: "The Atomics.pause() static method gives a hint to the CPU that the code calling the method is in a short-duration wait for shared memory, known as spinning\
 or a spinlock.", description_html: "The <code>Atomics.pause()</code> static method gives a hint to the CPU that the code calling the method is in a short-duration wait for shared memory, known as spinning or a spinlock.", group: ["javascript"], kind: "feature", name: "Atomics.pause()", spec: ["https://tc39.es/proposal-atomics-microwait/"], status: { baseline: "low", baseline_low_date: "2025-04-01", by_compat_key: { "javascript.builtins.Atomics.pause": { baseline: "low", baseline_low_date: "2025-04-01", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "137", firefox_android: "137", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "137", firefox_android: "137", safari: "18.4", safari_ios: "18.4" } } }, "atomics-wait-async": { compat_features: ["javascript.builtins.Atomics.waitAsync"], description: "The Atomics.waitAsync() static method waits for a value in a shared memory location, providing a promise \
when the expected value is not yet in memory. The waitAsync() method is a non-blocking alternative to Atomics.wait().", description_html: "The <code>Atomics.waitAsync()</code> static method waits for a value in a shared memory location, providing a promise when the expected value is not yet in memory. The <code>waitAsync()</code> method is a non-blocking alternative to <code>Atomics.wait()</code>.", group: ["javascript"], kind: "feature", name: "Atomics.waitAsync()", spec: ["https://tc39.es/ecma262/multipage/structured-data.html#sec-atomics.waitasync"], status: { baseline: "low", baseline_low_date: "2025-11-11", by_compat_key: { "javascript.builtins.Atomics.waitAsync": { baseline: "low", baseline_low_date: "2025-11-11", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "145", firefox_android: "145", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "145", firefox_android: "145", safari: "16.4", safari_ios: "1\
6.4" } } }, attr: { caniuse: ["css3-attr"], compat_features: ["css.types.attr.declaration-value", "css.types.attr.type_function", "css.types.attr.type_function.angle", "css.types.attr.type_function.color", "css.types.attr.type_function.custom-ident", "css.types.attr.type_function.ident", "css.types.attr.type_function.image", "css.types.attr.type_function.integer", "css.types.attr.type_function.length", "css.types.attr.type_function.length-percentage", "css.types.attr.type_function.number", "css.types.attr.type_function.percentage", "css.types.attr.type_function.resolution", "css.types.attr.type_function.string", "css.types.attr.type_function.time", "css.types.attr.type_function.transform-function", "css.types.attr.type_function.url"], description: "The attr() CSS function, in the context of any property, returns the value of an attribute of an HTML element, with the option to return it as a specific type or unit. You can set a default value for missing or invalid attributes.", description_html: "\
The <code>attr()</code> CSS function, in the context of any property, returns the value of an attribute of an HTML element, with the option to return it as a specific type or unit. You can set a default value for missing or invalid attributes.", group: ["css"], kind: "feature", name: "attr()", spec: ["https://drafts.csswg.org/css-values-5/#attr-notation"], status: { baseline: false, by_compat_key: { "css.types.attr.declaration-value": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "119", firefox_android: "119", safari: "18.4", safari_ios: "18.4" } }, "css.types.attr.type_function": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.angle": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.color": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css\
.types.attr.type_function.custom-ident": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.ident": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.image": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.integer": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.length": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.length-percentage": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.number": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.percentage": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "13\
3" } }, "css.types.attr.type_function.resolution": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.string": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.time": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.transform-function": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.types.attr.type_function.url": { baseline: false, support: {} } }, support: {} } }, "attr-contents": { compat_features: ["css.types.attr"], description: "The attr() CSS function, in content property declarations, sets a ::before or ::after pseudo-element's content to the value of the specified HTML attribute.", description_html: "The <code>attr()</code> CSS function, in <code>content</code> property declarations, sets a <code>::before</code> or <code>::after</code> pseudo-\
element's content to the value of the specified HTML attribute.", group: ["css"], kind: "feature", name: "attr() (content only)", spec: ["https://drafts.csswg.org/css-values-5/#attr-notation"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.attr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "attribution-reporting": { compat_features: ["api.HTMLAnchorElement.attributionSrc", "api.HTMLAreaElement.attributionSrc", "api.HTMLImageElement.attributionSrc", "api.HTMLScriptElement.attributionSrc", "api.Request.Request.init_attributionReporting_parameter", "api.Window.open.features_parameter_attributionsrc", "api.XMLHtt\
pRequest.setAttributionReporting", "api.fetch.init_attributionReporting_parameter", "html.elements.a.attributionsrc", "html.elements.area.attributionsrc", "html.elements.iframe.allow.attribution-reporting", "html.elements.img.attributionsrc", "html.elements.script.attributionsrc", "http.headers.Attribution-Reporting-Eligible", "http.headers.Attribution-Reporting-Register-Source", "http.headers.Attribution-Reporting-Register-Trigger", "http.headers.Attribution-Reporting-Support", "http.headers.Permissions-Policy.attribution-reporting"], description: "The attribution reporting API measures when an ad click or view leads to a conversion, such as a purchase on an advertiser site.", description_html: "The attribution reporting API measures when an ad click or view leads to a conversion, such as a purchase on an advertiser site.", discouraged: { according_to: ["https://groups.google.com/a/chromium.org/g/blink-dev/c/4K2RRt6VYCQ", "https://chromestatus.com/feature/6320639375966208"], reason: "\
Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the attribution reporting API.", reason_html: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the attribution reporting API.", removal_date: "2026-06-01" }, kind: "feature", name: "Attribution reporting", spec: ["https://wicg.github.io/attribution-reporting-api/"], status: { baseline: false, by_compat_key: { "api.HTMLAnchorElement.attributionSrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.HTMLAreaElement.attributionSrc": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "api.HTMLImageElement.attributionSrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.HTMLScriptElement.attrib\
utionSrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.Request.Request.init_attributionReporting_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.Window.open.features_parameter_attributionsrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.XMLHttpRequest.setAttributionReporting": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.fetch.init_attributionReporting_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "html.elements.a.attributionsrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "html.elements.area.attributionsrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "html.elements.iframe.allow.attribution-reporting": { baseline: false, support: { chrome: "117", chrome_android: "11\
7", edge: "117" } }, "html.elements.img.attributionsrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "html.elements.script.attributionsrc": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "http.headers.Attribution-Reporting-Eligible": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "http.headers.Attribution-Reporting-Register-Source": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "http.headers.Attribution-Reporting-Register-Trigger": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "http.headers.Attribution-Reporting-Support": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "http.headers.Permissions-Policy.attribution-reporting": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } } }, support: { chrome: "133", chrome_android: "133",
    edge: "133" } } }, audio: { caniuse: ["audio"], compat_features: ["api.HTMLAudioElement", "api.HTMLAudioElement.Audio", "html.elements.audio", "html.elements.audio.controls", "html.elements.audio.crossorigin", "html.elements.audio.loop", "html.elements.audio.muted", "html.elements.audio.preload", "html.elements.audio.src"], description: "The <audio> element plays sound such as audio effects or music, optionally with controls provided by the browser.", description_html: "The <code>&#x3C;audio></code> element plays sound such as audio effects or music, optionally with controls provided by the browser.", group: ["media-elements", "html-elements"], kind: "feature", name: "<audio>", spec: ["https://html.spec.whatwg.org/multipage/media.html#audio"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLAudioElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLAudioElement.Audio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.audio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.audio.controls": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.audio.crossorigin": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "33",
    chrome_android: "33", edge: "≤18", firefox: "74", firefox_android: "79", safari: "10", safari_ios: "10" } }, "html.elements.audio.loop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "3.1", safari_ios: "3" } }, "html.elements.audio.muted": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "15", chrome_android: "18", edge: "≤18", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "html.elements.audio.preload": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.audio.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } } }, "audio-session": { compat_features: ["api.AudioSession", "api.AudioSession.type", "api.Navigator.audioSession"], description: "The navigator.audioSession API controls how audio playback interacts with other applications. For example, playing music can pause audio from other applications, while ambient audio can play at the same time.", description_html: "The <code>navigator.audioSession</code> API controls how audio playback interacts with other applications. For example, playing music can pause audio from other applications, while ambient audio can play at the same time.", kind: "feature", name: "Audio session", spec: ["https://w3c.github.io/audio-session/"], status: { baseline: false, by_compat_key: { "api.AudioSession": { baseline: false, support: {
    safari: "16.4", safari_ios: "16.4" } }, "api.AudioSession.type": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "api.Navigator.audioSession": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } } }, support: { safari: "16.4", safari_ios: "16.4" } } }, "audio-video-tracks": { caniuse: ["audiotracks", "videotracks"], compat_features: ["api.AudioTrack", "api.AudioTrack.enabled", "api.AudioTrack.id", "api.AudioTrack.kind", "api.AudioTrack.label", "api.AudioTrack.language", "api.AudioTrackList", "api.AudioTrackList.addtrack_event", "api.AudioTrackList.change_event", "api.AudioTrackList.getTrackById", "api.AudioTrackList.length", "api.AudioTrackList.removetrack_event", "api.HTMLMediaElement.audioTracks", "api.HTMLMediaElement.videoTracks", "api.VideoTrack", "api.VideoTrack.id", "api.VideoTrack.kind", "api.VideoTrack.label", "api.VideoTrack.language", "api.VideoTrack.selected", "api.VideoTrackList", "api.VideoTrackList.addtrack_event", "api.VideoTrack\
List.change_event", "api.VideoTrackList.getTrackById", "api.VideoTrackList.length", "api.VideoTrackList.removetrack_event", "api.VideoTrackList.selectedIndex"], description: "The audioTracks and videoTracks APIs for media elements switch audio and video tracks during playback.", description_html: "The <code>audioTracks</code> and <code>videoTracks</code> APIs for media elements switch audio and video tracks during playback.", group: ["media-elements"], kind: "feature", name: "Audio and video tracks", spec: ["https://html.spec.whatwg.org/multipage/media.html#media-resources-with-multiple-media-tracks"], status: { baseline: false, by_compat_key: { "api.AudioTrack": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "api.AudioTrack.enabled": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "api.AudioTrack.id": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "api.AudioTrack.kind": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "a\
pi.AudioTrack.label": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "api.AudioTrack.language": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "api.AudioTrackList": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.AudioTrackList.addtrack_event": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.AudioTrackList.change_event": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.AudioTrackList.getTrackById": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.AudioTrackList.length": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.AudioTrackList.removetrack_event": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.HTMLMediaElement.audioTracks": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.HTMLMediaElement.videoTracks": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrack": { baseline: false, support: {
    safari: "7", safari_ios: "7" } }, "api.VideoTrack.id": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrack.kind": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrack.label": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrack.language": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrack.selected": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList.addtrack_event": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList.change_event": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList.getTrackById": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList.length": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList.removetrack_event": { baseline: false,
    support: { safari: "7", safari_ios: "7" } }, "api.VideoTrackList.selectedIndex": { baseline: false, support: { safari: "7", safari_ios: "7" } } }, support: { safari: "8", safari_ios: "8" } } }, "audio-worklet": { compat_features: ["api.AudioWorklet", "api.AudioWorkletGlobalScope", "api.AudioWorkletGlobalScope.currentFrame", "api.AudioWorkletGlobalScope.currentTime", "api.AudioWorkletGlobalScope.port", "api.AudioWorkletGlobalScope.registerProcessor", "api.AudioWorkletGlobalScope.sampleRate", "api.AudioWorkletNode", "api.AudioWorkletNode.AudioWorkletNode", "api.AudioWorkletNode.parameters", "api.AudioWorkletNode.port", "api.AudioWorkletNode.processorerror_event", "api.AudioWorkletProcessor", "api.AudioWorkletProcessor.AudioWorkletProcessor", "api.AudioWorkletProcessor.port", "api.BaseAudioContext.audioWorklet", "api.Worklet", "api.Worklet.addModule", "api.WorkletGlobalScope"], description: "The AudioWorklet API runs module code in a separate thread, specifically for non-blocking, low\
 latency audio processing.", description_html: "The <code>AudioWorklet</code> API runs module code in a separate thread, specifically for non-blocking, low latency audio processing.", group: ["web-audio", "worklets"], kind: "feature", name: "AudioWorklet", spec: ["https://webaudio.github.io/web-audio-api/#AudioWorklet"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.AudioWorklet": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletGlobalScope": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletGlobalScope.currentFrame": { baseline: "high", baseline_high_date: "\
2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletGlobalScope.currentTime": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletGlobalScope.port": { baseline: false, support: { firefox: "138", firefox_android: "138" } }, "api.AudioWorkletGlobalScope.registerProcessor": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletGlobalScope.sampleRate": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "\
66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletNode.AudioWorkletNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletNode.parameters": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletNode.port": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "\
66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletNode.processorerror_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletProcessor": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletProcessor.AudioWorkletProcessor": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioWorkletProcessor.port": { baseline: "high", baseline_high_date: "2023-10-26",
    baseline_low_date: "2021-04-26", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.audioWorklet": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.Worklet": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.Worklet.addModule": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.WorkletGlobalScope": { baseline: "high", baseline_high_date: "2023-10-26",
    baseline_low_date: "2021-04-26", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, audiolistener: { compat_features: ["api.AudioListener", "api.AudioListener.forwardX", "api.AudioListener.forwardY", "api.AudioListener.forwardZ", "api.AudioListener.positionX", "api.AudioListener.positionY", "api.AudioListener.positionZ", "api.AudioListener.upX", "api.AudioListener.upY", "api.AudioListener.upZ"], description: "An AudioListener object represents the virtual position and orientation of a person relative to sound sources, to spatialize audio in a Web Audio context.", description_html: "An <code>AudioListener</code> object represents the virtual position and orientation of a person relative to sound sources, to spatialize audio in a Web Audio context.", group: ["w\
eb-audio"], kind: "feature", name: "AudioListener", spec: ["https://webaudio.github.io/web-audio-api/#AudioListener"], status: { baseline: false, by_compat_key: { "api.AudioListener": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioListener.forwardX": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.forwardY": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.forwardZ": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.positionX": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.\
AudioListener.positionY": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.positionZ": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.upX": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.upY": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioListener.upZ": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } } }, "audiolistener-setposition-setorientation": { compat_features: ["api.AudioListener.setOrientation", "api.AudioListener.setPosition"], description: "The setPosition() and setOr\
ientation() methods of the AudioListener API set the virtual position and orientation of a person relative to sound sources, to spatialize audio in a Web Audio context.", description_html: "The <code>setPosition()</code> and <code>setOrientation()</code> methods of the <code>AudioListener</code> API set the virtual position and orientation of a person relative to sound sources, to spatialize audio in a Web Audio context.", discouraged: { according_to: ["https://webaudio.github.io/web-audio-api/#dom-audiolistener-setposition", "https://webaudio.github.io/web-audio-api/#dom-audiolistener-setorientation"], alternatives: ["audiolistener"], reason: "The setPosition() and setOrientation() methods are equivalent to using an AudioListener instances's positionX, positionY, positionZ, forwardX, forwardY, forwardZ, upX, upY, and upZ properties.", reason_html: "The <code>setPosition()</code> and <code>setOrientation()</code> methods are equivalent to using an <code>AudioListener</code> instances's\
 <code>positionX</code>, <code>positionY</code>, <code>positionZ</code>, <code>forwardX</code>, <code>forwardY</code>, <code>forwardZ</code>, <code>upX</code>, <code>upY</code>, and <code>upZ</code> properties." }, group: ["web-audio"], kind: "feature", name: "AudioListener setPosition() and setOrientation()", spec: ["https://webaudio.github.io/web-audio-api/#AudioListener"], status: { baseline: false, by_compat_key: { "api.AudioListener.setOrientation": { baseline: false, support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioListener.setPosition": { baseline: false, support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } } }, support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } } }, autocapitalize: { compat_features: ["api.HTMLElement.autocapitalize", "ht\
ml.global_attributes.autocapitalize"], description: "The autocapitalize global HTML attribute sets the virtual keyboard capitalization behavior for user input on an element, such as the first letter of sentences or all words.", description_html: "The <code>autocapitalize</code> global HTML attribute sets the virtual keyboard capitalization behavior for user input on an element, such as the first letter of sentences or all words.", kind: "feature", name: "autocapitalize", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#autocapitalization"], status: { baseline: false, by_compat_key: { "api.HTMLElement.autocapitalize": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "111", firefox_android: "111", safari_ios: "10.3" } }, "html.global_attributes.autocapitalize": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "111", firefox_android: "111", safari_ios: "5" } } }, support: { chrome: "66", chrome_android: "\
66", edge: "79", firefox: "111", firefox_android: "111", safari_ios: "10.3" } } }, autocorrect: { compat_features: ["api.HTMLElement.autocorrect", "html.global_attributes.autocorrect"], description: "The autocorrect global HTML attribute controls whether to automatically correct spelling or punctuation errors for user input.", description_html: "The <code>autocorrect</code> global HTML attribute controls whether to automatically correct spelling or punctuation errors for user input.", kind: "feature", name: "autocorrect", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#autocorrection"], status: { baseline: false, by_compat_key: { "api.HTMLElement.autocorrect": { baseline: false, support: { firefox: "136", firefox_android: "136", safari: "14.1", safari_ios: "14.5" } }, "html.global_attributes.autocorrect": { baseline: false, support: { firefox: "136", firefox_android: "136", safari: "14.1", safari_ios: "14.5" } } }, support: { firefox: "136", firefox_android: "136", safari: "\
14.1", safari_ios: "14.5" } } }, autofill: { compat_features: ["css.selectors.autofill"], description: "The :autofill pseudo-class matches <input> elements that have been filled in automatically by the browser.", description_html: "The <code>:autofill</code> pseudo-class matches <code>&#x3C;input></code> elements that have been filled in automatically by the browser.", group: ["forms"], kind: "feature", name: ":autofill", spec: ["https://html.spec.whatwg.org/multipage/semantics-other.html#selector-autofill"], status: { baseline: false, by_compat_key: { "css.selectors.autofill": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110", safari: "15", safari_ios: "15" } } }, support: { chrome: "110", chrome_android: "110", edge: "110", safari: "15", safari_ios: "15" } } }, autofocus: { caniuse: ["autofocus"], compat_features: ["api.HTMLElement.autofocus", "api.MathMLElement.autofocus", "api.SVGElement.autofocus", "html.global_attributes.autofocus", "svg.global_attri\
butes.autofocus"], description: "The autofocus HTML attribute gives focus to an element on page load.", description_html: "The <code>autofocus</code> HTML attribute gives focus to an element on page load.", kind: "feature", name: "autofocus", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#the-autofocus-attribute"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLElement.autofocus": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "110", firefox_android: "110", safari: "15.4", safari_ios: "15.4" } }, "api.MathMLElement.autofocus": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "110", firefox_android: "110", safari: "15.4", safari_ios: "15.4" } }, "api.SVGElement.autofocus": { baseline: "\
high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "110", firefox_android: "110", safari: "15.4", safari_ios: "15.4" } }, "html.global_attributes.autofocus": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "110", firefox_android: "110", safari: "15.4", safari_ios: "16.4" } }, "svg.global_attributes.autofocus": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "110", firefox_android: "110", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "autonomous-custom-elements": { compat_features: ["api.CustomElementRegistry", "api.CustomElementRegistry.define", "api.CustomElem\
entRegistry.define.disabledFeatures_static_property", "api.CustomElementRegistry.get", "api.CustomElementRegistry.getName", "api.CustomElementRegistry.upgrade", "api.CustomElementRegistry.whenDefined", "api.Window.customElements", "css.selectors.defined"], description: "Autonomous custom elements are HTML elements with a hyphenated tag name (like <example-element>) that have behaviors you define.", description_html: "Autonomous custom elements are HTML elements with a hyphenated tag name (like <code>&#x3C;example-element></code>) that have behaviors you define.", group: ["custom-elements"], kind: "feature", name: "Autonomous custom elements", spec: ["https://html.spec.whatwg.org/multipage/custom-elements.html#autonomous-custom-element"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.CustomElementRegistry": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54",
    chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10.1", safari_ios: "10.3" } }, "api.CustomElementRegistry.define": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10.1", safari_ios: "10.3" } }, "api.CustomElementRegistry.define.disabledFeatures_static_property": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "92", firefox_android: "92" } }, "api.CustomElementRegistry.get": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63" } }, "api.CustomElementRegistry.getName": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "116", firefox_android: "116" } }, "api.CustomElementRegistry.upgrade": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-1\
5", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "63", firefox_android: "63", safari: "12.1", safari_ios: "12.2" } }, "api.CustomElementRegistry.whenDefined": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10.1", safari_ios: "10.3" } }, "api.Window.customElements": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10.1", safari_ios: "10.3" } }, "css.selectors.defined": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } } }, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63",
    safari: "10.1", safari_ios: "10.3" } } }, avif: { caniuse: ["avif"], compat_features: ["mediatypes.image.avif", "mediatypes.image.avif.animation"], description: "AVIF (AV1 Image File Format) is an image format based on the AV1 video format.", description_html: "AVIF (AV1 Image File Format) is an image format based on the AV1 video format.", group: ["image-formats"], kind: "feature", name: "AVIF", spec: ["https://aomediacodec.github.io/av1-avif/"], status: { baseline: "low", baseline_low_date: "2024-01-25", by_compat_key: { "mediatypes.image.avif": { baseline: "low", baseline_low_date: "2024-01-25", support: { chrome: "85", chrome_android: "85", edge: "121", firefox: "93", firefox_android: "93", safari: "16.4", safari_ios: "16.1" } }, "mediatypes.image.avif.animation": { baseline: "low", baseline_low_date: "2024-01-25", support: { chrome: "85", chrome_android: "85", edge: "121", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.1" } } }, support: { chrome: "85",
    chrome_android: "85", edge: "121", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.1" } } }, b: { compat_features: ["html.elements.b"], description: "The <b> HTML element draws reader's attention to text, styling text as bold by default.", description_html: "The <code>&#x3C;b></code> HTML element draws reader's attention to text, styling text as bold by default.", group: ["html-elements"], kind: "feature", name: "<b>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-b-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.b": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } } }, backdrop: { compat_features: ["css.selectors.backdrop", "css.selectors.backdrop.dialog", "css.selectors.backdrop.inherit_from_originating_element"], description: "The ::backdrop CSS pseudo-element is a box underneath an element in the top layer, such as a <dialog>. It can be used to create obscuring effects distinguishing a modal element from the elements underneath.", description_html: "The <code>::backdrop</code> CSS pseudo-element is a box underneath an element in the top layer, such as a <code>&#x3C;dialog></code>. It can be used to create obscuring effects distinguishing a modal element from the elements underneath.", group: ["selectors"], kind: "feature", name: "::backdrop", spec: ["https://drafts.csswg.org/css-position-4/#backdrop"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.selectors.backdrop": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "\
37", chrome_android: "37", edge: "79", firefox: "47", firefox_android: "47", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.backdrop.dialog": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.backdrop.inherit_from_originating_element": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "120", firefox_android: "120", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "47", firefox_android: "47", safari: "15.4", safari_ios: "15.4" } } }, "backdrop-filter": { caniuse: ["css-backdrop-filter"], compat_features: ["css.properties.backdrop-filter"], description: "The backdrop-filter CSS property applies graphical effects such as blurring or color shifting to the area behi\
nd an element.", description_html: "The <code>backdrop-filter</code> CSS property applies graphical effects such as blurring or color shifting to the area behind an element.", group: ["css"], kind: "feature", name: "backdrop-filter", spec: ["https://drafts.csswg.org/filter-effects-2/#BackdropFilterProperty"], status: { baseline: "low", baseline_low_date: "2024-09-16", by_compat_key: { "css.properties.backdrop-filter": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "103", firefox_android: "103", safari: "18", safari_ios: "18" } } }, support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "103", firefox_android: "103", safari: "18", safari_ios: "18" } } }, background: { caniuse: ["multibackgrounds"], compat_features: ["css.properties.background", "css.properties.background.local", "css.properties.background.multiple_backgrounds", "css.properties.background.no-repeat", "css.properties.background.none", "c\
ss.properties.background.repeat", "css.properties.background.repeat-x", "css.properties.background.repeat-y", "css.properties.background.round", "css.properties.background.scroll", "css.properties.background.space", "css.properties.background.transparent"], description: "The background CSS property is a shorthand that sets several background properties at once.", description_html: "The <code>background</code> CSS property is a shorthand that sets several background properties at once.", group: ["background"], kind: "feature", name: "background", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background\
.local": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.multiple_backgrounds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.background.no-repeat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css\
.properties.background.repeat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.repeat-x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.repeat-y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.round": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } },
    "css.properties.background.scroll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.space": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1.3", safari_ios: "1" } } }, "background-attachment": { caniuse: ["background-attachment"], compat_features: ["css.properties.backgr\
ound-attachment", "css.properties.background-attachment.fixed", "css.properties.background-attachment.local", "css.properties.background-attachment.multiple_backgrounds", "css.properties.background-attachment.scroll"], description: "The background-attachment CSS property sets whether an element's background image or gradient moves as the element scrolls.", description_html: "The <code>background-attachment</code> CSS property sets whether an element's background image or gradient moves as the element scrolls.", group: ["background"], kind: "feature", name: "background-attachment", spec: ["https://drafts.csswg.org/css-backgrounds-3/#the-background-attachment"], status: { baseline: false, by_compat_key: { "css.properties.background-attachment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3.2" } }, "css.properties.background-att\
achment.fixed": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "15.4" } }, "css.properties.background-attachment.local": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "15.4", safari_ios: "15.4" } }, "css.properties.background-attachment.multiple_backgrounds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1.3", safari_ios: "3.2" } }, "css.properties.background-attachment.scroll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "25", firefox_android: "25", safari: "15.4" } } }, "background-blend-mode": { caniuse: ["css-backgroundblendmode"], compat_features: ["css.properties.background-blend-mode", "css.types.blend-mode"], description: "The background-blend-mode CSS property blends an element's background image and background color using blend modes like multiply, difference, or color.", description_html: "The <code>background-blend-mode</code> CSS property blends an element's background image and background color using blend modes like <code>multiply</code>, <code>difference</code>, or <code>color</code>.", group: ["blend-mode"], kind: "feature", name: "background-blend-mode", spec: ["https://drafts.csswg.org/compositing-2/#background-blend-mode"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.background-blend-mode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "30", firefox_android: "30", safari: "8", safari_ios: "8" } }, "css.types.blend-mode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "59", edge: "79", firefox: "30", firefox_android: "54", safari: "8", safari_ios: "8" } } }, support: { chrome: "35", chrome_android: "59", edge: "79", firefox: "30", firefox_android: "54", safari: "8", safari_ios: "8" } } }, "background-clip": { compat_features: ["css.properties.background-clip", "css.properties.background-clip.border-box", "css.properties.background-clip.content-box", "css.properties.background-clip.padding-box", "css.properties.background.background-clip"], description: "The background-clip CSS property sets the extent of the background: the padding box, the content box, or the default border box.", description_html: "The <code>background-clip</code> CSS property sets the extent of the\
 background: the padding box, the content box, or the default border box.", group: ["background"], kind: "feature", name: "background-clip", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background-clip"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-clip": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.properties.background-clip.border-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.properties.background-clip.content-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.properties.background-clip.padding-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.properties.background.background-clip": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "22", firefox_android: "22", safari: "5.1", safari_ios: "4" } } }, support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "22", firefox_android: "22", safari: "5.1", safari_ios: "5" } } }, "background-clip-border-area": { compat_features: ["css.properties.background-clip.border-area"], description: "The background-clip: border-area CSS declaration draws the background underneath only the border of an element.", description_html: "The <\
code>background-clip: border-area</code> CSS declaration draws the background underneath only the border of an element.", group: ["background"], kind: "feature", name: "background-clip: border-area", spec: ["https://drafts.csswg.org/css-backgrounds-4/#background-clip"], status: { baseline: false, by_compat_key: { "css.properties.background-clip.border-area": { baseline: false, support: { safari: "18.2", safari_ios: "18.2" } } }, support: { safari: "18.2", safari_ios: "18.2" } } }, "background-clip-text": { compat_features: ["css.properties.background-clip.text"], description: "The background-clip: text CSS declaration draws the background underneath only the text in the element.", description_html: "The <code>background-clip: text</code> CSS declaration draws the background underneath only the text in the element.", group: ["background"], kind: "feature", name: "background-clip: text", spec: ["https://drafts.csswg.org/css-backgrounds-4/#background-clip"], status: { baseline: false, by_compat_key: {
    "css.properties.background-clip.text": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120", safari: "14", safari_ios: "14" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", safari: "14", safari_ios: "14" } } }, "background-color": { compat_features: ["css.properties.background-color", "css.properties.background-color.transparent"], description: "The background-color CSS property sets the fill color of an element, behind any content and background images or gradients.", description_html: "The <code>background-color</code> CSS property sets the fill color of an element, behind any content and background images or gradients.", group: ["background"], kind: "feature", name: "background-color", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background-color"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-color": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "background-fetch": { compat_features: ["api.BackgroundFetchEvent", "api.BackgroundFetchEvent.BackgroundFetchEvent", "api.BackgroundFetchEvent.registration", "api.BackgroundFetchManager", "api.BackgroundFetchManager.fetch", "api.BackgroundFetchManager.get", "api.BackgroundFetchManager.getIds", "api.BackgroundFetchRecord", "api.BackgroundFetchRecord.request", "api.BackgroundFetchRecord.responseReady", "api.BackgroundFetchRegistra\
tion", "api.BackgroundFetchRegistration.abort", "api.BackgroundFetchRegistration.downloadTotal", "api.BackgroundFetchRegistration.downloaded", "api.BackgroundFetchRegistration.failureReason", "api.BackgroundFetchRegistration.id", "api.BackgroundFetchRegistration.match", "api.BackgroundFetchRegistration.matchAll", "api.BackgroundFetchRegistration.progress_event", "api.BackgroundFetchRegistration.recordsAvailable", "api.BackgroundFetchRegistration.result", "api.BackgroundFetchRegistration.uploadTotal", "api.BackgroundFetchRegistration.uploaded", "api.BackgroundFetchUpdateUIEvent", "api.BackgroundFetchUpdateUIEvent.BackgroundFetchUpdateUIEvent", "api.BackgroundFetchUpdateUIEvent.updateUI", "api.ServiceWorkerGlobalScope.backgroundfetchabort_event", "api.ServiceWorkerGlobalScope.backgroundfetchclick_event", "api.ServiceWorkerGlobalScope.backgroundfetchfail_event", "api.ServiceWorkerGlobalScope.backgroundfetchsuccess_event", "api.ServiceWorkerRegistration.backgroundFetch"], description: "Bac\
kground fetch downloads data in the background even when the web page is closed.", description_html: "Background fetch downloads data in the background even when the web page is closed.", kind: "feature", name: "Background fetch", spec: ["https://wicg.github.io/background-fetch/"], status: { baseline: false, by_compat_key: { "api.BackgroundFetchEvent": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchEvent.BackgroundFetchEvent": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchEvent.registration": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchManager": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchManager.fetch": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchManager.get": { baseline: false, support: { chrome: "74", chrome_android: "\
74", edge: "79" } }, "api.BackgroundFetchManager.getIds": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRecord": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRecord.request": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRecord.responseReady": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.abort": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.downloadTotal": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.downloaded": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.B\
ackgroundFetchRegistration.failureReason": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.id": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.match": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.matchAll": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.progress_event": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.recordsAvailable": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.result": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchRegistration.uploadTotal": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "\
79" } }, "api.BackgroundFetchRegistration.uploaded": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchUpdateUIEvent": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchUpdateUIEvent.BackgroundFetchUpdateUIEvent": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.BackgroundFetchUpdateUIEvent.updateUI": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.ServiceWorkerGlobalScope.backgroundfetchabort_event": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.ServiceWorkerGlobalScope.backgroundfetchclick_event": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.ServiceWorkerGlobalScope.backgroundfetchfail_event": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.ServiceWorkerGlobalScope.backgroundfetchsucces\
s_event": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.ServiceWorkerRegistration.backgroundFetch": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } } }, support: { chrome: "74", chrome_android: "74", edge: "79" } } }, "background-image": { compat_features: ["css.properties.background-image", "css.properties.background-image.multiple_backgrounds", "css.properties.background-image.none"], description: "The background-image CSS property sets the graphics to display behind the content of an element and in front of the background color. Graphics may be any combination of images or gradients.", description_html: "The <code>background-image</code> CSS property sets the graphics to display behind the content of an element and in front of the background color. Graphics may be any combination of images or gradients.", group: ["background"], kind: "feature", name: "background-image", spec: ["https://drafts.csswg.org/css-backg\
rounds-3/#background-image"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-image.multiple_backgrounds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.background-image.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "\
4", safari: "1.3", safari_ios: "1" } } }, "background-origin": { compat_features: ["css.properties.background-origin", "css.properties.background-origin.border-box", "css.properties.background-origin.content-box", "css.properties.background-origin.padding-box", "css.properties.background.background-origin"], description: "The background-origin CSS property sets the background starting position relative to the border and padding of an element.", description_html: "The <code>background-origin</code> CSS property sets the background starting position relative to the border and padding of an element.", group: ["background"], kind: "feature", name: "background-origin", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background-origin"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-origin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.background-origin.border-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.background-origin.content-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.background-origin.padding-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.background.background-origin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "22", firefox_android: "22", safari: "5.1", safari_ios: "4" } } }, support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "22", firefox_android: "22", safari: "5.1", safari_ios: "4" } } }, "background-position": { caniuse: ["css-background-offsets", "background-position-x-y"], compat_features: ["css.properties.background-position", "css.properties.background-position-x", "css.properties.background-position-x.side-relative_values", "css.properties.background-position-y", "css.properties.background-position-y.side-relative_values", "css.properties.background-position.bottom", "css.properties.background-position.center", "css.properties.background-position.left", "css.properties.background-position.multiple_backgrounds", "css.properties.background-position.right", "css.properties.background-position.side-relative_values", "css.properties.background-position.top"], description: "The background-pos\
ition CSS property offsets the initial position of background images relative to the background origin.", description_html: "The <code>background-position</code> CSS property offsets the initial position of background images relative to the background origin.", group: ["background"], kind: "feature", name: "background-position", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background-position"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-position": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-position-x": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "49", firefox_android: "49", safari: "\
1", safari_ios: "1" } }, "css.properties.background-position-x.side-relative_values": { baseline: "low", baseline_low_date: "2026-01-21", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "49", firefox_android: "49", safari: "15.4", safari_ios: "15.4" } }, "css.properties.background-position-y": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "49", firefox_android: "49", safari: "1", safari_ios: "1" } }, "css.properties.background-position-y.side-relative_values": { baseline: "low", baseline_low_date: "2026-01-21", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "49", firefox_android: "49", safari: "15.4", safari_ios: "15.4" } }, "css.properties.background-position.bottom": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.background-position.center": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-position.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-position.multiple_backgrounds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.background-position.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "\
18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-position.side-relative_values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "13", firefox_android: "14", safari: "7", safari_ios: "7" } }, "css.properties.background-position.top": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "13", firefox_android: "14", safari: "7", safari_ios: "7" } } }, "background-repeat": { caniuse: ["background-repeat-round-space"], compat_features: ["css.properties.background-repeat", "css.properties.background-repeat.2-value", "css.properties.background-repeat.multiple_backgrounds", "css.properties.backgr\
ound-repeat.no-repeat", "css.properties.background-repeat.repeat", "css.properties.background-repeat.repeat-x", "css.properties.background-repeat.repeat-y", "css.properties.background-repeat.round", "css.properties.background-repeat.space"], description: "The background-repeat CSS property sets how a background image is tiled.", description_html: "The <code>background-repeat</code> CSS property sets how a background image is tiled.", group: ["background"], kind: "feature", name: "background-repeat", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background-repeat"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "css.properties.background-repeat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-repeat.2-value": { baseline: "hi\
gh", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "5", safari_ios: "4" } }, "css.properties.background-repeat.multiple_backgrounds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.background-repeat.no-repeat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-repeat.repeat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "cs\
s.properties.background-repeat.repeat-x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-repeat.repeat-y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.background-repeat.round": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "49", firefox_android: "49", safari: "8", safari_ios: "8" } }, "css.properties.background-repeat.space": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "49", firefox_android: "49",
    safari: "8", safari_ios: "8" } } }, support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "49", firefox_android: "49", safari: "8", safari_ios: "8" } } }, "background-size": { compat_features: ["css.properties.background-size", "css.properties.background-size.auto", "css.properties.background-size.contain", "css.properties.background-size.cover", "css.properties.background.background-size"], description: "The background-size CSS property scales or stretches a background based on the size of the element (with the contain and cover keywords), a length, or percentage.", description_html: "The <code>background-size</code> CSS property scales or stretches a background based on the size of the element (with the <code>contain</code> and <code>cover</code> keywords), a length, or percentage.", group: ["background"], kind: "feature", name: "background-size", spec: ["https://drafts.csswg.org/css-backgrounds-3/#background-size"], status: { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.background-size.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.background-size.contain": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.background-size.cover": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18",
    edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.background.background-size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "9", firefox_android: "18", safari: "5.1", safari_ios: "4" } } }, support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "9", firefox_android: "18", safari: "5.1", safari_ios: "4.2" } } }, "background-sync": { compat_features: ["api.Permissions.permission_background-sync", "api.ServiceWorkerGlobalScope.sync_event", "api.ServiceWorkerRegistration.sync", "api.SyncEvent", "api.SyncEvent.SyncEvent", "api.SyncEvent.lastChance", "api.SyncEvent.tag", "api.SyncManager", "api.SyncManager.getTags", "api.SyncManager.register", "api.SyncManager.worker_support"], description: "The background synchronization API registers a service worker callback to run only when the device is no longer offline. You can\
 use this to let users continue using your app while offline and synchronize with a server after reconnecting.", description_html: "The background synchronization API registers a service worker callback to run only when the device is no longer offline. You can use this to let users continue using your app while offline and synchronize with a server after reconnecting.", kind: "feature", name: "Background sync", spec: ["https://wicg.github.io/background-sync/spec/"], status: { baseline: false, by_compat_key: { "api.Permissions.permission_background-sync": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "79" } }, "api.ServiceWorkerGlobalScope.sync_event": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.ServiceWorkerRegistration.sync": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncEvent": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncEven\
t.SyncEvent": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncEvent.lastChance": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncEvent.tag": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncManager": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncManager.getTags": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncManager.register": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.SyncManager.worker_support": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } } }, support: { chrome: "49", chrome_android: "49", edge: "79" } } }, badging: { compat_features: ["api.Navigator.clearAppBadge", "api.Navigator.setAppBadge"], description: "The navigator.setAppBadge() method allows installed web applications to display an a\
pplication badge, typically a dot or number shown alongside the application's icon on the device's home screen or application dock.", description_html: "The <code>navigator.setAppBadge()</code> method allows installed web applications to display an application badge, typically a dot or number shown alongside the application's icon on the device's home screen or application dock.", kind: "feature", name: "Badging", spec: ["https://w3c.github.io/badging/"], status: { baseline: false, by_compat_key: { "api.Navigator.clearAppBadge": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81", safari: "17", safari_ios: "16.4" } }, "api.Navigator.setAppBadge": { baseline: false, support: { chrome: "81", edge: "81", safari: "17", safari_ios: "16.4" } } }, support: { chrome: "81", edge: "81", safari: "17", safari_ios: "16.4" } } }, barcode: { compat_features: ["api.BarcodeDetector", "api.BarcodeDetector.BarcodeDetector", "api.BarcodeDetector.detect", "api.BarcodeDetector.getSu\
pportedFormats_static"], description: "The BarcodeDetector API recognizes various barcode formats in images.", description_html: "The <code>BarcodeDetector</code> API recognizes various barcode formats in images.", kind: "feature", name: "Barcode detector", spec: ["https://wicg.github.io/shape-detection-api/#barcode-detection-api"], status: { baseline: false, by_compat_key: { "api.BarcodeDetector": { baseline: false, support: { chrome_android: "83" } }, "api.BarcodeDetector.BarcodeDetector": { baseline: false, support: { chrome_android: "83" } }, "api.BarcodeDetector.detect": { baseline: false, support: { chrome_android: "83" } }, "api.BarcodeDetector.getSupportedFormats_static": { baseline: false, support: { chrome_android: "83" } } }, support: { chrome_android: "83" } } }, barprop: { compat_features: ["api.BarProp", "api.BarProp.visible", "api.BarProp.visible.returns_popup", "api.Window.locationbar", "api.Window.menubar", "api.Window.personalbar", "api.Window.scrollbars", "api.Window\
.statusbar", "api.Window.toolbar"], description: "The visible property of the window.locationbar, window.menubar, window.personalbar, window.scrollbars, window.statusbar, and window.toolbar APIs historically represented the visibility of a browser user interface. For privacy reasons, it now represents whether the window is a pop-up.", description_html: "The <code>visible</code> property of the <code>window.locationbar</code>, <code>window.menubar</code>, <code>window.personalbar</code>, <code>window.scrollbars</code>, <code>window.statusbar</code>, and <code>window.toolbar</code> APIs historically represented the visibility of a browser user interface. For privacy reasons, it now represents whether the window is a pop-up.", kind: "feature", name: "BarProp", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#browser-interface-elements"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.BarProp": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.BarProp.visible": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.BarProp.visible.returns_popup": { baseline: false, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "96", firefox_android: "96" } }, "api.Window.locationbar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.menubar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.personalbar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.scrollbars": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.statusbar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.toolbar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, base: { compat_features: ["api.HTMLBaseElement", "api.HTMLBaseElement.href", "api.HTMLBaseElement.target", "html.elements.base", "html.elements.base.href", "html.elements.base.href.forbid_data_javascript_urls", "html.elements.base.href.relative_url", "html.elements.base.target"], description: "The <base> element sets the base URL (the URL that relative URLs are relative to) for all relative URLs in the document.", description_html: "The <code>&#x3C;base></code> element sets the base URL (the URL that relative URLs are relative to) for all relative URLs in the document.", group: ["html-elements"], kind: "feature", name: "<base>", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#the-base-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLBas\
eElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLBaseElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLBaseElement.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.base": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.base.href": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.base.href.forbid_data_javascript_urls": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "127", firefox_android: "127", safari: "13.1", safari_ios: "13.4" } }, "html.elements.base.href.relative_url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.base.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "2" } } }, base64encodedecode: { caniuse: ["atob-btoa"], compat_features: ["api.atob", "api.atob.worker_support", "api.btoa", "api.btoa.worker_support"], description: "The atob() and btoa() global functions encode and decode strings to and from base 64, respectively.", description_html: "The <code>atob()</code> and <code>btoa()</code> global functions encode and decode strings to and from base 64, respectively.", kind: "feature", name: "Base64 encoding and decoding", spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#atob"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "api.atob": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.atob.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "\
2016-09-20", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "4", firefox_android: "4", safari: "10", safari_ios: "10" } }, "api.btoa": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.btoa.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "4", firefox_android: "4", safari: "10", safari_ios: "10" } } }, support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "4", firefox_android: "4", safari: "10", safari_ios: "10" } } }, "baseline-shift": { compat_features: ["css.properties.baseline-shift", "css.properties.baseline-shift.baseline", "css.properties.baseline-shift.sub", "css.properties.baseline-shift.super"], description: "The baseline-shift CSS property sets the posi\
tion of an element relative to its dominant baseline.", description_html: "The <code>baseline-shift</code> CSS property sets the position of an element relative to its dominant baseline.", group: ["text"], kind: "feature", name: "baseline-shift", spec: ["https://drafts.csswg.org/css-inline-3/#baseline-shift-property"], status: { baseline: false, by_compat_key: { "css.properties.baseline-shift": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "149", firefox_android: "149", safari: "4", safari_ios: "3.2" } }, "css.properties.baseline-shift.baseline": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "4", safari_ios: "3.2" } }, "css.properties.baseline-shift.sub": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "149", firefox_android: "149", safari: "4", safari_ios: "3.2" } }, "css.properties.baseline-shift.super": {
    baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "149", firefox_android: "149", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "4", safari_ios: "3.2" } } }, "baseline-source": { compat_features: ["css.properties.baseline-source", "css.properties.baseline-source.auto", "css.properties.baseline-source.first", "css.properties.baseline-source.last"], description: "The baseline-source CSS property controls how inline-level boxes with multiple lines of text are aligned with the surrounding text. By default, which typographic baseline is used depends on the display property value.", description_html: "The <code>baseline-source</code> CSS property controls how inline-level boxes with multiple lines of text are aligned with the surrounding text. By default, which typographic baseline is used depends on the <code>display</code> property value.", kind: "feature", name: "\
baseline-source", spec: ["https://drafts.csswg.org/css-inline-3/#baseline-source"], status: { baseline: false, by_compat_key: { "css.properties.baseline-source": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "115", firefox_android: "115" } }, "css.properties.baseline-source.auto": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "115", firefox_android: "115" } }, "css.properties.baseline-source.first": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "115", firefox_android: "115" } }, "css.properties.baseline-source.last": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "115", firefox_android: "115" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "115", firefox_android: "115" } } }, battery: { caniuse: ["battery-status"], compat_features: ["api.BatteryManager", "api.BatteryManager.charging",
    "api.BatteryManager.chargingTime", "api.BatteryManager.chargingchange_event", "api.BatteryManager.chargingtimechange_event", "api.BatteryManager.dischargingTime", "api.BatteryManager.dischargingtimechange_event", "api.BatteryManager.level", "api.BatteryManager.levelchange_event", "api.BatteryManager.secure_context_required", "api.Navigator.getBattery", "api.Navigator.getBattery.secure_context_required"], description: "The navigator.getBattery() API obtains information about the device's battery, including charge level and status. Also known as the Battery API.", description_html: "The <code>navigator.getBattery()</code> API obtains information about the device's battery, including charge level and status. Also known as the Battery API.", kind: "feature", name: "Battery status", spec: ["https://w3c.github.io/battery/"], status: { baseline: false, by_compat_key: { "api.BatteryManager": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManag\
er.charging": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManager.chargingTime": { baseline: false, support: { chrome: "38", chrome_android: "42", edge: "79" } }, "api.BatteryManager.chargingchange_event": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManager.chargingtimechange_event": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManager.dischargingTime": { baseline: false, support: { chrome: "38", chrome_android: "42", edge: "79" } }, "api.BatteryManager.dischargingtimechange_event": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManager.level": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManager.levelchange_event": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.BatteryManager.secure_context_required": { baseline: false,
    support: { chrome: "103", chrome_android: "103", edge: "103" } }, "api.Navigator.getBattery": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79" } }, "api.Navigator.getBattery.secure_context_required": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103" } } }, support: { chrome: "38", chrome_android: "38", edge: "79" } } }, bdi: { compat_features: ["html.elements.bdi"], description: "The <bdi> element isolates text that may have a different text direction from its surrounding text. This prevents the browser's bidirectional text algorithm from affecting or being affected by the direction of the surrounding text.", description_html: "The <code>&#x3C;bdi></code> element isolates text that may have a different text direction from its surrounding text. This prevents the browser's bidirectional text algorithm from affecting or being affected by the direction of the surrounding text.", group: ["html-elements"], kind: "feature", name: "\
<bdi>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-bdi-element"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "html.elements.bdi": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "16", chrome_android: "18", edge: "79", firefox: "10", firefox_android: "10", safari: "6", safari_ios: "6" } } }, support: { chrome: "16", chrome_android: "18", edge: "79", firefox: "10", firefox_android: "10", safari: "6", safari_ios: "6" } } }, bdo: { compat_features: ["html.elements.bdo"], description: "The <bdo> element overrides the directionality of text, so that the text within is rendered in a different direction than the surrounding text.", description_html: "The <code>&#x3C;bdo></code> element overrides the directionality of text, so that the text within is rendered in a different direction than the surrounding text.", group: ["html-elements"],
    kind: "feature", name: "<bdo>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-bdo-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.bdo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "≤15", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "≤15", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "≤4", safari_ios: "≤3.2" } } }, beacons: { caniuse: ["beacon"], compat_features: ["api.Navigator.sendBeacon"], description: "The navigator.sendBeacon() method asynchronously sends an HTTP POST request with a limited amount of data, typically for app state, events, and analytics data. The one-way beacon is guaranteed to be initiated before the browser unloads the page, but the sender does not g\
et to handle the response.", description_html: "The <code>navigator.sendBeacon()</code> method asynchronously sends an HTTP POST request with a limited amount of data, typically for app state, events, and analytics data. The one-way beacon is guaranteed to be initiated before the browser unloads the page, but the sender does not get to handle the response.", kind: "feature", name: "Beacons", spec: ["https://w3c.github.io/beacon/"], status: { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", by_compat_key: { "api.Navigator.sendBeacon": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "39", chrome_android: "42", edge: "14", firefox: "31", firefox_android: "31", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "39", chrome_android: "42", edge: "14", firefox: "31", firefox_android: "31", safari: "11.1", safari_ios: "11.3" } } }, "before-after": { caniuse: ["css-gencontent"], compat_features: [
    "css.selectors.after", "css.selectors.after.animation_and_transition_support", "css.selectors.before", "css.selectors.before.animation_and_transition_support"], description: "The ::before and ::after CSS pseudo-elements select inline boxes preceding and following an element. They are often used with the content property to generate cosmetic content.", description_html: "The <code>::before</code> and <code>::after</code> CSS pseudo-elements select inline boxes preceding and following an element. They are often used with the <code>content</code> property to generate cosmetic content.", kind: "feature", name: "::before and ::after", spec: ["https://drafts.csswg.org/css-pseudo-4/#generated-content"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.after": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.selectors.after.animation_and_transition_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "css.selectors.before": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "css.selectors.before.animation_and_transition_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, beforeinstallprompt: {
    compat_features: ["api.BeforeInstallPromptEvent", "api.BeforeInstallPromptEvent.BeforeInstallPromptEvent", "api.BeforeInstallPromptEvent.platforms", "api.BeforeInstallPromptEvent.prompt", "api.BeforeInstallPromptEvent.userChoice", "api.Window.appinstalled_event", "api.Window.beforeinstallprompt_event"], description: "The beforeinstallprompt event fires when a Progressive Web App (PWA) is installable. You can cancel the event and later call event.prompt() to control when the installation prompt is shown. The appinstalled event fires when the PWA is successfully installed.", description_html: "The <code>beforeinstallprompt</code> event fires when a Progressive Web App (PWA) is installable. You can cancel the event and later call <code>event.prompt()</code> to control when the installation prompt is shown. The <code>appinstalled</code> event fires when the PWA is successfully installed.", group: ["progressive-web-app"], kind: "feature", name: "beforeinstallprompt", spec: ["https://wic\
g.github.io/manifest-incubations/#installation-events"], status: { baseline: false, by_compat_key: { "api.BeforeInstallPromptEvent": { baseline: false, support: { chrome: "44", chrome_android: "44", edge: "79" } }, "api.BeforeInstallPromptEvent.BeforeInstallPromptEvent": { baseline: false, support: { chrome: "44", chrome_android: "44", edge: "79" } }, "api.BeforeInstallPromptEvent.platforms": { baseline: false, support: { chrome: "44", chrome_android: "44", edge: "79" } }, "api.BeforeInstallPromptEvent.prompt": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79" } }, "api.BeforeInstallPromptEvent.userChoice": { baseline: false, support: { chrome: "44", chrome_android: "44", edge: "79" } }, "api.Window.appinstalled_event": { baseline: false, support: { chrome: "64", chrome_android: "57", edge: "79" } }, "api.Window.beforeinstallprompt_event": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } } }, support: { chrome: "76", chrome_android: "\
76", edge: "79" } } }, beforeunload: { compat_features: ["api.BeforeUnloadEvent", "api.BeforeUnloadEvent.user_interaction", "api.Window.beforeunload_event", "api.Window.beforeunload_event.preventdefault_activation"], description: "The beforeunload event is fired when the current window is about to be unloaded. Typically this is used to display a dialog to confirm if users really want to leave the page when there is unsaved data that would be lost.", description_html: "The <code>beforeunload</code> event is fired when the current window is about to be unloaded. Typically this is used to display a dialog to confirm if users really want to leave the page when there is unsaved data that would be lost.", kind: "feature", name: "beforeunload", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-beforeunloadevent-interface"], status: { baseline: false, by_compat_key: { "api.BeforeUnloadEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-\
07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "1.5", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.BeforeUnloadEvent.user_interaction": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.Window.beforeunload_event": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3" } }, "api.Window.beforeunload_event.preventdefault_activation": { baseline: false, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "6", firefox_android: "6", safari: "11" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3" } } }, "bfcache-blocking-reasons": { compat_features: ["api.NotRestoredReasonDetails", "api.NotRestoredReasonDetails.reason", "api.Not\
RestoredReasonDetails.toJSON", "api.NotRestoredReasons", "api.NotRestoredReasons.children", "api.NotRestoredReasons.id", "api.NotRestoredReasons.name", "api.NotRestoredReasons.reasons", "api.NotRestoredReasons.src", "api.NotRestoredReasons.toJSON", "api.NotRestoredReasons.url", "api.PerformanceNavigationTiming.notRestoredReasons"], description: "The notRestoredReasons property of a PerformanceNavigationTiming object explains why the current document was blocked from using the back/forward cache (also known as the bfcache) on navigation.", description_html: "The <code>notRestoredReasons</code> property of a <code>PerformanceNavigationTiming</code> object explains why the current document was blocked from using the back/forward cache (also known as the bfcache) on navigation.", group: ["performance"], kind: "feature", name: "Back/forward cache blocking reasons", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-notrestoredreasons-interface"], status: { baseline: false,
    by_compat_key: { "api.NotRestoredReasonDetails": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasonDetails.reason": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasonDetails.toJSON": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.children": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.id": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.name": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.reasons": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.src": { baseline: false,
    support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.toJSON": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.NotRestoredReasons.url": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.PerformanceNavigationTiming.notRestoredReasons": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } } }, support: { chrome: "125", chrome_android: "125", edge: "125" } } }, bigint: { caniuse: ["bigint"], compat_features: ["javascript.builtins.BigInt", "javascript.builtins.BigInt.BigInt", "javascript.builtins.BigInt.asIntN", "javascript.builtins.BigInt.asUintN", "javascript.builtins.BigInt.toString", "javascript.builtins.BigInt.valueOf"], description: "The BigInt JavaScript type represents integers of any size, including integers too large for the primitive Number type.", description_html: "The <code>BigInt</code> JavaScript type represents integers of a\
ny size, including integers too large for the primitive <code>Number</code> type.", group: ["javascript"], kind: "feature", name: "BigInt", snapshot: ["ecmascript-2020"], spec: ["https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-bigint-objects"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "javascript.builtins.BigInt": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.BigInt": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.asIntN": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16",
    support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.asUintN": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.toString": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.valueOf": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } } }, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "\
68", safari: "14", safari_ios: "14" } } }, bigint64array: { compat_features: ["javascript.builtins.BigInt64Array", "javascript.builtins.BigInt64Array.BigInt64Array", "javascript.builtins.BigUint64Array", "javascript.builtins.BigUint64Array.BigUint64Array", "javascript.builtins.DataView.getBigInt64", "javascript.builtins.DataView.getBigUint64", "javascript.builtins.DataView.setBigInt64", "javascript.builtins.DataView.setBigUint64"], description: "The BigInt64Array and BigUint64Array typed arrays represent 64-bit integers, signed and unsigned respectively.", description_html: "The <code>BigInt64Array</code> and <code>BigUint64Array</code> typed arrays represent 64-bit integers, signed and unsigned respectively.", group: ["javascript"], kind: "feature", name: "BigInt64Array", snapshot: ["ecmascript-2020"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-typedarray-objects"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20",
    by_compat_key: { "javascript.builtins.BigInt64Array": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.BigInt64Array.BigInt64Array": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.BigUint64Array": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.BigUint64Array.BigUint64Array": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "\
79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.DataView.getBigInt64": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.DataView.getBigUint64": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.DataView.setBigInt64": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "javascript.builtins.DataView.setBigUint64": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-2\
0", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } } }, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } } }, "blocking-render": { compat_features: ["api.HTMLLinkElement.blocking", "api.HTMLScriptElement.blocking", "api.HTMLStyleElement.blocking", "html.elements.link.blocking", "html.elements.script.blocking", "html.elements.style.blocking"], description: 'The blocking="render" attribute for <link>, <script>, and <style> elements blocks rendering until the external script or stylesheet has been loaded. For <link rel="expect">, rendering is blocked until a specific element is in the DOM.', description_html: 'The <code>blocking="render"</code> attribute for <code>&#x3C;link></code>, <code>&#x3C;script></code>, and <code>&#x3C;style></code> elements blocks rendering until the external script or stylesheet has been loaded. For <\
code>&#x3C;link rel="expect"></code>, rendering is blocked until a specific element is in the DOM.', group: ["html"], kind: "feature", name: 'blocking="render"', spec: ["https://html.spec.whatwg.org/multipage/urls-and-fetching.html#blocking-attributes"], status: { baseline: false, by_compat_key: { "api.HTMLLinkElement.blocking": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "18.2", safari_ios: "18.2" } }, "api.HTMLScriptElement.blocking": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "18.2", safari_ios: "18.2" } }, "api.HTMLStyleElement.blocking": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "18.2", safari_ios: "18.2" } }, "html.elements.link.blocking": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "18.2", safari_ios: "18.2" } }, "html.elements.script.blocking": { baseline: false, support: { chrome: "105", chrome_android: "\
105", edge: "105", safari: "18.2", safari_ios: "18.2" } }, "html.elements.style.blocking": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "18.2", safari_ios: "18.2" } } }, blockquote: { compat_features: ["html.elements.blockquote", "html.elements.blockquote.cite"], description: "The <blockquote> element represents an extended quotation, styling contents as an indented block by default.", description_html: "The <code>&#x3C;blockquote></code> element represents an extended quotation, styling contents as an indented block by default.", group: ["html-elements"], kind: "feature", name: "<blockquote>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-blockquote-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.blockquote": { baseline: "hi\
gh", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.blockquote.cite": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, bmp: { compat_features: ["mediatypes.image.bmp"], description: "The BMP image format is an uncompressed raster graphics file format. Also known as a bitmap.", description_html: "The BMP image format is an uncompressed raster graphics file format. Also known as a bitmap.", kind: "feature", name: "BMP", spec: ["https://www.rfc-editor.org/rfc/rfc7903#section-1.2"], status: { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "mediatypes.image.bmp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, body: { compat_features: ["api.HTMLBodyElement", "html.elements.body"], description: "The <body> element represents the content of an HTML document.", description_html: "The <code>&#x3C;body></code> element represents the content of an HTML document.", group: ["html-elements"], kind: "feature", name: "<body>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-body-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLBodyElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.body": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "border-image": { caniuse: ["border-image"], compat_features: ["css.properties.border-image", "css.properties.border-image-outset", "css.properties.border-image-repeat", "css.properties.border-image-repeat.repeat", "css.properties.border-image-repeat.round", "css.properties.border-image-repeat.space", "css.properties.border-image-repeat.stretch", "css.properties.border-image-slice", "css.properties.border-image-source", "css.properties.border-image-widt\
h", "css.properties.border-image-width.auto", "css.properties.border-image.fill", "css.properties.border-image.gradient", "css.properties.border-image.none", "css.properties.border-image.optional_border_image_slice", "css.properties.border-image.repeat", "css.properties.border-image.round", "css.properties.border-image.space", "css.properties.border-image.stretch"], description: "The border-image CSS property draws an image around an element.", description_html: "The <code>border-image</code> CSS property draws an image around an element.", group: ["borders-outlines"], kind: "feature", name: "Border images", spec: ["https://drafts.csswg.org/css-backgrounds-3/#border-images"], status: { baseline: "high", baseline_high_date: "2019-08-01", baseline_low_date: "2017-02-01", by_compat_key: { "css.properties.border-image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "\
15", safari: "6", safari_ios: "6" } }, "css.properties.border-image-outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image-repeat": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "9.3" } }, "css.properties.border-image-repeat.repeat": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "9.3" } }, "css.properties.border-image-repeat.round": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "30", chrome_android: "30", edge: "\
12", firefox: "15", firefox_android: "15", safari: "9.1", safari_ios: "9.3" } }, "css.properties.border-image-repeat.space": { baseline: "high", baseline_high_date: "2019-08-01", baseline_low_date: "2017-02-01", support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "50", firefox_android: "50", safari: "9.1", safari_ios: "9.3" } }, "css.properties.border-image-repeat.stretch": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "9.3" } }, "css.properties.border-image-slice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image-source": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "15", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "6", safari_ios: "6" } }, "css.properties.border-image-width.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.fill": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.gradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "css.properties.border-image.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.optional_border_image_slice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.repeat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.round": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.space": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } }, "css.properties.border-image.stretch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "6", safari_ios: "6" } } }, support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "50", firefox_android: "50", safari: "9.1", safari_ios: "9.3" } } }, "border-radius": { caniuse: ["border-radius"], compat_features: ["css.properties.border-bottom-left-radius", "css.properties.border-bottom-left-radius.elliptical_corners", "\
css.properties.border-bottom-left-radius.percentages", "css.properties.border-bottom-right-radius", "css.properties.border-bottom-right-radius.elliptical_corners", "css.properties.border-bottom-right-radius.percentages", "css.properties.border-radius", "css.properties.border-radius.4_values_for_4_corners", "css.properties.border-radius.elliptical_borders", "css.properties.border-radius.percentages", "css.properties.border-top-left-radius", "css.properties.border-top-left-radius.elliptical_corners", "css.properties.border-top-left-radius.percentages", "css.properties.border-top-right-radius", "css.properties.border-top-right-radius.elliptical_corners", "css.properties.border-top-right-radius.percentages"], description: "The border-radius CSS property rounds the corners of the border drawn around an element.", description_html: "The <code>border-radius</code> CSS property rounds the corners of the border drawn around an element.", group: ["borders-outlines"], kind: "feature", name: "bord\
er-radius", spec: ["https://drafts.csswg.org/css-backgrounds-3/#corners"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.border-bottom-left-radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-bottom-left-radius.elliptical_corners": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-bottom-left-radius.percentages": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } },
    "css.properties.border-bottom-right-radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-bottom-right-radius.elliptical_corners": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-bottom-right-radius.percentages": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "\
4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-radius.4_values_for_4_corners": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-radius.elliptical_borders": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-radius.percentages": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.properties.border-top-left-radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-top-left-radius.elliptical_corners": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-top-left-radius.percentages": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-top-right-radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-top-right-radius.elliptical_corners": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.border-top-right-radius.percentages": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, "border-shape": { compat_features: ["css.properties.border-shape", "css.properties.border-shape.none"], description: "The border-shape CSS property sets the geometry of the border box, changing the shape of any applicable border, border image, focus outline, or shadow.", description_html: "The <code>border-shape</code> CSS property sets the geometry of the border box, changing the shape o\
f any applicable border, border image, focus outline, or shadow.", kind: "feature", name: "border-shape", spec: ["https://drafts.csswg.org/css-borders-4/#border-shape"], status: { baseline: false, by_compat_key: { "css.properties.border-shape": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "css.properties.border-shape.none": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } } }, support: { chrome: "147", chrome_android: "147", edge: "147" } } }, borders: { compat_features: ["css.properties.border", "css.properties.border-bottom", "css.properties.border-bottom-color", "css.properties.border-bottom-color.transparent", "css.properties.border-bottom-style", "css.properties.border-bottom-style.dashed", "css.properties.border-bottom-style.dotted", "css.properties.border-bottom-style.double", "css.properties.border-bottom-style.groove", "css.properties.border-bottom-style.hidden", "css.properties.border-bottom-style.inset",
    "css.properties.border-bottom-style.none", "css.properties.border-bottom-style.outset", "css.properties.border-bottom-style.ridge", "css.properties.border-bottom-style.solid", "css.properties.border-bottom-width", "css.properties.border-bottom-width.medium", "css.properties.border-bottom-width.thick", "css.properties.border-bottom-width.thin", "css.properties.border-bottom.dashed", "css.properties.border-bottom.dotted", "css.properties.border-bottom.double", "css.properties.border-bottom.groove", "css.properties.border-bottom.hidden", "css.properties.border-bottom.inset", "css.properties.border-bottom.medium", "css.properties.border-bottom.none", "css.properties.border-bottom.outset", "css.properties.border-bottom.ridge", "css.properties.border-bottom.solid", "css.properties.border-bottom.thick", "css.properties.border-bottom.thin", "css.properties.border-bottom.transparent", "css.properties.border-color", "css.properties.border-color.transparent", "css.properties.border-left", "cs\
s.properties.border-left-color", "css.properties.border-left-color.transparent", "css.properties.border-left-style", "css.properties.border-left-style.dashed", "css.properties.border-left-style.dotted", "css.properties.border-left-style.double", "css.properties.border-left-style.groove", "css.properties.border-left-style.hidden", "css.properties.border-left-style.inset", "css.properties.border-left-style.none", "css.properties.border-left-style.outset", "css.properties.border-left-style.ridge", "css.properties.border-left-style.solid", "css.properties.border-left-width", "css.properties.border-left-width.medium", "css.properties.border-left-width.thick", "css.properties.border-left-width.thin", "css.properties.border-left.dashed", "css.properties.border-left.dotted", "css.properties.border-left.double", "css.properties.border-left.groove", "css.properties.border-left.hidden", "css.properties.border-left.inset", "css.properties.border-left.medium", "css.properties.border-left.none", "cs\
s.properties.border-left.outset", "css.properties.border-left.ridge", "css.properties.border-left.solid", "css.properties.border-left.thick", "css.properties.border-left.thin", "css.properties.border-left.transparent", "css.properties.border-right", "css.properties.border-right-color", "css.properties.border-right-color.transparent", "css.properties.border-right-style", "css.properties.border-right-style.dashed", "css.properties.border-right-style.dotted", "css.properties.border-right-style.double", "css.properties.border-right-style.groove", "css.properties.border-right-style.hidden", "css.properties.border-right-style.inset", "css.properties.border-right-style.none", "css.properties.border-right-style.outset", "css.properties.border-right-style.ridge", "css.properties.border-right-style.solid", "css.properties.border-right-width", "css.properties.border-right-width.medium", "css.properties.border-right-width.thick", "css.properties.border-right-width.thin", "css.properties.border-rig\
ht.dashed", "css.properties.border-right.dotted", "css.properties.border-right.double", "css.properties.border-right.groove", "css.properties.border-right.hidden", "css.properties.border-right.inset", "css.properties.border-right.medium", "css.properties.border-right.none", "css.properties.border-right.outset", "css.properties.border-right.ridge", "css.properties.border-right.solid", "css.properties.border-right.thick", "css.properties.border-right.thin", "css.properties.border-right.transparent", "css.properties.border-style", "css.properties.border-style.dashed", "css.properties.border-style.dotted", "css.properties.border-style.double", "css.properties.border-style.groove", "css.properties.border-style.hidden", "css.properties.border-style.inset", "css.properties.border-style.none", "css.properties.border-style.outset", "css.properties.border-style.ridge", "css.properties.border-style.solid", "css.properties.border-top", "css.properties.border-top-color", "css.properties.border-top-\
color.transparent", "css.properties.border-top-style", "css.properties.border-top-style.dashed", "css.properties.border-top-style.dotted", "css.properties.border-top-style.double", "css.properties.border-top-style.groove", "css.properties.border-top-style.hidden", "css.properties.border-top-style.inset", "css.properties.border-top-style.none", "css.properties.border-top-style.outset", "css.properties.border-top-style.ridge", "css.properties.border-top-style.solid", "css.properties.border-top-width", "css.properties.border-top-width.medium", "css.properties.border-top-width.thick", "css.properties.border-top-width.thin", "css.properties.border-top.dashed", "css.properties.border-top.dotted", "css.properties.border-top.double", "css.properties.border-top.groove", "css.properties.border-top.hidden", "css.properties.border-top.inset", "css.properties.border-top.medium", "css.properties.border-top.none", "css.properties.border-top.outset", "css.properties.border-top.ridge", "css.properties.\
border-top.solid", "css.properties.border-top.thick", "css.properties.border-top.thin", "css.properties.border-top.transparent", "css.properties.border-width", "css.properties.border-width.medium", "css.properties.border-width.thick", "css.properties.border-width.thin", "css.properties.border.dashed", "css.properties.border.dotted", "css.properties.border.double", "css.properties.border.groove", "css.properties.border.hidden", "css.properties.border.inset", "css.properties.border.medium", "css.properties.border.none", "css.properties.border.outset", "css.properties.border.ridge", "css.properties.border.solid", "css.properties.border.thick", "css.properties.border.thin", "css.properties.border.transparent", "css.types.line-style"], description: "The border CSS property sets the color, style, and width of the line around an element.", description_html: "The <code>border</code> CSS property sets the color, style, and width of the line around an element.", group: ["borders-outlines"], kind: "\
feature", name: "Borders", spec: ["https://drafts.csswg.org/css-backgrounds-3/#borders"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.border": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-color.transparent": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bo\
ttom-style.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "css.properties.border-bottom-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-style.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-width.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-width.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom-width.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-bottom.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-style.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-left-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left-width.medium": { baseline: "high", baseline_high_date: "2018-01\
-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left-width.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left-width.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.dotted": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.inset": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.ridge": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-left.transparent": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-right": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-right-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.groove": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.\
properties.border-right-style.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-style.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "css.properties.border-right-width.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-right-width.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-right-width.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-right.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
14", safari: "1", safari_ios: "1" } }, "css.properties.border-right.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "1" } }, "css.properties.border-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-style.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.border-top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-style.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-width.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-width.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top-width.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-top.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "css.properties.border-width.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "css.properties.border-width.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "css.properties.border-width.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "css.properties.border.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.border.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.line-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "14", safari: "1", safari_ios: "3" } } }, "box-decoration-break": { caniuse: ["css-boxdecorationbre\
ak"], compat_features: ["css.properties.box-decoration-break", "css.properties.box-decoration-break.clone", "css.properties.box-decoration-break.slice"], description: "The box-decoration-break CSS property sets whether box decorations, such as borders or backgrounds, of an element divided across a page, column, or region wraps each fragment or splits across the break.", description_html: "The <code>box-decoration-break</code> CSS property sets whether box decorations, such as borders or backgrounds, of an element divided across a page, column, or region wraps each fragment or splits across the break.", kind: "feature", name: "box-decoration-break", spec: ["https://drafts.csswg.org/css-break-4/#break-decoration"], status: { baseline: false, by_compat_key: { "css.properties.box-decoration-break": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "32", firefox_android: "32" } }, "css.properties.box-decoration-break.clone": { baseline: false, support: {
    chrome: "130", chrome_android: "130", edge: "130", firefox: "32", firefox_android: "32" } }, "css.properties.box-decoration-break.slice": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "32", firefox_android: "32" } } }, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "32", firefox_android: "32" } } }, "box-shadow": { caniuse: ["css-boxshadow"], compat_features: ["css.properties.box-shadow", "css.properties.box-shadow.inset", "css.properties.box-shadow.multiple_shadows", "css.properties.box-shadow.none", "css.properties.box-shadow.spread_radius"], description: "The box-shadow CSS property applies shadow effects around an element's frame. This can create drop shadow and inner shadow effects.", description_html: "The <code>box-shadow</code> CSS property applies shadow effects around an element's frame. This can create drop shadow and inner shadow effects.", group: ["background"], kind: "feature", name: "box-shadow", spec: [
    "https://drafts.csswg.org/css-backgrounds-3/#box-shadow"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.box-shadow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.properties.box-shadow.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.properties.box-shadow.multiple_shadows": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.properties.box-shadow.none": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.properties.box-shadow.spread_radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, "box-sizing": { caniuse: ["css3-boxsizing"], compat_features: ["css.properties.box-sizing", "css.properties.box-sizing.border-box", "css.properties.box-sizing.content-box"], description: "The box-sizing CSS property sets whether an element's width and height are calculated based on the content-box, which does not count the size of borders or padding, or border-box, which does count them.", description_html: "The <code>box-s\
izing</code> CSS property sets whether an element's width and height are calculated based on the <code>content-box</code>, which does not count the size of borders or padding, or <code>border-box</code>, which does count them.", group: ["layout"], kind: "feature", name: "box-sizing", spec: ["https://drafts.csswg.org/css-sizing-3/#propdef-box-sizing"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.box-sizing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "5.1", safari_ios: "6" } }, "css.properties.box-sizing.border-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "5.1", safari_ios: "6" } }, "css.properties.box-sizin\
g.content-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "5.1", safari_ios: "6" } } }, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "5.1", safari_ios: "6" } } }, br: { compat_features: ["api.HTMLBRElement", "html.elements.br"], description: "The <br> element produces line breaks in text.", description_html: "The <code>&#x3C;br></code> element produces line breaks in text.", group: ["html-elements"], kind: "feature", name: "<br>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-br-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLBRElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.br": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "broadcast-channel": { caniuse: ["broadcastchannel"], compat_features: ["api.BroadcastChannel", "api.BroadcastChannel.BroadcastChannel", "api.BroadcastChannel.close", "api.BroadcastChannel.message_event", "api.BroadcastChannel.messageerror_event", "api.BroadcastChannel.name", "api.BroadcastChannel.postMessage"], description: "The BroadcastChannel API allows you to send messages between same-origin browsing contexts, such as between the same page loaded in multiple tabs.", description_html: "The <code>BroadcastChannel</code> API allows you to\
 send messages between same-origin browsing contexts, such as between the same page loaded in multiple tabs.", group: ["messaging"], kind: "feature", name: "BroadcastChannel", spec: ["https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "api.BroadcastChannel": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } }, "api.BroadcastChannel.BroadcastChannel": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } }, "api.BroadcastChannel.close": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "\
2022-03-14", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } }, "api.BroadcastChannel.message_event": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } }, "api.BroadcastChannel.messageerror_event": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "57", firefox_android: "57", safari: "15.4", safari_ios: "15.4" } }, "api.BroadcastChannel.name": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } }, "api.BroadcastChannel.postMessage": { baseline: "high", baseline_high_date: "\
2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "38", firefox_android: "38", safari: "15.4", safari_ios: "15.4" } } }, brotli: { caniuse: ["brotli"], compat_features: ["http.headers.Accept-Encoding.br", "http.headers.Content-Encoding.br"], description: "Brotli is a lossless data compression algorithm. When used as a content encoding, it often provides better compression than gzip.", description_html: "Brotli is a lossless data compression algorithm. When used as a content encoding, it often provides better compression than gzip.", kind: "feature", name: "Brotli compression", spec: ["https://www.rfc-editor.org/rfc/rfc7932"], status: { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", by_compat_key: { "http.headers.Accept-Encoding.br": { baseline: "hig\
h", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "50", chrome_android: "51", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "http.headers.Content-Encoding.br": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "50", chrome_android: "51", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } } }, support: { chrome: "50", chrome_android: "51", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } } }, button: { compat_features: ["api.HTMLButtonElement", "api.HTMLButtonElement.disabled", "api.HTMLButtonElement.form", "api.HTMLButtonElement.formAction", "api.HTMLButtonElement.formEnctype", "api.HTMLButtonElement.formMethod", "api.HTMLButtonElement.formNoValidate", "api.HTMLButtonElement.formTarget", "api.HTMLButtonElement.labels", "api.HTMLButtonElement.name", "api.HTMLButtonElement.type", "api.HTML\
ButtonElement.value", "html.elements.button", "html.elements.button.disabled", "html.elements.button.form", "html.elements.button.formaction", "html.elements.button.formenctype", "html.elements.button.formmethod", "html.elements.button.formnovalidate", "html.elements.button.formtarget", "html.elements.button.name", "html.elements.button.type", "html.elements.button.value"], description: "The <button> HTML element represents a button that triggers some action, such as submitting a form or opening a dialog, styled as a labeled rectangular box by default.", description_html: "The <code>&#x3C;button></code> HTML element represents a button that triggers some action, such as submitting a form or opening a dialog, styled as a labeled rectangular box by default.", group: ["forms", "html-elements"], kind: "feature", name: "<button>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", by_compat_key: { "api.HTMLButtonElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLButtonElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLButtonElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLButtonElement.formAction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "\
5" } }, "api.HTMLButtonElement.formEnctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLButtonElement.formMethod": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLButtonElement.formNoValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLButtonElement.formTarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1",
    safari_ios: "5" } }, "api.HTMLButtonElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "5.1", safari_ios: "5" } }, "api.HTMLButtonElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLButtonElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLButtonElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "html.elements.button": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.button.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.button.form": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "9", chrome_android: "18", edge: "16", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.button.formaction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } },
    "html.elements.button.formenctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.button.formmethod": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.button.formnovalidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.button.formtarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "\
5" } }, "html.elements.button.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.button.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.button.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, calc: { caniuse: ["calc"], compat_features: ["css.types.calc", "css.types.calc.gradient_color_stops", "\
css.types.calc.nested", "css.types.calc.number_values"], description: "The calc() CSS function computes mathematical expressions such a calc(100%/3 - 1em).", description_html: "The <code>calc()</code> CSS function computes mathematical expressions such a <code>calc(100%/3 - 1em)</code>.", group: ["css"], kind: "feature", name: "calc()", spec: ["https://drafts.csswg.org/css-values-3/#calc-notation"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.calc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "28", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.calc.gradient_color_stops": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "28", edge: "12", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "\
7" } }, "css.types.calc.nested": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "css.types.calc.number_values": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "48", firefox_android: "48", safari: "7", safari_ios: "7" } } }, support: { chrome: "26", chrome_android: "28", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } } }, "calc-constants": { compat_features: ["css.types.calc-keyword", "css.types.calc-keyword.NaN", "css.types.calc-keyword.e", "css.types.calc-keyword.infinity", "css.types.calc-keyword.pi"], description: "The e, pi, infinity, and NaN keywords represent well-defined constants accepted in CSS math functions such as calc().", description_html: "The <code>e</code>, <c\
ode>pi</code>, <code>infinity</code>, and <code>NaN</code> keywords represent well-defined constants accepted in CSS math functions such as <code>calc()</code>.", group: ["css"], kind: "feature", name: "calc() keywords", spec: ["https://drafts.csswg.org/css-values-4/#calc-keywords"], status: { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", by_compat_key: { "css.types.calc-keyword": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.calc-keyword.NaN": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "114", firefox_android: "114", safari: "16", safari_ios: "16" } }, "css.types.calc-keyword.e": { baseline: "high", baseline_high_date: "2025-08-09", baseline_low_date: "\
2023-02-09", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.calc-keyword.infinity": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "114", firefox_android: "114", safari: "16", safari_ios: "16" } }, "css.types.calc-keyword.pi": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "114", firefox_android: "114", safari: "16", safari_ios: "16" } } }, "calc-size": { compat_features: ["css.types.calc-size"], description: "The calc-size() CSS function computes mathematical expressions that include height and width keyword values, for exam\
ple calc-size(fit-content, size / 2). Not to be confused with the calc() CSS function, which cannot use keyword values.", description_html: "The <code>calc-size()</code> CSS function computes mathematical expressions that include <code>height</code> and <code>width</code> keyword values, for example <code>calc-size(fit-content, size / 2)</code>. Not to be confused with the <code>calc()</code> CSS function, which cannot use keyword values.", group: ["css"], kind: "feature", name: "calc-size()", spec: ["https://drafts.csswg.org/css-values-5/#calc-size"], status: { baseline: false, by_compat_key: { "css.types.calc-size": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, canvas: { compat_features: ["api.HTMLCanvasElement", "api.HTMLCanvasElement.getContext", "api.HTMLCanvasElement.height", "api.HTMLCanvasElement.toBlob", "api.HTMLCanvasElement.toBlob.type_parameter_jpeg", "api.HTMLCanva\
sElement.toDataURL", "api.HTMLCanvasElement.toDataURL.type_parameter_jpeg", "api.HTMLCanvasElement.width", "html.elements.canvas", "html.elements.canvas.height", "html.elements.canvas.width"], description: "The <canvas> HTML element is a space to draw graphics in, using the 2D canvas API, WebGL, or WebGPU.", description_html: "The <code>&#x3C;canvas></code> HTML element is a space to draw graphics in, using the 2D canvas API, WebGL, or WebGPU.", group: ["canvas", "html-elements"], kind: "feature", name: "<canvas>", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#canvas"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLCanvasElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.HTMLCanvasElement.getContext": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.HTMLCanvasElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLCanvasElement.toBlob": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "18", firefox_android: "18", safari: "11", safari_ios: "11" } }, "api.HTMLCanvasElement.toBlob.type_parameter_jpeg": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "18", firefox_android: "18", safari: "11", safari_ios: "11" } }, "api.HTMLCanvasElement.toDataURL": { baseline: "hig\
h", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.HTMLCanvasElement.toDataURL.type_parameter_jpeg": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "18", firefox_android: "18", safari: "11", safari_ios: "11" } }, "api.HTMLCanvasElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.canvas": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "html.elements.canvas.height": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "html.elements.canvas.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } } }, "canvas-2d": { compat_features: ["api.CanvasGradient", "api.CanvasGradient.addColorStop", "api.CanvasPattern", "api.CanvasPattern.setTransform", "api.CanvasPattern.setTransform.dommatrix", "api.CanvasRenderingContext2D", "api.CanvasRenderingContext2D.arc", "api.CanvasRenderingContext2D.arcTo", "api.CanvasRenderingContext2D.beginPath", "api.CanvasRenderingContext2D.bezierCurveTo", "api.CanvasRenderingContext2D.ca\
nvas", "api.CanvasRenderingContext2D.clearRect", "api.CanvasRenderingContext2D.clip", "api.CanvasRenderingContext2D.clip.path_parameter", "api.CanvasRenderingContext2D.closePath", "api.CanvasRenderingContext2D.createImageData", "api.CanvasRenderingContext2D.createLinearGradient", "api.CanvasRenderingContext2D.createPattern", "api.CanvasRenderingContext2D.createRadialGradient", "api.CanvasRenderingContext2D.direction", "api.CanvasRenderingContext2D.drawFocusIfNeeded", "api.CanvasRenderingContext2D.drawFocusIfNeeded.path_parameter", "api.CanvasRenderingContext2D.drawImage", "api.CanvasRenderingContext2D.drawImage.ImageBitmap_source_image", "api.CanvasRenderingContext2D.ellipse", "api.CanvasRenderingContext2D.fill", "api.CanvasRenderingContext2D.fill.path_parameter", "api.CanvasRenderingContext2D.fillRect", "api.CanvasRenderingContext2D.fillStyle", "api.CanvasRenderingContext2D.fillText", "api.CanvasRenderingContext2D.filter", "api.CanvasRenderingContext2D.font", "api.CanvasRenderingConte\
xt2D.fontKerning", "api.CanvasRenderingContext2D.fontStretch", "api.CanvasRenderingContext2D.fontVariantCaps", "api.CanvasRenderingContext2D.getContextAttributes", "api.CanvasRenderingContext2D.getImageData", "api.CanvasRenderingContext2D.getLineDash", "api.CanvasRenderingContext2D.getTransform", "api.CanvasRenderingContext2D.globalAlpha", "api.CanvasRenderingContext2D.globalCompositeOperation", "api.CanvasRenderingContext2D.imageSmoothingEnabled", "api.CanvasRenderingContext2D.imageSmoothingQuality", "api.CanvasRenderingContext2D.isPointInPath", "api.CanvasRenderingContext2D.isPointInPath.path_parameter", "api.CanvasRenderingContext2D.isPointInStroke", "api.CanvasRenderingContext2D.isPointInStroke.path_parameter", "api.CanvasRenderingContext2D.lang", "api.CanvasRenderingContext2D.letterSpacing", "api.CanvasRenderingContext2D.lineCap", "api.CanvasRenderingContext2D.lineDashOffset", "api.CanvasRenderingContext2D.lineJoin", "api.CanvasRenderingContext2D.lineTo", "api.CanvasRenderingConte\
xt2D.lineWidth", "api.CanvasRenderingContext2D.measureText", "api.CanvasRenderingContext2D.miterLimit", "api.CanvasRenderingContext2D.moveTo", "api.CanvasRenderingContext2D.putImageData", "api.CanvasRenderingContext2D.quadraticCurveTo", "api.CanvasRenderingContext2D.rect", "api.CanvasRenderingContext2D.resetTransform", "api.CanvasRenderingContext2D.restore", "api.CanvasRenderingContext2D.rotate", "api.CanvasRenderingContext2D.save", "api.CanvasRenderingContext2D.scale", "api.CanvasRenderingContext2D.setLineDash", "api.CanvasRenderingContext2D.setTransform", "api.CanvasRenderingContext2D.setTransform.matrix_parameter", "api.CanvasRenderingContext2D.shadowBlur", "api.CanvasRenderingContext2D.shadowColor", "api.CanvasRenderingContext2D.shadowOffsetX", "api.CanvasRenderingContext2D.shadowOffsetY", "api.CanvasRenderingContext2D.stroke", "api.CanvasRenderingContext2D.stroke.path_parameter", "api.CanvasRenderingContext2D.strokeRect", "api.CanvasRenderingContext2D.strokeStyle", "api.CanvasRend\
eringContext2D.strokeText", "api.CanvasRenderingContext2D.textAlign", "api.CanvasRenderingContext2D.textBaseline", "api.CanvasRenderingContext2D.textRendering", "api.CanvasRenderingContext2D.transform", "api.CanvasRenderingContext2D.translate", "api.CanvasRenderingContext2D.wordSpacing", "api.HTMLCanvasElement.getContext.2d_context", "api.ImageData", "api.ImageData.ImageData", "api.ImageData.colorSpace", "api.ImageData.data", "api.ImageData.height", "api.ImageData.width", "api.ImageData.worker_support", "api.Path2D", "api.Path2D.Path2D", "api.Path2D.addPath", "api.Path2D.arc", "api.Path2D.arcTo", "api.Path2D.bezierCurveTo", "api.Path2D.closePath", "api.Path2D.ellipse", "api.Path2D.lineTo", "api.Path2D.moveTo", "api.Path2D.quadraticCurveTo", "api.Path2D.rect", "api.Path2D.roundRect", "api.TextMetrics", "api.TextMetrics.actualBoundingBoxAscent", "api.TextMetrics.actualBoundingBoxDescent", "api.TextMetrics.actualBoundingBoxLeft", "api.TextMetrics.actualBoundingBoxRight", "api.TextMetrics.\
alphabeticBaseline", "api.TextMetrics.emHeightAscent", "api.TextMetrics.emHeightDescent", "api.TextMetrics.fontBoundingBoxAscent", "api.TextMetrics.fontBoundingBoxDescent", "api.TextMetrics.hangingBaseline", "api.TextMetrics.ideographicBaseline", "api.TextMetrics.width"], description: 'The CanvasRenderingContext2D API is the "2d" rendering context for the <canvas> element. It represents a flat, two-dimensional space for drawing graphics and animations.', description_html: 'The <code>CanvasRenderingContext2D</code> API is the "2d" rendering context for the <code>&#x3C;canvas></code> element. It represents a flat, two-dimensional space for drawing graphics and animations.', group: ["canvas"], kind: "feature", name: "2D canvas", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#2dcontext"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.CanvasGradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasGradient.addColorStop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasPattern": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasPattern.setTransform": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "33", firefox_android: "33", safari: "11.1", safari_ios: "11.3" } }, "api.CanvasPattern.setTransform.dommatrix": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "\
2020-07-28", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "79", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.CanvasRenderingContext2D": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.arc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.CanvasRenderingContext2D.arcTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.beginPath": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.bezierCurveTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.canvas": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.CanvasRenderingContext2D.clearRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.clip": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.clip.path_parameter": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.closePath": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.createImageData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "ap\
i.CanvasRenderingContext2D.createLinearGradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.createPattern": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.createRadialGradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.direction": { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "10\
1", firefox_android: "101", safari: "9", safari_ios: "9" } }, "api.CanvasRenderingContext2D.drawFocusIfNeeded": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "37", chrome_android: "37", edge: "14", firefox: "32", firefox_android: "32", safari: "8", safari_ios: "8" } }, "api.CanvasRenderingContext2D.drawFocusIfNeeded.path_parameter": { baseline: false, support: { chrome: "37", chrome_android: "37", edge: "14", safari: "8", safari_ios: "8" } }, "api.CanvasRenderingContext2D.drawImage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.drawImage.ImageBitmap_source_image": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "42", firefox_android: "\
42", safari: "15", safari_ios: "15" } }, "api.CanvasRenderingContext2D.ellipse": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "31", chrome_android: "31", edge: "13", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "api.CanvasRenderingContext2D.fill": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.fill.path_parameter": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.fillRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.fillStyle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.fillText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.filter": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "49", firefox_android: "49" } }, "api.CanvasRenderingContext2D.font": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "18.4", safari_ios: "18.4" } }, "api.CanvasRendering\
Context2D.fontKerning": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "104", firefox_android: "104" } }, "api.CanvasRenderingContext2D.fontStretch": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "117", firefox_android: "117" } }, "api.CanvasRenderingContext2D.fontVariantCaps": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "117", firefox_android: "117" } }, "api.CanvasRenderingContext2D.getContextAttributes": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "117", firefox_android: "117", safari: "15", safari_ios: "15" } }, "api.CanvasRenderingContext2D.getImageData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "4", safari_ios: "\
3.2" } }, "api.CanvasRenderingContext2D.getLineDash": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "27", firefox_android: "27", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.getTransform": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "70", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.CanvasRenderingContext2D.globalAlpha": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.globalCompositeOperation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "1\
2", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.imageSmoothingEnabled": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "30", chrome_android: "30", edge: "15", firefox: "51", firefox_android: "51", safari: "9.1", safari_ios: "9.3" } }, "api.CanvasRenderingContext2D.imageSmoothingQuality": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", safari: "9.1", safari_ios: "9.3" } }, "api.CanvasRenderingContext2D.isPointInPath": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.CanvasRenderingContext2D.isPointInPath.path_parameter": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "\
31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.isPointInStroke": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "26", chrome_android: "26", edge: "79", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.isPointInStroke.path_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.lang": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136" } }, "api.CanvasRenderingContext2D.letterSpacing": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "115", firefox_android: "115", safari: "18.4", safari_ios: "18.4" } }, "api.CanvasRenderingContext2D.li\
neCap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.lineDashOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "27", firefox_android: "27", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.lineJoin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.lineTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } },
    "api.CanvasRenderingContext2D.lineWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.measureText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.miterLimit": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.moveTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.putImageData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.quadraticCurveTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.CanvasRenderingContext2D.rect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.resetTransform": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "31", chrome_android: "31",
    edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.CanvasRenderingContext2D.restore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.rotate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.save": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.scale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.setLineDash": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "27", firefox_android: "27", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.setTransform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.setTransform.matrix_parameter": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "70", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.CanvasRenderingContext2D.shadowBlur": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.shadowColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.shadowOffsetX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.shadowOffsetY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.stroke": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.stroke.path_parameter": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.CanvasRenderingContext2D.strokeRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.strokeStyle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "\
1" } }, "api.CanvasRenderingContext2D.strokeText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.textAlign": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.textBaseline": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.CanvasRenderingContext2D.textRendering": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "116", firefox_android: "116" } }, "api.CanvasRenderingContext2D.transfo\
rm": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.CanvasRenderingContext2D.translate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.CanvasRenderingContext2D.wordSpacing": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "115", firefox_android: "115", safari: "18.4", safari_ios: "18.4" } }, "api.HTMLCanvasElement.getContext.2d_context": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } }, "api.ImageData": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ImageData.ImageData": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "api.ImageData.colorSpace": { baseline: false, support: { chrome: "92", chrome_android: "92", edge: "92", safari: "15.2", safari_ios: "15.2" } }, "api.ImageData.data": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ImageData.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ImageData.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ImageData.worker_support": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.Path2D": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.Path2D": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "\
31", safari: "8", safari_ios: "8" } }, "api.Path2D.addPath": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "api.Path2D.arc": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.arcTo": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.bezierCurveTo": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "\
api.Path2D.closePath": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.ellipse": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "api.Path2D.lineTo": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.moveTo": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.quadraticCurveTo": { baseline: "\
high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.rect": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.Path2D.roundRect": { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "112", firefox_android: "112", safari: "16", safari_ios: "16" } }, "api.TextMetrics": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "31", safari: "4", safari_ios: "3.2" } }, "api.TextMetrics.actualBoundingBoxAscent": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.actualBoundingBoxDescent": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.actualBoundingBoxLeft": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.actualBoundingBoxRight": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.a\
lphabeticBaseline": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "116", firefox_android: "116", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.emHeightAscent": { baseline: false, support: { firefox: "118", firefox_android: "118", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.emHeightDescent": { baseline: false, support: { firefox: "118", firefox_android: "118", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.fontBoundingBoxAscent": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "116", firefox_android: "116", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.fontBoundingBoxDescent": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "\
116", firefox_android: "116", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.hangingBaseline": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "116", firefox_android: "116", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.ideographicBaseline": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "116", firefox_android: "116", safari: "11.1", safari_ios: "11.3" } }, "api.TextMetrics.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "31", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "2", safari_ios: "1" } } }, "canvas-2d-alpha": {
    compat_features: ["api.HTMLCanvasElement.getContext.2d_context.options_alpha_parameter"], description: "The optional alpha parameter of a 2D canvas's getContext() method sets whether the canvas has an alpha transparency channel. If set to false, then this permits the browser to optimize compositing for an opaque canvas.", description_html: "The optional <code>alpha</code> parameter of a 2D canvas's <code>getContext()</code> method sets whether the canvas has an alpha transparency channel. If set to <code>false</code>, then this permits the browser to optimize compositing for an opaque canvas.", group: ["canvas"], kind: "feature", name: "2D canvas opacity", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-alpha"], status: { baseline: false, by_compat_key: { "api.HTMLCanvasElement.getContext.2d_context.options_alpha_parameter": { baseline: false, support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "30", firefox_android: "30" } } }, support: { chrome: "\
32", chrome_android: "32", edge: "79", firefox: "30", firefox_android: "30" } } }, "canvas-2d-color-management": { compat_features: ["api.HTMLCanvasElement.getContext.2d_context.options_colorSpace_parameter"], description: `The optional colorSpace parameter of a 2D canvas's getContext() method chooses the color representation, such as "srgb" or "display-p3".`, description_html: `The optional <code>colorSpace</code> parameter of a 2D canvas's <code>getContext()</code> method chooses the color representation, such as <code>"srgb"</code> or <code>"display-p3"</code>.`, group: ["canvas"], kind: "feature", name: "Color management for 2D canvas", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-color-space"], status: { baseline: false, by_compat_key: { "api.HTMLCanvasElement.getContext.2d_context.options_colorSpace_parameter": { baseline: false, support: { chrome: "92", chrome_android: "92", edge: "92", safari: "15.2", safari_ios: "15.2" } } }, support: { chrome: "92",
    chrome_android: "92", edge: "92", safari: "15.2", safari_ios: "15.2" } } }, "canvas-2d-desynchronized": { compat_features: ["api.HTMLCanvasElement.getContext.2d_context.options_desynchronized_parameter"], description: "The optional desynchronized parameter of a canvas's getContext() method permits the browser to draw a 2D canvas independently of the event loop. This can reduce drawing latency.", description_html: "The optional <code>desynchronized</code> parameter of a canvas's <code>getContext()</code> method permits the browser to draw a 2D canvas independently of the event loop. This can reduce drawing latency.", group: ["canvas"], kind: "feature", name: "Desynchronized 2D canvas", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-desynchronized"], status: { baseline: false, by_compat_key: { "api.HTMLCanvasElement.getContext.2d_context.options_desynchronized_parameter": { baseline: false, support: { chrome: "81", chrome_android: "75", edge: "79", safari: "\
15", safari_ios: "15" } } }, support: { chrome: "81", chrome_android: "75", edge: "79", safari: "15", safari_ios: "15" } } }, "canvas-2d-willreadfrequently": { compat_features: ["api.HTMLCanvasElement.getContext.2d_context.options_willReadFrequently_parameter"], description: "The optional willReadFrequently parameter of a canvas's getContext() method permits the browser to optimize for frequent getImageData() calls by avoiding hardware acceleration. Also known as multiple readback.", description_html: "The optional <code>willReadFrequently</code> parameter of a canvas's <code>getContext()</code> method permits the browser to optimize for frequent <code>getImageData()</code> calls by avoiding hardware acceleration. Also known as multiple readback.", group: ["canvas"], kind: "feature", name: "willReadFrequently", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently"], status: { baseline: "low", baseline_low_date: "2024-09-16", by_compat_key: { "a\
pi.HTMLCanvasElement.getContext.2d_context.options_willReadFrequently_parameter": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "28", firefox_android: "28", safari: "18", safari_ios: "18" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "28", firefox_android: "28", safari: "18", safari_ios: "18" } } }, "canvas-context-lost": { compat_features: ["api.CanvasRenderingContext2D.isContextLost", "api.HTMLCanvasElement.contextlost_event", "api.HTMLCanvasElement.contextrestored_event", "api.OffscreenCanvas.contextlost_event", "api.OffscreenCanvas.contextrestored_event", "api.OffscreenCanvasRenderingContext2D.isContextLost"], description: "The contextlost event for <canvas> fires when the canvas backing storage is lost, while the contextrestored event fires when it is recreated.", description_html: "The <code>contextlost</code> event for <code>&#x3C;canvas></code> fires when the canvas backing st\
orage is lost, while the <code>contextrestored</code> event fires when it is recreated.", group: ["canvas"], kind: "feature", name: "contextlost and contextrestored", spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#context-lost-steps"], status: { baseline: false, by_compat_key: { "api.CanvasRenderingContext2D.isContextLost": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } }, "api.HTMLCanvasElement.contextlost_event": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } }, "api.HTMLCanvasElement.contextrestored_event": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } }, "api.OffscreenCanvas.contextlost_event": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } }, "api.OffscreenCanvas.contextrestored_ev\
ent": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } }, "api.OffscreenCanvasRenderingContext2D.isContextLost": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "125", firefox_android: "125" } } }, "canvas-createconicgradient": { compat_features: ["api.CanvasRenderingContext2D.createConicGradient", "api.OffscreenCanvasRenderingContext2D.createConicGradient"], description: "The createConicGradient() methods draw a conic gradient to a 2D canvas.", description_html: "The <code>createConicGradient()</code> methods draw a conic gradient to a 2D canvas.", group: ["canvas"], kind: "feature", name: "Canvas createConicGradient()", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createconicgradient-dev"], status: { baseline: "high", baseline_high_date: "2025-1\
0-11", baseline_low_date: "2023-04-11", by_compat_key: { "api.CanvasRenderingContext2D.createConicGradient": { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "112", firefox_android: "112", safari: "16.1", safari_ios: "16.1" } }, "api.OffscreenCanvasRenderingContext2D.createConicGradient": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "112", firefox_android: "112", safari: "16.4", safari_ios: "16.4" } } }, "canvas-html": { description: "A <canvas> HTML element with the layoutsubtree attribute can draw descendant elements in its rendering context. You can use it to style and layout text in a canvas, expose canvas content to browser featur\
es (like accessibility, translate, or find-in-page), and apply 2D and 3D effects to HTML.", description_html: "A <code>&#x3C;canvas></code> HTML element with the <code>layoutsubtree</code> attribute can draw descendant elements in its rendering context. You can use it to style and layout text in a canvas, expose canvas content to browser features (like accessibility, translate, or find-in-page), and apply 2D and 3D effects to HTML.", group: ["html-elements", "canvas", "webgl", "webgpu"], kind: "feature", name: "HTML in canvas", spec: ["https://github.com/WICG/html-in-canvas/blob/main/README.md"], status: { baseline: false, support: {} } }, "canvas-reset": { compat_features: ["api.CanvasRenderingContext2D.reset", "api.OffscreenCanvasRenderingContext2D.reset"], description: "The reset() method clears a canvas to its initial state.", description_html: "The <code>reset()</code> method clears a canvas to its initial state.", group: ["canvas"], kind: "feature", name: "Canvas reset()", spec: [
    "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-reset"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "api.CanvasRenderingContext2D.reset": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "113", firefox_android: "113", safari: "17.2", safari_ios: "17.2" } }, "api.OffscreenCanvasRenderingContext2D.reset": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "113", firefox_android: "113", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "113", firefox_android: "113", safari: "17.2", safari_ios: "17.2" } } }, "canvas-roundrect": { compat_features: ["api.CanvasRenderingContext2D.roundRect", "api.OffscreenCanvasRenderingContext2D.roundRect"], description: "The roundRect() methods draw a rounded rectangle to a 2D canvas.", description_html: "\
The <code>roundRect()</code> methods draw a rounded rectangle to a 2D canvas.", group: ["canvas"], kind: "feature", name: "Canvas roundRect()", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-roundrect"], status: { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", by_compat_key: { "api.CanvasRenderingContext2D.roundRect": { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "112", firefox_android: "112", safari: "16", safari_ios: "16" } }, "api.OffscreenCanvasRenderingContext2D.roundRect": { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "112", firefox_android: "112", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "112", firefox_android: "112", safari: "16.4",
    safari_ios: "16.4" } } }, cap: { compat_features: ["css.types.length.cap"], description: "The cap CSS length unit corresponds to the height of Latin capital letters.", description_html: "The <code>cap</code> CSS length unit corresponds to the height of Latin capital letters.", group: ["units"], kind: "feature", name: "cap unit", spec: ["https://drafts.csswg.org/css-values-4/#cap"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "css.types.length.cap": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "97", firefox_android: "97", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "97", firefox_android: "97", safari: "17.2", safari_ios: "17.2" } } }, "capture-handle": { compat_features: ["api.MediaDevices.setCaptureHandleConfig", "api.MediaStreamTrack.capturehandlechange_event", "api.MediaStreamTrack.getCaptureHandle"], description: "\
The capture handle API allows you to share a custom handle (a string) from a web application being captured by getDisplayMedia() to the capturing web application.", description_html: "The capture handle API allows you to share a custom handle (a string) from a web application being captured by <code>getDisplayMedia()</code> to the capturing web application.", kind: "feature", name: "Capture Handle", spec: ["https://w3c.github.io/mediacapture-handle/identity/"], status: { baseline: false, by_compat_key: { "api.MediaDevices.setCaptureHandleConfig": { baseline: false, support: { chrome: "102", edge: "102" } }, "api.MediaStreamTrack.capturehandlechange_event": { baseline: false, support: { chrome: "102", edge: "102" } }, "api.MediaStreamTrack.getCaptureHandle": { baseline: false, support: { chrome: "102", edge: "102" } } }, support: { chrome: "102", edge: "102" } } }, "capture-stream-audio-video": { compat_features: ["api.HTMLMediaElement.captureStream"], description: "The captureStream() \
method for <audio> and <video> elements returns a MediaStream for the media element's content. You can use this to record media or send it elsewhere, such as a canvas or WebRTC connection.", description_html: "The <code>captureStream()</code> method for <code>&#x3C;audio></code> and <code>&#x3C;video></code> elements returns a <code>MediaStream</code> for the media element's content. You can use this to record media or send it elsewhere, such as a canvas or WebRTC connection.", group: ["media-elements"], kind: "feature", name: "captureStream() for <audio> and <video>", spec: ["https://w3c.github.io/mediacapture-fromelement/#html-media-element-media-capture-extensions"], status: { baseline: false, by_compat_key: { "api.HTMLMediaElement.captureStream": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "149", firefox_android: "149" } } }, support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "149", firefox_android: "149" } } }, "capture-s\
tream-canvas": { compat_features: ["api.CanvasCaptureMediaStreamTrack", "api.CanvasCaptureMediaStreamTrack.canvas", "api.CanvasCaptureMediaStreamTrack.requestFrame", "api.HTMLCanvasElement.captureStream"], description: "The captureStream() method for <canvas> elements returns a MediaStream which includes a CanvasCaptureMediaStreamTrack representing real-time video of the canvas image. You can use this to record the canvas, or send it elsewhere, such as another canvas or WebRTC connection.", description_html: "The <code>captureStream()</code> method for <code>&#x3C;canvas></code> elements returns a <code>MediaStream</code> which includes a <code>CanvasCaptureMediaStreamTrack</code> representing real-time video of the canvas image. You can use this to record the canvas, or send it elsewhere, such as another canvas or WebRTC connection.", group: ["canvas"], kind: "feature", name: "captureStream() for <canvas>", spec: ["https://w3c.github.io/mediacapture-fromelement/#html-canvas-element-me\
dia-capture-extensions"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.CanvasCaptureMediaStreamTrack": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79", safari: "11", safari_ios: "11" } }, "api.CanvasCaptureMediaStreamTrack.canvas": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79", safari: "11", safari_ios: "11" } }, "api.CanvasCaptureMediaStreamTrack.requestFrame": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79", safari: "11", safari_ios: "11" } }, "api.HTMLCanvasElement.captureStream": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "43", firefox_android: "43", safari: "11", safari_ios: "11" } } }, support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "43", firefox_android: "43", safari: "11", safari_ios: "11" } } },
    "caret-color": { caniuse: ["css-caret-color"], compat_features: ["css.properties.caret-color"], description: "The caret-color CSS property sets the color of the text insertion pointer in a text input.", description_html: "The <code>caret-color</code> CSS property sets the color of the text insertion pointer in a text input.", group: ["css"], kind: "feature", name: "caret-color", spec: ["https://drafts.csswg.org/css-ui-4/#insertion-caret"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.caret-color": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "11.1", safari_ios: "11.3" } } }, "caret-shape": { compat_features: ["css.prope\
rties.caret-shape", "css.properties.caret-shape.auto", "css.properties.caret-shape.bar", "css.properties.caret-shape.block", "css.properties.caret-shape.underscore"], description: "The caret-shape CSS property sets the shape of the insertion caret, the symbol that shows where the next character is to be inserted or deleted.", description_html: "The <code>caret-shape</code> CSS property sets the shape of the insertion caret, the symbol that shows where the next character is to be inserted or deleted.", kind: "feature", name: "caret-shape", spec: ["https://drafts.csswg.org/css-ui-4/#propdef-caret-shape"], status: { baseline: false, by_compat_key: { "css.properties.caret-shape": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "css.properties.caret-shape.auto": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "css.properties.caret-shape.bar": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "1\
44" } }, "css.properties.caret-shape.block": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "css.properties.caret-shape.underscore": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } } }, support: { chrome: "144", chrome_android: "144", edge: "144" } } }, "cascade-layers": { caniuse: ["css-cascade-layers"], compat_features: ["api.CSSImportRule.layerName", "api.CSSLayerBlockRule", "api.CSSLayerBlockRule.name", "api.CSSLayerStatementRule", "api.CSSLayerStatementRule.nameList", "css.at-rules.import.layer", "css.at-rules.layer", "css.types.global_keywords.revert-layer"], description: "The @layer CSS at-rule avoids specificity conflicts by providing priority levels for different groups of CSS rules, such as low-priority styles like resets, and high-priority styles like UI components.", description_html: "The <code>@layer</code> CSS at-rule avoids specificity conflicts by providing priority levels for different groups of C\
SS rules, such as low-priority styles like resets, and high-priority styles like UI components.", group: ["css"], kind: "feature", name: "Cascade layers", spec: ["https://drafts.csswg.org/css-cascade-5/"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "api.CSSImportRule.layerName": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.CSSLayerBlockRule": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.CSSLayerBlockRule.name": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "\
97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.CSSLayerStatementRule": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "api.CSSLayerStatementRule.nameList": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "css.at-rules.import.layer": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "css.at-rules.layer": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "9\
9", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "css.types.global_keywords.revert-layer": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, "case-insensitive-attributes": { caniuse: ["css-case-insensitive"], compat_features: ["css.selectors.attribute.case_insensitive_modifier"], description: "The i identifier in a CSS attribute selector matches attribute values case-insensitively in document languages like XML where attribute values are case-sensitive.", description_html: "The <code>i</code> identifier in a CSS attribute selector matches attribute values case-insensitively in document languages like XML where attribute values are case-sensitiv\
e.", group: ["selectors"], kind: "feature", name: "Case-insensitive attribute selector", spec: ["https://drafts.csswg.org/selectors-4/#attribute-case"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.attribute.case_insensitive_modifier": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "47", firefox_android: "47", safari: "9", safari_ios: "9" } } }, support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "47", firefox_android: "47", safari: "9", safari_ios: "9" } } }, "case-sensitive-attributes": { compat_features: ["css.selectors.attribute.case_sensitive_modifier"], description: "The s identifier in a CSS attribute selector matches attribute values case-sensitively in document languages like HTML where attribute values are case-insensitive.", description_html: "The <code>s</code> identifier\
 in a CSS attribute selector matches attribute values case-sensitively in document languages like HTML where attribute values are case-insensitive.", group: ["selectors"], kind: "feature", name: "Case-sensitive attribute selector", spec: ["https://drafts.csswg.org/selectors-4/#attribute-case"], status: { baseline: false, by_compat_key: { "css.selectors.attribute.case_sensitive_modifier": { baseline: false, support: { firefox: "66", firefox_android: "66" } } }, support: { firefox: "66", firefox_android: "66" } } }, ch: { caniuse: ["ch-unit"], compat_features: ["css.types.length.ch"], description: "The ch CSS length unit is a font-relative length based on the width of the zero (0) character.", description_html: "The <code>ch</code> CSS length unit is a font-relative length based on the width of the zero (0) character.", group: ["units"], kind: "feature", name: "ch unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.length.ch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } } }, support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } } }, "change-event": { compat_features: ["api.HTMLElement.change_event"], description: "The change event for <input>, <select>, and <textarea> elements fires when the user modifies the element's value. Unlike the input event, the change event does not necessarily fire on every alteration to an element's value.", description_html: "The <code>change</code> event for <code>&#x3C;input></code>, <code>&#x3C;select></code>, and <code>&#x3C;textarea></code> elements fires when the user modifies the element's value. Unlike the <code>input</code> event, the change event do\
es not necessarily fire on every alteration to an element's value.", kind: "feature", name: "Change event", spec: ["https://html.spec.whatwg.org/multipage/indices.html#event-change", "https://html.spec.whatwg.org/multipage/webappapis.html#handler-onchange"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLElement.change_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, "channel-messaging": { caniuse: ["channel-messaging"], compat_features: ["api.MessageChannel", "api.MessageChannel.MessageChannel", "api.MessageChannel.port1", "api.MessageChannel.port2", "api.MessageEvent.ports", "api.MessagePort", "api.MessagePort.\
close", "api.MessagePort.message_event", "api.MessagePort.postMessage", "api.MessagePort.start", "api.MessagePort.worker_support"], description: "Channel messaging communicates one-to-one between browsing contexts on the same origin, such as between <iframe> elements or two documents using a shared worker.", description_html: "Channel messaging communicates one-to-one between browsing contexts on the same origin, such as between <code>&#x3C;iframe></code> elements or two documents using a shared worker.", group: ["messaging"], kind: "feature", name: "Channel messaging", spec: ["https://html.spec.whatwg.org/multipage/web-messaging.html#channel-messaging"], status: { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", by_compat_key: { "api.MessageChannel": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "\
4.2" } }, "api.MessageChannel.MessageChannel": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessageChannel.port1": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessageChannel.port2": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessageEvent.ports": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } },
    "api.MessagePort": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessagePort.close": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessagePort.message_event": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessagePort.postMessage": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.Message\
Port.start": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } }, "api.MessagePort.worker_support": { baseline: "high", baseline_high_date: "2018-03-22", baseline_low_date: "2015-09-22", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "41", firefox_android: "41", safari: "5", safari_ios: "4.2" } } }, charset: { compat_features: ["css.at-rules.charset"], description: "The @charset CSS at-rule specifies the character encoding of an external style sheet.", description_html: "The <code>@charset</code> CSS at-rule specifies the character encoding of an external style sheet.", group: ["css"], kind: "feature", name: "@charset", spec: ["https://drafts.csswg.org/css2/#charset"], status: {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.at-rules.charset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "4" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "4" } } }, "check-visibility": { compat_features: ["api.Element.checkVisibility", "api.Element.checkVisibility.options_checkOpacity_parameter", "api.Element.checkVisibility.options_checkVisibilityCSS_parameter", "api.Element.checkVisibility.options_contentVisibilityAuto_parameter", "api.Element.checkVisibility.options_opacityProperty_parameter", "api.Element.checkVisibility.options_visibilityProperty_parameter"], description: "The checkVisibility() method checks if an element is potentially visible, with optional parameters \
for the kinds of visibility to check. For example, it checks whether the element has the style display: none, but can also check for visibility: hidden.", description_html: "The <code>checkVisibility()</code> method checks if an element is potentially visible, with optional parameters for the kinds of visibility to check. For example, it checks whether the element has the style <code>display: none</code>, but can also check for <code>visibility: hidden</code>.", kind: "feature", name: "checkVisibility()", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-element-checkvisibility"], status: { baseline: "low", baseline_low_date: "2024-03-05", by_compat_key: { "api.Element.checkVisibility": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "106", firefox_android: "106", safari: "17.4", safari_ios: "17.4" } }, "api.Element.checkVisibility.options_checkOpacity_parameter": { baseline: "low", baseline_low_date: "2024-03-\
05", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "106", firefox_android: "106", safari: "17.4", safari_ios: "17.4" } }, "api.Element.checkVisibility.options_checkVisibilityCSS_parameter": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "106", firefox_android: "106", safari: "17.4", safari_ios: "17.4" } }, "api.Element.checkVisibility.options_contentVisibilityAuto_parameter": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } }, "api.Element.checkVisibility.options_opacityProperty_parameter": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } }, "api.Element.checkVisibility.options_visibilityProperty_parameter": {
    baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "106", firefox_android: "106", safari: "17.4", safari_ios: "17.4" } } }, cite: { compat_features: ["html.elements.cite"], description: "The <cite> element represents the title of a quoted, referenced, or mentioned creative work, such as a film or book.", description_html: "The <code>&#x3C;cite></code> element represents the title of a quoted, referenced, or mentioned creative work, such as a film or book.", group: ["html-elements"], kind: "feature", name: "<cite>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-cite-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.cite": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "class-syntax": { caniuse: ["es6-class"], compat_features: ["javascript.classes", "javascript.classes.constructor", "javascript.classes.extends", "javascript.classes.private_class_fields", "javascript.classes.private_class_fields_in", "javascript.classes.private_class_methods", "javascript.classes.public_class_fields", "javascript.classes.static", "javascript.classes.static.class_fields", "javascript.classes.static.initialization_blocks", "javascript.operators.class", "javascript.operators.new_target", "javascript.operators.super", "javascript.statements.class"], description: "Classes are an object-oriented syntax for JavaScript prototypes.", description_html: "Classes \
are an object-oriented syntax for JavaScript prototypes.", group: ["javascript"], kind: "feature", name: "Classes", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-class-definitions"], status: { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", by_compat_key: { "javascript.classes": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "javascript.classes.constructor": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "javascript.classes.extends": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "\
42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "javascript.classes.private_class_fields": { baseline: "high", baseline_high_date: "2024-01-13", baseline_low_date: "2021-07-13", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "90", firefox_android: "90", safari: "14.1", safari_ios: "14.5" } }, "javascript.classes.private_class_fields_in": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "90", firefox_android: "90", safari: "15", safari_ios: "15" } }, "javascript.classes.private_class_methods": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "90", firefox_android: "90", safari: "15", safari_ios: "15" } }, "javascript.classes.public_class_fields": { baseline: "high", baseline_high_date: "2025-03-1\
2", baseline_low_date: "2022-09-12", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "69", firefox_android: "79", safari: "16", safari_ios: "16" } }, "javascript.classes.static": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "javascript.classes.static.class_fields": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "75", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.classes.static.initialization_blocks": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "93", firefox_android: "93", safari: "16.4", safari_ios: "16.4" } }, "javascript.operators.class": { baseline: "\
high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "7", safari_ios: "7" } }, "javascript.operators.new_target": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "13", firefox: "41", firefox_android: "41", safari: "11", safari_ios: "11" } }, "javascript.operators.super": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "7", safari_ios: "7" } }, "javascript.statements.class": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "42", chrome_android: "\
42", edge: "13", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } } }, "clear-site-data": { compat_features: ["http.headers.Clear-Site-Data", "http.headers.Clear-Site-Data.cache", "http.headers.Clear-Site-Data.clientHints", "http.headers.Clear-Site-Data.cookies", "http.headers.Clear-Site-Data.executionContexts", "http.headers.Clear-Site-Data.secure_context_required", "http.headers.Clear-Site-Data.storage", "http.headers.Clear-Site-Data.wildcard"], description: "The Clear-Site-Data header deletes browsing data (such as cookies, storage, or cache) associated with the requesting website.", description_html: "The <code>Clear-Site-Data</code> header deletes browsing data (such as cookies, storage, or cache) associated with the requesting website.", kind: "feature", name: "Clearing site data", spec: ["https://w3c.github.io/webappsec-clear-site-data/"], status: { baseline: false, by_compat_key: { "http.headers.Clear-Site-Data": { baseline: "high", baseline_high_date: "2026\
-03-18", baseline_low_date: "2023-09-18", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "63", firefox_android: "63", safari: "17", safari_ios: "17" } }, "http.headers.Clear-Site-Data.cache": { baseline: false, support: { firefox: "138", firefox_android: "138", safari: "17", safari_ios: "17" } }, "http.headers.Clear-Site-Data.clientHints": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "http.headers.Clear-Site-Data.cookies": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "63", firefox_android: "63", safari: "17", safari_ios: "17" } }, "http.headers.Clear-Site-Data.executionContexts": { baseline: false, support: {} }, "http.headers.Clear-Site-Data.secure_context_required": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "\
63", firefox_android: "63", safari: "17", safari_ios: "17" } }, "http.headers.Clear-Site-Data.storage": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "63", firefox_android: "63", safari: "17", safari_ios: "17" } }, "http.headers.Clear-Site-Data.wildcard": { baseline: false, support: { firefox: "63", firefox_android: "63", safari: "17", safari_ios: "17" } } }, support: { firefox: "138", firefox_android: "138", safari: "17", safari_ios: "17" } } }, clip: { compat_features: ["css.properties.clip", "css.properties.clip.auto", "css.types.shape", "css.types.shape.rect"], description: "The clip CSS property sets the visible area of an absolutely positioned element.", description_html: "The <code>clip</code> CSS property sets the visible area of an absolutely positioned element.", discouraged: { according_to: ["https://drafts.csswg.org/css-masking-1/#clip-property"], alternatives: ["cli\
p-path"], reason: "The CSS Masking specification deprecated the clip property.", reason_html: "The CSS Masking specification deprecated the <code>clip</code> property." }, group: ["clipping-shapes-masking"], kind: "feature", name: "clip", spec: ["https://drafts.csswg.org/css-masking-1/#clip-property"], status: { baseline: false, by_compat_key: { "css.properties.clip": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.clip.auto": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.shape": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.types.shape.rect": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1.3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } } }, "clip-path": { compat_features: ["api.SVGClipPathElement", "api.SVGClipPathElement.clipPathUnits", "api.SVGClipPathElement.transform", "css.properties.clip-path", "css.properties.clip-path.basic_shape", "css.properties.clip-path.html_elements", "css.properties.clip-path.path", "css.properties.clip-path.svg_elements", "svg.elements.clipPath", "svg.elements.clipPath.clipPathUnits", "svg.elements.clipPath.systemLanguage", "svg.global_attributes.clip-path"], description: "The clip-path CSS property and SVG attribute set the visible area of an element. Everything outside the area will be hidden.", description_html: "The <code>clip-path</code> CSS property and SVG attribute set the visible area of an element. Everything outside the area will be hidden.", group: ["clipping-shapes-masking"], kind: "feature", name: "clip-path", spec: ["\
https://drafts.csswg.org/css-masking-1/#the-clip-path"], status: { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", by_compat_key: { "api.SVGClipPathElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGClipPathElement.clipPathUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGClipPathElement.transform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.clip-path": { baseline: "high", baseline_high_date: "2022-07-1\
5", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "3.5", firefox_android: "4", safari: "9.1", safari_ios: "9.3" } }, "css.properties.clip-path.basic_shape": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "54", firefox_android: "54", safari: "9.1", safari_ios: "9.3" } }, "css.properties.clip-path.html_elements": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "3.5", firefox_android: "4", safari: "9.1", safari_ios: "9.3" } }, "css.properties.clip-path.path": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13" } }, "css.properties.clip-path.svg_elements": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "52", firefox_android: "52", safari: "9.1", safari_ios: "9.3" } }, "svg.elements.clipPath": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.clipPath.clipPathUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.clipPath.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.global_attributes.clip-path": {
    baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "52", firefox_android: "52", safari: "7", safari_ios: "7" } } }, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13" } } }, "clip-path-animatable": { compat_features: ["css.properties.clip-path.is_animatable"], description: "The clip-path property can be animated using CSS transitions and animations.", description_html: "The <code>clip-path</code> property can be animated using CSS transitions and animations.", group: ["clipping-shapes-masking"], kind: "feature", name: "Animatable clipping paths", spec: ["https://drafts.csswg.org/css-masking-1/#the-clip-path"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.clip-path.is_animatable": { baseline: "high", baseline_high_date: "20\
22-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "49", firefox_android: "49", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "49", firefox_android: "49", safari: "12.1", safari_ios: "12.2" } } }, "clip-path-boxes": { compat_features: ["css.properties.clip-path.fill-box", "css.properties.clip-path.stroke-box", "css.properties.clip-path.view-box"], description: "The fill-box, stroke-box, and view-box values for clip-path set an edge of the element's box to use as the clipping shape.", description_html: "The <code>fill-box</code>, <code>stroke-box</code>, and <code>view-box</code> values for <code>clip-path</code> set an edge of the element's box to use as the clipping shape.", group: ["clipping-shapes-masking"], kind: "feature", name: "Clip path boxes", spec: ["https://drafts.csswg.org/css-masking-1/#the-clip-path"], status: { baseline: "low", baseline_low_date: "\
2023-11-02", by_compat_key: { "css.properties.clip-path.fill-box": { baseline: "low", baseline_low_date: "2023-11-02", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "51", firefox_android: "51", safari: "13.1", safari_ios: "13.4" } }, "css.properties.clip-path.stroke-box": { baseline: "low", baseline_low_date: "2023-11-02", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "51", firefox_android: "51", safari: "13.1", safari_ios: "13.4" } }, "css.properties.clip-path.view-box": { baseline: "low", baseline_low_date: "2023-11-02", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "54", firefox_android: "54", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "54", firefox_android: "54", safari: "13.1", safari_ios: "13.4" } } }, "clipboard-custom-format": { compat_features: ["api.ClipboardItem.type_web"], description: "The web  prefix for ClipboardItem data types \
(also known as MIME types) allows reading and writing unsanitized custom data from the device clipboard.", description_html: "The <code>web </code> prefix for <code>ClipboardItem</code> data types (also known as MIME types) allows reading and writing unsanitized custom data from the device clipboard.", group: ["clipboard"], kind: "feature", name: "Custom formats for clipboard items", spec: ["https://w3c.github.io/clipboard-apis/#optional-data-types-x"], status: { baseline: false, by_compat_key: { "api.ClipboardItem.type_web": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104" } } }, support: { chrome: "104", chrome_android: "104", edge: "104" } } }, "clipboard-events": { compat_features: ["api.ClipboardEvent", "api.ClipboardEvent.ClipboardEvent", "api.ClipboardEvent.clipboardData", "api.Element.copy_event", "api.Element.cut_event", "api.Element.paste_event"], description: 'The "copy", "cut", and "paste" events fire on elements when the user starts an action\
 with the clipboard.', description_html: 'The <code>"copy"</code>, <code>"cut"</code>, and <code>"paste"</code> events fire on elements when the user starts an action with the clipboard.', group: ["clipboard"], kind: "feature", name: "Clipboard events", spec: ["https://w3c.github.io/clipboard-apis/#clipboard-event-interfaces"], status: { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", by_compat_key: { "api.ClipboardEvent": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "22", firefox_android: "22", safari: "10.1", safari_ios: "10.3" } }, "api.ClipboardEvent.ClipboardEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "58", chrome_android: "58", edge: "17", firefox: "22", firefox_android: "22", safari: "10.1", safari_ios: "10.3" } }, "api.ClipboardEvent.clipboardData": { baseline: "hi\
gh", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "22", firefox_android: "22", safari: "10.1", safari_ios: "10.3" } }, "api.Element.copy_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "22", firefox_android: "22", safari: "3", safari_ios: "3" } }, "api.Element.cut_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "22", firefox_android: "22", safari: "3", safari_ios: "3" } }, "api.Element.paste_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "22", firefox_android: "22", safari: "3", safari_ios: "3" } } }, support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "\
22", firefox_android: "22", safari: "10.1", safari_ios: "10.3" } } }, "clipboard-supports": { compat_features: ["api.ClipboardItem.supports_static"], description: 'The ClipboardItem.supports() static method checks if the browser supports writing data types such as "image/svg+xml" or other custom formats to the system clipboard.', description_html: 'The <code>ClipboardItem.supports()</code> static method checks if the browser supports writing data types such as "image/svg+xml" or other custom formats to the system clipboard.', group: ["clipboard"], kind: "feature", name: "ClipboardItem.supports()", spec: ["https://w3c.github.io/clipboard-apis/#dom-clipboarditem-supports"], status: { baseline: "low", baseline_low_date: "2025-03-31", by_compat_key: { "api.ClipboardItem.supports_static": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "127", firefox_android: "127", safari: "18.4", safari_ios: "18.4" } } }, support: {
    chrome: "121", chrome_android: "121", edge: "121", firefox: "127", firefox_android: "127", safari: "18.4", safari_ios: "18.4" } } }, "clipboard-svg": { compat_features: ["api.ClipboardItem.type_image_svg_xml"], description: "The image/svg+xml data type (also known as the MIME type) for ClipboardItem objects represents SVG data written to or read from the clipboard.", description_html: "The <code>image/svg+xml</code> data type (also known as the MIME type) for <code>ClipboardItem</code> objects represents SVG data written to or read from the clipboard.", group: ["clipboard"], kind: "feature", name: "SVG clipboard items", spec: ["https://w3c.github.io/clipboard-apis/#optional-data-types-x"], status: { baseline: false, by_compat_key: { "api.ClipboardItem.type_image_svg_xml": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } } }, support: { chrome: "124", chrome_android: "124", edge: "124" } } }, "clipboard-unsanitized-formats": { compat_features: ["api.\
Clipboard.read.formats_unsanitized_parameter"], description: "The optional formats.unsanitized parameter of the navigator.clipboard.read() method reads unsanitized text/html data from the system clipboard.", description_html: "The optional <code>formats.unsanitized</code> parameter of the <code>navigator.clipboard.read()</code> method reads unsanitized <code>text/html</code> data from the system clipboard.", group: ["clipboard"], kind: "feature", name: "Read unsanitized clipboard data", spec: ["https://w3c.github.io/clipboard-apis/#dom-clipboardunsanitizedformats-unsanitized"], status: { baseline: false, by_compat_key: { "api.Clipboard.read.formats_unsanitized_parameter": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } } }, support: { chrome: "122", chrome_android: "122", edge: "122" } } }, clipboardchange: { compat_features: ["api.ClipboardChangeEvent", "api.ClipboardChangeEvent.ClipboardChangeEvent", "api.ClipboardChangeEvent.changeId", "api.Clipboar\
dChangeEvent.types"], description: "The clipboardchange event for navigator.clipboard fires when the user modifies the clipboard's contents.", description_html: "The <code>clipboardchange</code> event for <code>navigator.clipboard</code> fires when the user modifies the clipboard's contents.", group: ["clipboard"], kind: "feature", name: "clipboardchange", spec: ["https://w3c.github.io/clipboard-apis/#clipboard-event-clipboardchange"], status: { baseline: false, by_compat_key: { "api.ClipboardChangeEvent": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.ClipboardChangeEvent.ClipboardChangeEvent": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.ClipboardChangeEvent.changeId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.ClipboardChangeEvent.types": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } } }, support: { chrome: "144", chrome_android: "\
144", edge: "144" } } }, closewatcher: { compat_features: ["api.CloseWatcher", "api.CloseWatcher.CloseWatcher", "api.CloseWatcher.cancel_event", "api.CloseWatcher.close", "api.CloseWatcher.close_event", "api.CloseWatcher.destroy", "api.CloseWatcher.requestClose"], description: "The CloseWatcher API listens and responds to close requests on in-page components, such as modals, popovers, and sidebars.", description_html: "The <code>CloseWatcher</code> API listens and responds to close requests on in-page components, such as modals, popovers, and sidebars.", kind: "feature", name: "CloseWatcher", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#close-requests-and-close-watchers"], status: { baseline: false, by_compat_key: { "api.CloseWatcher": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } }, "api.CloseWatcher.CloseWatcher": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "12\
6", firefox: "149", firefox_android: "149" } }, "api.CloseWatcher.cancel_event": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } }, "api.CloseWatcher.close": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } }, "api.CloseWatcher.close_event": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } }, "api.CloseWatcher.destroy": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } }, "api.CloseWatcher.requestClose": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } } }, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "149", firefox_android: "149" } } }, code: { compat_features: ["html.elements.code"], description: "Th\
e <code> element displays its contents as a fragment of computer code.", description_html: "The <code>&#x3C;code></code> element displays its contents as a fragment of computer code.", group: ["html-elements"], kind: "feature", name: "<code>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-code-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.code": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, color: { compat_features: ["css.properties.color", "css.properties.color.transparent", "css.types.color", "css.types.color.transparent"], description: "The color CSS \
property sets the primary foreground color of an element, which is used for text, the default border color, and text decorations.", description_html: "The <code>color</code> CSS property sets the primary foreground color of an element, which is used for text, the default border color, and text decorations.", group: ["css"], kind: "feature", name: "Color", spec: ["https://drafts.csswg.org/css-color-4/#the-color-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "css.types.color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "color-adjust": { compat_features: ["css.properties.color-adjust"], description: "The color-adjust shorthand CSS property allows multiple performance related color adjustments to be set at once. Setting the print-color-adjust CSS property directly is preferred, as it is the only such adjustment so far defined.", description_html: "The <code>color-adjust</code> \
shorthand CSS property allows multiple performance related color adjustments to be set at once. Setting the <code>print-color-adjust</code> CSS property directly is preferred, as it is the only such adjustment so far defined.", discouraged: { according_to: ["https://drafts.csswg.org/css-color-adjust-1/#color-adjust"], alternatives: ["print-color-adjust"], reason: "The CSS Color Adjustment specification described the color-adjust as deprecated, to prevent authors from accidentally resetting color adjustments in unexpected contexts.", reason_html: "The CSS Color Adjustment specification described the <code>color-adjust</code> as deprecated, to prevent authors from accidentally resetting color adjustments in unexpected contexts." }, group: ["print"], kind: "feature", name: "color-adjust", spec: ["https://drafts.csswg.org/css-color-adjust-1/#color-adjust"], status: { baseline: false, by_compat_key: { "css.properties.color-adjust": { baseline: false, support: { firefox: "48", firefox_android: "\
48", safari: "15.4", safari_ios: "15.4" } } }, support: { firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } } }, "color-contrast": { description: "The color-contrast() CSS function picks a color from a list that has the most contrast with another color.", description_html: "The <code>color-contrast()</code> CSS function picks a color from a list that has the most contrast with another color.", discouraged: { according_to: ["https://github.com/w3c/csswg-drafts/issues/7557", "https://github.com/w3c/csswg-drafts/commit/36594e9e8496a5ca83f1f1ee2b4a83bcdf28753b"], alternatives: ["contrast-color"], reason: "The CSS Color specification renamed color-contrast() to contrast-color().", reason_html: "The CSS Color specification renamed <code>color-contrast()</code> to <code>contrast-color()</code>.", removal_date: "2022-10-19" }, group: ["color-types"], kind: "feature", name: "color-contrast()", spec: ["https://drafts.csswg.org/css-color-5/#contrast-color"], status: { baseline: false,
    support: {} } }, "color-function": { caniuse: ["css-color-function"], compat_features: ["css.types.color.color", "css.types.color.color.mixed_type_parameters"], description: "The color() function picks a color from a given color space. Wide gamut color spaces like display-p3 allow showing more vibrant and saturated colors than the standard srgb color space.", description_html: "The <code>color()</code> function picks a color from a given color space. Wide gamut color spaces like <code>display-p3</code> allow showing more vibrant and saturated colors than the standard <code>srgb</code> color space.", group: ["color-types"], kind: "feature", name: "color()", spec: ["https://drafts.csswg.org/css-color-4/#color-function"], status: { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", by_compat_key: { "css.types.color.color": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "\
111", edge: "111", firefox: "113", firefox_android: "113", safari: "15", safari_ios: "15" } }, "css.types.color.color.mixed_type_parameters": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15", safari_ios: "15" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15", safari_ios: "15" } } }, "color-gamut": { compat_features: ["css.at-rules.media.color-gamut", "css.at-rules.media.color-gamut.p3", "css.at-rules.media.color-gamut.rec2020", "css.at-rules.media.color-gamut.srgb"], description: "The color-gamut media query sets styles based on the colors a device can display.", description_html: "The <code>color-gamut</code> media query sets styles based on the colors a device can display.", group: ["media-queries"], kind: "feature", name: "color-gamut media query", spec: ["https\
://drafts.csswg.org/mediaqueries-5/#color-gamut"], status: { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", by_compat_key: { "css.at-rules.media.color-gamut": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "110", firefox_android: "110", safari: "10", safari_ios: "10" } }, "css.at-rules.media.color-gamut.p3": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "110", firefox_android: "110", safari: "10", safari_ios: "10" } }, "css.at-rules.media.color-gamut.rec2020": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "110", firefox_android: "110", safari: "10", safari_ios: "10" } }, "css.at-rules.media.color-gamut.srgb": { baseline: "high",
    baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "110", firefox_android: "110", safari: "10", safari_ios: "10" } } }, support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "110", firefox_android: "110", safari: "10", safari_ios: "10" } } }, "color-mix": { compat_features: ["css.types.color.color-mix"], description: "The color-mix() function mixes two colors in a given color space and by a given amount. Commonly, lighter or darker variations of a color are created by mixing with white or black.", description_html: "The <code>color-mix()</code> function mixes two colors in a given color space and by a given amount. Commonly, lighter or darker variations of a color are created by mixing with white or black.", group: ["css"], kind: "feature", name: "color-mix()", spec: ["https://drafts.csswg.org/css-color-5/#color-mix"], status: { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "\
2023-05-09", by_compat_key: { "css.types.color.color-mix": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "16.2", safari_ios: "16.2" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "16.2", safari_ios: "16.2" } } }, "color-scheme": { compat_features: ["css.properties.color-scheme", "css.properties.color-scheme.dark", "css.properties.color-scheme.light", "css.properties.color-scheme.normal", "css.properties.color-scheme.only", "html.elements.meta.name.color-scheme"], description: "The color-scheme CSS property sets which color schemes (light or dark) an element uses and may prevent automatic dark mode adjustments by the browser.", description_html: "The <code>color-scheme</code> CSS property sets which color schemes (light or dark) an element uses and may prevent automatic\
 dark mode adjustments by the browser.", group: ["css"], kind: "feature", name: "color-scheme", spec: ["https://drafts.csswg.org/css-color-adjust-1/#color-scheme-prop"], status: { baseline: "high", baseline_high_date: "2024-08-03", baseline_low_date: "2022-02-03", by_compat_key: { "css.properties.color-scheme": { baseline: "high", baseline_high_date: "2024-07-11", baseline_low_date: "2022-01-11", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "96", firefox_android: "96", safari: "13", safari_ios: "13" } }, "css.properties.color-scheme.dark": { baseline: "high", baseline_high_date: "2024-07-11", baseline_low_date: "2022-01-11", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "96", firefox_android: "96", safari: "13", safari_ios: "13" } }, "css.properties.color-scheme.light": { baseline: "high", baseline_high_date: "2024-07-11", baseline_low_date: "2022-01-11", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "96", firefox_android: "\
96", safari: "13", safari_ios: "13" } }, "css.properties.color-scheme.normal": { baseline: "high", baseline_high_date: "2024-07-11", baseline_low_date: "2022-01-11", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "96", firefox_android: "96", safari: "13", safari_ios: "13" } }, "css.properties.color-scheme.only": { baseline: "high", baseline_high_date: "2024-08-03", baseline_low_date: "2022-02-03", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "96", firefox_android: "96", safari: "13", safari_ios: "13" } }, "html.elements.meta.name.color-scheme": { baseline: "high", baseline_high_date: "2024-07-11", baseline_low_date: "2022-01-11", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "96", firefox_android: "96", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "96", firefox_android: "96", safari: "13", safari_ios: "13" } } }, colrv0: { caniuse: ["colr"], compat_features: [
    "css.at-rules.font-face.OpenType_COLRv0"], description: "COLRv0 is a font format that supports multi-color glyphs. COLRv0 supports only solid colors.", description_html: "COLRv0 is a font format that supports multi-color glyphs. COLRv0 supports only solid colors.", group: ["fonts"], kind: "feature", name: "COLRv0", spec: ["https://www.iso.org/standard/87621.html"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.at-rules.font-face.OpenType_COLRv0": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "31", firefox_android: "31", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "31", firefox_android: "31", safari: "11.1", safari_ios: "11.3" } } }, colrv1: { caniuse: ["colr-v1"], compat_features: ["css.at-rules.font-face.OpenType_COLRv1"], description: "CO\
LRv1 is a font format that supports multi-color glyphs. COLRv1 extends COLRv0 to support gradients, transforms, and blending modes.", description_html: "COLRv1 is a font format that supports multi-color glyphs. COLRv1 extends COLRv0 to support gradients, transforms, and blending modes.", group: ["fonts"], kind: "feature", name: "COLRv1", spec: ["https://www.iso.org/standard/87621.html"], status: { baseline: false, by_compat_key: { "css.at-rules.font-face.OpenType_COLRv1": { baseline: false, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107" } } }, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107" } } }, "column-breaks": { compat_features: ["css.properties.break-after.avoid-column", "css.properties.break-after.column", "css.properties.break-after.multicol_context", "css.properties.break-after.multicol_context.avoid", "css.properties.break-after.multicol_context.avoid-column", "css.properties.b\
reak-after.multicol_context.column", "css.properties.break-before.avoid-column", "css.properties.break-before.column", "css.properties.break-before.multicol_context", "css.properties.break-before.multicol_context.avoid", "css.properties.break-before.multicol_context.avoid-column", "css.properties.break-before.multicol_context.column", "css.properties.break-inside.avoid-column", "css.properties.break-inside.multicol_context", "css.properties.break-inside.multicol_context.avoid-column"], description: "In columnar layouts (created by the columns or column-count CSS properties), the break-after, break-before, break-inside properties control where columns start or end.", description_html: "In columnar layouts (created by the <code>columns</code> or <code>column-count</code> CSS properties), the <code>break-after</code>, <code>break-before</code>, <code>break-inside</code> properties control where columns start or end.", group: ["layout"], kind: "feature", name: "Column breaks", spec: ["http\
s://drafts.csswg.org/css-break-3/#breaking-controls"], status: { baseline: false, by_compat_key: { "css.properties.break-after.avoid-column": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-after.column": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-after.multicol_context": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "12" } }, "css.properties.break-after.multicol_context.avoid": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102" } }, "css.properties.break-after.multicol_context.avoid-column": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102" } }, "css.properties.break-after.multicol_context.column": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "12" } }, "css.properties.break-before.avoid-column": {
    baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-before.column": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-before.multicol_context": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "12" } }, "css.properties.break-before.multicol_context.avoid": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102" } }, "css.properties.break-before.multicol_context.avoid-column": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102" } }, "css.properties.break-before.multicol_context.column": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "12" } }, "css.properties.break-inside.avoid-column": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "50", chrome_android: "50", edge: "\
79", firefox: "92", firefox_android: "92", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.multicol_context": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.multicol_context.avoid-column": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "92", firefox_android: "92", safari: "10", safari_ios: "10" } } }, support: { chrome: "102", chrome_android: "102", edge: "102" } } }, "column-fill": { compat_features: ["css.properties.column-fill", "css.properties.column-fill.auto", "css.properties.column-fill.balance"], description: "The column-fill CSS property sets the distribution of content across columns in a multi-column layout.", description_html: "The <code>column-fill</co\
de> CSS property sets the distribution of content across columns in a multi-column layout.", group: ["multi-column"], kind: "feature", name: "column-fill", spec: ["https://drafts.csswg.org/css-multicol-1/#filling-columns"], status: { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", by_compat_key: { "css.properties.column-fill": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-fill.auto": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-fill.balance": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "\
50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } } }, support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } } }, "column-pseudo": { compat_features: ["css.selectors.column", "css.selectors.column.nested_scroll-marker"], description: "The ::column CSS pseudo-element represents the individual columns of a multi-column layout container. Columns can only be styled with scroll snap CSS properties and can also have a ::scroll-marker pseudo-element, which scrolls to the column when activated.", description_html: "The <code>::column</code> CSS pseudo-element represents the individual columns of a multi-column layout container. Columns can only be styled with scroll snap CSS properties and can also have a <code>::scroll-marker</code> pseudo-element, which scrolls to the column when activated.", group: ["multi-column", "scrolling"], kind: "feature", name: "::column", spec: ["https://dra\
fts.csswg.org/css-multicol-2/#column-pseudo"], status: { baseline: false, by_compat_key: { "css.selectors.column": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.column.nested_scroll-marker": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, "column-span": { compat_features: ["css.properties.column-span", "css.properties.column-span.all", "css.properties.column-span.none"], description: "The column-span CSS property controls whether a child element extends across all columns of a multi-column parent.", description_html: "The <code>column-span</code> CSS property controls whether a child element extends across all columns of a multi-column parent.", group: ["multi-column"], kind: "feature", name: "column-span", spec: ["https://drafts.csswg.org/css-multicol-1/#spanning-columns"], status: { baseline: "high", baseline_high_date: "2023\
-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "css.properties.column-span": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "71", firefox_android: "79", safari: "9", safari_ios: "9" } }, "css.properties.column-span.all": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "71", firefox_android: "79", safari: "9", safari_ios: "9" } }, "css.properties.column-span.none": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "71", firefox_android: "79", safari: "9", safari_ios: "9" } } }, support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "71", firefox_android: "79", safari: "9", safari_ios: "9" } } }, "composed-ranges": { compat_features: ["api.Selection\
.getComposedRanges"], description: "The window.getSelection().getComposedRanges() method returns ranges that represent the current user selection, even if the selection spans across shadow tree boundaries.", description_html: "The <code>window.getSelection().getComposedRanges()</code> method returns ranges that represent the current user selection, even if the selection spans across shadow tree boundaries.", group: ["selection", "web-components"], kind: "feature", name: "Selection composed ranges", spec: ["https://w3c.github.io/selection-api/#dom-selection-getcomposedranges"], status: { baseline: "low", baseline_low_date: "2025-08-19", by_compat_key: { "api.Selection.getComposedRanges": { baseline: "low", baseline_low_date: "2025-08-19", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "142", firefox_android: "142", safari: "17", safari_ios: "17" } } }, support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "142", firefox_android: "142", safari: "1\
7", safari_ios: "17" } } }, "composition-events": { compat_features: ["api.CompositionEvent", "api.CompositionEvent.CompositionEvent", "api.CompositionEvent.data", "api.Element.compositionend_event", "api.Element.compositionstart_event", "api.Element.compositionupdate_event"], description: "The compositionstart, compositionupdate, and compositionend events fire when an input method editor adds characters that might not be commonly available on keyboards. Examples of these characters are emoji, logograms in Asian languages, or input from speech recognition processors.", description_html: "The <code>compositionstart</code>, <code>compositionupdate</code>, and <code>compositionend</code> events fire when an input method editor adds characters that might not be commonly available on keyboards. Examples of these characters are emoji, logograms in Asian languages, or input from speech recognition processors.", kind: "feature", name: "Composition events", spec: ["https://w3c.github.io/uievent\
s/#events-compositionevents"], status: { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", by_compat_key: { "api.CompositionEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "5", safari_ios: "5" } }, "api.CompositionEvent.CompositionEvent": { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "53", firefox_android: "53", safari: "7", safari_ios: "7" } }, "api.CompositionEvent.data": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "5", safari_ios: "5" } }, "api.Element.compositionend_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "201\
5-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "5", safari_ios: "5" } }, "api.Element.compositionstart_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "5", safari_ios: "5" } }, "api.Element.compositionupdate_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "5", safari_ios: "5" } } }, support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "53", firefox_android: "53", safari: "7", safari_ios: "7" } } }, "compression-dictionary-transport": { compat_features: ["html.elements.link.rel.compression-dictionary", "http.headers.Accept-Encoding.dcb", "http.headers.Accept-Encoding.dcz", "http.headers.Available-Dictionary", "ht\
tp.headers.Content-Encoding.dcb", "http.headers.Content-Encoding.dcz", "http.headers.Dictionary-ID", "http.headers.Use-As-Dictionary"], description: "Compression Dictionary Transport is a mechanism for using designated HTTP responses as an external dictionary for future HTTP responses for compression schemes that support using external dictionaries (e.g., Brotli and Zstandard)", description_html: "Compression Dictionary Transport is a mechanism for using designated HTTP responses as an external dictionary for future HTTP responses for compression schemes that support using external dictionaries (e.g., Brotli and Zstandard)", kind: "feature", name: "Compression Dictionary Transport", spec: ["https://httpwg.org/specs/rfc9842.html"], status: { baseline: false, by_compat_key: { "html.elements.link.rel.compression-dictionary": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "http.headers.Accept-Encoding.dcb": { baseline: false, support: { chrome: "130", chrome_android: "\
130", edge: "130" } }, "http.headers.Accept-Encoding.dcz": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "http.headers.Available-Dictionary": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "http.headers.Content-Encoding.dcb": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "http.headers.Content-Encoding.dcz": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "http.headers.Dictionary-ID": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "http.headers.Use-As-Dictionary": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } } }, support: { chrome: "130", chrome_android: "130", edge: "130" } } }, "compression-streams": { compat_features: ["api.CompressionStream", "api.CompressionStream.CompressionStream", "api.CompressionStream.CompressionStream.brotli", "api.CompressionStream.Co\
mpressionStream.deflate", "api.CompressionStream.CompressionStream.deflate-raw", "api.CompressionStream.CompressionStream.gzip", "api.CompressionStream.readable", "api.CompressionStream.writable", "api.DecompressionStream", "api.DecompressionStream.DecompressionStream", "api.DecompressionStream.DecompressionStream.brotli", "api.DecompressionStream.DecompressionStream.deflate", "api.DecompressionStream.DecompressionStream.deflate-raw", "api.DecompressionStream.DecompressionStream.gzip", "api.DecompressionStream.readable", "api.DecompressionStream.writable"], description: "The CompressionStream and DecompressionStream APIs compress and decompress data using the gzip or deflate formats.", description_html: "The <code>CompressionStream</code> and <code>DecompressionStream</code> APIs compress and decompress data using the gzip or deflate formats.", kind: "feature", name: "Compression streams", spec: ["https://compression.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "\
2025-11-09", baseline_low_date: "2023-05-09", by_compat_key: { "api.CompressionStream": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.CompressionStream.CompressionStream": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.CompressionStream.CompressionStream.brotli": { baseline: false, support: { firefox: "147", firefox_android: "147", safari: "18.4", safari_ios: "18.4" } }, "api.CompressionStream.CompressionStream.deflate": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "\
16.4" } }, "api.CompressionStream.CompressionStream.deflate-raw": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.CompressionStream.CompressionStream.gzip": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.CompressionStream.readable": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.CompressionStream.writable": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "\
80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream.DecompressionStream": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream.DecompressionStream.brotli": { baseline: false, support: { firefox: "147", firefox_android: "147", safari: "18.4", safari_ios: "18.4" } }, "api.DecompressionStream.DecompressionStream.deflate": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "\
113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream.DecompressionStream.deflate-raw": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream.DecompressionStream.gzip": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream.readable": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } }, "api.DecompressionStream.writable": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: {
    chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "16.4", safari_ios: "16.4" } } }, "compute-pressure": { compat_features: ["api.PressureObserver", "api.PressureObserver.PressureObserver", "api.PressureObserver.disconnect", "api.PressureObserver.knownSources_static", "api.PressureObserver.observe", "api.PressureObserver.takeRecords", "api.PressureObserver.unobserve", "api.PressureRecord", "api.PressureRecord.source", "api.PressureRecord.state", "api.PressureRecord.time", "api.PressureRecord.toJSON", "html.elements.iframe.allow.compute-pressure", "http.headers.Permissions-Policy.compute-pressure"], description: "The PressureObserver API monitors CPU load, allowing you to adjust workloads in response to available computing resources. Also known as the Compute Pressure API.", description_html: "The <c\
ode>PressureObserver</code> API monitors CPU load, allowing you to adjust workloads in response to available computing resources. Also known as the Compute Pressure API.", group: ["compute-pressure"], kind: "feature", name: "CPU compute pressure", spec: ["https://w3c.github.io/compute-pressure/"], status: { baseline: false, by_compat_key: { "api.PressureObserver": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureObserver.PressureObserver": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureObserver.disconnect": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureObserver.knownSources_static": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureObserver.observe": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureObserver.takeRecords": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureObserver.unobserve": { baseline: false, support: { chrome: "\
125", edge: "125" } }, "api.PressureRecord": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureRecord.source": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureRecord.state": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureRecord.time": { baseline: false, support: { chrome: "125", edge: "125" } }, "api.PressureRecord.toJSON": { baseline: false, support: { chrome: "125", edge: "125" } }, "html.elements.iframe.allow.compute-pressure": { baseline: false, support: { chrome: "125", edge: "125" } }, "http.headers.Permissions-Policy.compute-pressure": { baseline: false, support: { chrome: "125", edge: "125" } } }, support: { chrome: "125", edge: "125" } } }, "conic-gradients": { caniuse: ["css-conic-gradients"], compat_features: ["css.types.gradient.conic-gradient", "css.types.gradient.conic-gradient.doubleposition", "css.types.gradient.conic-gradient.single_color_stop", "css.types.gradient.repeating-conic-gradient"],
    description: "The conic-gradient() and repeating-conic-gradient() CSS functions create backgrounds that progress between two or more colors around a center point.", description_html: "The <code>conic-gradient()</code> and <code>repeating-conic-gradient()</code> CSS functions create backgrounds that progress between two or more colors around a center point.", group: ["gradients"], kind: "feature", name: "Conic gradients", spec: ["https://drafts.csswg.org/css-images-4/#conic-gradients"], status: { baseline: "high", baseline_high_date: "2023-05-17", baseline_low_date: "2020-11-17", by_compat_key: { "css.types.gradient.conic-gradient": { baseline: "high", baseline_high_date: "2023-05-17", baseline_low_date: "2020-11-17", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "83", firefox_android: "83", safari: "12.1", safari_ios: "12.2" } }, "css.types.gradient.conic-gradient.doubleposition": { baseline: "high", baseline_high_date: "2023-05-17", baseline_low_date: "2020-1\
1-17", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "83", firefox_android: "83", safari: "12.1", safari_ios: "12.2" } }, "css.types.gradient.conic-gradient.single_color_stop": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "18.4", safari_ios: "18.4" } }, "css.types.gradient.repeating-conic-gradient": { baseline: "high", baseline_high_date: "2023-05-17", baseline_low_date: "2020-11-17", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "83", firefox_android: "83", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "83", firefox_android: "83", safari: "12.1", safari_ios: "12.2" } } }, console: { caniuse: ["console-basic"], compat_features: ["api.console", "api.console.assert_static", "api.console.clear_static", "api.console.countReset_static", "api.console.count_static", "api.\
console.debug_static", "api.console.dir_static", "api.console.dirxml_static", "api.console.error_static", "api.console.groupCollapsed_static", "api.console.groupEnd_static", "api.console.group_static", "api.console.info_static", "api.console.log_static", "api.console.substitution_strings", "api.console.table_static", "api.console.timeEnd_static", "api.console.timeLog_static", "api.console.time_static", "api.console.trace_static", "api.console.warn_static", "api.console.worker_support"], description: "The console API logs debugging messages to the browser development tools' console.", description_html: "The <code>console</code> API logs debugging messages to the browser development tools' console.", group: ["html-elements"], kind: "feature", name: "Console", spec: ["https://console.spec.whatwg.org/#console-namespace"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.console": { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.console.assert_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "28", firefox_android: "28", safari: "4", safari_ios: "3.2" } }, "api.console.clear_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "39", firefox_android: "39", safari: "7", safari_ios: "7" } }, "api.console.countReset_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "62", firefox_android: "62", safari: "13", safari_ios: "13" } }, "api.console.count_static": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "30", firefox_android: "30", safari: "4", safari_ios: "3.2" } }, "api.console.debug_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "5", firefox_android: "5", safari: "4", safari_ios: "3.2" } }, "api.console.dir_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "4", safari_ios: "3.2" } }, "api.console.dirxml_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "39", firefox_android: "39", safari: "4", safari_ios: "3.2" } }, "api.console.error_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.console.groupCollapsed_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "5.1", safari_ios: "5" } }, "api.console.groupEnd_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "4", safari_ios: "3.2" } }, "api.console.group_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "4", safari_ios: "3.2" } }, "api.console.info_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.console.log_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.console.substitution_strings": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "3", safari_ios: "1" } }, "api.console.table_static": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "27", chrome_android: "27", edge: "13", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "api.console.timeEnd_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
2", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "api.console.timeLog_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "62", firefox_android: "62", safari: "13", safari_ios: "13" } }, "api.console.time_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "api.console.trace_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.console.warn_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.console.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "29", firefox_android: "29", safari: "7", safari_ios: "7" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "constraint-validation": { caniuse: ["constraint-validation"], compat_features: ["api.HTMLButtonElement.checkValidity", "api.HTMLButtonElement.reportValidity", "api.HTMLButtonElement.setCustomValidity", "api.HTMLButtonElement.validationMessage", "api.HTMLButtonElement.validity", "api.HTMLButtonElement.willValidate", "api.HTMLFieldSetElement.checkValidity", "api.HTMLFieldSetElement.reportValidity", "api.HTMLFieldSetElement.setCustomValidity", "api.HTMLFieldSetElement.validationMessage", "api.HTMLFieldSetElement.validity", "api.H\
TMLFieldSetElement.willValidate", "api.HTMLFormElement.checkValidity", "api.HTMLFormElement.reportValidity", "api.HTMLInputElement.checkValidity", "api.HTMLInputElement.reportValidity", "api.HTMLInputElement.setCustomValidity", "api.HTMLInputElement.validationMessage", "api.HTMLInputElement.validity", "api.HTMLInputElement.willValidate", "api.HTMLObjectElement.checkValidity", "api.HTMLObjectElement.reportValidity", "api.HTMLObjectElement.setCustomValidity", "api.HTMLObjectElement.validationMessage", "api.HTMLObjectElement.validity", "api.HTMLObjectElement.willValidate", "api.HTMLOutputElement.checkValidity", "api.HTMLOutputElement.reportValidity", "api.HTMLOutputElement.setCustomValidity", "api.HTMLOutputElement.validationMessage", "api.HTMLOutputElement.validity", "api.HTMLOutputElement.willValidate", "api.HTMLSelectElement.checkValidity", "api.HTMLSelectElement.reportValidity", "api.HTMLSelectElement.setCustomValidity", "api.HTMLSelectElement.validationMessage", "api.HTMLSelectElemen\
t.validity", "api.HTMLSelectElement.willValidate", "api.HTMLTextAreaElement.checkValidity", "api.HTMLTextAreaElement.reportValidity", "api.HTMLTextAreaElement.setCustomValidity", "api.HTMLTextAreaElement.validationMessage", "api.HTMLTextAreaElement.validity", "api.HTMLTextAreaElement.willValidate", "api.ValidityState", "api.ValidityState.badInput", "api.ValidityState.customError", "api.ValidityState.patternMismatch", "api.ValidityState.rangeOverflow", "api.ValidityState.rangeUnderflow", "api.ValidityState.stepMismatch", "api.ValidityState.tooLong", "api.ValidityState.tooShort", "api.ValidityState.typeMismatch", "api.ValidityState.valid", "api.ValidityState.valueMissing"], description: "Methods that validate form controls before submission, such as checkValidity(), reportValidity() and setCustomValidity().", description_html: "Methods that validate form controls before submission, such as <code>checkValidity()</code>, <code>reportValidity()</code> and <code>setCustomValidity()</code>.",
    group: ["forms"], kind: "feature", name: "Constraint validation API", spec: ["https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-constraint-validation-api"], status: { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", by_compat_key: { "api.HTMLButtonElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLButtonElement.reportValidity": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "49", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLButtonElement.setCustomValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLButtonElement.validationMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLButtonElement.validity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLButtonElement.willValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.HTMLFieldSetElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLFieldSetElement.reportValidity": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "49", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLFieldSetElement.setCustomValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLFieldSetElement.validationMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLFieldSetElement.validity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLFieldSetElement.willValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.HTMLFormElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLFormElement.reportValidity": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLInputElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.reportValidity": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "49", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLInputElement.setCustomValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.validationMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.validity": { baseline: "high", baseline_high_date: "2018-01-\
29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.willValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.HTMLObjectElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLObjectElement.reportValidity": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "40", chrome_android: "40", edge: "18", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLObjectElement.setCustomValidity": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLObjectElement.validationMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLObjectElement.validity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLObjectElement.willValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLOutputElement.checkVali\
dity": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.reportValidity": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "40", chrome_android: "40", edge: "14", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLOutputElement.setCustomValidity": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.validationMessage": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "\
5" } }, "api.HTMLOutputElement.validity": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.willValidate": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLSelectElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLSelectElement.reportValidity": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "49", firefox_android: "64", safari: "\
10.1", safari_ios: "10.3" } }, "api.HTMLSelectElement.setCustomValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLSelectElement.validationMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLSelectElement.validity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLSelectElement.willValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "\
4", safari: "4", safari_ios: "3" } }, "api.HTMLTextAreaElement.checkValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.reportValidity": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "49", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLTextAreaElement.setCustomValidity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.validationMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.validity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.willValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.ValidityState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.badInput": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "\
29", firefox_android: "64", safari: "7", safari_ios: "7" } }, "api.ValidityState.customError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.patternMismatch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.rangeOverflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.rangeUnderflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "\
4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.stepMismatch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.tooLong": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "64", safari: "5", safari_ios: "5" } }, "api.ValidityState.tooShort": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "51", firefox_android: "64", safari: "10", safari_ios: "10" } }, "api.ValidityState.typeMismatch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "\
4", safari: "5", safari_ios: "5" } }, "api.ValidityState.valid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.ValidityState.valueMissing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } } }, support: { chrome: "40", chrome_android: "40", edge: "18", firefox: "51", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } } }, "constructed-stylesheets": { compat_features: ["api.CSSStyleSheet.CSSStyleSheet", "api.CSSStyleSheet.CSSStyleSheet.options_baseURL_parameter", "api.CSSStyleSheet.replace", "api.CSSStyleSheet.replaceSync", "api.Document.adoptedStyleSheets", "api.ShadowRoot.adoptedStyleSheets"], description: "The CSSStyleSheet constructor creates \
a new stylesheet which can be shared between a document and multiple shadow roots using adoptedStyleSheets.", description_html: "The <code>CSSStyleSheet</code> constructor creates a new stylesheet which can be shared between a document and multiple shadow roots using <code>adoptedStyleSheets</code>.", kind: "feature", name: "Constructed stylesheets", spec: ["https://drafts.csswg.org/cssom-1/#dom-cssstylesheet-cssstylesheet", "https://drafts.csswg.org/cssom-1/#dom-documentorshadowroot-adoptedstylesheets"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.CSSStyleSheet.CSSStyleSheet": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "101", firefox_android: "101", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleSheet.CSSStyleSheet.options_baseURL_parameter": { baseline: false, support: { firefox: "101", firefox_android: "\
101", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleSheet.replace": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "101", firefox_android: "101", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleSheet.replaceSync": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "101", firefox_android: "101", safari: "16.4", safari_ios: "16.4" } }, "api.Document.adoptedStyleSheets": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "101", firefox_android: "101", safari: "16.4", safari_ios: "16.4" } }, "api.ShadowRoot.adoptedStyleSheets": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "73", chrome_android: "73", edge: "7\
9", firefox: "101", firefox_android: "101", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "101", firefox_android: "101", safari: "16.4", safari_ios: "16.4" } } }, "contact-picker": { compat_features: ["api.ContactAddress", "api.ContactAddress.addressLine", "api.ContactAddress.city", "api.ContactAddress.country", "api.ContactAddress.dependentLocality", "api.ContactAddress.organization", "api.ContactAddress.phone", "api.ContactAddress.postalCode", "api.ContactAddress.recipient", "api.ContactAddress.region", "api.ContactAddress.sortingCode", "api.ContactAddress.toJSON", "api.ContactsManager", "api.ContactsManager.getProperties", "api.ContactsManager.select", "api.Navigator.contacts"], description: "The navigator.contacts API allows you to ask users to share limited details about entries in their contact list with your application.", description_html: "The <code>navigator.contacts</code> API allows you to ask users to share li\
mited details about entries in their contact list with your application.", kind: "feature", name: "Contact picker", spec: ["https://w3c.github.io/contact-picker/#contacts-manager"], status: { baseline: false, by_compat_key: { "api.ContactAddress": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.addressLine": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.city": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.country": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.dependentLocality": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.organization": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.phone": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.postalCode": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.recipient": { baseline: false, support: { chrome_android: "\
84" } }, "api.ContactAddress.region": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.sortingCode": { baseline: false, support: { chrome_android: "84" } }, "api.ContactAddress.toJSON": { baseline: false, support: { chrome_android: "84" } }, "api.ContactsManager": { baseline: false, support: { chrome_android: "80" } }, "api.ContactsManager.getProperties": { baseline: false, support: { chrome_android: "80" } }, "api.ContactsManager.select": { baseline: false, support: { chrome_android: "80" } }, "api.Navigator.contacts": { baseline: false, support: { chrome_android: "80" } } }, support: { chrome_android: "80" } } }, contain: { caniuse: ["css-containment"], compat_features: ["css.properties.contain", "css.properties.contain.content", "css.properties.contain.none", "css.properties.contain.strict"], description: "The contain CSS property sets limits to the scope of styles, layout, and paint rendering for speed and efficiency. The none keyword value disables conta\
inment, strict is equivalent to contain: size layout style paint, and content is equivalent to contain: layout style paint.", description_html: "The <code>contain</code> CSS property sets limits to the scope of styles, layout, and paint rendering for speed and efficiency. The <code>none</code> keyword value disables containment, <code>strict</code> is equivalent to <code>contain: size layout style paint</code>, and <code>content</code> is equivalent to <code>contain: layout style paint</code>.", group: ["containment"], kind: "feature", name: "contain", spec: ["https://drafts.csswg.org/css-contain-2/#contain-property"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.contain": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "css.proper\
ties.contain.content": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "css.properties.contain.none": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "css.properties.contain.strict": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, "contain-inline-size": { compat_features: ["css.properties.contain.inline-size"], description: "The \
contain: inline-size CSS declaration prevents the element's inline dimension from being set by the element's contents. This permits the browser to avoid slower layout calculations.", description_html: "The <code>contain: inline-size</code> CSS declaration prevents the element's inline dimension from being set by the element's contents. This permits the browser to avoid slower layout calculations.", group: ["containment"], kind: "feature", name: "Inline-size containment", spec: ["https://drafts.csswg.org/css-contain-3/#containment-inline-size"], status: { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: { "css.properties.contain.inline-size": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "101", firefox_android: "101", safari: "16", safari_ios: "16" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "\
101", firefox_android: "101", safari: "16", safari_ios: "16" } } }, "contain-intrinsic-size": { compat_features: ["css.properties.contain-intrinsic-block-size", "css.properties.contain-intrinsic-block-size.none", "css.properties.contain-intrinsic-height", "css.properties.contain-intrinsic-height.none", "css.properties.contain-intrinsic-inline-size", "css.properties.contain-intrinsic-inline-size.none", "css.properties.contain-intrinsic-size", "css.properties.contain-intrinsic-size.auto_none", "css.properties.contain-intrinsic-size.none", "css.properties.contain-intrinsic-width", "css.properties.contain-intrinsic-width.none"], description: "The contain-intrinsic-size CSS property sets the intrinsic size of an element. When using size containment, the browser will lay out the element as if it had a single child of this size.", description_html: "The <code>contain-intrinsic-size</code> CSS property sets the intrinsic size of an element. When using size containment, the browser will lay out\
 the element as if it had a single child of this size.", group: ["containment"], kind: "feature", name: "contain-intrinsic-size", spec: ["https://drafts.csswg.org/css-sizing-4/#intrinsic-size-override"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "css.properties.contain-intrinsic-block-size": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-block-size.none": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-height": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "\
95", chrome_android: "95", edge: "95", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-height.none": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-inline-size": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-inline-size.none": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-size": { baseline: "high", baseline_high_date: "\
2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-size.auto_none": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "117", firefox_android: "117", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-size.none": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.properties.contain-intrinsic-width": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.proper\
ties.contain-intrinsic-width.none": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } } }, support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } } }, "contain-layout": { compat_features: ["css.properties.contain.layout"], description: "The contain: layout CSS declaration isolates the inside of an element such that it cannot affect the layout of the rest of the page or be affected by the rest of the page. This permits the browser to avoid slower layout calculations.", description_html: "The <code>contain: layout</code> CSS declaration isolates the inside of an element such that it cannot affect the layout of the rest of the page or be affected by the rest of the page. This permits the browser to avoid slower layout calculations.", group: ["cont\
ainment"], kind: "feature", name: "Layout containment", spec: ["https://drafts.csswg.org/css-contain-2/#containment-layout"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.contain.layout": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, "contain-paint": { compat_features: ["css.properties.contain.paint"], description: "The contain: paint CSS declaration prevents an element's descendants from being drawn outside the boundaries of the containing element, with any overflow clipped. This permits the browser to avoid slower painting calculations.", description_html: "The <code>contain: paint</code> \
CSS declaration prevents an element's descendants from being drawn outside the boundaries of the containing element, with any overflow clipped. This permits the browser to avoid slower painting calculations.", group: ["containment"], kind: "feature", name: "Paint containment", spec: ["https://drafts.csswg.org/css-contain-2/#containment-paint"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.contain.paint": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, "contain-size": { compat_features: ["css.properties.contain.size"], description: "The contain: size CSS declaration sets an element's dimensions\
 exclusively by its height and width properties, ignoring its contents and descendants. This permits the browser to avoid slower layout calculations.", description_html: "The <code>contain: size</code> CSS declaration sets an element's dimensions exclusively by its <code>height</code> and <code>width</code> properties, ignoring its contents and descendants. This permits the browser to avoid slower layout calculations.", group: ["containment"], kind: "feature", name: "Size containment", spec: ["https://drafts.csswg.org/css-contain-2/#containment-size"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.contain.size": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "69",
    firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, "contain-style": { compat_features: ["css.properties.contain.style"], description: "The contain: style CSS declaration permits the browser to avoid slower layout calculations by preventing modification to counter (counter-increment and counter-set) and quotation styles (content property quote values) beyond the element's descendants.", description_html: "The <code>contain: style</code> CSS declaration permits the browser to avoid slower layout calculations by preventing modification to counter (<code>counter-increment</code> and <code>counter-set</code>) and quotation styles (<code>content</code> property quote values) beyond the element's descendants.", group: ["containment"], kind: "feature", name: "Style containment", spec: ["https://drafts.csswg.org/css-contain-2/#containment-style"], status: { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", by_compat_key: { "css.properties.con\
tain.style": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "103", firefox_android: "103", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "103", firefox_android: "103", safari: "15.4", safari_ios: "15.4" } } }, "container-anchor-position-queries": { compat_features: ["css.at-rules.container.anchor_position_queries", "css.at-rules.container.anchor_position_queries.fallback", "css.at-rules.container.anchor_position_queries.fallback.any_value", "css.properties.container-type.anchored"], description: "Anchor position container queries with the @container anchored(fallback: …) at-rule apply styles to an element based on the element's anchor position.", description_html: "Anchor position container queries with the <code>@container anchored(fallback: …)</code> at-rule apply styles to an element based on the element's ancho\
r position.", kind: "feature", name: "Anchor position container queries", spec: ["https://drafts.csswg.org/css-anchor-position-2/#anchored-container-queries"], status: { baseline: false, by_compat_key: { "css.at-rules.container.anchor_position_queries": { baseline: false, support: { chrome: "143", chrome_android: "143", edge: "143" } }, "css.at-rules.container.anchor_position_queries.fallback": { baseline: false, support: { chrome: "143", chrome_android: "143", edge: "143" } }, "css.at-rules.container.anchor_position_queries.fallback.any_value": { baseline: false, support: { chrome: "143", chrome_android: "143", edge: "143" } }, "css.properties.container-type.anchored": { baseline: false, support: { chrome: "143", chrome_android: "143", edge: "143" } } }, support: { chrome: "143", chrome_android: "143", edge: "143" } } }, "container-queries": { caniuse: ["css-container-queries", "css-container-query-units"], compat_features: ["api.CSSContainerRule", "api.CSSContainerRule.containerName",
    "api.CSSContainerRule.containerQuery", "css.at-rules.container", "css.properties.container", "css.properties.container-name", "css.properties.container-name.none", "css.properties.container-type", "css.properties.container-type.inline-size", "css.properties.container-type.normal", "css.properties.container-type.size", "css.types.length.container_query_length_units"], description: "Container size queries with the @container at-rule apply styles to an element based on the dimensions of its container.", description_html: "Container size queries with the <code>@container</code> at-rule apply styles to an element based on the dimensions of its container.", group: ["container-queries"], kind: "feature", name: "Container queries", spec: ["https://drafts.csswg.org/css-conditional-5/#container-queries"], status: { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", by_compat_key: { "api.CSSContainerRule": { baseline: "high", baseline_high_date: "2025-08-14",
    baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "api.CSSContainerRule.containerName": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "110", firefox_android: "110", safari: "17", safari_ios: "17" } }, "api.CSSContainerRule.containerQuery": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "110", firefox_android: "110", safari: "17", safari_ios: "17" } }, "css.at-rules.container": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.properties.container": { baseline: "high",
    baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.properties.container-name": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.properties.container-name.none": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.properties.container-type": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.propert\
ies.container-type.inline-size": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.properties.container-type.normal": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.properties.container-type.size": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } }, "css.types.length.container_query_length_units": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "\
110", safari: "16", safari_ios: "16" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "110", firefox_android: "110", safari: "16", safari_ios: "16" } } }, "container-scroll-state-queries": { compat_features: ["css.at-rules.container.scroll-state_queries", "css.at-rules.container.scroll-state_queries.scrollable", "css.at-rules.container.scroll-state_queries.snapped", "css.at-rules.container.scroll-state_queries.stuck", "css.properties.container-type.scroll-state"], description: "Container scroll-state queries with the @container scroll-state(...) at-rule apply styles to an element based on the sticky positioning, snapped, and scrollable state of the container.", description_html: "Container scroll-state queries with the <code>@container scroll-state(...)</code> at-rule apply styles to an element based on the sticky positioning, snapped, and scrollable state of the container.", group: ["container-queries"], kind: "feature", name: "Container scroll-state queri\
es", spec: ["https://drafts.csswg.org/css-conditional-5/#scroll-state-container"], status: { baseline: false, by_compat_key: { "css.at-rules.container.scroll-state_queries": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.at-rules.container.scroll-state_queries.scrollable": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.at-rules.container.scroll-state_queries.snapped": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.at-rules.container.scroll-state_queries.stuck": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.properties.container-type.scroll-state": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } } }, support: { chrome: "133", chrome_android: "133", edge: "133" } } }, "container-style-queries": { caniuse: ["css-container-queries-style"], compat_features: ["css.at-rules.container.style_\
queries_for_custom_properties"], description: "Container style queries with the @container at-rule apply styles to an element based on the values of custom properties of its container.", description_html: "Container style queries with the <code>@container</code> at-rule apply styles to an element based on the values of custom properties of its container.", group: ["container-queries"], kind: "feature", name: "Container style queries", spec: ["https://drafts.csswg.org/css-conditional-5/#style-container"], status: { baseline: false, by_compat_key: { "css.at-rules.container.style_queries_for_custom_properties": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111", safari: "18", safari_ios: "18" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", safari: "18", safari_ios: "18" } } }, content: { compat_features: ["css.properties.content", "css.properties.content.close-quote", "css.properties.content.element_replacement", "css.properties.content.gr\
adient", "css.properties.content.no-close-quote", "css.properties.content.no-open-quote", "css.properties.content.none", "css.properties.content.none_applies_to_elements", "css.properties.content.normal", "css.properties.content.open-quote", "css.properties.content.url", "css.types.string", "css.types.string.unicode_escaped_characters"], description: "The content CSS property sets the content inside of an element or pseudo-element, replacing the current value. It's often used with the ::before and ::after pseudo-elements to generate cosmetic content.", description_html: "The <code>content</code> CSS property sets the content inside of an element or pseudo-element, replacing the current value. It's often used with the <code>::before</code> and <code>::after</code> pseudo-elements to generate cosmetic content.", group: ["css"], kind: "feature", name: "Content", spec: ["https://drafts.csswg.org/css-content-3/#content-property"], status: { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.content": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.content.close-quote": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.content.element_replacement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "28", chrome_android: "28", edge: "79", firefox: "63", firefox_android: "63", safari: "9", safari_ios: "9" } }, "css.properties.content.gradient": { baseline: false, support: { chrome: "26", chrome_android: "26", edge: "12", safari: "7", safari_ios: "7" } }, "css.properties.content.no-close-quote": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.content.no-open-quote": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.content.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.content.none_applies_to_elements": { baseline: false, support: {} }, "css.properties.content.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.content.open-quote": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.content.url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.string": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.string.unicode_escaped_characters": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "content-index": { compat_features: ["api.ContentIndex", "api.ContentIndex.add", "api.ContentIndex.delete", "api.ContentIndex.getAll", "api.ContentIndexEvent", "api.ContentIndexEvent.ContentIndexEvent", "api.ContentIndexEvent.id", "api.ServiceWorkerGlobalScope.contentdelete_event", "api.ServiceWorkerRegistration.index"], description: "The Content Index API allows developers to register their offline enabled content with the browser.", description_html: "The Content Index API allows developers to register their offline enabled content with the browser.", kind: "feature", name: "Content Index", spec: ["https://wicg.github.io/content-index/spec/"], status: { baseline: false, by_compat_key: { "api.ContentIndex": { baseline: false, support: { chrome_android: "84" } }, "api.ContentIndex.add": { baseline: false, support: { chrome_android: "\
84" } }, "api.ContentIndex.delete": { baseline: false, support: { chrome_android: "84" } }, "api.ContentIndex.getAll": { baseline: false, support: { chrome_android: "84" } }, "api.ContentIndexEvent": { baseline: false, support: { chrome_android: "84" } }, "api.ContentIndexEvent.ContentIndexEvent": { baseline: false, support: { chrome_android: "84" } }, "api.ContentIndexEvent.id": { baseline: false, support: { chrome_android: "84" } }, "api.ServiceWorkerGlobalScope.contentdelete_event": { baseline: false, support: { chrome_android: "84" } }, "api.ServiceWorkerRegistration.index": { baseline: false, support: { chrome_android: "84" } } }, support: { chrome_android: "84" } } }, "content-visibility": { caniuse: ["css-content-visibility"], compat_features: ["api.ContentVisibilityAutoStateChangeEvent", "api.ContentVisibilityAutoStateChangeEvent.ContentVisibilityAutoStateChangeEvent", "api.ContentVisibilityAutoStateChangeEvent.skipped", "api.Element.contentvisibilityautostatechange_event", "cs\
s.properties.content-visibility", "css.properties.content-visibility.auto", "css.properties.content-visibility.hidden", "css.properties.content-visibility.visible"], description: "The content-visibility CSS property delays rendering an element, including layout and painting, until it is needed.", description_html: "The <code>content-visibility</code> CSS property delays rendering an element, including layout and painting, until it is needed.", group: ["css"], kind: "feature", name: "content-visibility", spec: ["https://drafts.csswg.org/css-contain-2/#content-visibility"], status: { baseline: "low", baseline_low_date: "2025-09-15", by_compat_key: { "api.ContentVisibilityAutoStateChangeEvent": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.ContentVisibilityAutoStateChangeEvent.ContentVisibilityAutoStateChangeEvent": { baseline: "low", baseline_low_date: "\
2024-09-16", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.ContentVisibilityAutoStateChangeEvent.skipped": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.Element.contentvisibilityautostatechange_event": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "130", firefox_android: "130", safari: "18", safari_ios: "18" } }, "css.properties.content-visibility": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "css.properties.content-visibility.auto": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "85", chrome_android: "85",
    edge: "85", firefox: "125", firefox_android: "125", safari: "26", safari_ios: "26" } }, "css.properties.content-visibility.hidden": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "css.properties.content-visibility.visible": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } } }, support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "130", firefox_android: "130", safari: "26", safari_ios: "26" } } }, contenteditable: { caniuse: ["contenteditable"], compat_features: ["api.HTMLElement.contentEditable", "api.HTMLElement.isContentEditable", "html.global_attributes.contenteditable"], description: "The contenteditable global HTML attribute allows the user to edit the content of an element, such as insert\
ing or deleting text.", description_html: "The <code>contenteditable</code> global HTML attribute allows the user to edit the content of an element, such as inserting or deleting text.", kind: "feature", name: "contenteditable", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#contenteditable"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLElement.contentEditable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.isContentEditable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.global_attributes.contenteditable": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "contenteditable-plaintextonly": { compat_features: ["api.HTMLElement.contentEditable.plaintext-only", "html.global_attributes.contenteditable.plaintext-only"], description: 'The contenteditable="plaintext-only" global HTML attribute allows the user to edit the content of an element, but prevents rich-text formatting.', description_html: 'The <code>contenteditable="plaintext-only"</code> global HTML attribute allows the user to edit the content of an element, but prevents rich-text formatting.', kind: "feature", name: 'contenteditable="plaintext-only"', spec: ["https://html.spec.whatwg.org/multipage/interaction.html#attr-contenteditable-plaintextonly-state"], status: { baseline: "\
low", baseline_low_date: "2025-03-04", by_compat_key: { "api.HTMLElement.contentEditable.plaintext-only": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "136", firefox_android: "136", safari: "5.1", safari_ios: "5" } }, "html.global_attributes.contenteditable.plaintext-only": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "136", firefox_android: "136", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "136", firefox_android: "136", safari: "5.1", safari_ios: "5" } } }, "context-fill-stroke": { compat_features: ["svg.elements.circle.fill.context-fill", "svg.elements.ellipse.fill.context-fill", "svg.elements.path.fill.context-fill", "svg.elements.polygon.fill.context-fill", "svg.elements.polyline.fill.context-fill", "svg.elements.rect.fill.context-fill", "svg.elements.text.fill.context-fil\
l", "svg.elements.textPath.fill.context-fill", "svg.elements.tspan.fill.context-fill", "svg.global_attributes.stroke.context-stroke"], description: "The context-fill and context-stroke CSS values are used with fill and stroke in SVG <marker> or <use> elements to match a color from where they appear.", description_html: "The <code>context-fill</code> and <code>context-stroke</code> CSS values are used with <code>fill</code> and <code>stroke</code> in SVG <code>&#x3C;marker></code> or <code>&#x3C;use></code> elements to match a color from where they appear.", group: ["svg"], kind: "feature", name: "context-fill and context-stroke", spec: ["https://w3c.github.io/svgwg/svg2-draft/painting.html#SpecifyingPaint"], status: { baseline: false, by_compat_key: { "svg.elements.circle.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.ellipse.fill.context-fill": { baseline: false, support: { chrome: "\
124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111", safari_ios: "3" } }, "svg.elements.path.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.polygon.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.polyline.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.rect.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.text.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.textPath.fill.context-fill": { baseline: false, support: {
    chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.elements.tspan.fill.context-fill": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } }, "svg.global_attributes.stroke.context-stroke": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } } }, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "111", firefox_android: "111" } } }, "contrast-color": { compat_features: ["css.types.color.contrast-color"], description: "The contrast-color() CSS function picks a color that has guaranteed contrast against a specified foreground or background color.", description_html: "The <code>contrast-color()</code> CSS function picks a color that has guaranteed contrast against a specified foreground or background color.", group: ["color-types"], kind: "feature", name: "contrast-color()", spec: [
    "https://drafts.csswg.org/css-color-6/#funcdef-contrast-color"], status: { baseline: false, by_compat_key: { "css.types.color.contrast-color": { baseline: false, support: { firefox: "146", firefox_android: "146", safari: "26", safari_ios: "26" } } }, support: { firefox: "146", firefox_android: "146", safari: "26", safari_ios: "26" } } }, "controls-list": { compat_features: ["api.HTMLMediaElement.controlsList", "html.elements.audio.controlslist", "html.elements.video.controlslist"], description: `The controlslist attribute for <audio> or <video> hides parts of the browser's built-in controls. For example, controlslist="nofullscreen" removes the button to play the video in fullscreen.`, description_html: `The <code>controlslist</code> attribute for <code>&#x3C;audio></code> or <code>&#x3C;video></code> hides parts of the browser's built-in controls. For example, <code>controlslist="nofullscreen"</code> removes the button to play the video in fullscreen.`, group: ["media-elements"], kind: "\
feature", name: "controlslist", spec: ["https://wicg.github.io/controls-list/"], status: { baseline: false, by_compat_key: { "api.HTMLMediaElement.controlsList": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "html.elements.audio.controlslist": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "html.elements.video.controlslist": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } } }, support: { chrome: "58", chrome_android: "58", edge: "79" } } }, "cookie-enabled": { compat_features: ["api.Navigator.cookieEnabled"], description: "The navigator.cookieEnabled property is a boolean for whether the browser accepts or ignores attempts to write cookie data.", description_html: "The <code>navigator.cookieEnabled</code> property is a boolean for whether the browser accepts or ignores attempts to write cookie data.", group: ["cookies"], kind: "feature", name: "cookieEnabled", spec: ["https://html.spec\
.whatwg.org/multipage/system-state.html#cookies"], status: { baseline: "low", baseline_low_date: "2024-09-16", by_compat_key: { "api.Navigator.cookieEnabled": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "18", safari_ios: "18" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "18", safari_ios: "18" } } }, "cookie-store": { caniuse: ["cookie-store-api"], compat_features: ["api.CookieChangeEvent", "api.CookieChangeEvent.CookieChangeEvent", "api.CookieChangeEvent.changed", "api.CookieChangeEvent.deleted", "api.CookieStore", "api.CookieStore.change_event", "api.CookieStore.delete", "api.CookieStore.get", "api.CookieStore.get.domain_return_property", "api.CookieStore.get.expires_return_property", "api.CookieStore.get.name_return_property", "api.CookieStore.get.path_return_property", "api.CookieStore.get.sameSite_return_proper\
ty", "api.CookieStore.get.secure_return_property", "api.CookieStore.get.value_return_property", "api.CookieStore.getAll", "api.CookieStore.set", "api.CookieStoreManager", "api.CookieStoreManager.getSubscriptions", "api.CookieStoreManager.subscribe", "api.CookieStoreManager.unsubscribe", "api.ExtendableCookieChangeEvent", "api.ExtendableCookieChangeEvent.ExtendableCookieChangeEvent", "api.ExtendableCookieChangeEvent.changed", "api.ExtendableCookieChangeEvent.deleted", "api.ServiceWorkerGlobalScope.cookieStore", "api.ServiceWorkerGlobalScope.cookiechange_event", "api.ServiceWorkerRegistration.cookies", "api.Window.cookieStore"], description: "The CookieStore API is an asynchronous and promise-based API for managing cookies. It does not rely on document and so is available to service workers as well.", description_html: "The <code>CookieStore</code> API is an asynchronous and promise-based API for managing cookies. It does not rely on document and so is available to service workers as wel\
l.", group: ["cookies"], kind: "feature", name: "Cookie store", spec: ["https://cookiestore.spec.whatwg.org/"], status: { baseline: false, by_compat_key: { "api.CookieChangeEvent": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieChangeEvent.CookieChangeEvent": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieChangeEvent.changed": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieChangeEvent.deleted": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "\
140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore.change_event": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore.delete": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore.get": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore.get.domain_return_property": { baseline: false, support: { chrome: "87", chrome_android: "\
87", edge: "87" } }, "api.CookieStore.get.expires_return_property": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "api.CookieStore.get.name_return_property": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore.get.path_return_property": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "api.CookieStore.get.sameSite_return_property": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "api.CookieStore.get.secure_return_property": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "api.CookieStore.get.value_return_property": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } },
    "api.CookieStore.getAll": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStore.set": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.CookieStoreManager": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.CookieStoreManager.getSubscriptions": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.CookieStoreManager.subscribe": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.CookieStoreManager.unsubscribe": { baseline: false, support: { chrome: "87", chrome_android: "\
87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.ExtendableCookieChangeEvent": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.ExtendableCookieChangeEvent.ExtendableCookieChangeEvent": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.ExtendableCookieChangeEvent.changed": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.ExtendableCookieChangeEvent.deleted": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.ServiceWorkerGlobalScope.cookieStore": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } }, "api.ServiceWorkerGlobalScope.co\
okiechange_event": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.ServiceWorkerRegistration.cookies": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140" } }, "api.Window.cookieStore": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "140", firefox_android: "140", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "87", chrome_android: "87", edge: "87" } } }, cookies: { compat_features: ["api.Document.cookie", "http.headers.Cookie", "http.headers.Set-Cookie", "http.headers.Set-Cookie.HttpOnly", "http.headers.Set-Cookie.Max-Age", "http.headers.Set-Cookie.SameSite", "http.headers.Set-Cookie.SameSite.Lax", "http.headers.Set-Cookie.SameSite.Lax_default", "http.headers.Set-Cookie.SameSite.None", "http.headers.Set-Cookie.SameSite.Strict", "http.headers.Set-Cookie.SameSi\
te.none_requires_secure", "http.headers.Set-Cookie.SameSite.schemeful", "http.headers.Set-Cookie.host_secure_prefixes", "http.headers.Set-Cookie.http_host-http_prefixes"], description: "The Set-Cookie HTTP header stores limited amounts of data that persist across request and response, creating shared state between the browser and server.", description_html: "The <code>Set-Cookie</code> HTTP header stores limited amounts of data that persist across request and response, creating shared state between the browser and server.", group: ["cookies"], kind: "feature", name: "Cookies", spec: ["https://httpwg.org/specs/rfc6265.html"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Document.cookie": { baseline: "high", baseline_high_date: "2022-01-09", baseline_low_date: "2019-07-09", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "68", firefox_android: "68", safari: "4", safari_ios: "3.2" } }, "http.headers\
.Cookie": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Set-Cookie": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Set-Cookie.HttpOnly": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "5", safari_ios: "4" } }, "http.headers.Set-Cookie.Max-Age": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Set-Cookie.SameSit\
e": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "http.headers.Set-Cookie.SameSite.Lax": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "http.headers.Set-Cookie.SameSite.Lax_default": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "86" } }, "http.headers.Set-Cookie.SameSite.None": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "67", edge: "16", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "http.headers.Set-Cookie.SameSite.Strict": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-\
19", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "http.headers.Set-Cookie.SameSite.none_requires_secure": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "86", firefox: "131", firefox_android: "131" } }, "http.headers.Set-Cookie.SameSite.schemeful": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91" } }, "http.headers.Set-Cookie.host_secure_prefixes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "50", firefox_android: "50", safari: "13", safari_ios: "13" } }, "http.headers.Set-Cookie.http_host-http_prefixes": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "143", firefox_android: "143" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } } }, "corner-shape": { compat_features: ["css.properties.corner-block-end-shape", "css.properties.corner-block-start-shape", "css.properties.corner-bottom-left-shape", "css.properties.corner-bottom-right-shape", "css.properties.corner-bottom-shape", "css.properties.corner-end-end-shape", "css.properties.corner-end-start-shape", "css.properties.corner-inline-end-shape", "css.properties.corner-inline-start-shape", "css.properties.corner-left-shape", "css.properties.corner-right-shape", "css.properties.corner-shape", "css.properties.corner-start-end-shape", "css.properties.corner-start-start-shape", "css.properties.corner-top-left-shape", "css.properties.corner-top-right-shape", "css.properties.corner-top-shape", "css.types.corner-shape-value", "css.types.corner-shape-value.bevel", "css.types.corner-shape-value.notch", "css.types.corner-shape-value.round", "css.types.corner-shape-value.scoop", "css.types.corner-shape-value.square", "css.types.corner-shape-value.squircle", "css.types.\
corner-shape-value.superellipse", "css.types.superellipse"], description: "The corner-shape CSS property sets the shape of an element's corners when using border-radius, allowing for shapes other than rounded corners. For example, corner-shape: squircle is a shape in between a square and rounded corner.", description_html: "The <code>corner-shape</code> CSS property sets the shape of an element's corners when using <code>border-radius</code>, allowing for shapes other than rounded corners. For example, <code>corner-shape: squircle</code> is a shape in between a square and rounded corner.", kind: "feature", name: "corner-shape", spec: ["https://drafts.csswg.org/css-borders-4/#corner-shaping"], status: { baseline: false, by_compat_key: { "css.properties.corner-block-end-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-block-start-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "\
css.properties.corner-bottom-left-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-bottom-right-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-bottom-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-end-end-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-end-start-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-inline-end-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-inline-start-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-left-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } },
    "css.properties.corner-right-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-start-end-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-start-start-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-top-left-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-top-right-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.properties.corner-top-shape": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corne\
r-shape-value.bevel": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value.notch": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value.round": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value.scoop": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value.square": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value.squircle": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.corner-shape-value.superellipse": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.superellipse": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, support: { chrome: "139", chrome_android: "\
139", edge: "139" } } }, cors: { caniuse: ["cors"], compat_features: ["http.headers.Access-Control-Allow-Credentials", "http.headers.Access-Control-Allow-Headers", "http.headers.Access-Control-Allow-Headers.authorization_not_covered_by_wildcard", "http.headers.Access-Control-Allow-Headers.wildcard", "http.headers.Access-Control-Allow-Methods", "http.headers.Access-Control-Allow-Methods.wildcard", "http.headers.Access-Control-Allow-Origin", "http.headers.Access-Control-Expose-Headers", "http.headers.Access-Control-Expose-Headers.wildcard", "http.headers.Access-Control-Max-Age", "http.headers.Access-Control-Request-Headers", "http.headers.Access-Control-Request-Method"], description: "Cross-Origin Resource Sharing is an HTTP-header based mechanism that allows a server to indicate any origins (domain, scheme, or port) other than its own from which a browser should permit loading resources. Also known as CORS.", description_html: "Cross-Origin Resource Sharing is an HTTP-header based mecha\
nism that allows a server to indicate any origins (domain, scheme, or port) other than its own from which a browser should permit loading resources. Also known as CORS.", group: ["security"], kind: "feature", name: "CORS", spec: ["https://fetch.spec.whatwg.org/#http-cors-protocol"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "http.headers.Access-Control-Allow-Credentials": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Allow-Headers": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Allow-Headers.authorization_not_covered_by_\
wildcard": { baseline: false, support: {} }, "http.headers.Access-Control-Allow-Headers.wildcard": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "69", firefox_android: "79", safari: "13", safari_ios: "13" } }, "http.headers.Access-Control-Allow-Methods": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Allow-Methods.wildcard": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "69", firefox_android: "79", safari: "13", safari_ios: "13" } }, "http.headers.Access-Control-Allow-Origin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Expose-Headers": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Expose-Headers.wildcard": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "69", firefox_android: "79", safari: "13", safari_ios: "13" } }, "http.headers.Access-Control-Max-Age": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Request-Headers": { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "http.headers.Access-Control-Request-Method": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "counter-reset-reversed": { compat_features: ["css.properties.counter-reset.reversed"], description: "The reversed() CSS function for counter-reset creates a counter that counts down.", description_html: "The <code>reversed()</code> CSS function for <code>counter-reset</code> creates a counter that counts down.", group: ["counters"], kind: "feature", name: "Reversed counter-reset", spec: ["https://drafts.csswg.org/css-l\
ists-3/#css-counter-reversed"], status: { baseline: false, by_compat_key: { "css.properties.counter-reset.reversed": { baseline: false, support: { firefox: "96", firefox_android: "96" } } }, support: { firefox: "96", firefox_android: "96" } } }, "counter-set": { compat_features: ["css.properties.counter-set", "css.properties.counter-set.list-item", "css.properties.counter-set.none"], description: "The counter-set CSS property creates (and optionally sets a value for) a counter, the numbers for a series of headings or ordered list items.", description_html: "The <code>counter-set</code> CSS property creates (and optionally sets a value for) a counter, the numbers for a series of headings or ordered list items.", group: ["counters"], kind: "feature", name: "counter-set", spec: ["https://drafts.csswg.org/css-lists-3/#propdef-counter-set"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "css.properties.counter-set": { baseline: "low", baseline_low_date: "2023-\
12-11", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "68", firefox_android: "68", safari: "17.2", safari_ios: "17.2" } }, "css.properties.counter-set.list-item": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "68", firefox_android: "68", safari: "17.2", safari_ios: "17.2" } }, "css.properties.counter-set.none": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "68", firefox_android: "68", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "68", firefox_android: "68", safari: "17.2", safari_ios: "17.2" } } }, "counter-style": { caniuse: ["css-at-counter-style"], compat_features: ["api.CSSCounterStyleRule", "api.CSSCounterStyleRule.additiveSymbols", "api.CSSCounterStyleRule.fallback", "api.CSSCounterStyleRule.name", "api.CSSCounterStyleRule.negative", "api.CSSCounter\
StyleRule.pad", "api.CSSCounterStyleRule.prefix", "api.CSSCounterStyleRule.range", "api.CSSCounterStyleRule.speakAs", "api.CSSCounterStyleRule.suffix", "api.CSSCounterStyleRule.symbols", "api.CSSCounterStyleRule.system", "css.at-rules.counter-style", "css.at-rules.counter-style.additive-symbols", "css.at-rules.counter-style.fallback", "css.at-rules.counter-style.negative", "css.at-rules.counter-style.pad", "css.at-rules.counter-style.prefix", "css.at-rules.counter-style.range", "css.at-rules.counter-style.speak-as", "css.at-rules.counter-style.suffix", "css.at-rules.counter-style.symbols", "css.at-rules.counter-style.system"], description: "The @counter-style CSS at-rule sets custom counter styles for list items. For example, you can use a sequence of specific symbols instead of numbers for an ordered list.", description_html: "The <code>@counter-style</code> CSS at-rule sets custom counter styles for list items. For example, you can use a sequence of specific symbols instead of number\
s for an ordered list.", group: ["counters"], kind: "feature", name: "@counter-style", spec: ["https://drafts.csswg.org/css-counter-styles-3/"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "api.CSSCounterStyleRule": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.additiveSymbols": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.fallback": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17",
    safari_ios: "17" } }, "api.CSSCounterStyleRule.name": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.negative": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.pad": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.prefix": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33",
    safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.range": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.speakAs": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.suffix": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.symbols": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "\
33", safari: "17", safari_ios: "17" } }, "api.CSSCounterStyleRule.system": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.additive-symbols": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.fallback": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "\
33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.negative": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.pad": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.prefix": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.range": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "9\
1", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.speak-as": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33" } }, "css.at-rules.counter-style.suffix": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.symbols": { baseline: false, support: { safari: "17", safari_ios: "17" } }, "css.at-rules.counter-style.system": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } } }, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "17", safari_ios: "17" } } },
    counters: { caniuse: ["css-counters"], compat_features: ["css.properties.counter-increment", "css.properties.counter-increment.list-item", "css.properties.counter-increment.none", "css.properties.counter-reset", "css.properties.counter-reset.list-item", "css.properties.counter-reset.none", "css.properties.counter-reset.reset_does_not_affect_siblings", "css.types.counter", "css.types.counters"], description: "The counter-reset and counter-increment CSS properties and the counter() and counters() functions automatically number headings or ordered list items.", description_html: "The <code>counter-reset</code> and <code>counter-increment</code> CSS properties and the <code>counter()</code> and <code>counters()</code> functions automatically number headings or ordered list items.", group: ["counters"], kind: "feature", name: "Counters (CSS)", spec: ["https://drafts.csswg.org/css-lists-3/#auto-numbering"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", by_compat_key: { "css.properties.counter-increment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "25", safari: "3", safari_ios: "1" } }, "css.properties.counter-increment.list-item": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "1", firefox_android: "25", safari: "9", safari_ios: "9" } }, "css.properties.counter-increment.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "25", safari: "3", safari_ios: "2" } }, "css.properties.counter-reset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
25", safari: "3", safari_ios: "1" } }, "css.properties.counter-reset.list-item": { baseline: false, support: { edge: "12", firefox: "1", firefox_android: "25" } }, "css.properties.counter-reset.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "25", safari: "3", safari_ios: "2" } }, "css.properties.counter-reset.reset_does_not_affect_siblings": { baseline: false, support: { firefox: "82", firefox_android: "82" } }, "css.types.counter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.types.counters": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "\
3", safari_ios: "1" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "25", safari: "3", safari_ios: "1" } } }, createimagebitmap: { caniuse: ["createimagebitmap"], compat_features: ["api.ImageBitmap", "api.ImageBitmap.close", "api.ImageBitmap.height", "api.ImageBitmap.width", "api.createImageBitmap", "api.createImageBitmap.options_colorSpaceConversion_parameter", "api.createImageBitmap.options_imageOrientation_parameter", "api.createImageBitmap.options_imageOrientation_parameter.from-image", "api.createImageBitmap.options_premultiplyAlpha_parameter", "api.createImageBitmap.options_resizeHeight_parameter", "api.createImageBitmap.options_resizeQuality_parameter", "api.createImageBitmap.options_resizeWidth_parameter", "api.createImageBitmap.svgimageelement_as_source_image"], description: "The createImageBitmap() global method creates an ImageBitmap object from a source such as an image, SVG, blob, or canvas. An ImageBitmap object represents p\
ixel data that can be drawn to a canvas with lower latency than other types, such as ImageData.", description_html: "The <code>createImageBitmap()</code> global method creates an <code>ImageBitmap</code> object from a source such as an image, SVG, blob, or canvas. An <code>ImageBitmap</code> object represents pixel data that can be drawn to a canvas with lower latency than other types, such as <code>ImageData</code>.", kind: "feature", name: "createImageBitmap", spec: ["https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "api.ImageBitmap": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "42", firefox_android: "42", safari: "15", safari_ios: "15" } }, "api.ImageBitmap.close": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "\
52", chrome_android: "52", edge: "79", firefox: "46", firefox_android: "46", safari: "15", safari_ios: "15" } }, "api.ImageBitmap.height": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "42", firefox_android: "42", safari: "15", safari_ios: "15" } }, "api.ImageBitmap.width": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "42", firefox_android: "42", safari: "15", safari_ios: "15" } }, "api.createImageBitmap": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "42", firefox_android: "42", safari: "15", safari_ios: "15" } }, "api.createImageBitmap.options_colorSpaceConversion_parameter": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: {
    chrome: "58", chrome_android: "58", edge: "79", firefox: "98", firefox_android: "98", safari: "15", safari_ios: "15" } }, "api.createImageBitmap.options_imageOrientation_parameter": { baseline: "high", baseline_high_date: "2024-04-05", baseline_low_date: "2021-10-05", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "93", firefox_android: "93", safari: "15", safari_ios: "15" } }, "api.createImageBitmap.options_imageOrientation_parameter.from-image": { baseline: "high", baseline_high_date: "2025-10-06", baseline_low_date: "2023-04-06", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "111", firefox_android: "111", safari: "16", safari_ios: "16" } }, "api.createImageBitmap.options_premultiplyAlpha_parameter": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "93", firefox_android: "93", safari: "17", safari_ios: "17" } }, "api.createImageBi\
tmap.options_resizeHeight_parameter": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "98", firefox_android: "98", safari: "15", safari_ios: "15" } }, "api.createImageBitmap.options_resizeQuality_parameter": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "149", firefox_android: "149", safari: "15", safari_ios: "15" } }, "api.createImageBitmap.options_resizeWidth_parameter": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "98", firefox_android: "98", safari: "15", safari_ios: "15" } }, "api.createImageBitmap.svgimageelement_as_source_image": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "65", firefox_android: "65", safari: "17.2", safari_ios: "\
17.2" } } }, support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "98", firefox_android: "98", safari: "17.2", safari_ios: "17.2" } } }, "credential-management": { compat_features: ["api.Credential", "api.Credential.id", "api.Credential.isConditionalMediationAvailable_static", "api.Credential.type", "api.CredentialsContainer", "api.CredentialsContainer.create", "api.CredentialsContainer.get", "api.CredentialsContainer.preventSilentAccess", "api.CredentialsContainer.store", "api.Navigator.credentials"], description: "The navigator.credentials API provides generic storage for authentication credentials. Other credential APIs represent specific kinds of credentials, such as password or public key credentials, that the credential management API stores.", description_html: "The <code>navigator.credentials</code> API provides generic storage for authentication credentials. Other credential APIs represent specific kinds of credentials, such as password or public key credentials\
, that the credential management API stores.", group: ["credential-management"], kind: "feature", name: "Credential management", spec: ["https://w3c.github.io/webappsec-credential-management/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Credential": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.Credential.id": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.Credential.isConditionalMediationAvailable_static": { baseline: false, support: { safari: "16", safari_ios: "16" } }, "api.Credential.type": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "\
2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.get": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.preventSilentAccess": { baseline: "high", baseline_high_date: "2026-03-18",
    baseline_low_date: "2023-09-18", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "60", firefox_android: "60", safari: "17", safari_ios: "17" } }, "api.CredentialsContainer.store": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.Navigator.credentials": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } } }, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } } }, "crisp-edges": { compat_features: ["css.properties.image-rendering.crisp-edges"], description: "The image-rendering: crisp-edges CSS declaration scales images to preserve lines without blurr\
ing.", description_html: "The <code>image-rendering: crisp-edges</code> CSS declaration scales images to preserve lines without blurring.", group: ["image-scaling"], kind: "feature", name: "crisp-edges", spec: ["https://drafts.csswg.org/css-images-3/#the-image-rendering"], status: { baseline: false, by_compat_key: { "css.properties.image-rendering.crisp-edges": { baseline: false, support: { firefox: "65", firefox_android: "65", safari: "7", safari_ios: "7" } } }, support: { firefox: "65", firefox_android: "65", safari: "7", safari_ios: "7" } } }, "cross-document-view-transitions": { caniuse: ["cross-document-view-transitions"], compat_features: ["api.CSSViewTransitionRule", "api.CSSViewTransitionRule.navigation", "api.CSSViewTransitionRule.types", "css.at-rules.view-transition"], description: "The @view-transition CSS rule sets whether a document opts-in to transitions between documents in a multi-page application. Both the old and new document must opt-in for a transition to be trigge\
red.", description_html: "The <code>@view-transition</code> CSS rule sets whether a document opts-in to transitions between documents in a multi-page application. Both the old and new document must opt-in for a transition to be triggered.", group: ["view-transitions"], kind: "feature", name: "Cross-document view transitions", spec: ["https://drafts.csswg.org/css-view-transitions-2/#cross-doc-opt-in"], status: { baseline: false, by_compat_key: { "api.CSSViewTransitionRule": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", safari: "18.2", safari_ios: "18.2" } }, "api.CSSViewTransitionRule.navigation": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", safari: "18.2", safari_ios: "18.2" } }, "api.CSSViewTransitionRule.types": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", safari: "18.2", safari_ios: "18.2" } }, "css.at-rules.view-transition": { baseline: false, support: { chrome: "126", chrome_android: "\
126", edge: "126", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "126", chrome_android: "126", edge: "126", safari: "18.2", safari_ios: "18.2" } } }, "cross-fade": { caniuse: ["css-cross-fade"], compat_features: ["css.types.image.cross-fade"], description: "The cross-fade() CSS function generates an image by mixing two images.", description_html: "The <code>cross-fade()</code> CSS function generates an image by mixing two images.", group: ["images"], kind: "feature", name: "cross-fade()", spec: ["https://drafts.csswg.org/css-images-4/#cross-fade-function"], status: { baseline: false, by_compat_key: { "css.types.image.cross-fade": { baseline: false, support: { safari: "10", safari_ios: "9.3" } } }, support: { safari: "10", safari_ios: "9.3" } } }, csp: { caniuse: ["contentsecuritypolicy", "contentsecuritypolicy2"], compat_features: ["api.Document.securitypolicyviolation_event", "api.Element.securitypolicyviolation_event", "api.HTMLElement.nonce", "api.HTMLIFrameElement.cs\
p", "api.SecurityPolicyViolationEvent", "api.SecurityPolicyViolationEvent.SecurityPolicyViolationEvent", "api.SecurityPolicyViolationEvent.blockedURI", "api.SecurityPolicyViolationEvent.columnNumber", "api.SecurityPolicyViolationEvent.disposition", "api.SecurityPolicyViolationEvent.documentURI", "api.SecurityPolicyViolationEvent.effectiveDirective", "api.SecurityPolicyViolationEvent.lineNumber", "api.SecurityPolicyViolationEvent.originalPolicy", "api.SecurityPolicyViolationEvent.referrer", "api.SecurityPolicyViolationEvent.sample", "api.SecurityPolicyViolationEvent.sourceFile", "api.SecurityPolicyViolationEvent.statusCode", "api.SecurityPolicyViolationEvent.violatedDirective", "api.SecurityPolicyViolationEvent.worker_support", "api.WorkerGlobalScope.securitypolicyviolation_event", "html.elements.iframe.csp", "html.elements.meta.http-equiv.content-security-policy", "html.global_attributes.nonce", "http.headers.Content-Security-Policy", "http.headers.Content-Security-Policy-Report-Only",
    "http.headers.Content-Security-Policy.base-uri", "http.headers.Content-Security-Policy.child-src", "http.headers.Content-Security-Policy.connect-src", "http.headers.Content-Security-Policy.default-src", "http.headers.Content-Security-Policy.font-src", "http.headers.Content-Security-Policy.form-action", "http.headers.Content-Security-Policy.frame-ancestors", "http.headers.Content-Security-Policy.frame-src", "http.headers.Content-Security-Policy.img-src", "http.headers.Content-Security-Policy.manifest-src", "http.headers.Content-Security-Policy.media-src", "http.headers.Content-Security-Policy.meta-element-support", "http.headers.Content-Security-Policy.object-src", "http.headers.Content-Security-Policy.report-sample", "http.headers.Content-Security-Policy.report-to", "http.headers.Content-Security-Policy.sandbox", "http.headers.Content-Security-Policy.script-src", "http.headers.Content-Security-Policy.script-src-attr", "http.headers.Content-Security-Policy.script-src-elem", "http.he\
aders.Content-Security-Policy.script-src.external_scripts", "http.headers.Content-Security-Policy.script-src.wasm-unsafe-eval", "http.headers.Content-Security-Policy.strict-dynamic", "http.headers.Content-Security-Policy.style-src", "http.headers.Content-Security-Policy.style-src-attr", "http.headers.Content-Security-Policy.style-src-elem", "http.headers.Content-Security-Policy.unsafe-hashes", "http.headers.Content-Security-Policy.worker-src", "http.headers.Content-Security-Policy.worker_support"], description: "Content Security Policy (CSP) helps to mitigate certain security threats, including cross-site scripting (XSS) and clickjacking attacks. It consists of a set of directives from a website to a browser, which instruct the browser to restrict the things that the site is allowed to do.", description_html: "Content Security Policy (CSP) helps to mitigate certain security threats, including cross-site scripting (XSS) and clickjacking attacks. It consists of a set of directives from a\
 website to a browser, which instruct the browser to restrict the things that the site is allowed to do.", group: ["security"], kind: "feature", name: "Content Security Policy (CSP)", spec: ["https://w3c.github.io/webappsec-csp/"], status: { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", by_compat_key: { "api.Document.securitypolicyviolation_event": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "93", firefox_android: "93", safari: "15.4", safari_ios: "15.4" } }, "api.Element.securitypolicyviolation_event": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.HTMLElement.nonce": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: {
    chrome: "61", chrome_android: "61", edge: "79", firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLIFrameElement.csp": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.SecurityPolicyViolationEvent": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.SecurityPolicyViolationEvent": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.blockedURI": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "\
63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.columnNumber": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.disposition": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "63", firefox_android: "63", safari: "15", safari_ios: "15" } }, "api.SecurityPolicyViolationEvent.documentURI": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.effectiveDirective": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "\
41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.lineNumber": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.originalPolicy": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.referrer": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.sample": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "63", firefox_android: "63", safari: "15", safari_ios: "15" } }, "api.SecurityPolicyViolationEvent.sourceFile": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.statusCode": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.SecurityPolicyViolationEvent.violatedDirective": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.Security\
PolicyViolationEvent.worker_support": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "63", firefox_android: "63" } }, "api.WorkerGlobalScope.securitypolicyviolation_event": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "html.elements.iframe.csp": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "html.elements.meta.http-equiv.content-security-policy": { baseline: "high", baseline_high_date: "≤2019-12-06", baseline_low_date: "≤2017-06-06", support: { chrome: "≤59", chrome_android: "≤59", edge: "12", firefox: "1", firefox_android: "4", safari: "≤10.1", safari_ios: "≤10.3" } }, "html.global_attributes.nonce": { baseline: "high", baseline_high_date: "2024-11-16", baseline_low_date: "2022-05-16", support: { chrome: "61", chrome_android: "\
61", edge: "79", firefox: "75", firefox_android: "79", safari: "15.5", safari_ios: "15.5" } }, "http.headers.Content-Security-Policy": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy-Report-Only": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.base-uri": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "35", firefox_android: "35", safari: "10", safari_ios: "9.3" } }, "http.headers.Content-Security-Policy.child-src": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "\
2017-04-05", support: { chrome: "40", chrome_android: "40", edge: "15", firefox: "45", firefox_android: "45", safari: "10", safari_ios: "9.3" } }, "http.headers.Content-Security-Policy.connect-src": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "50", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.default-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.font-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.form-act\
ion": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "40", chrome_android: "40", edge: "15", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "9.3" } }, "http.headers.Content-Security-Policy.frame-ancestors": { baseline: "high", baseline_high_date: "2020-07-23", baseline_low_date: "2018-01-23", support: { chrome: "40", chrome_android: "40", edge: "15", firefox: "58", firefox_android: "58", safari: "10", safari_ios: "9.3" } }, "http.headers.Content-Security-Policy.frame-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.img-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "2\
3", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.manifest-src": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "41", firefox_android: "41", safari: "11", safari_ios: "11" } }, "http.headers.Content-Security-Policy.media-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.meta-element-support": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "25", chrome_android: "25", edge: "≤18", firefox: "45", firefox_android: "45", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.object-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-\
02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.report-sample": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "63", firefox_android: "63", safari: "15.4", safari_ios: "15.4" } }, "http.headers.Content-Security-Policy.report-to": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Content-Security-Policy.sandbox": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "50", firefox_android: "50", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.script-src": { baseline: "high", baseline_high_date: "\
2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.script-src-attr": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "http.headers.Content-Security-Policy.script-src-elem": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "http.headers.Content-Security-Policy.script-src.external_scripts": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "116", firefox_android: "116", safari: "\
15.6", safari_ios: "15.6" } }, "http.headers.Content-Security-Policy.script-src.wasm-unsafe-eval": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "102", firefox_android: "102", safari: "16", safari_ios: "16" } }, "http.headers.Content-Security-Policy.strict-dynamic": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "52", firefox_android: "52", safari: "15.4", safari_ios: "15.4" } }, "http.headers.Content-Security-Policy.style-src": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "http.headers.Content-Security-Policy.style-src-attr": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "202\
2-12-13", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "http.headers.Content-Security-Policy.style-src-elem": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "108", firefox_android: "108", safari: "26.2", safari_ios: "26.2" } }, "http.headers.Content-Security-Policy.unsafe-hashes": { baseline: "high", baseline_high_date: "2025-07-17", baseline_low_date: "2023-01-17", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "109", firefox_android: "109", safari: "15.4", safari_ios: "15.4" } }, "http.headers.Content-Security-Policy.worker-src": { baseline: "high", baseline_high_date: "2024-11-16", baseline_low_date: "2022-05-16", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "58", firefox_android: "58", safari: "15.5", safari_ios: "15.5" } }, "http.headers.Content-Security-Policy.worker_suppo\
rt": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } } }, support: { chrome: "25", chrome_android: "25", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } } }, "css-escape": { compat_features: ["api.CSS.escape_static"], description: "The CSS.escape() static method escapes a string so that it can be used in a valid CSS selector.", description_html: "The <code>CSS.escape()</code> static method escapes a string so that it can be used in a valid CSS selector.", group: ["cssom"], kind: "feature", name: "CSS.escape()", spec: ["https://drafts.csswg.org/cssom-1/#the-css.escape()-method"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.CSS.escape_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2\
020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } } }, "css-modules": { compat_features: ["javascript.statements.import.import_attributes.type_css"], description: 'Module import … with { type: "css" } statements load CSS modules as constructable stylesheets. Also known as CSS module scripts.', description_html: 'Module <code>import … with { type: "css" }</code> statements load CSS modules as constructable stylesheets. Also known as CSS module scripts.', kind: "feature", name: "CSS import attributes", spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#css-module-script"], status: { baseline: false, by_compat_key: { "javascript.statements.import.import_attributes.type_css": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "\
123", firefox: "147", firefox_android: "147" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "147", firefox_android: "147" } } }, "css-object-model": { compat_features: ["api.CSS", "api.CSSConditionRule", "api.CSSConditionRule.conditionText", "api.CSSGroupingRule", "api.CSSGroupingRule.cssRules", "api.CSSGroupingRule.deleteRule", "api.CSSGroupingRule.insertRule", "api.CSSMarginRule", "api.CSSMarginRule.name", "api.CSSMarginRule.style", "api.CSSMediaRule", "api.CSSMediaRule.media", "api.CSSPageDescriptors", "api.CSSPageDescriptors.margin", "api.CSSPageDescriptors.margin-bottom", "api.CSSPageDescriptors.margin-left", "api.CSSPageDescriptors.margin-right", "api.CSSPageDescriptors.margin-top", "api.CSSPageDescriptors.marginBottom", "api.CSSPageDescriptors.marginLeft", "api.CSSPageDescriptors.marginRight", "api.CSSPageDescriptors.marginTop", "api.CSSPageDescriptors.page-orientation", "api.CSSPageDescriptors.pageOrientation", "api.CSSPageDescriptors.size", "api.\
CSSPageRule", "api.CSSPageRule.selectorText", "api.CSSPageRule.style", "api.CSSPageRule.style.type_CSSPageDescriptors", "api.CSSPseudoElement", "api.CSSPseudoElement.element", "api.CSSPseudoElement.type", "api.CSSRule", "api.CSSRule.cssText", "api.CSSRule.parentRule", "api.CSSRule.parentStyleSheet", "api.CSSRuleList", "api.CSSRuleList.item", "api.CSSRuleList.length", "api.CSSStyleDeclaration", "api.CSSStyleDeclaration.@@iterator", "api.CSSStyleDeclaration.cssText", "api.CSSStyleDeclaration.getPropertyPriority", "api.CSSStyleDeclaration.getPropertyValue", "api.CSSStyleDeclaration.item", "api.CSSStyleDeclaration.length", "api.CSSStyleDeclaration.parentRule", "api.CSSStyleDeclaration.removeProperty", "api.CSSStyleDeclaration.setProperty", "api.CSSStyleRule", "api.CSSStyleRule.selectorText", "api.CSSStyleRule.style", "api.CSSStyleSheet", "api.CSSStyleSheet.cssRules", "api.CSSStyleSheet.deleteRule", "api.CSSStyleSheet.insertRule", "api.CSSStyleSheet.insertRule.index_parameter_optional", "ap\
i.CSSStyleSheet.ownerRule", "api.Document.styleSheets", "api.HTMLElement.style", "api.HTMLLinkElement.sheet", "api.HTMLStyleElement.sheet", "api.MediaList", "api.MediaList.appendMedium", "api.MediaList.deleteMedium", "api.MediaList.item", "api.MediaList.length", "api.MediaList.mediaText", "api.MediaList.toString", "api.ProcessingInstruction.sheet", "api.ShadowRoot.styleSheets", "api.StyleSheet", "api.StyleSheet.disabled", "api.StyleSheet.href", "api.StyleSheet.media", "api.StyleSheet.ownerNode", "api.StyleSheet.parentStyleSheet", "api.StyleSheet.title", "api.StyleSheet.type", "api.StyleSheetList", "api.StyleSheetList.item", "api.StyleSheetList.length"], description: "The CSS object model API reads, creates, and modifies CSS stylesheets and inline styles. Also known as CSSOM.", description_html: "The CSS object model API reads, creates, and modifies CSS stylesheets and inline styles. Also known as CSSOM.", group: ["cssom"], kind: "feature", name: "CSS object model", spec: ["https://draf\
ts.csswg.org/cssom-1/#css-object-model"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "api.CSS": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "api.CSSConditionRule": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "20", firefox_android: "20", safari: "14.1", safari_ios: "14.5" } }, "api.CSSConditionRule.conditionText": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "20", firefox_android: "20", safari: "14.1", safari_ios: "14.5" } }, "api.CSSGroupingRule": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26",
    support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "20", firefox_android: "20", safari: "14.1", safari_ios: "14.5" } }, "api.CSSGroupingRule.cssRules": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "20", firefox_android: "20", safari: "14.1", safari_ios: "14.5" } }, "api.CSSGroupingRule.deleteRule": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "20", firefox_android: "20", safari: "14.1", safari_ios: "14.5" } }, "api.CSSGroupingRule.insertRule": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "20", firefox_android: "20", safari: "14.1", safari_ios: "14.5" } }, "api.CSSMarginRule": { baseline: false, support: { chrome: "131", chrome_android: "131",
    edge: "131" } }, "api.CSSMarginRule.name": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "api.CSSMarginRule.style": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "api.CSSMediaRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.CSSMediaRule.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.CSSPageDescriptors": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.margin": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSP\
ageDescriptors.margin-bottom": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.margin-left": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.margin-right": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.margin-top": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.marginBottom": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.marginLeft": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.marginRight": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } },
    "api.CSSPageDescriptors.marginTop": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageDescriptors.page-orientation": { baseline: false, support: { firefox: "129", firefox_android: "129" } }, "api.CSSPageDescriptors.pageOrientation": { baseline: false, support: { firefox: "129", firefox_android: "129" } }, "api.CSSPageDescriptors.size": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPageRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "3", safari_ios: "1" } }, "api.CSSPageRule.selectorText": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "110", firefox_android: "110", safari: "3", safari_ios: "1" } },
    "api.CSSPageRule.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "3", safari_ios: "1" } }, "api.CSSPageRule.style.type_CSSPageDescriptors": { baseline: false, support: { firefox: "129", firefox_android: "129", safari: "26", safari_ios: "26" } }, "api.CSSPseudoElement": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.CSSPseudoElement.element": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.CSSPseudoElement.type": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.CSSRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSRule.cssText": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSRule.parentRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSRule.parentStyleSheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSRuleList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSRuleList.item": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSRuleList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration.@@iterator": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "51", chrome_android: "51", edge: "18", firefox: "36", firefox_android: "36", safari: "11", safari_ios: "11" } }, "api.CSSStyleDeclaration.cssText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration.getPropertyPriority": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration.getPropertyValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.CSSStyleDeclaration.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.CSSStyleDeclaration.parentRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration.removeProperty": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleDeclaration.setProperty": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.CSSStyleRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2\
015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleRule.selectorText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleRule.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleSheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleSheet.cssRules": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleSheet.deleteRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleSheet.insertRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSStyleSheet.insertRule.index_parameter_optional": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "1", safari_ios: "1" } }, "api.CSSStyleSheet.ownerRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.styleSheets": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.HTMLElement.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLLinkElement.sheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLStyleElement.sheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MediaList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MediaList.appendMedium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MediaList.deleteMedium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MediaList.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "api.MediaList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MediaList.mediaText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MediaList.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.ProcessingInstruction.sheet": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "api.ShadowRoot.styleSheets": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "12.1", safari_ios: "12.2" } }, "api.StyleSheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.media": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.ownerNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.parentStyleSheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheet.type": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheetList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheetList.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.StyleSheetList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "22", firefox_android: "22", safari: "\
9", safari_ios: "9" } } }, "css-object-model-discouraged": { compat_features: ["api.CSSPrimitiveValue", "api.CSSPrimitiveValue.getCounterValue", "api.CSSPrimitiveValue.getFloatValue", "api.CSSPrimitiveValue.getRGBColorValue", "api.CSSPrimitiveValue.getRectValue", "api.CSSPrimitiveValue.getStringValue", "api.CSSPrimitiveValue.primitiveType", "api.CSSPrimitiveValue.setFloatValue", "api.CSSPrimitiveValue.setStringValue", "api.CSSValue", "api.CSSValue.cssText", "api.CSSValue.cssValueType", "api.CSSValueList", "api.CSSValueList.item", "api.CSSValueList.length", "api.Counter", "api.Counter.identifier", "api.Counter.listStyle", "api.Counter.separator", "api.Rect", "api.Rect.bottom", "api.Rect.left", "api.Rect.right", "api.Rect.top"], description: "The DOM level 2 style specification defined interfaces to access and modify CSS styles, such as CSSValue and CSSPrimitiveValue, that were later excluded from the CSS object model.", description_html: "The DOM level 2 style specification defined inte\
rfaces to access and modify CSS styles, such as <code>CSSValue</code> and <code>CSSPrimitiveValue</code>, that were later excluded from the CSS object model.", discouraged: { according_to: ["https://www.w3.org/TR/DOM-Level-2-Style/#Overview-status"], alternatives: ["css-object-model"], reason: "The DOM level 2 CSS object model was excluded from the later CSS object model (CSSOM) specification.", reason_html: "The DOM level 2 CSS object model was excluded from the later CSS object model (CSSOM) specification." }, group: ["cssom"], kind: "feature", name: "CSS object model (DOM level 2)", spec: ["https://www.w3.org/TR/DOM-Level-2-Style/"], status: { baseline: false, by_compat_key: { "api.CSSPrimitiveValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimitiveValue.getCounterValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimitiveValue.getFloatValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimit\
iveValue.getRGBColorValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimitiveValue.getRectValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimitiveValue.getStringValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimitiveValue.primitiveType": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.CSSPrimitiveValue.setFloatValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSPrimitiveValue.setStringValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSValue": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSValue.cssText": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.CSSValue.cssValueType": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.CSSValueList": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.CSSValueList.item": { baseline: false, support: {
    safari: "3", safari_ios: "1" } }, "api.CSSValueList.length": { baseline: false, support: { safari: "10", safari_ios: "10" } }, "api.Counter": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Counter.identifier": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Counter.listStyle": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Counter.separator": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Rect": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Rect.bottom": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Rect.left": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Rect.right": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.Rect.top": { baseline: false, support: { safari: "3", safari_ios: "1" } } }, support: { safari: "10", safari_ios: "10" } } }, "css-supports": { caniuse: ["css-supports-api"], compat_features: ["a\
pi.CSS.supports_static", "api.CSS.supports_static.optional_parens"], description: "The CSS.supports() static method returns whether the browser supports a CSS declaration (given by two arguments, a property and value) or an @supports at-rule condition string.", description_html: "The <code>CSS.supports()</code> static method returns whether the browser supports a CSS declaration (given by two arguments, a property and value) or an <code>@supports</code> at-rule condition string.", group: ["css"], kind: "feature", name: "CSS.supports()", spec: ["https://drafts.csswg.org/css-conditional-3/#the-css-namespace"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.CSS.supports_static": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "api.CSS.supports_static.op\
tional_parens": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "55", firefox_android: "55", safari: "11", safari_ios: "11" } } }, support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "55", firefox_android: "55", safari: "11", safari_ios: "11" } } }, "css-typed-om": { compat_features: ["api.CSSImageValue", "api.CSSKeywordValue", "api.CSSKeywordValue.CSSKeywordValue", "api.CSSKeywordValue.value", "api.CSSMathClamp", "api.CSSMathClamp.CSSMathClamp", "api.CSSMathClamp.lower", "api.CSSMathClamp.upper", "api.CSSMathClamp.value", "api.CSSMathInvert", "api.CSSMathInvert.CSSMathInvert", "api.CSSMathInvert.value", "api.CSSMathMax", "api.CSSMathMax.CSSMathMax", "api.CSSMathMax.values", "api.CSSMathMin", "api.CSSMathMin.CSSMathMin", "api.CSSMathMin.values", "api.CSSMathNegate", "api.CSSMathNegate.CSSMathNegate", "api.CSSMathNegate.value", "api.CSSMathProduct", "api.CSSMathProd\
uct.CSSMathProduct", "api.CSSMathProduct.values", "api.CSSMathSum", "api.CSSMathSum.CSSMathSum", "api.CSSMathSum.values", "api.CSSMathValue", "api.CSSMathValue.operator", "api.CSSMatrixComponent", "api.CSSMatrixComponent.CSSMatrixComponent", "api.CSSMatrixComponent.matrix", "api.CSSNumericArray", "api.CSSNumericArray.@@iterator", "api.CSSNumericArray.entries", "api.CSSNumericArray.forEach", "api.CSSNumericArray.keys", "api.CSSNumericArray.length", "api.CSSNumericArray.values", "api.CSSNumericValue", "api.CSSNumericValue.add", "api.CSSNumericValue.div", "api.CSSNumericValue.equals", "api.CSSNumericValue.max", "api.CSSNumericValue.min", "api.CSSNumericValue.mul", "api.CSSNumericValue.parse_static", "api.CSSNumericValue.sub", "api.CSSNumericValue.to", "api.CSSNumericValue.toSum", "api.CSSNumericValue.type", "api.CSSPerspective", "api.CSSPerspective.CSSPerspective", "api.CSSPerspective.length", "api.CSSRotate", "api.CSSRotate.CSSRotate", "api.CSSRotate.angle", "api.CSSRotate.x", "api.CSSRo\
tate.y", "api.CSSRotate.z", "api.CSSScale", "api.CSSScale.CSSScale", "api.CSSScale.x", "api.CSSScale.y", "api.CSSScale.z", "api.CSSSkew", "api.CSSSkew.CSSSkew", "api.CSSSkew.ax", "api.CSSSkew.ay", "api.CSSSkewX", "api.CSSSkewX.CSSSkewX", "api.CSSSkewX.ax", "api.CSSSkewY", "api.CSSSkewY.CSSSkewY", "api.CSSSkewY.ay", "api.CSSStyleRule.styleMap", "api.CSSStyleValue", "api.CSSStyleValue.parseAll_static", "api.CSSStyleValue.parse_static", "api.CSSStyleValue.toString", "api.CSSTransformComponent", "api.CSSTransformComponent.is2D", "api.CSSTransformComponent.toMatrix", "api.CSSTransformComponent.toString", "api.CSSTransformValue", "api.CSSTransformValue.@@iterator", "api.CSSTransformValue.CSSTransformValue", "api.CSSTransformValue.entries", "api.CSSTransformValue.forEach", "api.CSSTransformValue.is2D", "api.CSSTransformValue.keys", "api.CSSTransformValue.length", "api.CSSTransformValue.toMatrix", "api.CSSTransformValue.values", "api.CSSTranslate", "api.CSSTranslate.CSSTranslate", "api.CSSTran\
slate.x", "api.CSSTranslate.y", "api.CSSTranslate.z", "api.CSSUnitValue", "api.CSSUnitValue.CSSUnitValue", "api.CSSUnitValue.unit", "api.CSSUnitValue.value", "api.CSSUnparsedValue", "api.CSSUnparsedValue.@@iterator", "api.CSSUnparsedValue.CSSUnparsedValue", "api.CSSUnparsedValue.entries", "api.CSSUnparsedValue.forEach", "api.CSSUnparsedValue.keys", "api.CSSUnparsedValue.length", "api.CSSUnparsedValue.values", "api.CSSVariableReferenceValue", "api.CSSVariableReferenceValue.CSSVariableReferenceValue", "api.CSSVariableReferenceValue.fallback", "api.CSSVariableReferenceValue.variable", "api.Element.computedStyleMap", "api.HTMLElement.attributeStyleMap", "api.StylePropertyMap", "api.StylePropertyMap.append", "api.StylePropertyMap.clear", "api.StylePropertyMap.delete", "api.StylePropertyMap.set", "api.StylePropertyMapReadOnly", "api.StylePropertyMapReadOnly.@@iterator", "api.StylePropertyMapReadOnly.entries", "api.StylePropertyMapReadOnly.forEach", "api.StylePropertyMapReadOnly.get", "api.St\
ylePropertyMapReadOnly.getAll", "api.StylePropertyMapReadOnly.has", "api.StylePropertyMapReadOnly.keys", "api.StylePropertyMapReadOnly.size", "api.StylePropertyMapReadOnly.values"], description: "The CSSStyleValue and its subclasses represent CSS values as distinct types instead of only strings. Also known as typed OM.", description_html: "The <code>CSSStyleValue</code> and its subclasses represent CSS values as distinct types instead of only strings. Also known as typed OM.", group: ["cssom"], kind: "feature", name: "CSS typed object model", spec: ["https://drafts.css-houdini.org/css-typed-om-1/"], status: { baseline: false, by_compat_key: { "api.CSSImageValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSKeywordValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSKeywordValue.CSSKeywordValue": { baseline: false, support: { chrome: "\
66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSKeywordValue.value": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathClamp": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathClamp.CSSMathClamp": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathClamp.lower": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathClamp.upper": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathClamp.value": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathInvert": { baseline: false,
    support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathInvert.CSSMathInvert": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathInvert.value": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathMax": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathMax.CSSMathMax": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "api.CSSMathMax.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathMin": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathMin.CSSMathMin": { baseline: false, support: { chrome: "66", chrome_android: "\
66", edge: "79" } }, "api.CSSMathMin.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathNegate": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathNegate.CSSMathNegate": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathNegate.value": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathProduct": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathProduct.CSSMathProduct": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "api.CSSMathProduct.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } },
    "api.CSSMathSum": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathSum.CSSMathSum": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "api.CSSMathSum.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMathValue.operator": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMatrixComponent": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMatrixComponent.CSSMatrixComponent": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSMatrix\
Component.matrix": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericArray": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericArray.@@iterator": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericArray.entries": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericArray.forEach": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericArray.keys": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericArray.length": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "\
16.4" } }, "api.CSSNumericArray.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.add": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.div": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.equals": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.max": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.min": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.\
4", safari_ios: "16.4" } }, "api.CSSNumericValue.mul": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.parse_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.sub": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.to": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.toSum": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSNumericValue.type": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPerspective": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "\
79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPerspective.CSSPerspective": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPerspective.length": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSRotate": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSRotate.CSSRotate": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSRotate.angle": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSRotate.x": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSRotate.y": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79",
    safari: "16.4", safari_ios: "16.4" } }, "api.CSSRotate.z": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSScale": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSScale.CSSScale": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSScale.x": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSScale.y": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSScale.z": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkew": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "\
api.CSSSkew.CSSSkew": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkew.ax": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkew.ay": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkewX": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkewX.CSSSkewX": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkewX.ax": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkewY": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkewY.CSSSkewY": { baseline: false,
    support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSSkewY.ay": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleRule.styleMap": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleValue.parseAll_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleValue.parse_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSStyleValue.toString": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformCo\
mponent": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformComponent.is2D": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformComponent.toMatrix": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformComponent.toString": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.@@iterator": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.CSSTransformValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "\
79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.entries": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.forEach": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.is2D": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.keys": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.length": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.toMatrix": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTransformValue.values": { baseline: false, support: {
    chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTranslate": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTranslate.CSSTranslate": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTranslate.x": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTranslate.y": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSTranslate.z": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnitValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnitValue.CSSUnitValue": { baseline: false, support: {
    chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnitValue.unit": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnitValue.value": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue.@@iterator": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue.CSSUnparsedValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue.entries": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedV\
alue.forEach": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue.keys": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue.length": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSUnparsedValue.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSVariableReferenceValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSVariableReferenceValue.CSSVariableReferenceValue": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSVariableReferenceValue.fallback": { baseline: false, support: { chrome: "66", chrome_android: "\
66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSSVariableReferenceValue.variable": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.Element.computedStyleMap": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.HTMLElement.attributeStyleMap": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMap": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMap.append": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMap.clear": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMap.delete": { baseline: false,
    support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMap.set": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.@@iterator": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.entries": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.forEach": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.get": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "1\
6.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.getAll": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.has": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.keys": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.size": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.StylePropertyMapReadOnly.values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } } }, "cubic-bezier-easing": { compat_features: ["css.types.easing-function", "css.types.easing\
-function.cubic-bezier"], description: "The cubic-bezier() CSS easing function interpolates along a smooth curve, creating animations and transitions with continuous changes in speed. The ease, ease-in, ease-out, and ease-in-out keyword values are presets for common Bézier curves.", description_html: "The <code>cubic-bezier()</code> CSS easing function interpolates along a smooth curve, creating animations and transitions with continuous changes in speed. The <code>ease</code>, <code>ease-in</code>, <code>ease-out</code>, and <code>ease-in-out</code> keyword values are presets for common Bézier curves.", group: ["animation", "transitions"], kind: "feature", name: "cubic-bezier() easing", spec: ["https://drafts.csswg.org/css-easing-2/#cubic-bezier-easing-functions"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.easing-function": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-0\
7-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.types.easing-function.cubic-bezier": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } } }, support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } } }, currentcolor: { caniuse: ["currentcolor"], compat_features: ["css.properties.background-color.currentColor", "css.properties.background.currentColor", "css.properties.border-bottom-color.currentColor", "css.properties.border-bottom.currentColor", "css.properties.border-color.currentColor", "css.properties.border-left-color.currentColor", "css.properties.border-left.currentColor", "css.properties.border-right-color.currentColor", "css.properties.border-top-color.curren\
tColor", "css.properties.border-top.currentColor", "css.properties.border.currentColor", "css.properties.color.currentColor", "css.properties.outline-color.currentColor"], description: "The currentColor CSS value allows you to reuse an element's computed text color for other properties.", description_html: "The <code>currentColor</code> CSS value allows you to reuse an element's computed text color for other properties.", group: ["color-types"], kind: "feature", name: "currentColor", spec: ["https://drafts.csswg.org/css-color-3/#currentcolor"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.background.currentColor": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-bottom-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-bottom.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-le\
ft-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-left.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-right-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-top-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "4", safari_ios: "3.2" } }, "css.properties.border-top.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.border.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.outline-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "1\
2", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, cursor: { caniuse: ["css3-cursors", "css3-cursors-grab", "css3-cursors-newer"], compat_features: ["css.properties.cursor", "css.properties.cursor.alias", "css.properties.cursor.all-scroll", "css.properties.cursor.auto", "css.properties.cursor.cell", "css.properties.cursor.col-resize", "css.properties.cursor.context-menu", "css.properties.cursor.copy", "css.properties.cursor.crosshair", "css.properties.cursor.default", "css.properties.cursor.e-resize", "css.properties.cursor.ew-resize", "css.properties.cursor.grab", "css.properties.cursor.grabbing", "css.properties.cursor.help", "css.properties.cursor.move", "css.properties.cursor.n-resize", "css.properties.cursor.ne-resize", "css.properties.cursor.nesw-resize", "css.properties.cursor.no-drop", "css.properties.cursor.none", "c\
ss.properties.cursor.not-allowed", "css.properties.cursor.ns-resize", "css.properties.cursor.nw-resize", "css.properties.cursor.nwse-resize", "css.properties.cursor.pointer", "css.properties.cursor.progress", "css.properties.cursor.row-resize", "css.properties.cursor.s-resize", "css.properties.cursor.se-resize", "css.properties.cursor.sw-resize", "css.properties.cursor.text", "css.properties.cursor.url", "css.properties.cursor.url_positioning_syntax", "css.properties.cursor.vertical-text", "css.properties.cursor.w-resize", "css.properties.cursor.wait", "css.properties.cursor.zoom-in", "css.properties.cursor.zoom-out", "svg.global_attributes.cursor"], description: "The cursor CSS property styles the pointer, allowing you to provide hints to the user on how to interact with the hovered element.", description_html: "The <code>cursor</code> CSS property styles the pointer, allowing you to provide hints to the user on how to interact with the hovered element.", group: ["css"], kind: "featur\
e", name: "Cursor styles", spec: ["https://drafts.csswg.org/css-ui-4/#cursor"], status: { baseline: false, by_compat_key: { "css.properties.cursor": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2", safari_ios: "13.4" } }, "css.properties.cursor.alias": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.all-scroll": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.auto": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2", safari_ios: "13.4" } }, "css.properties.cursor.cell": { baseline: "hig\
h", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3", safari_ios: "13.4" } }, "css.properties.cursor.col-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.context-menu": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.copy": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.crosshair": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.default": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
95", safari: "1.2" } }, "css.properties.cursor.e-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.ew-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.grab": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "14", firefox: "27", firefox_android: "95", safari: "11" } }, "css.properties.cursor.grabbing": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "27", firefox_android: "95", safari: "11" } }, "css.properties.cursor.help": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.move": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "\
1.2" } }, "css.properties.cursor.n-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.ne-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.nesw-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.no-drop": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.none": { baseline: false, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "95", safari: "5" } }, "css.properties.cursor.not-allowed": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "\
3" } }, "css.properties.cursor.ns-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.nw-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.nwse-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.pointer": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.progress": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.row-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "\
3" } }, "css.properties.cursor.s-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.se-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.sw-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.text": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2", safari_ios: "13.4" } }, "css.properties.cursor.url": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3", safari_ios: "\
13.4" } }, "css.properties.cursor.url_positioning_syntax": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.vertical-text": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "95", safari: "3" } }, "css.properties.cursor.w-resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.wait": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2" } }, "css.properties.cursor.zoom-in": { baseline: false, support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "24", firefox_android: "95", safari: "9" } }, "css.properties.cursor.zoom-out": { baseline: false, support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "24", firefox_android: "\
95", safari: "9" } }, "svg.global_attributes.cursor": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "95", safari: "1.2", safari_ios: "1" } } }, support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "27", firefox_android: "95", safari: "11" } } }, "custom-ellipses": { compat_features: ["css.properties.text-overflow.string"], description: "The text-overflow CSS property with a string value sets the string representing clipped text.", description_html: "The <code>text-overflow</code> CSS property with a string value sets the string representing clipped text.", kind: "feature", name: "Custom ellipses", spec: ["https://drafts.csswg.org/css-overflow-4/#overflow-string"], status: { baseline: false, by_compat_key: { "css.properties.text-overflow.string": { baseline: false, support: { firefox: "9", firefox_android: "9" } } }, support: { firefox: "9", firefox_android: "\
9" } } }, "custom-media-queries": { compat_features: ["api.CSSCustomMediaRule", "css.at-rules.custom-media"], description: "The @custom-media CSS at-rule names a media query, which you can reuse in multiple @media rules.", description_html: "The <code>@custom-media</code> CSS at-rule names a media query, which you can reuse in multiple <code>@media</code> rules.", group: ["media-queries"], kind: "feature", name: "Custom media queries", spec: ["https://drafts.csswg.org/mediaqueries-5/#custom-mq"], status: { baseline: false, by_compat_key: { "api.CSSCustomMediaRule": { baseline: false, support: {} }, "css.at-rules.custom-media": { baseline: false, support: {} } }, support: {} } }, "custom-properties": { caniuse: ["css-variables"], compat_features: ["css.properties.custom-property", "css.types.var"], description: "Custom properties are CSS properties prefixed with -- that set values you can reuse with the var() function. For example, you can set a --key-color property to reuse as border-c\
olor: var(--key-color). Also known as CSS variables.", description_html: "Custom properties are CSS properties prefixed with <code>--</code> that set values you can reuse with the <code>var()</code> function. For example, you can set a <code>--key-color</code> property to reuse as <code>border-color: var(--key-color)</code>. Also known as CSS variables.", group: ["css"], kind: "feature", name: "Custom properties", spec: ["https://drafts.csswg.org/css-variables-1/"], status: { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", by_compat_key: { "css.properties.custom-property": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "49", chrome_android: "49", edge: "15", firefox: "31", firefox_android: "31", safari: "9.1", safari_ios: "9.3" } }, "css.types.var": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "49", chrome_android: "49", edge: "15",
    firefox: "31", firefox_android: "31", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "49", chrome_android: "49", edge: "15", firefox: "31", firefox_android: "31", safari: "9.1", safari_ios: "9.3" } } }, "customizable-select": { caniuse: ["customizable-select"], compat_features: ["css.properties.appearance.base-select", "css.selectors.checkmark", "css.selectors.picker", "css.selectors.picker-icon", "html.elements.selectedcontent"], description: "The <select> element's appearance, including the button, selected option, picker dropdown, and options, can be customized using CSS.", description_html: "The <code>&#x3C;select></code> element's appearance, including the button, selected option, picker dropdown, and options, can be customized using CSS.", group: ["forms", "html-elements"], kind: "feature", name: "Customizable <select>", spec: ["https://open-ui.org/components/customizableselect/"], status: { baseline: false, by_compat_key: { "css.properties.appearance.base-select": {
    baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.checkmark": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.selectors.picker": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.picker-icon": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "html.elements.selectedcontent": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, "customized-built-in-elements": { compat_features: ["api.CustomElementRegistry.builtin_element_support", "html.global_attributes.is"], description: "Customized built-in elements are HTML elements that extend built-in elements using the is attribute, to add new behaviors that you define.", description_html: "Customized built-in elements are HTML elements that extend built-in elements usin\
g the <code>is</code> attribute, to add new behaviors that you define.", group: ["custom-elements"], kind: "feature", name: "Customized built-in elements", spec: ["https://html.spec.whatwg.org/multipage/custom-elements.html#customized-built-in-element"], status: { baseline: false, by_compat_key: { "api.CustomElementRegistry.builtin_element_support": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "63", firefox_android: "63" } }, "html.global_attributes.is": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "63", firefox_android: "63" } } }, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "63", firefox_android: "63" } } }, data: { compat_features: ["api.HTMLDataElement", "api.HTMLDataElement.value", "html.elements.data", "html.elements.data.value"], description: "The <data> element links a given piece of content with a machine-readable translation.", description_html: "The <code>&#x3C;data></\
code> element links a given piece of content with a machine-readable translation.", group: ["html-elements"], kind: "feature", name: "<data>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-data-element"], status: { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", by_compat_key: { "api.HTMLDataElement": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.HTMLDataElement.value": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "html.elements.data": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "\
14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "html.elements.data.value": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } } }, support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } } }, "data-urls": { compat_features: ["http.data-url", "http.data-url.css_files", "http.data-url.html_files", "http.data-url.js_files", "http.data-url.top_level_navigation_blocked"], description: "Data URLs are URLs that start with the data: scheme and which directly contain data rather than point to remote resources.", description_html: "Data URLs are URLs that start with the <code>data:</code> scheme and which directly contain data rather than point to remote resources.", kind: "feature", name: "Data URLs", spec: ["https://www.rfc-ed\
itor.org/rfc/rfc2397"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "http.data-url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "≤4", chrome_android: "18", edge: "12", firefox: "≤2", firefox_android: "4", safari: "≤3.1", safari_ios: "≤2" } }, "http.data-url.css_files": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "≤4", chrome_android: "18", edge: "12", firefox: "≤2", firefox_android: "4", safari: "≤3.1", safari_ios: "≤2" } }, "http.data-url.html_files": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "≤4", chrome_android: "18", edge: "79", firefox: "≤2", firefox_android: "4", safari: "≤3.1", safari_ios: "≤2" } }, "http.data-url.js_files": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-\
07-29", support: { chrome: "≤4", chrome_android: "18", edge: "12", firefox: "≤2", firefox_android: "4", safari: "≤3.1", safari_ios: "≤2" } }, "http.data-url.top_level_navigation_blocked": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "59", firefox_android: "59", safari: "14", safari_ios: "14" } } }, support: { chrome: "≤4", chrome_android: "18", edge: "12", firefox: "≤2", firefox_android: "4", safari: "≤3.1", safari_ios: "≤2" } } }, datalist: { caniuse: ["datalist"], compat_features: ["api.HTMLDataListElement", "api.HTMLDataListElement.options", "html.elements.datalist", "html.elements.datalist.input_type_color", "html.elements.datalist.input_type_date", "html.elements.datalist.input_type_email", "html.elements.datalist.input_type_number", "html.elements.datalist.input_type_range", "html.elements.datalist.input_type_search", "html.elements.datalist.input_type_tel",
    "html.elements.datalist.input_type_text", "html.elements.datalist.input_type_time", "html.elements.datalist.input_type_url", "html.elements.input.type_color.list", "html.elements.input.type_date.list", "html.elements.input.type_email.list", "html.elements.input.type_number.list", "html.elements.input.type_range.list", "html.elements.input.type_search.list", "html.elements.input.type_tel.list", "html.elements.input.type_text.list", "html.elements.input.type_time.list", "html.elements.input.type_url.list"], description: "The <datalist> element sets recommended values for an <input> element. Browsers may show a dropdown menu of all values or match values as the user types.", description_html: "The <code>&#x3C;datalist></code> element sets recommended values for an <code>&#x3C;input></code> element. Browsers may show a dropdown menu of all values or match values as the user types.", group: ["forms"], kind: "feature", name: "<datalist>", spec: ["https://html.spec.whatwg.org/multipage/fo\
rm-elements.html#the-datalist-element"], status: { baseline: false, by_compat_key: { "api.HTMLDataListElement": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "api.HTMLDataListElement.options": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist": { baseline: false, support: { chrome: "20", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_color": { baseline: false, support: { chrome: "20", chrome_android: "33", edge: "14", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_date": { baseline: false, support: { chrome: "20", chrome_android: "\
33", edge: "12", safari: "14.1", safari_ios: "14.5" } }, "html.elements.datalist.input_type_email": { baseline: false, support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_number": { baseline: false, support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_range": { baseline: false, support: { chrome: "20", chrome_android: "57", edge: "12", firefox: "110", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_search": { baseline: false, support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_tel": { baseline: false, support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_text": { baseline: false, support: {
    chrome: "20", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_time": { baseline: false, support: { chrome: "20", chrome_android: "33", edge: "12", safari: "14.1", safari_ios: "12.2" } }, "html.elements.datalist.input_type_url": { baseline: false, support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_color.list": { baseline: false, support: { chrome: "20", chrome_android: "33", edge: "14", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_date.list": { baseline: false, support: { chrome: "20", chrome_android: "33", edge: "12", safari: "14.1", safari_ios: "14.5" } }, "html.elements.input.type_email.list": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "\
12.2" } }, "html.elements.input.type_number.list": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "29", firefox_android: "29", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_range.list": { baseline: false, support: { chrome: "20", chrome_android: "57", edge: "12", firefox: "110", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_search.list": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_tel.list": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_text.\
list": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "20", chrome_android: "33", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_time.list": { baseline: false, support: { chrome: "20", chrome_android: "33", edge: "12", safari: "14.1", safari_ios: "12.2" } }, "html.elements.input.type_url.list": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "22", chrome_android: "33", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "69", chrome_android: "69", edge: "12", firefox: "110", safari: "12.1", safari_ios: "12.2" } } }, dataset: { caniuse: ["dataset"], compat_features: ["api.DOMStringMap", "api.HTMLElement.dataset", "api.MathMLElement.dataset", "api.SVGElement.dataset"], description: "The dataset API attaches and accesses custom data on elements, using \
either the dataset property of HTMLElement or attributes prefixed with data-.", description_html: "The <code>dataset</code> API attaches and accesses custom data on elements, using either the <code>dataset</code> property of <code>HTMLElement</code> or attributes prefixed with <code>data-</code>.", kind: "feature", name: "Dataset", spec: ["https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.DOMStringMap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.HTMLElement.dataset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "\
6", safari: "5.1", safari_ios: "5" } }, "api.MathMLElement.dataset": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.SVGElement.dataset": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "55", chrome_android: "55", edge: "17", firefox: "51", firefox_android: "51", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } } }, date: { compat_features: ["javascript.builtins.Date", "javascript.builtins.Date.@@toPrimitive", "javascript.builtins.Date.Date", "javascript.builtins.Date.UTC", "javascript.builtins.Date.UTC.optional_monthIndex", "javascript.builtins.Date.getDate", "javascript.builtins.Date.getDay", "javascript.builtins.Date.getFullYear", "\
javascript.builtins.Date.getHours", "javascript.builtins.Date.getMilliseconds", "javascript.builtins.Date.getMinutes", "javascript.builtins.Date.getMonth", "javascript.builtins.Date.getSeconds", "javascript.builtins.Date.getTime", "javascript.builtins.Date.getTimezoneOffset", "javascript.builtins.Date.getUTCDate", "javascript.builtins.Date.getUTCDay", "javascript.builtins.Date.getUTCFullYear", "javascript.builtins.Date.getUTCHours", "javascript.builtins.Date.getUTCMilliseconds", "javascript.builtins.Date.getUTCMinutes", "javascript.builtins.Date.getUTCMonth", "javascript.builtins.Date.getUTCSeconds", "javascript.builtins.Date.now", "javascript.builtins.Date.parse", "javascript.builtins.Date.parse.iso_8601", "javascript.builtins.Date.setDate", "javascript.builtins.Date.setFullYear", "javascript.builtins.Date.setHours", "javascript.builtins.Date.setMilliseconds", "javascript.builtins.Date.setMinutes", "javascript.builtins.Date.setMonth", "javascript.builtins.Date.setSeconds", "javascript\
.builtins.Date.setTime", "javascript.builtins.Date.setUTCDate", "javascript.builtins.Date.setUTCFullYear", "javascript.builtins.Date.setUTCHours", "javascript.builtins.Date.setUTCMilliseconds", "javascript.builtins.Date.setUTCMinutes", "javascript.builtins.Date.setUTCMonth", "javascript.builtins.Date.setUTCSeconds", "javascript.builtins.Date.toDateString", "javascript.builtins.Date.toISOString", "javascript.builtins.Date.toJSON", "javascript.builtins.Date.toString", "javascript.builtins.Date.toTimeString", "javascript.builtins.Date.toUTCString", "javascript.builtins.Date.valueOf"], description: "The Date object represents a single moment in time.", description_html: "The <code>Date</code> object represents a single moment in time.", group: ["primitive-types"], kind: "feature", name: "Date", spec: ["https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "\
javascript.builtins.Date": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.@@toPrimitive": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "47", chrome_android: "47", edge: "15", firefox: "44", firefox_android: "44", safari: "10", safari_ios: "10" } }, "javascript.builtins.Date.Date": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.UTC": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "\
javascript.builtins.Date.UTC.optional_monthIndex": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "≤15", chrome_android: "18", edge: "≤15", firefox: "≤4", firefox_android: "4", safari: "≤10.1", safari_ios: "≤10.3" } }, "javascript.builtins.Date.getDate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getDay": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getFullYear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getHours": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getMilliseconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getMinutes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getMonth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getSeconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getTimezoneOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCDate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1",
    firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCDay": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCFullYear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCHours": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCMilliseconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCMinutes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCMonth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.getUTCSeconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.now": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "4" } }, "javascript.builtins.Date.parse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.parse.iso_8601": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Date.setDate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setFullYear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setHours": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setMilliseconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setMinutes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setMonth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setSeconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCDate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCFullYear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCHours": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCMilliseconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCMinutes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCMonth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setUTCSeconds": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toDateString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toISOString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "javascript.builtins.Date.toJSON": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "3", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "javascript.builtins.Date.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toTimeString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toUTCString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.valueOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015\
-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "date-get-year-set-year": { compat_features: ["javascript.builtins.Date.getYear", "javascript.builtins.Date.setYear"], description: "The getYear() and setYear() methods of Date objects get and set the year as an offset to 1900.", description_html: "The <code>getYear()</code> and <code>setYear()</code> methods of <code>Date</code> objects get and set the year as an offset to 1900.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers"], reason: "The getYear() and setYear() methods use a truncated number instead of the actual year number, known as a year 2000 problem.", reason_html: "The <code>getYear()</cod\
e> and <code>setYear()</code> methods use a truncated number instead of the actual year number, known as a year 2000 problem." }, group: ["javascript"], kind: "feature", name: "getYear() and setYear()", spec: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-date.prototype.getyear"], status: { baseline: false, by_compat_key: { "javascript.builtins.Date.getYear": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.setYear": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "date-to-gmt-string": { compat_features: ["javascript.builtins.Date.toGMTString"], description: "The toGMTString() method of Date \
objects is an alias to the toUTCString() method.", description_html: "The <code>toGMTString()</code> method of <code>Date</code> objects is an alias to the <code>toUTCString()</code> method.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers", "https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-date.prototype.togmtstring"], reason: 'The method exists "principally for compatibility with old code."', reason_html: 'The method exists "principally for compatibility with old code."' }, group: ["javascript"], kind: "feature", name: "toGMTString()", spec: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-date.prototype.togmtstring"], status: { baseline: false, by_compat_key: { "javascript.builtins.Date.toGMTString": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "declarative-shadow-dom": { caniuse: ["declarative-shadow-dom"], compat_features: ["api.HTMLTemplateElement.shadowRootClonable", "api.HTMLTemplateElement.shadowRootDelegatesFocus", "api.HTMLTemplateElement.shadowRootMode", "api.HTMLTemplateElement.shadowRootSerializable", "api.HTMLTemplateElement.shadowRootSlotAssignment", "html.elements.template.shadowrootclonable", "html.elements.template.shadowrootdelegatesfocus", "html.elements.template.shadowrootmode", "html.elements.template.shadowrootserializable"], description: "The shadowrootmode attribute on <template> creates a shadow root without the use of JavaScript. It is a declarative alternative to the attachShadow() method.", description_html: "The <code>shadowrootmode</code> attribute on <code>&#x3C;template></code> creates a shadow root without\
 the use of JavaScript. It is a declarative alternative to the <code>attachShadow()</code> method.", group: ["html", "dom", "web-components"], kind: "feature", name: "Declarative shadow DOM", spec: ["https://html.spec.whatwg.org/multipage/scripting.html#attr-template-shadowrootmode"], status: { baseline: "low", baseline_low_date: "2024-02-20", by_compat_key: { "api.HTMLTemplateElement.shadowRootClonable": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "125", firefox_android: "125", safari: "18", safari_ios: "18" } }, "api.HTMLTemplateElement.shadowRootDelegatesFocus": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "123", firefox_android: "123", safari: "18", safari_ios: "18" } }, "api.HTMLTemplateElement.shadowRootMode": { baseline: "low", baseline_low_date: "2024-02-20", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "\
123", firefox_android: "123", safari: "16.4", safari_ios: "16.4" } }, "api.HTMLTemplateElement.shadowRootSerializable": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.HTMLTemplateElement.shadowRootSlotAssignment": { baseline: false, support: {} }, "html.elements.template.shadowrootclonable": { baseline: "low", baseline_low_date: "2024-05-13", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "125", firefox_android: "125", safari: "17.5", safari_ios: "17.5" } }, "html.elements.template.shadowrootdelegatesfocus": { baseline: "low", baseline_low_date: "2024-03-22", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "123", firefox_android: "123", safari: "16.4", safari_ios: "16.4" } }, "html.elements.template.shadowrootmode": { baseline: "low", baseline_low_date: "2024-02-20", support: { chrome: "111", chrome_android: "\
111", edge: "111", firefox: "123", firefox_android: "123", safari: "16.4", safari_ios: "16.4" } }, "html.elements.template.shadowrootserializable": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125", safari: "18", safari_ios: "18" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "123", firefox_android: "123", safari: "16.4", safari_ios: "16.4" } } }, "declarative-webmcp": { description: "The toolname, tooldescription, and toolautosubmit HTML form element attributes register actions that can be called by in-browser AI agents or browser extensions. Also known as declarative WebMCP.", description_html: "The <code>toolname</code>, <code>tooldescription</code>, and <code>toolautosubmit</code> HTML form element attributes register actions that can be called by in-browser AI agents or browser extensions. Also known as declarative WebMCP.", group: ["webmcp"], kind: "feature", name: "Form-associated WebMCP attributes", spec: ["https://we\
bmachinelearning.github.io/webmcp/"], status: { baseline: false, support: {} } }, "dedicated-workers": { caniuse: ["webworkers"], compat_features: ["api.DedicatedWorkerGlobalScope", "api.DedicatedWorkerGlobalScope.close", "api.DedicatedWorkerGlobalScope.name", "api.Worker", "api.Worker.Worker", "api.Worker.Worker.mime_checks", "api.Worker.Worker.options_name_parameter", "api.Worker.error_event", "api.Worker.terminate", "api.Worker.worker_support", "api.WorkerGlobalScope", "api.WorkerGlobalScope.error_event", "api.WorkerGlobalScope.importScripts", "api.WorkerGlobalScope.importScripts.mime_checks", "api.WorkerGlobalScope.location", "api.WorkerGlobalScope.navigator", "api.WorkerGlobalScope.rejectionhandled_event", "api.WorkerGlobalScope.self", "api.WorkerGlobalScope.unhandledrejection_event", "api.WorkerLocation", "api.WorkerLocation.hash", "api.WorkerLocation.host", "api.WorkerLocation.hostname", "api.WorkerLocation.href", "api.WorkerLocation.origin", "api.WorkerLocation.pathname", "api.\
WorkerLocation.port", "api.WorkerLocation.protocol", "api.WorkerLocation.search", "api.WorkerLocation.toString", "api.WorkerNavigator"], description: "The Worker() constructor runs a script in its own thread, which can send and receive messages with the script that created it. Also known as web workers.", description_html: "The <code>Worker()</code> constructor runs a script in its own thread, which can send and receive messages with the script that created it. Also known as web workers.", group: ["workers"], kind: "feature", name: "Dedicated workers", spec: ["https://html.spec.whatwg.org/multipage/workers.html#workers"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.DedicatedWorkerGlobalScope": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.De\
dicatedWorkerGlobalScope.close": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.DedicatedWorkerGlobalScope.name": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "70", chrome_android: "70", edge: "18", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.Worker": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.Worker.Worker": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.Worker.Worker\
.mime_checks": { baseline: false, support: { firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } }, "api.Worker.Worker.options_name_parameter": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "70", chrome_android: "70", edge: "18", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.Worker.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.Worker.terminate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.Worker.worker_support": { baseline: false, support: { firefox: "34", firefox_android: "34" } }, "api.WorkerGlobalScope": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerGlobalScope.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerGlobalScope.importScripts": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerGlobalScope.importScripts.mime_checks": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "67", firefox_android: "67", safari: "16", safari_ios: "16" } }, "api.WorkerGlobal\
Scope.location": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerGlobalScope.navigator": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "4", chrome_android: "18", edge: "17", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerGlobalScope.rejectionhandled_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.WorkerGlobalScope.self": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "34", safari: "4", safari_ios: "5" } },
    "api.WorkerGlobalScope.unhandledrejection_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.WorkerLocation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.hash": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.host": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } },
    "api.WorkerLocation.hostname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.origin": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "14", firefox: "29", firefox_android: "29", safari: "10", safari_ios: "10" } }, "api.WorkerLocation.pathname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.Wo\
rkerLocation.port": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.protocol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.search": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerLocation.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerNavigator": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "5" } } }, default: { caniuse: ["css-default-pseudo"], compat_features: ["css.selectors.default"], description: "The :default CSS pseudo-class matches the default element in a group of related form controls, such as checkboxes and radio buttons with the checked attribute.", description_html: "The <code>:default</code> CSS pseudo-class matches the default element in a group of related form controls, such as checkboxes and radio buttons with the <code>checked</code> attribute.", group: ["selectors"], kind: "feature", name: ":default", spec: ["https://drafts.csswg.org/selectors-4/#the-default-pseudo"], status: { baseline: "high", baseline_high_date: "2022\
-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.default": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "10", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } } }, support: { chrome: "10", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } } }, del: { compat_features: ["api.HTMLModElement", "api.HTMLModElement.cite", "api.HTMLModElement.dateTime", "html.elements.del", "html.elements.del.cite", "html.elements.del.datetime"], description: "The <del> element represents a range of text that has been deleted from a document, styling text as strikethrough by default.", description_html: "The <code>&#x3C;del></code> element represents a range of text that has been deleted from a document, styling text as strikethrough by default.", group: ["html-elements"], kind: "feature", name: "<del>", spec: ["https://htm\
l.spec.whatwg.org/multipage/edits.html#the-del-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLModElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLModElement.cite": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLModElement.dateTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.del": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.del.cite": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.del.datetime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "description-list": { compat_features: ["api.HTMLDListElement", "html.elements.dd", "html.elements.dl", "html.elements.dt"], description: "The <dl>, <dt>, and <dd> HTML elements represent a list of terms and their asso\
ciated descriptions. Use a description list to create glossaries or similar list of key-value pairs.", description_html: "The <code>&#x3C;dl></code>, <code>&#x3C;dt></code>, and <code>&#x3C;dd></code> HTML elements represent a list of terms and their associated descriptions. Use a description list to create glossaries or similar list of key-value pairs.", group: ["html"], kind: "feature", name: "Description list", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-dd-element", "https://html.spec.whatwg.org/multipage/grouping-content.html#the-dl-element", "https://html.spec.whatwg.org/multipage/grouping-content.html#the-dt-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLDListElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "html.elements.dd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.dl": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.dt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, destructuring: { compat_features: ["javascript.operators.destructuring", "javascript.operators.destructuring.computed_prope\
rty_names", "javascript.operators.destructuring.rest_in_arrays", "javascript.operators.destructuring.rest_in_objects"], description: "The destructuring assignment syntax is a JavaScript expression that unpacks values from arrays, or properties from objects, into distinct variables.", description_html: "The destructuring assignment syntax is a JavaScript expression that unpacks values from arrays, or properties from objects, into distinct variables.", group: ["javascript"], kind: "feature", name: "Destructuring", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-destructuring-assignment", "https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-destructuring-binding-patterns"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.operators.destructuring": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "\
2016-08-02", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "41", firefox_android: "41", safari: "8", safari_ios: "8" } }, "javascript.operators.destructuring.computed_property_names": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "javascript.operators.destructuring.rest_in_arrays": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "49", chrome_android: "49", edge: "16", firefox: "41", firefox_android: "41", safari: "9.1", safari_ios: "9.3" } }, "javascript.operators.destructuring.rest_in_objects": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "55", firefox_android: "55", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "\
60", chrome_android: "60", edge: "79", firefox: "55", firefox_android: "55", safari: "11.1", safari_ios: "11.3" } } }, details: { caniuse: ["details"], compat_features: ["api.HTMLDetailsElement", "api.HTMLDetailsElement.open", "api.HTMLElement.toggle_event", "api.HTMLElement.toggle_event.details_elements", "html.elements.details", "html.elements.details.open", "html.elements.summary", "html.elements.summary.display_list_item"], description: "The <details> element is a disclosure widget which can be expanded to reveal additional content. When closed, only the nested <summary> element is visible.", description_html: "The <code>&#x3C;details></code> element is a disclosure widget which can be expanded to reveal additional content. When closed, only the nested <code>&#x3C;summary></code> element is visible.", group: ["html-elements"], kind: "feature", name: "<details>", spec: ["https://html.spec.whatwg.org/multipage/interactive-elements.html#the-details-element"], status: { baseline: "high",
    baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.HTMLDetailsElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "10", chrome_android: "18", edge: "79", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "6" } }, "api.HTMLDetailsElement.open": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "10", chrome_android: "18", edge: "79", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "6" } }, "api.HTMLElement.toggle_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLElement.toggle_event.details_elements": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "\
36", edge: "79", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "html.elements.details": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "12", chrome_android: "18", edge: "79", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "6" } }, "html.elements.details.open": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "12", chrome_android: "18", edge: "79", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "6" } }, "html.elements.summary": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "12", chrome_android: "18", edge: "79", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "6" } }, "html.elements.summary.display_list_item": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "49", firefox_android: "49" } } }, support: {
    chrome: "12", chrome_android: "18", edge: "79", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "6" } } }, "details-content": { compat_features: ["css.selectors.details-content"], description: "The ::details-content pseudo-element selects the expandable content of a <details> element, excluding the <summary>.", description_html: "The <code>::details-content</code> pseudo-element selects the expandable content of a <code>&#x3C;details></code> element, excluding the <code>&#x3C;summary></code>.", group: ["selectors"], kind: "feature", name: "::details-content", spec: ["https://drafts.csswg.org/css-pseudo-4/#details-content-pseudo"], status: { baseline: "low", baseline_low_date: "2025-09-16", by_compat_key: { "css.selectors.details-content": { baseline: "low", baseline_low_date: "2025-09-16", support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "143", firefox_android: "143", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "131", chrome_android: "\
131", edge: "131", firefox: "143", firefox_android: "143", safari: "18.4", safari_ios: "18.4" } } }, "details-name": { compat_features: ["api.HTMLDetailsElement.name", "html.elements.details.name"], description: "Multiple <details> elements which use the same name attribute are mutually exclusive. When one member of the group is opened, all other members are closed.", description_html: "Multiple <code>&#x3C;details></code> elements which use the same <code>name</code> attribute are mutually exclusive. When one member of the group is opened, all other members are closed.", group: ["html-elements"], kind: "feature", name: "Mutually exclusive <details> elements", spec: ["https://html.spec.whatwg.org/multipage/interactive-elements.html#attr-details-name"], status: { baseline: "low", baseline_low_date: "2024-09-03", by_compat_key: { "api.HTMLDetailsElement.name": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "130",
    firefox_android: "130", safari: "17.2", safari_ios: "17.2" } }, "html.elements.details.name": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "130", firefox_android: "130", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "130", firefox_android: "130", safari: "17.2", safari_ios: "17.2" } } }, "device-bound-session-credentials": { compat_features: ["http.headers.Sec-Secure-Session-Id", "http.headers.Secure-Session-Challenge", "http.headers.Secure-Session-Registration", "http.headers.Secure-Session-Response", "http.headers.Secure-Session-Skipped"], description: "Device-bound session credentials is a protocol to request proof of possession of a private key. Regularly confirming key possession can help protect against cookie theft.", description_html: "Device-bound session credentials is a protocol to request proof of possession of a private key. R\
egularly confirming key possession can help protect against cookie theft.", kind: "feature", name: "Device-bound session credentials", spec: ["https://w3c.github.io/webappsec-dbsc/"], status: { baseline: false, by_compat_key: { "http.headers.Sec-Secure-Session-Id": { baseline: false, support: {} }, "http.headers.Secure-Session-Challenge": { baseline: false, support: {} }, "http.headers.Secure-Session-Registration": { baseline: false, support: {} }, "http.headers.Secure-Session-Response": { baseline: false, support: {} }, "http.headers.Secure-Session-Skipped": { baseline: false, support: {} } }, support: {} } }, "device-memory": { compat_features: ["api.Navigator.deviceMemory", "api.WorkerNavigator.deviceMemory", "http.headers.Sec-CH-Device-Memory"], description: "The navigator.deviceMemory property is the approximate amount of device memory, in gigabytes.", description_html: "The <code>navigator.deviceMemory</code> property is the approximate amount of device memory, in gigabytes.", kind: "\
feature", name: "Device memory", spec: ["https://www.w3.org/TR/device-memory/"], status: { baseline: false, by_compat_key: { "api.Navigator.deviceMemory": { baseline: false, support: { chrome: "63", chrome_android: "63", edge: "79" } }, "api.WorkerNavigator.deviceMemory": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "http.headers.Sec-CH-Device-Memory": { baseline: false, support: { chrome: "97", chrome_android: "97", edge: "97" } } }, support: { chrome: "97", chrome_android: "97", edge: "97" } } }, "device-orientation-events": { caniuse: ["deviceorientation"], compat_features: ["api.DeviceMotionEvent", "api.DeviceMotionEvent.DeviceMotionEvent", "api.DeviceMotionEvent.acceleration", "api.DeviceMotionEvent.accelerationIncludingGravity", "api.DeviceMotionEvent.interval", "api.DeviceMotionEvent.requestPermission_static", "api.DeviceMotionEvent.rotationRate", "api.DeviceMotionEventAcceleration", "api.DeviceMotionEventAcceleration.x", "api.DeviceMotionEve\
ntAcceleration.y", "api.DeviceMotionEventAcceleration.z", "api.DeviceMotionEventRotationRate", "api.DeviceMotionEventRotationRate.alpha", "api.DeviceMotionEventRotationRate.beta", "api.DeviceMotionEventRotationRate.gamma", "api.DeviceOrientationEvent", "api.DeviceOrientationEvent.DeviceOrientationEvent", "api.DeviceOrientationEvent.absolute", "api.DeviceOrientationEvent.alpha", "api.DeviceOrientationEvent.beta", "api.DeviceOrientationEvent.gamma", "api.DeviceOrientationEvent.requestPermission_static", "api.Window.devicemotion_event", "api.Window.deviceorientation_event", "api.Window.deviceorientationabsolute_event"], description: "The DeviceMotion and DeviceOrientation events report the movement and orientation of the browser's device in physical space. Note that coordinates can differ noticeably between platforms and devices.", description_html: "The <code>DeviceMotion</code> and <code>DeviceOrientation</code> events report the movement and orientation of the browser's device in physi\
cal space. Note that coordinates can differ noticeably between platforms and devices.", group: ["sensors"], kind: "feature", name: "Device orientation events", spec: ["https://w3c.github.io/deviceorientation/"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "api.DeviceMotionEvent": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceMotionEvent.DeviceMotionEvent": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "14", firefox: "29", firefox_android: "29" } }, "api.DeviceMotionEvent.acceleration": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceM\
otionEvent.accelerationIncludingGravity": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceMotionEvent.interval": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceMotionEvent.requestPermission_static": { baseline: false, support: { safari_ios: "14.5" } }, "api.DeviceMotionEvent.rotationRate": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceMotionEventAcceleration": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "\
6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventAcceleration.x": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventAcceleration.y": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventAcceleration.z": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventRotationRate": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventRotationRate.alpha": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventRotationRate.beta": { baseline: false, support: {
    chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceMotionEventRotationRate.gamma": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari_ios: "4.2" } }, "api.DeviceOrientationEvent": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceOrientationEvent.DeviceOrientationEvent": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "14", firefox: "17", firefox_android: "17" } }, "api.DeviceOrientationEvent.absolute": { baseline: false, support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "17" } }, "api.DeviceOrientationEvent.alpha": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-\
18", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceOrientationEvent.beta": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceOrientationEvent.gamma": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.DeviceOrientationEvent.requestPermission_static": { baseline: false, support: { safari_ios: "14.5" } }, "api.Window.devicemotion_event": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } },
    "api.Window.deviceorientation_event": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } }, "api.Window.deviceorientationabsolute_event": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "110", firefox_android: "110" } } }, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "6", safari: "17", safari_ios: "4.2" } } }, "device-posture": { compat_features: ["api.DevicePosture", "api.DevicePosture.change_event", "api.DevicePosture.type", "api.Navigator.devicePosture", "css.at-rules.media.device-posture"], description: "The device posture API and the device-posture CSS media feature reflect the physical posture of a device, such as whether a foldable device is folded or unfolded.", description_html: "The device posture API and the <code>device-postur\
e</code> CSS media feature reflect the physical posture of a device, such as whether a foldable device is folded or unfolded.", kind: "feature", name: "Device posture", spec: ["https://w3c.github.io/device-posture/"], status: { baseline: false, by_compat_key: { "api.DevicePosture": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132" } }, "api.DevicePosture.change_event": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132" } }, "api.DevicePosture.type": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132" } }, "api.Navigator.devicePosture": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132" } }, "css.at-rules.media.device-posture": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132" } } }, support: { chrome: "132", chrome_android: "132", edge: "132" } } }, "device-queries": { compat_features: ["css.at-rules.media.device-aspect-ratio", "css.at-rules.\
media.device-height", "css.at-rules.media.device-width"], description: "The device-aspect-ratio, device-height, and device-width media features describe physical properties of the displaying output device.", description_html: "The <code>device-aspect-ratio</code>, <code>device-height</code>, and <code>device-width</code> media features describe physical properties of the displaying output device.", discouraged: { according_to: ["https://drafts.csswg.org/mediaqueries-5/#mf-deprecated"], alternatives: ["media-queries"], reason: "Device media queries do not reflect available layout, only the physical size of the device.", reason_html: "Device media queries do not reflect available layout, only the physical size of the device." }, group: ["media-queries"], kind: "feature", name: "Device media queries", spec: ["https://drafts.csswg.org/mediaqueries-5/#mf-deprecated"], status: { baseline: false, by_compat_key: { "css.at-rules.media.device-aspect-ratio": { baseline: false, support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.device-height": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.device-width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } } }, devicepixelratio: { caniuse: ["devicepixelratio"], compat_features: ["api.Window.devicePixelRatio"], description: "The window.devicePixelRatio property is the ratio of the size of one CSS pixel to the vertical size of one physical pixel on the current display device.", description_html: "The <code>window.devicePixelRatio</code> property is the ratio of the size of one CSS pixel to the vertica\
l size of one physical pixel on the current display device.", kind: "feature", name: "devicePixelRatio", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-window-devicepixelratio"], status: { baseline: false, by_compat_key: { "api.Window.devicePixelRatio": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "18", firefox_android: "18" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "18", firefox_android: "18" } } }, dfn: { compat_features: ["html.elements.dfn"], description: "The <dfn> element marks a term to be defined, styling text as italic by default.", description_html: "The <code>&#x3C;dfn></code> element marks a term to be defined, styling text as italic by default.", group: ["html-elements"], kind: "feature", name: "<dfn>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-dfn-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: {
    "html.elements.dfn": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } } }, support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } } }, dialog: { caniuse: ["dialog"], compat_features: ["api.HTMLDialogElement", "api.HTMLDialogElement.cancel_event", "api.HTMLDialogElement.close", "api.HTMLDialogElement.close_event", "api.HTMLDialogElement.open", "api.HTMLDialogElement.returnValue", "api.HTMLDialogElement.show", "api.HTMLDialogElement.showModal", "api.HTMLElement.beforetoggle_event.dialog_elements", "api.HTMLElement.toggle_event.dialog_elements", "html.elements.dialog", "html.elements.dialog.open"], description: "The <dialog> HTML element represents a modal or non-modal dialog box, such as a confirmation prompt or a subwindow used to enter data.", description_html: "\
The <code>&#x3C;dialog></code> HTML element represents a modal or non-modal dialog box, such as a confirmation prompt or a subwindow used to enter data.", group: ["html-elements"], kind: "feature", name: "<dialog>", spec: ["https://html.spec.whatwg.org/multipage/interactive-elements.html#the-dialog-element"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "api.HTMLDialogElement": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.cancel_event": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.close": { baseline: "high", baseline_high_date: "\
2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.close_event": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.open": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.returnValue": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.show": { baseline: "\
high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLDialogElement.showModal": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLElement.beforetoggle_event.dialog_elements": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "133", firefox_android: "133", safari: "26", safari_ios: "26" } }, "api.HTMLElement.toggle_event.dialog_elements": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "133", firefox_android: "133", safari: "26", safari_ios: "26" } }, "html.elements.dialog": { baseline: "high", baseline_high_date: "\
2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } }, "html.elements.dialog.open": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "98", firefox_android: "98", safari: "15.4", safari_ios: "15.4" } } }, "dialog-closedby": { compat_features: ["api.HTMLDialogElement.closedBy", "html.elements.dialog.closedby"], description: 'The closedby HTML attribute for <dialog> sets which user actions close a dialog. For example, closedby="any" allows the dialog to be closed by clicking outside of it.', description_html: 'The <code>closedby</code> HTML attribute for <code>&#x3C;dialog></code> sets which user actions close a dialog. Fo\
r example, <code>closedby="any"</code> allows the dialog to be closed by clicking outside of it.', group: ["html-elements"], kind: "feature", name: "<dialog closedby>", spec: ["https://html.spec.whatwg.org/multipage/interactive-elements.html#attr-dialog-closedby"], status: { baseline: false, by_compat_key: { "api.HTMLDialogElement.closedBy": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "html.elements.dialog.closedby": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } } }, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } } }, "digital-credentials": { compat_features: ["api.DigitalCredential", "api.DigitalCredential.data", "api.DigitalCredential.protocol", "api.DigitalCredential.toJSON", "api.DigitalCredential.userAgentAllowsProtocol_static"], description: "The digital credentials API \
issues and requests digital credentials, such as driver's licenses or ID cards, with the browser or operating system. Digital credentials extend the navigator.credentials credential management API.", description_html: "The digital credentials API issues and requests digital credentials, such as driver's licenses or ID cards, with the browser or operating system. Digital credentials extend the <code>navigator.credentials</code> credential management API.", kind: "feature", name: "Digital credentials", spec: ["https://w3c-fedid.github.io/digital-credentials/"], status: { baseline: false, by_compat_key: { "api.DigitalCredential": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", safari: "26", safari_ios: "26" } }, "api.DigitalCredential.data": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", safari: "26", safari_ios: "26" } }, "api.DigitalCredential.protocol": { baseline: false, support: { chrome: "141", chrome_android: "141",
    edge: "141", safari: "26", safari_ios: "26" } }, "api.DigitalCredential.toJSON": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", safari: "26", safari_ios: "26" } }, "api.DigitalCredential.userAgentAllowsProtocol_static": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", safari: "26", safari_ios: "26" } } }, support: { chrome: "141", chrome_android: "141", edge: "141", safari: "26", safari_ios: "26" } } }, "digital-goods": { compat_features: ["api.Window.getDigitalGoodsService"], description: "The window.getDigitalGoodsService API connects to stores or billing services for in-app products and subscriptions.", description_html: "The <code>window.getDigitalGoodsService</code> API connects to stores or billing services for in-app products and subscriptions.", kind: "feature", name: "Digital goods", spec: ["https://wicg.github.io/digital-goods/"], status: { baseline: false, by_compat_key: { "api.Window.getDigitalGoodsServic\
e": { baseline: false, support: { chrome_android: "101", edge: "134" } } }, support: { chrome_android: "101", edge: "134" } } }, "dir-pseudo": { caniuse: ["css-dir-pseudo"], compat_features: ["css.selectors.dir"], description: "The :dir() CSS functional pseudo-class matches elements by text direction, either right to left (rtl) or left to right (ltr).", description_html: "The <code>:dir()</code> CSS functional pseudo-class matches elements by text direction, either right to left (<code>rtl</code>) or left to right (<code>ltr</code>).", group: ["selectors"], kind: "feature", name: ":dir()", spec: ["https://drafts.csswg.org/selectors-4/#the-dir-pseudo"], status: { baseline: "low", baseline_low_date: "2023-12-07", by_compat_key: { "css.selectors.dir": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "49", firefox_android: "49", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "120", chrome_android: "120",
    edge: "120", firefox: "49", firefox_android: "49", safari: "16.4", safari_ios: "16.4" } } }, dirname: { compat_features: ["api.HTMLInputElement.dirName", "api.HTMLTextAreaElement.dirName", "html.elements.input.dirname", "html.elements.textarea.dirname"], description: "The dirname attribute of <textarea> and <input> HTML elements includes the field's writing direction as form data on submission.", description_html: "The <code>dirname</code> attribute of <code>&#x3C;textarea></code> and <code>&#x3C;input></code> HTML elements includes the field's writing direction as form data on submission.", kind: "feature", name: "dirname", spec: ["https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-dirname"], status: { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", by_compat_key: { "api.HTMLInputElement.dirName": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "17", chrome_android: "\
18", edge: "79", firefox: "116", firefox_android: "116", safari: "6", safari_ios: "6" } }, "api.HTMLTextAreaElement.dirName": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "17", chrome_android: "18", edge: "79", firefox: "116", firefox_android: "116", safari: "6", safari_ios: "6" } }, "html.elements.input.dirname": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "17", chrome_android: "18", edge: "79", firefox: "116", firefox_android: "116", safari: "6", safari_ios: "6" } }, "html.elements.textarea.dirname": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "17", chrome_android: "18", edge: "79", firefox: "116", firefox_android: "116", safari: "6", safari_ios: "6" } } }, support: { chrome: "17", chrome_android: "18", edge: "79", firefox: "116", firefox_android: "116", safari: "6", safari_ios: "6" } } }, display: { caniuse: [
    "inline-block"], compat_features: ["css.properties.display", "css.properties.display.block", "css.properties.display.inline", "css.properties.display.inline-block", "css.properties.display.none", "css.properties.display.none.option_is_hidden"], description: "The display CSS property sets the display behavior of an element's box within its layout and sets the layout behavior for its child elements.", description_html: "The <code>display</code> CSS property sets the display behavior of an element's box within its layout and sets the layout behavior for its child elements.", group: ["css"], kind: "feature", name: "Display", spec: ["https://drafts.csswg.org/css-display-3/#the-display-properties"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.display": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.block": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.inline": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.inline-block": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.display.none.option_is_hidden": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "display-animation": { compat_features: ["css.properties.content-visibility.is_transitionable", "css.properties.content-visibility.keyframe_animatable", "css.properties.display.is_transitionable", "css.properties.display.keyframe_animatable", "css.properties.transition-behavior.transitionable_content-visibility", "css.properties.transition-behavior.transitionable_display"], description: "You can animate elements between display: none and any other display value or animate between content-visibility: hidden and any other content-visibility value. This also applies to transitions.", description_html: "You can animate elements between <code>display: none</code\
> and any other <code>display</code> value or animate between <code>content-visibility: hidden</code> and any other <code>content-visibility</code> value. This also applies to transitions.", group: ["css"], kind: "feature", name: "display animation", spec: ["https://drafts.csswg.org/css-display-4/#display-animation", "https://drafts.csswg.org/css-contain-3/#content-visibility-animation"], status: { baseline: false, by_compat_key: { "css.properties.content-visibility.is_transitionable": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "18", safari_ios: "18" } }, "css.properties.content-visibility.keyframe_animatable": { baseline: false, support: { chrome: "116", chrome_android: "116", edge: "116", safari: "18", safari_ios: "18" } }, "css.properties.display.is_transitionable": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "18", safari_ios: "18" } }, "css.properties.display.keyframe_animatable": { baseline: false,
    support: { chrome: "116", chrome_android: "116", edge: "116", safari: "18", safari_ios: "18" } }, "css.properties.transition-behavior.transitionable_content-visibility": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "18", safari_ios: "18" } }, "css.properties.transition-behavior.transitionable_display": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "18", safari_ios: "18" } } }, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "18", safari_ios: "18" } } }, "display-contents": { caniuse: ["css-display-contents"], compat_features: ["css.properties.display.contents", "css.properties.display.contents.contents_unusual", "css.properties.display.contents.focusable_elements"], description: "The display: contents CSS declaration sets an element to display only its contents, not itself.", description_html: "The <code>display: contents</code> CSS declaration sets an element to display onl\
y its contents, not itself.", group: ["css"], kind: "feature", name: "display: contents", spec: ["https://drafts.csswg.org/css-display-3/#box-generation"], status: { baseline: false, by_compat_key: { "css.properties.display.contents": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "37", firefox_android: "37", safari: "11.1", safari_ios: "11.3" } }, "css.properties.display.contents.contents_unusual": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "59", firefox_android: "59" } }, "css.properties.display.contents.focusable_elements": { baseline: false, support: {} } }, support: {} } }, "display-flow-root": { caniuse: ["flow-root"], compat_features: ["css.properties.display.flow-root"], description: "The display: flow-root CSS declaration sets an element as the root element of a new flow layout for its children, preventing margin collapse with \
sibling elements.", description_html: "The <code>display: flow-root</code> CSS declaration sets an element as the root element of a new flow layout for its children, preventing margin collapse with sibling elements.", group: ["css"], kind: "feature", name: "display: flow-root", spec: ["https://drafts.csswg.org/css-display-3/#inner-model"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.display.flow-root": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "53", firefox_android: "53", safari: "13", safari_ios: "13" } } }, support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "53", firefox_android: "53", safari: "13", safari_ios: "13" } } }, "display-grid-lanes": { kind: "moved", redirect_target: "masonry" }, "display-list-item": { compat_features: ["css.properties.display.list-item", "css.pr\
operties.display.list-item.legend-support"], description: "The display: list-item CSS declaration renders an element with the box layout of a <li> HTML element.", description_html: "The <code>display: list-item</code> CSS declaration renders an element with the box layout of a <code>&#x3C;li></code> HTML element.", group: ["css", "lists"], kind: "feature", name: "display: list-item", spec: ["https://drafts.csswg.org/css-display-3/#list-items"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.display.list-item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.list-item.legend-support": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64" } } }, support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "display-mode": { compat_features: ["css.at-rules.media.display-mode", "css.at-rules.media.display-mode.browser", "css.at-rules.media.display-mode.fullscreen", "css.at-rules.media.display-mode.minimal-ui", "css.at-rules.media.display-mode.standalone"], description: "The display-mode CSS media query sets styles based on whether the web page is in an ordinary browser tab mode or another mode, such as fullscreen, standalone, or minimal-ui.", description_html: "The <code>display-mode</code> CSS media query sets styles based on whether the web page is in an ordinary <code>browser</code> tab mode or another mode, such as <code>fullscreen</code>, <code>standalone</code>, or <code>minimal-ui</code>.", group: ["media-queries"], kind: "feature", name: "display-mode media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#display-modes"], status: { baseline: false, by_compat_key: { "\
css.at-rules.media.display-mode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "47", firefox_android: "47", safari: "13", safari_ios: "12.2" } }, "css.at-rules.media.display-mode.browser": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "47", firefox_android: "116", safari: "13", safari_ios: "12.2" } }, "css.at-rules.media.display-mode.fullscreen": { baseline: false, support: { chrome: "47", edge: "79", firefox_android: "116" } }, "css.at-rules.media.display-mode.minimal-ui": { baseline: false, support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "57", firefox_android: "116", safari: "13" } }, "css.at-rules.media.display-mode.standalone": { baseline: false, support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "57", firefox_android: "116", safari: "\
13" } } }, support: { chrome: "47", edge: "79", firefox_android: "116" } } }, "display-ruby": { compat_features: ["css.properties.display.ruby", "css.properties.display.ruby-base", "css.properties.display.ruby-base-container", "css.properties.display.ruby-text", "css.properties.display.ruby-text-container", "css.properties.ruby-position.alternate"], description: "The display: ruby CSS declaration renders an element with the box layout of a <ruby> HTML element. Child elements may use equivalents to <ruby> internal elements such as display: ruby-base for <rb>.", description_html: "The <code>display: ruby</code> CSS declaration renders an element with the box layout of a <code>&#x3C;ruby></code> HTML element. Child elements may use equivalents to <code>&#x3C;ruby></code> internal elements such as <code>display: ruby-base</code> for <code>&#x3C;rb></code>.", group: ["css", "ruby"], kind: "feature", name: "display: ruby", spec: ["https://drafts.csswg.org/css-display-3/#layout-specific-displ\
ay"], status: { baseline: false, by_compat_key: { "css.properties.display.ruby": { baseline: false, support: { chrome: "121", chrome_android: "121", firefox: "38", firefox_android: "38" } }, "css.properties.display.ruby-base": { baseline: false, support: { firefox: "38", firefox_android: "38" } }, "css.properties.display.ruby-base-container": { baseline: false, support: { firefox: "38", firefox_android: "38" } }, "css.properties.display.ruby-text": { baseline: false, support: { chrome: "121", chrome_android: "121", firefox: "38", firefox_android: "38" } }, "css.properties.display.ruby-text-container": { baseline: false, support: { firefox: "38", firefox_android: "38" } }, "css.properties.ruby-position.alternate": { baseline: false, support: { firefox: "88", firefox_android: "88" } } }, support: { firefox: "88", firefox_android: "88" } } }, "display-table": { caniuse: ["css-table"], compat_features: ["css.properties.display.inline-table", "css.properties.display.table", "css.properties.\
display.table-caption", "css.properties.display.table-cell", "css.properties.display.table-column", "css.properties.display.table-column-group", "css.properties.display.table-footer-group", "css.properties.display.table-header-group", "css.properties.display.table-row", "css.properties.display.table-row-group"], description: "The display: table CSS declaration renders an element with the box layout of a <table> HTML element. Child elements may use equivalents to <table> internal elements such as display: table-row for <tr>.", description_html: "The <code>display: table</code> CSS declaration renders an element with the box layout of a <code>&#x3C;table></code> HTML element. Child elements may use equivalents to <code>&#x3C;table></code> internal elements such as <code>display: table-row</code> for <code>&#x3C;tr></code>.", group: ["css"], kind: "feature", name: "display: table", spec: ["https://drafts.csswg.org/css-display-3/#layout-specific-display"], status: { baseline: "high", baseline_high_date: "\
≤2019-10-05", baseline_low_date: "≤2017-04-05", by_compat_key: { "css.properties.display.inline-table": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-caption": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "css.properties.display.table-cell": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-column": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-column-group": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-footer-group": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-header-group": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-row": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.display.table-row-group": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, div: { compat_features: ["api.HTMLDivElement", "html.elements.div"], description: "The <div> HTML element is the generic container for content.", description_html: "The <code>&#x3C;div></code> HTML element is the generic contain\
er for content.", group: ["html-elements"], kind: "feature", name: "<div>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-div-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLDivElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.div": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "document-caretpositionfrompoint": { compat_features: ["api.CaretPosition", "api.CaretPosition.getClientRect", "api.Car\
etPosition.offset", "api.CaretPosition.offsetNode", "api.Document.caretPositionFromPoint", "api.Document.caretPositionFromPoint.options_parameter"], description: "The document.caretPositionFromPoint() method finds an insertion point, represented by a DOM node and an offset within that node, for given coordinates in the viewport.", description_html: "The <code>document.caretPositionFromPoint()</code> method finds an insertion point, represented by a DOM node and an offset within that node, for given coordinates in the viewport.", kind: "feature", name: "document.caretPositionFromPoint()", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-document-caretpositionfrompoint"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "api.CaretPosition": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "20", firefox_android: "20", safari: "26.2", safari_ios: "26.2" } }, "api.CaretPosition.getClientR\
ect": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "23", firefox_android: "23", safari: "26.2", safari_ios: "26.2" } }, "api.CaretPosition.offset": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "20", firefox_android: "20", safari: "26.2", safari_ios: "26.2" } }, "api.CaretPosition.offsetNode": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "20", firefox_android: "20", safari: "26.2", safari_ios: "26.2" } }, "api.Document.caretPositionFromPoint": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "20", firefox_android: "20", safari: "26.2", safari_ios: "26.2" } }, "api.Document.caretPositionFromPoint.options_parameter": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "\
128", chrome_android: "128", edge: "128", firefox: "150", firefox_android: "150", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "20", firefox_android: "20", safari: "26.2", safari_ios: "26.2" } } }, "document-colors": { compat_features: ["api.Document.alinkColor", "api.Document.bgColor", "api.Document.fgColor", "api.Document.linkColor", "api.Document.vlinkColor"], description: "A document's bgColor, fgColor, alinkColor, linkColor, and vlinkColor properties get and set the background, foreground, active link, link, and visited link colors of that document.", description_html: "A document's <code>bgColor</code>, <code>fgColor</code>, <code>alinkColor</code>, <code>linkColor</code>, and <code>vlinkColor</code> properties get and set the background, foreground, active link, link, and visited link colors of that document.", discouraged: { according_to: ["https://html.spec.whatwg.org/multipage/obsolete.html"], alternatives: [
    "background-color", "color", "css-object-model", "get-computed-style"], reason: "Document color attributes are superseded by CSS.", reason_html: "Document color attributes are superseded by CSS." }, kind: "feature", name: "Document colors", spec: ["https://html.spec.whatwg.org/multipage/obsolete.html"], status: { baseline: false, by_compat_key: { "api.Document.alinkColor": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.bgColor": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.fgColor": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.linkColor": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "69",
    firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.vlinkColor": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } } }, support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } } }, "document-picture-in-picture": { compat_features: ["api.DocumentPictureInPicture", "api.DocumentPictureInPicture.enter_event", "api.DocumentPictureInPicture.requestWindow", "api.DocumentPictureInPicture.requestWindow.option_disallowReturnToOpener", "api.DocumentPictureInPicture.requestWindow.option_preferInitialWindowPlacement", "api.DocumentPictureInPicture.window", "api.DocumentPictureInPictureEvent", "api.DocumentPictureInPictureEvent.DocumentPictureInPictureEvent", "api.DocumentPictureInPictureEvent.window", "api.Window.documentPictureInPicture"], description: "The document picture-in-picture API creates an al\
ways-on-top window from arbitrary HTML content.", description_html: "The document picture-in-picture API creates an always-on-top window from arbitrary HTML content.", kind: "feature", name: "Document picture-in-picture", spec: ["https://wicg.github.io/document-picture-in-picture/"], status: { baseline: false, by_compat_key: { "api.DocumentPictureInPicture": { baseline: false, support: { chrome: "116", edge: "116" } }, "api.DocumentPictureInPicture.enter_event": { baseline: false, support: { chrome: "116", edge: "116" } }, "api.DocumentPictureInPicture.requestWindow": { baseline: false, support: { chrome: "116", edge: "116" } }, "api.DocumentPictureInPicture.requestWindow.option_disallowReturnToOpener": { baseline: false, support: { chrome: "124", edge: "124" } }, "api.DocumentPictureInPicture.requestWindow.option_preferInitialWindowPlacement": { baseline: false, support: { chrome: "130", edge: "130" } }, "api.DocumentPictureInPicture.window": { baseline: false, support: { chrome: "116",
    edge: "116" } }, "api.DocumentPictureInPictureEvent": { baseline: false, support: { chrome: "116", edge: "116" } }, "api.DocumentPictureInPictureEvent.DocumentPictureInPictureEvent": { baseline: false, support: { chrome: "116", edge: "116" } }, "api.DocumentPictureInPictureEvent.window": { baseline: false, support: { chrome: "116", edge: "116" } }, "api.Window.documentPictureInPicture": { baseline: false, support: { chrome: "116", edge: "116" } } }, support: { chrome: "130", edge: "130" } } }, "document-write": { compat_features: ["api.Document.close", "api.Document.open", "api.Document.write", "api.Document.write.enforces_trusted_types", "api.Document.writeln", "api.Document.writeln.enforces_trusted_types"], description: "The document.open(), document.write(), document.writeln(), and document.close() methods write content to a document, possibly while that document is still loading.", description_html: "The <code>document.open()</code>, <code>document.write()</code>, <code>documen\
t.writeln()</code>, and <code>document.close()</code> methods write content to a document, possibly while that document is still loading.", discouraged: { according_to: ["https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#document.write()"], alternatives: ["dom"], reason: 'The dynamic markup insertion API, which includes document.write(), has "very idiosyncratic behavior" which can be difficult to debug.', reason_html: 'The dynamic markup insertion API, which includes <code>document.write()</code>, has "very idiosyncratic behavior" which can be difficult to debug.' }, kind: "feature", name: "document.write()", spec: ["https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html"], status: { baseline: false, by_compat_key: { "api.Document.close": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } },
    "api.Document.open": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.write": { baseline: false, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.write.enforces_trusted_types": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.Document.writeln": { baseline: false, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.Document.writeln.enforces_trusted_types": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } } }, support: {
    chrome: "45", chrome_android: "45", edge: "12", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } } }, dom: { compat_features: ["api.Attr", "api.Attr.localName", "api.Attr.name", "api.Attr.namespaceURI", "api.Attr.ownerElement", "api.Attr.prefix", "api.Attr.value", "api.CDATASection", "api.CharacterData", "api.CharacterData.after", "api.CharacterData.appendData", "api.CharacterData.before", "api.CharacterData.data", "api.CharacterData.deleteData", "api.CharacterData.insertData", "api.CharacterData.length", "api.CharacterData.nextElementSibling", "api.CharacterData.previousElementSibling", "api.CharacterData.remove", "api.CharacterData.replaceData", "api.CharacterData.replaceWith", "api.CharacterData.substringData", "api.Comment", "api.Comment.Comment", "api.DOMException", "api.DOMException.DOMException", "api.DOMException.message", "api.DOMException.name", "api.DOMImplementation", "api.DOMImplementation.createDocument", "api.DOMImplementation.createDocumentType",
    "api.DOMImplementation.createHTMLDocument", "api.DOMStringList", "api.DOMStringList.contains", "api.DOMStringList.item", "api.DOMStringList.length", "api.DOMTokenList", "api.DOMTokenList.@@iterator", "api.DOMTokenList.add", "api.DOMTokenList.add.multiple_parameters", "api.DOMTokenList.contains", "api.DOMTokenList.entries", "api.DOMTokenList.forEach", "api.DOMTokenList.item", "api.DOMTokenList.keys", "api.DOMTokenList.length", "api.DOMTokenList.remove", "api.DOMTokenList.remove.multiple_parameters", "api.DOMTokenList.remove_duplicates", "api.DOMTokenList.replace", "api.DOMTokenList.replace.boolean_value", "api.DOMTokenList.supports", "api.DOMTokenList.toString", "api.DOMTokenList.toggle", "api.DOMTokenList.toggle.force_parameter", "api.DOMTokenList.trim_whitespace", "api.DOMTokenList.value", "api.DOMTokenList.values", "api.Document", "api.Document.DOMContentLoaded_event", "api.Document.Document", "api.Document.URL", "api.Document.activeElement", "api.Document.adoptNode", "api.Docume\
nt.append", "api.Document.body", "api.Document.characterSet", "api.Document.childElementCount", "api.Document.children", "api.Document.compatMode", "api.Document.contentType", "api.Document.createAttribute", "api.Document.createAttributeNS", "api.Document.createCDATASection", "api.Document.createComment", "api.Document.createDocumentFragment", "api.Document.createElement", "api.Document.createElement.options_parameter", "api.Document.createElementNS", "api.Document.createElementNS.options_parameter", "api.Document.createNodeIterator", "api.Document.createProcessingInstruction", "api.Document.createTextNode", "api.Document.createTreeWalker", "api.Document.createTreeWalker.whatToShow_filter_parameters_optional", "api.Document.currentScript", "api.Document.defaultView", "api.Document.dir", "api.Document.doctype", "api.Document.documentElement", "api.Document.documentURI", "api.Document.embeds", "api.Document.firstElementChild", "api.Document.forms", "api.Document.getElementById", "api.Doc\
ument.getElementsByClassName", "api.Document.getElementsByName", "api.Document.getElementsByTagName", "api.Document.getElementsByTagNameNS", "api.Document.hasFocus", "api.Document.head", "api.Document.images", "api.Document.implementation", "api.Document.importNode", "api.Document.lastElementChild", "api.Document.lastModified", "api.Document.links", "api.Document.plugins", "api.Document.prepend", "api.Document.querySelector", "api.Document.querySelectorAll", "api.Document.readyState", "api.Document.readystatechange_event", "api.Document.referrer", "api.Document.replaceChildren", "api.Document.scripts", "api.Document.title", "api.DocumentFragment", "api.DocumentFragment.DocumentFragment", "api.DocumentFragment.append", "api.DocumentFragment.childElementCount", "api.DocumentFragment.children", "api.DocumentFragment.firstElementChild", "api.DocumentFragment.getElementById", "api.DocumentFragment.lastElementChild", "api.DocumentFragment.prepend", "api.DocumentFragment.querySelector", "api.\
DocumentFragment.querySelectorAll", "api.DocumentFragment.replaceChildren", "api.DocumentType", "api.DocumentType.after", "api.DocumentType.before", "api.DocumentType.name", "api.DocumentType.publicId", "api.DocumentType.remove", "api.DocumentType.replaceWith", "api.DocumentType.systemId", "api.Element", "api.Element.after", "api.Element.append", "api.Element.attributes", "api.Element.before", "api.Element.childElementCount", "api.Element.children", "api.Element.classList", "api.Element.className", "api.Element.clientHeight", "api.Element.clientLeft", "api.Element.clientTop", "api.Element.clientWidth", "api.Element.closest", "api.Element.currentCSSZoom", "api.Element.firstElementChild", "api.Element.getAttribute", "api.Element.getAttributeNS", "api.Element.getAttributeNames", "api.Element.getAttributeNode", "api.Element.getAttributeNodeNS", "api.Element.getBoundingClientRect", "api.Element.getClientRects", "api.Element.getElementsByClassName", "api.Element.getElementsByTagName", "api.E\
lement.getElementsByTagName.all_elements_selector", "api.Element.getElementsByTagNameNS", "api.Element.getElementsByTagNameNS.all_elements_selector", "api.Element.hasAttribute", "api.Element.hasAttributeNS", "api.Element.hasAttributes", "api.Element.id", "api.Element.innerHTML", "api.Element.insertAdjacentElement", "api.Element.insertAdjacentHTML", "api.Element.insertAdjacentText", "api.Element.lastElementChild", "api.Element.localName", "api.Element.matches", "api.Element.namespaceURI", "api.Element.nextElementSibling", "api.Element.outerHTML", "api.Element.prefix", "api.Element.prepend", "api.Element.previousElementSibling", "api.Element.querySelector", "api.Element.querySelectorAll", "api.Element.remove", "api.Element.removeAttribute", "api.Element.removeAttributeNS", "api.Element.removeAttributeNode", "api.Element.replaceChildren", "api.Element.replaceWith", "api.Element.setAttribute", "api.Element.setAttributeNS", "api.Element.setAttributeNode", "api.Element.setAttributeNodeNS", "\
api.Element.tagName", "api.Element.toggleAttribute", "api.HTMLCollection", "api.HTMLCollection.item", "api.HTMLCollection.length", "api.HTMLCollection.namedItem", "api.HTMLDocument", "api.HTMLElement", "api.HTMLElement.dir", "api.HTMLElement.hidden", "api.HTMLElement.innerText", "api.HTMLElement.load_event", "api.HTMLElement.offsetHeight", "api.HTMLElement.offsetLeft", "api.HTMLElement.offsetParent", "api.HTMLElement.offsetTop", "api.HTMLElement.offsetWidth", "api.HTMLElement.outerText", "api.NamedNodeMap", "api.NamedNodeMap.getNamedItem", "api.NamedNodeMap.getNamedItemNS", "api.NamedNodeMap.item", "api.NamedNodeMap.length", "api.NamedNodeMap.removeNamedItem", "api.NamedNodeMap.removeNamedItemNS", "api.NamedNodeMap.setNamedItem", "api.NamedNodeMap.setNamedItemNS", "api.Node", "api.Node.appendChild", "api.Node.baseURI", "api.Node.childNodes", "api.Node.cloneNode", "api.Node.compareDocumentPosition", "api.Node.contains", "api.Node.firstChild", "api.Node.hasChildNodes", "api.Node.insertBe\
fore", "api.Node.isDefaultNamespace", "api.Node.isEqualNode", "api.Node.isSameNode", "api.Node.lastChild", "api.Node.lookupNamespaceURI", "api.Node.lookupPrefix", "api.Node.nextSibling", "api.Node.nodeName", "api.Node.nodeType", "api.Node.nodeValue", "api.Node.normalize", "api.Node.ownerDocument", "api.Node.parentElement", "api.Node.parentNode", "api.Node.previousSibling", "api.Node.removeChild", "api.Node.replaceChild", "api.Node.textContent", "api.NodeIterator", "api.NodeIterator.filter", "api.NodeIterator.nextNode", "api.NodeIterator.pointerBeforeReferenceNode", "api.NodeIterator.previousNode", "api.NodeIterator.referenceNode", "api.NodeIterator.root", "api.NodeIterator.whatToShow", "api.NodeList", "api.NodeList.@@iterator", "api.NodeList.entries", "api.NodeList.forEach", "api.NodeList.item", "api.NodeList.keys", "api.NodeList.length", "api.NodeList.values", "api.ProcessingInstruction", "api.ProcessingInstruction.target", "api.Text", "api.Text.Text", "api.Text.splitText", "api.Text.\
wholeText", "api.TreeWalker", "api.TreeWalker.currentNode", "api.TreeWalker.filter", "api.TreeWalker.firstChild", "api.TreeWalker.lastChild", "api.TreeWalker.nextNode", "api.TreeWalker.nextSibling", "api.TreeWalker.parentNode", "api.TreeWalker.previousNode", "api.TreeWalker.previousSibling", "api.TreeWalker.root", "api.TreeWalker.whatToShow", "api.Window.document", "api.XMLDocument"], description: "The DOM (Document Object Model) API represents HTML and XML documents as trees of nodes. You can use the API to inspect and modify the structure and content of a document.", description_html: "The DOM (Document Object Model) API represents HTML and XML documents as trees of nodes. You can use the API to inspect and modify the structure and content of a document.", group: ["dom"], kind: "feature", name: "DOM", spec: ["https://dom.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Attr": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Attr.localName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Attr.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Attr.namespaceURI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Attr.ownerElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Attr.prefix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Attr.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CDATASection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.CharacterData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1",
    firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CharacterData.after": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.CharacterData.appendData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CharacterData.before": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.CharacterData.data": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "api.CharacterData.deleteData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CharacterData.insertData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CharacterData.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CharacterData.nextElementSibling": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "\
9", safari_ios: "9" } }, "api.CharacterData.previousElementSibling": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.CharacterData.remove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "api.CharacterData.replaceData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CharacterData.replaceWith": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "\
10", safari_ios: "10" } }, "api.CharacterData.substringData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Comment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Comment.Comment": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "29", chrome_android: "29", edge: "16", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "api.DOMException": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMException\
.DOMException": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "37", firefox_android: "37", safari: "10.1", safari_ios: "10.3" } }, "api.DOMException.message": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMException.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMImplementation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMImplementation.createDocument": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMImplementation.createDocumentType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMImplementation.createHTMLDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.DOMStringList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMStringList.contains": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMStringList.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMStringList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.@@iterator": { baseline: "high", baseline_high_date: "\
2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.DOMTokenList.add": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.add.multiple_parameters": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "26", firefox_android: "26", safari: "7", safari_ios: "7" } }, "api.DOMTokenList.contains": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.entries": { baseline: "high", baseline_high_date: "\
2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "50", firefox_android: "50", safari: "10.1", safari_ios: "10.3" } }, "api.DOMTokenList.forEach": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "50", firefox_android: "50", safari: "10.1", safari_ios: "10.3" } }, "api.DOMTokenList.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.keys": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "50", firefox_android: "50", safari: "10.1", safari_ios: "10.3" } }, "api.DOMTokenList.length": { baseline: "high", baseline_high_date: "2018\
-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.remove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.remove.multiple_parameters": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "26", firefox_android: "26", safari: "7", safari_ios: "7" } }, "api.DOMTokenList.remove_duplicates": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "60", chrome_android: "60", edge: "17", firefox: "55", firefox_android: "55", safari: "10", safari_ios: "10" } }, "api.DOMTokenList.replace": { baseline: "high", baseline_high_date: "\
2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "61", chrome_android: "61", edge: "17", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.DOMTokenList.replace.boolean_value": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "67", chrome_android: "67", edge: "18", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "api.DOMTokenList.supports": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.DOMTokenList.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.toggle": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.DOMTokenList.toggle.force_parameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "24", firefox_android: "24", safari: "7", safari_ios: "7" } }, "api.DOMTokenList.trim_whitespace": { baseline: "high", baseline_high_date: "2019-07-24", baseline_low_date: "2017-01-24", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "51", firefox_android: "51", safari: "10", safari_ios: "10" } }, "api.DOMTokenList.value": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "47", firefox_android: "47", safari: "10", safari_ios: "10" } }, "api.DOMTokenList.values": { baseline: "high", baseline_high_date: "\
2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "50", firefox_android: "50", safari: "10.1", safari_ios: "10.3" } }, "api.Document": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.DOMContentLoaded_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Document.Document": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "60", chrome_android: "60", edge: "17", firefox: "20", firefox_android: "20", safari: "8", safari_ios: "8" } }, "api.Document.URL": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "3", safari_ios: "2" } }, "api.Document.activeElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.Document.adoptNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Document.append": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Document.body": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "60", firefox_android: "60", safari: "1", safari_ios: "1" } }, "api.Document.characterSet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Document.childElementCount": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.Document.children": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "29", chrome_android: "29", edge: "16", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.Document.compatMode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "\
18", edge: "12", firefox: "19", firefox_android: "19", safari: "5.1", safari_ios: "5" } }, "api.Document.contentType": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "36", chrome_android: "36", edge: "17", firefox: "1", firefox_android: "4", safari: "9", safari_ios: "9" } }, "api.Document.createAttribute": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createAttributeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createCDATASection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createComment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createDocumentFragment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createElement.options_parameter": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "50", firefox_android: "\
50", safari: "26", safari_ios: "26" } }, "api.Document.createElementNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createElementNS.options_parameter": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "50", firefox_android: "50", safari: "26", safari_ios: "26" } }, "api.Document.createNodeIterator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Document.createProcessingInstruction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "api.Document.createTextNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.createTreeWalker": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.Document.createTreeWalker.whatToShow_filter_parameters_optional": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "4", chrome_android: "18", edge: "13", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "api.Document.currentScript": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "4", firefox_android: "\
4", safari: "8", safari_ios: "8" } }, "api.Document.defaultView": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.dir": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "1", firefox_android: "4", safari: "10.1", safari_ios: "10.3" } }, "api.Document.doctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.documentElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "api.Document.documentURI": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Document.embeds": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "61", firefox_android: "61", safari: "10.1", safari_ios: "10.3" } }, "api.Document.firstElementChild": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.Document.forms": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "61", firefox_android: "61", safari: "4", safari_ios: "3.2" } }, "api.Docu\
ment.getElementById": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.getElementsByClassName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Document.getElementsByName": { baseline: "high", baseline_high_date: "2020-07-23", baseline_low_date: "2018-01-23", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "58", firefox_android: "58", safari: "4", safari_ios: "3.2" } }, "api.Document.getElementsByTagName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "a\
pi.Document.getElementsByTagNameNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.hasFocus": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "3", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.Document.head": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "61", firefox_android: "61", safari: "5", safari_ios: "4" } }, "api.Document.images": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "61", firefox_android: "61", safari: "4", safari_ios: "3.2" } }, "api.Document.implementatio\
n": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.importNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.lastElementChild": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.Document.lastModified": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Document.links": { baseline: "high", baseline_high_date: "\
2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "61", firefox_android: "61", safari: "4", safari_ios: "3.2" } }, "api.Document.plugins": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "61", firefox_android: "61", safari: "10.1", safari_ios: "10.3" } }, "api.Document.prepend": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Document.querySelector": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Document.querySelectorAll": { baseline: "high", baseline_high_date: "2018-01\
-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Document.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.readystatechange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.Document.referrer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.replaceChildren": { baseline: "high", baseline_high_date: "2023-04-20", baseline_low_date: "\
2020-10-20", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "78", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.Document.scripts": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "61", firefox_android: "61", safari: "10.1", safari_ios: "10.3" } }, "api.Document.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DocumentFragment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.DocumentFragment.DocumentFragment": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: {
    chrome: "29", chrome_android: "29", edge: "17", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "api.DocumentFragment.append": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.DocumentFragment.childElementCount": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.DocumentFragment.children": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "29", chrome_android: "29", edge: "16", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.DocumentFragment.firstElementChild": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "\
2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.DocumentFragment.getElementById": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "36", chrome_android: "36", edge: "17", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "api.DocumentFragment.lastElementChild": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "29", chrome_android: "29", edge: "17", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "api.DocumentFragment.prepend": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.DocumentFragment.querySelector": { baseline: "high", baseline_high_date: "2018-01-2\
9", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.DocumentFragment.querySelectorAll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.DocumentFragment.replaceChildren": { baseline: "high", baseline_high_date: "2023-04-20", baseline_low_date: "2020-10-20", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "78", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.DocumentType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.DocumentType.after": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "\
2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.DocumentType.before": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.DocumentType.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.DocumentType.publicId": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.DocumentType.remove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "24", chrome_android: "25", edge: "12", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "api.DocumentType.replaceWith": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.DocumentType.systemId": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Element": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.after": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "\
54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Element.append": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Element.attributes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.before": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Element.childElementCount": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "\
3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.Element.children": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.Element.classList": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "22", chrome_android: "25", edge: "16", firefox: "3.6", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.Element.className": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.clientHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
3", safari_ios: "1" } }, "api.Element.clientLeft": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Element.clientTop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Element.clientWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Element.closest": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "41", chrome_android: "41", edge: "15", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "9" } }, "api.Elemen\
t.currentCSSZoom": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "126", firefox_android: "126", safari: "26.4", safari_ios: "26.4" } }, "api.Element.firstElementChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.Element.getAttribute": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getAttributeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getAttributeNames": { baseline: "hig\
h", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "61", chrome_android: "61", edge: "18", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "api.Element.getAttributeNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getAttributeNodeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getBoundingClientRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Element.getClientRects": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Element.getElementsByClassName": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "1", chrome_android: "18", edge: "16", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Element.getElementsByTagName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getElementsByTagName.all_elements_selector": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getE\
lementsByTagNameNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.getElementsByTagNameNS.all_elements_selector": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.hasAttribute": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.hasAttributeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "\
api.Element.hasAttributes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.id": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.innerHTML": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.insertAdjacentElement": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "48", firefox_android: "48", safari: "3", safari_ios: "1" } }, "api.Element.insertAdjacentHT\
ML": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "8", firefox_android: "8", safari: "4", safari_ios: "4" } }, "api.Element.insertAdjacentText": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "48", firefox_android: "48", safari: "4", safari_ios: "4" } }, "api.Element.lastElementChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.Element.localName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.matches": { baseline: "high",
    baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "33", chrome_android: "33", edge: "15", firefox: "34", firefox_android: "34", safari: "8", safari_ios: "8" } }, "api.Element.namespaceURI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.nextElementSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.Element.outerHTML": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "1.3", safari_ios: "1" } }, "api.Element.prefix": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.prepend": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Element.previousElementSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.Element.querySelector": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Element.querySelectorAll": { baseline: "high", baseline_high_date: "2018-01\
-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Element.remove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "api.Element.removeAttribute": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.removeAttributeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.removeAttributeNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.replaceChildren": { baseline: "high", baseline_high_date: "2023-04-20", baseline_low_date: "2020-10-20", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "78", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.Element.replaceWith": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.Element.setAttribute": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.setAttributeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.setAttributeNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.setAttributeNodeNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.tagName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.toggleAttribute": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "69", chrome_android: "\
69", edge: "18", firefox: "63", firefox_android: "63", safari: "12", safari_ios: "12" } }, "api.HTMLCollection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLCollection.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLCollection.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLCollection.namedItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLElement.dir": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "\
5" } }, "api.HTMLElement.innerText": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "45", firefox_android: "45", safari: "1", safari_ios: "1" } }, "api.HTMLElement.load_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.HTMLElement.offsetHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.offsetLeft": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HT\
MLElement.offsetParent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.offsetTop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.offsetWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.outerText": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "98", firefox_android: "98", safari: "1.3", safari_ios: "1" } }, "api.NamedNodeMap": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.getNamedItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.getNamedItemNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.length": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.removeNamedItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.removeNamedItemNS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.setNamedItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.NamedNodeMap.setNamedItemNS": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "34", firefox_android: "34", safari: "1", safari_ios: "1" } }, "api.Node": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.appendChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.baseURI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "1" } }, "api.Node.childNodes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.Node.cloneNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.compareDocumentPosition": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Node.contains": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "1.1", safari_ios: "1" } }, "api.Node.firstChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.hasChildNodes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.insertBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.isDefaultNamespace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Node.isEqualNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.Node.isSameNode": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "48", firefox_android: "48", safari: "3", safari_ios: "1" } }, "api.Node.lastChild": { baseline: "high", baseline_high_date: "2018-09-08", baseline_low_date: "2016-03-08", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "45", safari: "1", safari_ios: "1" } }, "api.Node.lookupNamespaceURI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Node.lookupPrefix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } },
    "api.Node.nextSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.nodeName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.nodeType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.nodeValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.normalize": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.ownerDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.parentElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "1.1", safari_ios: "1" } }, "api.Node.parentNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.previousSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Node.removeChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.replaceChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Node.textContent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.NodeIterator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.filter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.nextNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.pointerBeforeReferenceNode": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.previousNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.referenceNode": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.root": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeIterator.whatToShow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.NodeList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.NodeList.@@iterator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "api.NodeList.entries": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "api.NodeList.forEach": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "api.NodeList.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "api.NodeList.keys": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "api.NodeList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.NodeList.values": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "api.ProcessingInstruction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Proc\
essingInstruction.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Text": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Text.Text": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "29", chrome_android: "29", edge: "16", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "api.Text.splitText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Text.wholeText": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.TreeWalker": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.currentNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.filter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.firstChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2\
015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.lastChild": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.nextNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.nextSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.parentNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.previousNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.previousSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.root": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.TreeWalker.whatToShow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.Window.document": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.XMLDocument": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "dom-geometry": { compat_features: ["api.DOMMatrix", "api.DOMMatrix.DOMMatrix", "api.DOMMatrix.a", "api.DOMMatrix.b", "api.DOMMatrix.c", "api.DOMMatrix.d", "api.DOMMatrix.e", "api.DOMMatrix.f", "api.DOMMatrix.fromFloat32Array_static", "api.DOMMatrix.fromFloat64Array_static", "api.DOMMatrix.fromMatrix_stati\
c", "api.DOMMatrix.invertSelf", "api.DOMMatrix.m11", "api.DOMMatrix.m12", "api.DOMMatrix.m13", "api.DOMMatrix.m14", "api.DOMMatrix.m21", "api.DOMMatrix.m22", "api.DOMMatrix.m23", "api.DOMMatrix.m24", "api.DOMMatrix.m31", "api.DOMMatrix.m32", "api.DOMMatrix.m33", "api.DOMMatrix.m34", "api.DOMMatrix.m41", "api.DOMMatrix.m42", "api.DOMMatrix.m43", "api.DOMMatrix.m44", "api.DOMMatrix.multiplySelf", "api.DOMMatrix.preMultiplySelf", "api.DOMMatrix.rotateAxisAngleSelf", "api.DOMMatrix.rotateFromVectorSelf", "api.DOMMatrix.rotateSelf", "api.DOMMatrix.scale3dSelf", "api.DOMMatrix.scaleSelf", "api.DOMMatrix.setMatrixValue", "api.DOMMatrix.skewXSelf", "api.DOMMatrix.skewYSelf", "api.DOMMatrix.translateSelf", "api.DOMMatrix.worker_support", "api.DOMMatrixReadOnly", "api.DOMMatrixReadOnly.DOMMatrixReadOnly", "api.DOMMatrixReadOnly.a", "api.DOMMatrixReadOnly.b", "api.DOMMatrixReadOnly.c", "api.DOMMatrixReadOnly.d", "api.DOMMatrixReadOnly.e", "api.DOMMatrixReadOnly.f", "api.DOMMatrixReadOnly.flipX", "\
api.DOMMatrixReadOnly.flipY", "api.DOMMatrixReadOnly.fromFloat32Array_static", "api.DOMMatrixReadOnly.fromFloat64Array_static", "api.DOMMatrixReadOnly.fromMatrix_static", "api.DOMMatrixReadOnly.inverse", "api.DOMMatrixReadOnly.is2D", "api.DOMMatrixReadOnly.isIdentity", "api.DOMMatrixReadOnly.m11", "api.DOMMatrixReadOnly.m12", "api.DOMMatrixReadOnly.m13", "api.DOMMatrixReadOnly.m14", "api.DOMMatrixReadOnly.m21", "api.DOMMatrixReadOnly.m22", "api.DOMMatrixReadOnly.m23", "api.DOMMatrixReadOnly.m24", "api.DOMMatrixReadOnly.m31", "api.DOMMatrixReadOnly.m32", "api.DOMMatrixReadOnly.m33", "api.DOMMatrixReadOnly.m34", "api.DOMMatrixReadOnly.m41", "api.DOMMatrixReadOnly.m42", "api.DOMMatrixReadOnly.m43", "api.DOMMatrixReadOnly.m44", "api.DOMMatrixReadOnly.multiply", "api.DOMMatrixReadOnly.rotate", "api.DOMMatrixReadOnly.rotateAxisAngle", "api.DOMMatrixReadOnly.rotateFromVector", "api.DOMMatrixReadOnly.scale", "api.DOMMatrixReadOnly.scale3d", "api.DOMMatrixReadOnly.skewX", "api.DOMMatrixReadOnly\
.skewY", "api.DOMMatrixReadOnly.toFloat32Array", "api.DOMMatrixReadOnly.toFloat64Array", "api.DOMMatrixReadOnly.toJSON", "api.DOMMatrixReadOnly.toString", "api.DOMMatrixReadOnly.transformPoint", "api.DOMMatrixReadOnly.translate", "api.DOMMatrixReadOnly.worker_support", "api.DOMPoint", "api.DOMPoint.DOMPoint", "api.DOMPoint.fromPoint_static", "api.DOMPoint.w", "api.DOMPoint.worker_support", "api.DOMPoint.x", "api.DOMPoint.y", "api.DOMPoint.z", "api.DOMPointReadOnly", "api.DOMPointReadOnly.DOMPointReadOnly", "api.DOMPointReadOnly.fromPoint_static", "api.DOMPointReadOnly.matrixTransform", "api.DOMPointReadOnly.toJSON", "api.DOMPointReadOnly.w", "api.DOMPointReadOnly.worker_support", "api.DOMPointReadOnly.x", "api.DOMPointReadOnly.y", "api.DOMPointReadOnly.z", "api.DOMQuad", "api.DOMQuad.DOMQuad", "api.DOMQuad.fromQuad_static", "api.DOMQuad.fromRect_static", "api.DOMQuad.getBounds", "api.DOMQuad.p1", "api.DOMQuad.p2", "api.DOMQuad.p3", "api.DOMQuad.p4", "api.DOMQuad.toJSON", "api.DOMQuad.w\
orker_support", "api.DOMRect", "api.DOMRect.DOMRect", "api.DOMRect.fromRect_static", "api.DOMRect.height", "api.DOMRect.width", "api.DOMRect.worker_support", "api.DOMRect.x", "api.DOMRect.y", "api.DOMRectList", "api.DOMRectList.item", "api.DOMRectList.length", "api.DOMRectReadOnly", "api.DOMRectReadOnly.DOMRectReadOnly", "api.DOMRectReadOnly.bottom", "api.DOMRectReadOnly.fromRect_static", "api.DOMRectReadOnly.height", "api.DOMRectReadOnly.left", "api.DOMRectReadOnly.right", "api.DOMRectReadOnly.toJSON", "api.DOMRectReadOnly.top", "api.DOMRectReadOnly.width", "api.DOMRectReadOnly.worker_support", "api.DOMRectReadOnly.x", "api.DOMRectReadOnly.y"], description: "The DOMMatrix, DOMPoint, DOMQuad and DOMRect APIs represent points, rectangles, quadrilaterals and transformation matrices within JavaScript. They can be used in transformations in CSS, <canvas>, and SVG.", description_html: "The <code>DOMMatrix</code>, <code>DOMPoint</code>, <code>DOMQuad</code> and <code>DOMRect</code> APIs repr\
esent points, rectangles, quadrilaterals and transformation matrices within JavaScript. They can be used in transformations in CSS, <code>&#x3C;canvas></code>, and SVG.", kind: "feature", name: "DOM Geometry", spec: ["https://drafts.csswg.org/geometry-1/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.DOMMatrix": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.DOMMatrix": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.a": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "\
61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.b": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.c": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.d": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.e": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "\
33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.f": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.fromFloat32Array_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.fromFloat64Array_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.fromMatrix_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "\
79", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.invertSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m11": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m12": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m13": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "\
11" } }, "api.DOMMatrix.m14": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m21": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m22": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m23": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m24": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m31": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m32": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m33": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m34": { baseline: "high", baseline_high_date: "2022-07-\
15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m41": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m42": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m43": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.m44": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.multiplySelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.preMultiplySelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.rotateAxisAngleSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.rotateFromVectorSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.rotateSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.scale3dSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.scaleSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.setMatrixValue": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020\
-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.skewXSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.skewYSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.translateSelf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrix.worker_support": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07\
-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.DOMMatrixReadOnly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.a": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.b": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-\
01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.c": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.d": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.e": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.f": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.flipX": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.flipY": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.fromFloat32Array_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.fromFloat64Array_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "\
2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.fromMatrix_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.inverse": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.is2D": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.isIdentity": { baseline: "high", baseline_high_date: "2022-07-15",
    baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m11": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m12": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m13": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m14": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m21": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m22": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m23": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m24": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020\
-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m31": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m32": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m33": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m34": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-\
15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m41": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m42": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m43": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.m44": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.multiply": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.rotate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.rotateAxisAngle": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.rotateFromVector": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.scale": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.scale3d": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.skewX": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.skewY": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.toFloat32Array": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.toFloat64Array": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.toJSON": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.toString": { baseline: "high", baseline_high_date: "2022-07\
-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.transformPoint": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.translate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } }, "api.DOMMatrixReadOnly.worker_support": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMPoint": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.DOMPoint": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.fromPoint_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.w": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.worker_support": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.y": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPoint.z": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.DOMPointReadOnly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.fromPoint_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.matrixTransform": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMPointReadOnly.toJSON": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.w": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.worker_support": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.y": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMPointReadOnly.z": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMQuad": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "11", safari_ios: "11" } }, "api.DOMQuad.DOMQuad": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "11", safari_ios: "11" } }, "api.DOMQuad.fromQuad_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "\
2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMQuad.fromRect_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMQuad.getBounds": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "api.DOMQuad.p1": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "11", safari_ios: "11" } }, "api.DOMQuad.p2": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "11", safari_ios: "11" } }, "api.DOMQuad.p3": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "11", safari_ios: "11" } }, "api.DOMQuad.p4": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "11", safari_ios: "11" } }, "api.DOMQuad.toJSON": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "api.DOMQuad.worker_support": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "\
79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.DOMRect": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "27", firefox_android: "27", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.DOMRect": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.fromRect_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.height": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "27",
    firefox_android: "27", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "27", firefox_android: "27", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.worker_support": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRect.y": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "\
31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectList": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "27", firefox_android: "27", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectList.item": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "27", firefox_android: "27", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectList.length": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "27", firefox_android: "27", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "\
10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.DOMRectReadOnly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.bottom": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.fromRect_static": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.height": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31",
    firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.toJSON": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.top": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "\
31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.worker_support": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.DOMRectReadOnly.y": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79",
    firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "33", firefox_android: "33", safari: "11", safari_ios: "11" } } }, "dominant-baseline": { compat_features: ["css.properties.dominant-baseline", "css.properties.dominant-baseline.alphabetic", "css.properties.dominant-baseline.auto", "css.properties.dominant-baseline.central", "css.properties.dominant-baseline.hanging", "css.properties.dominant-baseline.ideographic", "css.properties.dominant-baseline.mathematical", "css.properties.dominant-baseline.middle"], description: "The dominant-baseline CSS property sets the specific baseline used to align an elements's text and inline-level contents.", description_html: "The <code>dominant-baseline</code> CSS property sets the specific baseline used to align an elements's text and inline-level contents.", group: ["text"], kind: "feature", name: "dominant-baseline", spec: ["https://drafts.csswg.org\
/css-inline-3/#dominant-baseline-property"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.dominant-baseline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baseline.alphabetic": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baseline.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baseline.central": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baseline.hanging": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baseline.ideographic": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baseline.mathematical": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.dominant-baselin\
e.middle": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, domparser: { compat_features: ["api.DOMParser", "api.DOMParser.DOMParser", "api.DOMParser.parseFromString", "api.DOMParser.parseFromString.html", "api.DOMParser.parseFromString.xml"], description: "The DOMParser API parses XML or HTML source code from a string into a DOM Document.", description_html: "The <code>DOMParser</code> API parses XML or HTML source code from a string into a DOM Document.", group: ["parsing-and-serialization"], kind: "feature", name: "DOMParser", spec: ["https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#the-domparser-interface"], status: { baseline: "high", baseline_high_date: "2018-09-2\
1", baseline_low_date: "2016-03-21", by_compat_key: { "api.DOMParser": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.DOMParser.DOMParser": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.DOMParser.parseFromString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.DOMParser.parseFromString.html": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "12", firefox_android: "1\
4", safari: "9.1", safari_ios: "9.3" } }, "api.DOMParser.parseFromString.xml": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } } }, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "12", firefox_android: "14", safari: "9.1", safari_ios: "9.3" } } }, download: { caniuse: ["download"], compat_features: ["api.HTMLAnchorElement.download", "api.HTMLAreaElement.download", "api.SVGAElement.download", "html.elements.a.download", "html.elements.area.download", "svg.elements.a.download"], description: "The download attribute for <a> elements loads the target URL as a file to be saved, instead of navigating to it. An optional attribute value sets a default file name.", description_html: "The <code>download</code> attribute for <code>&#x3C;a></code> elements loads the target URL as a file to be saved, instead of nav\
igating to it. An optional attribute value sets a default file name.", kind: "feature", name: "download", spec: ["https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download"], status: { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", by_compat_key: { "api.HTMLAnchorElement.download": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "15", chrome_android: "18", edge: "13", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLAreaElement.download": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "54", chrome_android: "54", edge: "13", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "10.3" } }, "api.SVGAElement.download": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142", firefox: "20", firefox_android: "20" } }, "html.elements.a.download": { baseline: "\
high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "14", chrome_android: "18", edge: "18", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "13" } }, "html.elements.area.download": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "54", chrome_android: "54", edge: "12", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "10.3" } }, "svg.elements.a.download": { baseline: false, support: { firefox: "20", firefox_android: "20" } } }, support: { chrome: "14", chrome_android: "18", edge: "18", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "13" } } }, draganddrop: { caniuse: ["dragndrop"], compat_features: ["api.DataTransfer", "api.DataTransfer.DataTransfer", "api.DataTransfer.clearData", "api.DataTransfer.dropEffect", "api.DataTransfer.effectAllowed", "api.DataTransfer.files", "api.DataTransfer.getData", "api.DataTransfer.items", "api.DataTran\
sfer.setData", "api.DataTransfer.setDragImage", "api.DataTransfer.types", "api.DataTransferItem", "api.DataTransferItem.getAsFile", "api.DataTransferItem.getAsFileSystemHandle", "api.DataTransferItem.getAsString", "api.DataTransferItem.kind", "api.DataTransferItem.type", "api.DataTransferItemList", "api.DataTransferItemList.add", "api.DataTransferItemList.clear", "api.DataTransferItemList.length", "api.DataTransferItemList.remove", "api.DragEvent", "api.DragEvent.DragEvent", "api.DragEvent.dataTransfer", "api.HTMLElement.drag_event", "api.HTMLElement.dragend_event", "api.HTMLElement.dragenter_event", "api.HTMLElement.draggable", "api.HTMLElement.dragleave_event", "api.HTMLElement.dragover_event", "api.HTMLElement.dragstart_event", "api.HTMLElement.drop_event"], description: "The Drag and Drop API lets users drag and drop elements and external files such as images onto web pages. Developers can customize which elements can become draggable, the type of feedback the draggable elements pr\
oduce, and the droppable elements.", description_html: "The Drag and Drop API lets users drag and drop elements and external files such as images onto web pages. Developers can customize which elements can become draggable, the type of feedback the draggable elements produce, and the droppable elements.", kind: "feature", name: "Drag and Drop", spec: ["https://html.spec.whatwg.org/multipage/dnd.html#dnd"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.DataTransfer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DataTransfer.DataTransfer": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "59", chrome_android: "59", edge: "17", firefox: "62", firefox_android: "62", safari: "14.1", safari_ios: "\
14.5" } }, "api.DataTransfer.clearData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DataTransfer.dropEffect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DataTransfer.effectAllowed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DataTransfer.files": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.\
2" } }, "api.DataTransfer.getData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DataTransfer.items": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "52", safari: "11.1", safari_ios: "11.3" } }, "api.DataTransfer.setData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.DataTransfer.setDragImage": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "3", chrome_android: "18", edge: "18", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } },
    "api.DataTransfer.types": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.DataTransferItem": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.DataTransferItem.getAsFile": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.DataTransferItem.getAsFileSystemHandle": { baseline: false, support: { chrome: "86", chrome_android: "132", edge: "86" } }, "api.DataTransferItem.getAsString": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: {
    chrome: "11", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.DataTransferItem.kind": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.DataTransferItem.type": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.DataTransferItemList": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "13", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "6", safari_ios: "6" } }, "api.DataTransferItemList.add": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "\
13", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "6", safari_ios: "6" } }, "api.DataTransferItemList.clear": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "13", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "6", safari_ios: "6" } }, "api.DataTransferItemList.length": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "13", chrome_android: "18", edge: "12", firefox: "50", firefox_android: "50", safari: "6", safari_ios: "6" } }, "api.DataTransferItemList.remove": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "50", firefox_android: "50", safari: "6", safari_ios: "6" } }, "api.DragEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "46", chrome_android: "\
46", edge: "12", firefox: "3.5", firefox_android: "4", safari: "14", safari_ios: "14" } }, "api.DragEvent.DragEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "3.5", firefox_android: "4", safari: "14", safari_ios: "14" } }, "api.DragEvent.dataTransfer": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "3.5", firefox_android: "4", safari: "14", safari_ios: "14" } }, "api.HTMLElement.drag_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } }, "api.HTMLElement.dragend_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } }, "api.HTMLElement.dragenter_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } }, "api.HTMLElement.draggable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLElement.dragleave_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } }, "api.HTMLElement.dragover_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } }, "api.HTMLElement.dragstart_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } }, "api.HTMLElement.drop_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "dynamic-range": { compat_features: ["css.at-rules.media.dynamic-range"], description: "The dynamic-range CSS media query sets styles based on whether a device can display at least standard range colors or at least high range colors. Non-visual devices will match neither.", description_html: "\
The <code>dynamic-range</code> CSS media query sets styles based on whether a device can display at least <code>standard</code> range colors or at least <code>high</code> range colors. Non-visual devices will match neither.", group: ["media-queries"], kind: "feature", name: "dynamic-range media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#dynamic-range"], status: { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", by_compat_key: { "css.at-rules.media.dynamic-range": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "100", firefox_android: "100", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "100", firefox_android: "100", safari: "13.1", safari_ios: "13.4" } } }, "dynamic-range-limit": { compat_features: ["css.properties.dynamic-range-limit", "css.properties.dynamic-range-li\
mit.constrained", "css.properties.dynamic-range-limit.dynamic-range-limit-mix_values", "css.properties.dynamic-range-limit.no-limit", "css.properties.dynamic-range-limit.standard", "css.types.dynamic-range-limit-mix"], description: "The dynamic-range-limit CSS property controls the peak luminance of high dynamic range content. You can use this to coordinate the apparent brightness of HDR and SDR content.", description_html: "The <code>dynamic-range-limit</code> CSS property controls the peak luminance of high dynamic range content. You can use this to coordinate the apparent brightness of HDR and SDR content.", group: ["css"], kind: "feature", name: "dynamic-range-limit", spec: ["https://drafts.csswg.org/css-color-hdr-1/#controlling-dynamic-range"], status: { baseline: false, by_compat_key: { "css.properties.dynamic-range-limit": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136", safari: "26", safari_ios: "26" } }, "css.properties.dynamic-range-limit.const\
rained": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136" } }, "css.properties.dynamic-range-limit.dynamic-range-limit-mix_values": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136" } }, "css.properties.dynamic-range-limit.no-limit": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136", safari: "26", safari_ios: "26" } }, "css.properties.dynamic-range-limit.standard": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136", safari: "26", safari_ios: "26" } }, "css.types.dynamic-range-limit-mix": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136" } } }, support: { chrome: "136", chrome_android: "136", edge: "136" } } }, "early-data": { compat_features: ["http.headers.Early-Data", "http.status.425"], description: "TLS 1.3 sessions may be resumed more quickly by sending so-called early data to servers before the TLS handshake has finished. Also known\
 as zero round-trip time resumption or 0-RTT.", description_html: "TLS 1.3 sessions may be resumed more quickly by sending so-called early data to servers before the TLS handshake has finished. Also known as zero round-trip time resumption or 0-RTT.", kind: "feature", name: "Early data", spec: ["https://httpwg.org/specs/rfc8470.html"], status: { baseline: false, by_compat_key: { "http.headers.Early-Data": { baseline: false, support: { firefox: "58", firefox_android: "58" } }, "http.status.425": { baseline: false, support: { firefox: "58", firefox_android: "58" } } }, support: { firefox: "58", firefox_android: "58" } } }, "edit-context": { compat_features: ["api.CharacterBoundsUpdateEvent", "api.CharacterBoundsUpdateEvent.CharacterBoundsUpdateEvent", "api.CharacterBoundsUpdateEvent.rangeEnd", "api.CharacterBoundsUpdateEvent.rangeStart", "api.EditContext", "api.EditContext.EditContext", "api.EditContext.attachedElements", "api.EditContext.characterBounds", "api.EditContext.characterBound\
sRangeStart", "api.EditContext.characterboundsupdate_event", "api.EditContext.compositionend_event", "api.EditContext.compositionstart_event", "api.EditContext.selectionEnd", "api.EditContext.selectionStart", "api.EditContext.text", "api.EditContext.textformatupdate_event", "api.EditContext.textupdate_event", "api.EditContext.updateCharacterBounds", "api.EditContext.updateControlBounds", "api.EditContext.updateSelection", "api.EditContext.updateSelectionBounds", "api.EditContext.updateText", "api.HTMLElement.editContext", "api.TextFormat", "api.TextFormat.TextFormat", "api.TextFormat.rangeEnd", "api.TextFormat.rangeStart", "api.TextFormat.underlineStyle", "api.TextFormat.underlineThickness", "api.TextFormatUpdateEvent", "api.TextFormatUpdateEvent.TextFormatUpdateEvent", "api.TextFormatUpdateEvent.getTextFormats", "api.TextUpdateEvent", "api.TextUpdateEvent.TextUpdateEvent", "api.TextUpdateEvent.selectionEnd", "api.TextUpdateEvent.selectionStart", "api.TextUpdateEvent.text", "api.TextUp\
dateEvent.updateRangeEnd", "api.TextUpdateEvent.updateRangeStart"], description: "The EditContext API allows you to build rich text editors that support advanced text input, such as Input Method Editor (IME) composition, an emoji picker, or other platform-specific editing UI.", description_html: "The <code>EditContext</code> API allows you to build rich text editors that support advanced text input, such as Input Method Editor (IME) composition, an emoji picker, or other platform-specific editing UI.", kind: "feature", name: "EditContext", spec: ["https://w3c.github.io/edit-context/"], status: { baseline: false, by_compat_key: { "api.CharacterBoundsUpdateEvent": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.CharacterBoundsUpdateEvent.CharacterBoundsUpdateEvent": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.CharacterBoundsUpdateEvent.rangeEnd": { baseline: false, support: { chrome: "121", chrome_android: "\
121", edge: "121" } }, "api.CharacterBoundsUpdateEvent.rangeStart": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.EditContext": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.attachedElements": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.characterBounds": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.characterBoundsRangeStart": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.characterboundsupdate_event": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.compositionend_event": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } },
    "api.EditContext.compositionstart_event": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.selectionEnd": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.selectionStart": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.text": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.textformatupdate_event": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.textupdate_event": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.updateCharacterBounds": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.updateControlBounds": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.updateSel\
ection": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.updateSelectionBounds": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.EditContext.updateText": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.HTMLElement.editContext": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormat": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormat.TextFormat": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormat.rangeEnd": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormat.rangeStart": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormat.underlineStyle": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "\
121" } }, "api.TextFormat.underlineThickness": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormatUpdateEvent": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormatUpdateEvent.TextFormatUpdateEvent": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextFormatUpdateEvent.getTextFormats": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpdateEvent": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpdateEvent.TextUpdateEvent": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpdateEvent.selectionEnd": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpdateEvent.selectionStart": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpda\
teEvent.text": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpdateEvent.updateRangeEnd": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "api.TextUpdateEvent.updateRangeStart": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } } }, support: { chrome: "121", chrome_android: "121", edge: "121" } } }, element: { caniuse: ["css-element-function"], compat_features: ["css.properties.background-image.element", "css.types.image.element"], description: "The element() CSS function creates a live-updating image from an HTML element that can be used as an image or background image.", description_html: "The <code>element()</code> CSS function creates a live-updating image from an HTML element that can be used as an image or background image.", kind: "feature", name: "element()", spec: ["https://drafts.csswg.org/css-images-4/#element-notation"], status: { baseline: false, by_compat_key: {
    "css.properties.background-image.element": { baseline: false, support: {} }, "css.types.image.element": { baseline: false, support: {} } }, support: {} } }, "element-capture": { compat_features: ["api.BrowserCaptureMediaStreamTrack.restrictTo", "api.RestrictionTarget", "api.RestrictionTarget.fromElement_static"], description: "The restrictTo() method on screen capture media tracks limits capture to a specific element, excluding content which might occlude the element itself, such as video conferencing controls.", description_html: "The <code>restrictTo()</code> method on screen capture media tracks limits capture to a specific element, excluding content which might occlude the element itself, such as video conferencing controls.", kind: "feature", name: "Element capture", spec: ["https://screen-share.github.io/element-capture/"], status: { baseline: false, by_compat_key: { "api.BrowserCaptureMediaStreamTrack.restrictTo": { baseline: false, support: { chrome: "132", edge: "132" } },
    "api.RestrictionTarget": { baseline: false, support: { chrome: "132", edge: "132" } }, "api.RestrictionTarget.fromElement_static": { baseline: false, support: { chrome: "132", edge: "132" } } }, support: { chrome: "132", edge: "132" } } }, "element-from-point": { caniuse: ["element-from-point"], compat_features: ["api.Document.elementFromPoint", "api.Document.elementsFromPoint"], description: "The document.elementFromPoint() and document.elementsFromPoint() methods find the top-most element at a given point in the viewport, or all elements at a given point in the viewport, respectively.", description_html: "The <code>document.elementFromPoint()</code> and <code>document.elementsFromPoint()</code> methods find the top-most element at a given point in the viewport, or all elements at a given point in the viewport, respectively.", kind: "feature", name: "document.elementFromPoint() and document.elementsFromPoint()", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-document-elementfr\
ompoint", "https://drafts.csswg.org/cssom-view-1/#dom-document-elementsfrompoint"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Document.elementFromPoint": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Document.elementsFromPoint": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "11.1", safari_ios: "11.3" } } }, "element-timing": { compat_features: ["api.Element.elementTiming", "api.PerformanceElementTiming", "api.PerformanceElementTiming.element", "api.Performance\
ElementTiming.id", "api.PerformanceElementTiming.identifier", "api.PerformanceElementTiming.intersectionRect", "api.PerformanceElementTiming.loadTime", "api.PerformanceElementTiming.naturalHeight", "api.PerformanceElementTiming.naturalWidth", "api.PerformanceElementTiming.renderTime", "api.PerformanceElementTiming.toJSON", "api.PerformanceElementTiming.url"], description: "The element performance entry and the PerformanceElementTiming API measures the time to render elements that have the elementtiming attribute.", description_html: "The <code>element</code> performance entry and the <code>PerformanceElementTiming</code> API measures the time to render elements that have the <code>elementtiming</code> attribute.", group: ["performance"], kind: "feature", name: "Element timing", spec: ["https://w3c.github.io/element-timing/"], status: { baseline: false, by_compat_key: { "api.Element.elementTiming": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.Pe\
rformanceElementTiming": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.element": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.id": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.identifier": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.intersectionRect": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.loadTime": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.naturalHeight": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.naturalWidth": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElem\
entTiming.renderTime": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.toJSON": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.PerformanceElementTiming.url": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } } }, support: { chrome: "77", chrome_android: "77", edge: "79" } } }, em: { compat_features: ["html.elements.em"], description: "The <em> HTML element emphasizes or stresses the content, styling text as italic by default.", description_html: "The <code>&#x3C;em></code> HTML element emphasizes or stresses the content, styling text as italic by default.", group: ["html-elements"], kind: "feature", name: "<em>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-em-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.em": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "em-unit": { compat_features: ["css.types.length.em"], description: "The em CSS length unit is a font-relative length equal to the specified font size. In an element with a 2 inch font, 1em equals 2 inches.", description_html: "The <code>em</code> CSS length unit is a font-relative length equal to the specified font size. In an element with a 2 inch font, <code>1em</code> equals 2 inches.", group: ["units"], kind: "feature", name: "em unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.length.em": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, embed: { compat_features: ["api.HTMLEmbedElement", "api.HTMLEmbedElement.getSVGDocument", "api.HTMLEmbedElement.height", "api.HTMLEmbedElement.src", "api.HTMLEmbedElement.type", "api.HTMLEmbedElement.width", "html.elements.embed", "html.elements.embed.height", "html.elements.embed.src", "html.elements.embed.type", "html.elements.embed.width"], description: "The <embed> element represents an external resource such as a PDF or SVG document. It was historically used for plugins such as Shockwave Flash.", description_html: "The <code>&#x3C;embed></code> element represents an external resource such as a PDF or SVG document. It was historically used for plugins such as Shockwave Flash.", group: [
    "html-elements"], kind: "feature", name: "<embed>", spec: ["https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element", "https://html.spec.whatwg.org/multipage/obsolete.html#noembed"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.HTMLEmbedElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLEmbedElement.getSVGDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLEmbedElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLEmbedElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLEmbedElement.type": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLEmbedElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.embed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
≤4", safari_ios: "≤3.2" } }, "html.elements.embed.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.embed.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.embed.type": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.embed.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, empty: { compat_features: ["css.selectors.empty", "css.selectors.empty.matches_whitespace"], description: "The :empty CSS pseudo-class matches elements without child elements.", description_html: "The <code>:empty</code> CSS pseudo-class matches elements without child elements.", group: ["selectors"], kind: "feature", name: ":empty", spec: ["https://drafts.csswg.org/selectors-4/#the-empty-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.empty": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.empty.matches_whitespace": { baseline: false, support: {} } },
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "encrypted-media-extensions": { caniuse: ["eme"], compat_features: ["api.HTMLMediaElement.encrypted_event", "api.HTMLMediaElement.mediaKeys", "api.HTMLMediaElement.setMediaKeys", "api.HTMLMediaElement.waitingforkey_event", "api.MediaCapabilities.decodingInfo.configuration_keySystemConfiguration_parameter", "api.MediaEncryptedEvent", "api.MediaEncryptedEvent.MediaEncryptedEvent", "api.MediaEncryptedEvent.initData", "api.MediaEncryptedEvent.initDataType", "api.MediaKeyMessageEvent", "api.MediaKeyMessageEvent.MediaKeyMessageEvent", "api.MediaKeyMessageEvent.message", "api.MediaKeyMessageEvent.messageType", "api.MediaKeySession", "api.MediaKeySession.close", "api.MediaKeySession.closed", "api.MediaKeySession.expiration", "api.MediaKeySession.generateRequest", "api.MediaKeySession.keyStatuses", "api.MediaKeySession.keystatuseschange_event", "api.MediaKeySes\
sion.load", "api.MediaKeySession.message_event", "api.MediaKeySession.remove", "api.MediaKeySession.sessionId", "api.MediaKeySession.update", "api.MediaKeyStatusMap", "api.MediaKeyStatusMap.@@iterator", "api.MediaKeyStatusMap.entries", "api.MediaKeyStatusMap.forEach", "api.MediaKeyStatusMap.get", "api.MediaKeyStatusMap.has", "api.MediaKeyStatusMap.keys", "api.MediaKeyStatusMap.size", "api.MediaKeyStatusMap.values", "api.MediaKeySystemAccess", "api.MediaKeySystemAccess.createMediaKeys", "api.MediaKeySystemAccess.getConfiguration", "api.MediaKeySystemAccess.keySystem", "api.MediaKeys", "api.MediaKeys.createSession", "api.MediaKeys.getStatusForPolicy", "api.MediaKeys.setServerCertificate", "api.Navigator.requestMediaKeySystemAccess", "html.elements.iframe.allow.encrypted-media", "http.headers.Permissions-Policy.encrypted-media"], description: "The mediaKeys property of HTMLMediaElement and the navigator.requestMediaKeySystemAccess() method control the playback of content subject to digita\
l rights management. Also known as EME.", description_html: "The <code>mediaKeys</code> property of <code>HTMLMediaElement</code> and the <code>navigator.requestMediaKeySystemAccess()</code> method control the playback of content subject to digital rights management. Also known as EME.", kind: "feature", name: "Encrypted media extensions", spec: ["https://w3c.github.io/encrypted-media/"], status: { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", by_compat_key: { "api.HTMLMediaElement.encrypted_event": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.HTMLMediaElement.mediaKeys": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1",
    safari_ios: "12.2" } }, "api.HTMLMediaElement.setMediaKeys": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.HTMLMediaElement.waitingforkey_event": { baseline: "low", baseline_low_date: "2024-11-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "133", firefox_android: "133", safari: "12.1", safari_ios: "12.2" } }, "api.MediaCapabilities.decodingInfo.configuration_keySystemConfiguration_parameter": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "129", firefox_android: "129" } }, "api.MediaEncryptedEvent": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaEncrypte\
dEvent.MediaEncryptedEvent": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaEncryptedEvent.initData": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaEncryptedEvent.initDataType": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyMessageEvent": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12\
.1", safari_ios: "12.2" } }, "api.MediaKeyMessageEvent.MediaKeyMessageEvent": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyMessageEvent.message": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyMessageEvent.messageType": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "\
38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.close": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.closed": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.expiration": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.generateRequest": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "\
42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.keyStatuses": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.keystatuseschange_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.load": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.message_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.remove": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.sessionId": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySession.update": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "\
2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.@@iterator": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "45", firefox_android: "45", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.entries": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.forEach": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "47", firefox_android: "47", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.get": { baseline: "high", baseline_high_date: "2021-0\
9-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.has": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "45", firefox_android: "45", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.keys": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.size": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeyStatusMap.values": { baseline: "high", baseline_high_date: "\
2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySystemAccess": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySystemAccess.createMediaKeys": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySystemAccess.getConfiguration": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "43", firefox_android: "43", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeySystemAccess.ke\
ySystem": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeys": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeys.createSession": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.MediaKeys.getStatusForPolicy": { baseline: false, support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "128", firefox_android: "128" } }, "api.MediaKeys.setServerCertificate": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "\
2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "api.Navigator.requestMediaKeySystemAccess": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } }, "html.elements.iframe.allow.encrypted-media": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "74", firefox_android: "79" } }, "http.headers.Permissions-Policy.encrypted-media": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "38", firefox_android: "38", safari: "12.1", safari_ios: "12.2" } } }, enterkeyhint: { compat_features: ["api.HTMLElement.enterKeyHint", "html.global_attributes.enterkeyhint"], description: `The enterkeyhint glob\
al HTML attribute sets the label for a virtual keyboard's Enter key. For example, enterkeyhint="search" may label the key with a magnifying glass icon.`, description_html: `The <code>enterkeyhint</code> global HTML attribute sets the label for a virtual keyboard's Enter key. For example, <code>enterkeyhint="search"</code> may label the key with a magnifying glass icon.`, kind: "feature", name: "enterkeyhint", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#input-modalities:-the-enterkeyhint-attribute"], status: { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", by_compat_key: { "api.HTMLElement.enterKeyHint": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "94", firefox_android: "94", safari: "13.1", safari_ios: "13.4" } }, "html.global_attributes.enterkeyhint": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "\
2021-11-02", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "94", firefox_android: "94", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "94", firefox_android: "94", safari: "13.1", safari_ios: "13.4" } } }, "error-cause": { compat_features: ["javascript.builtins.Error.Error.options_cause_parameter", "javascript.builtins.Error.cause"], description: "The cause property of errors records the specific original cause of the error, particularly for errors that have been re-thrown.", description_html: "The <code>cause</code> property of errors records the specific original cause of the error, particularly for errors that have been re-thrown.", group: ["javascript"], kind: "feature", name: "Error cause", spec: ["https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-installerrorcause"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "javas\
cript.builtins.Error.Error.options_cause_parameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "91", firefox_android: "91", safari: "15", safari_ios: "15" } }, "javascript.builtins.Error.cause": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "91", firefox_android: "91", safari: "15", safari_ios: "15" } } }, support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "91", firefox_android: "91", safari: "15", safari_ios: "15" } } }, "escape-unescape": { compat_features: ["javascript.builtins.escape", "javascript.builtins.unescape"], description: "The escape() and unescape() built-in Javascript methods encode and unencode strings using percent encoding, where certain characters are replaced by hexadecimal escape sequences.", description_html: "The <code>escape()<\
/code> and <code>unescape()</code> built-in Javascript methods encode and unencode strings using percent encoding, where certain characters are replaced by hexadecimal escape sequences.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers"], reason: 'TC39 included the escape() and unescape() methods in Annex B of the ECMAScript specification, which covers JavaScript features with "one or more undesirable characteristics and in the absence of legacy usage would be removed."', reason_html: 'TC39 included the <code>escape()</code> and <code>unescape()</code> methods in Annex B of the ECMAScript specification, which covers JavaScript features with "one or more undesirable characteristics and in the absence of legacy usage would be removed."' }, group: ["javascript"], kind: "feature", name: "escape() and unescape()", spec: ["https://tc39.es/ecma262/multipage/additional-ecma\
script-features-for-web-browsers.html#sec-escape-string"], status: { baseline: false, by_compat_key: { "javascript.builtins.escape": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.unescape": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "event-timing": { compat_features: ["api.EventCounts", "api.EventCounts.@@iterator", "api.EventCounts.entries", "api.EventCounts.forEach", "api.EventCounts.get", "api.EventCounts.has", "api.EventCounts.keys", "api.EventCounts.size", "api.EventCounts.values", "api.Performance.eventCounts", "api.PerformanceEventTiming", "api.PerformanceEventTiming.cancelable", "api.PerformanceEventTiming.interactionId", "api\
.PerformanceEventTiming.processingEnd", "api.PerformanceEventTiming.processingStart", "api.PerformanceEventTiming.target", "api.PerformanceEventTiming.toJSON"], description: "The event and first-input performance entries and the PerformanceEventTiming API measures the latency of user input events, such as mouse clicks or keypresses. They're used to calculate Interaction to Next Paint (INP), a common metric for perceived responsiveness.", description_html: "The <code>event</code> and <code>first-input</code> performance entries and the <code>PerformanceEventTiming</code> API measures the latency of user input events, such as mouse clicks or keypresses. They're used to calculate Interaction to Next Paint (INP), a common metric for perceived responsiveness.", group: ["performance"], kind: "feature", name: "Event timing", spec: ["https://w3c.github.io/event-timing/"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "api.EventCounts": { baseline: "low", baseline_low_date: "\
2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.@@iterator": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.entries": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.forEach": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.get": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "\
26.2" } }, "api.EventCounts.has": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.keys": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.size": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.EventCounts.values": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.Performance.eventCounts": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "\
85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.PerformanceEventTiming": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.PerformanceEventTiming.cancelable": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.PerformanceEventTiming.interactionId": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "api.PerformanceEventTiming.processingEnd": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "\
api.PerformanceEventTiming.processingStart": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.PerformanceEventTiming.target": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } }, "api.PerformanceEventTiming.toJSON": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "89", firefox_android: "89", safari: "26.2", safari_ios: "26.2" } } }, events: { caniuse: ["addeventlistener"], compat_features: ["api.CustomEvent", "api.CustomEvent.CustomEvent", "api.CustomEvent.detail", "api.CustomEvent.worker_support", "api\
.Event", "api.Event.Event", "api.Event.bubbles", "api.Event.cancelable", "api.Event.currentTarget", "api.Event.defaultPrevented", "api.Event.eventPhase", "api.Event.isTrusted", "api.Event.preventDefault", "api.Event.stopImmediatePropagation", "api.Event.stopPropagation", "api.Event.target", "api.Event.timeStamp", "api.Event.type", "api.EventTarget", "api.EventTarget.EventTarget", "api.EventTarget.addEventListener", "api.EventTarget.addEventListener.options_parameter", "api.EventTarget.addEventListener.options_parameter.options_capture_parameter", "api.EventTarget.addEventListener.options_parameter.options_once_parameter", "api.EventTarget.addEventListener.options_parameter.options_passive_parameter", "api.EventTarget.addEventListener.options_parameter.options_passive_parameter_default_true_touch", "api.EventTarget.addEventListener.options_parameter.options_passive_parameter_default_true_wheel", "api.EventTarget.addEventListener.options_parameter.options_signal_parameter", "api.EventTar\
get.addEventListener.useCapture_parameter_optional", "api.EventTarget.dispatchEvent", "api.EventTarget.removeEventListener", "api.EventTarget.removeEventListener.options_parameter", "api.EventTarget.removeEventListener.useCapture_parameter_optional"], description: "The Event API and the addEventListener() method on objects that receive events (event targets) represent and handle significant things happening on a page. Many APIs fire events for a wide range of situations relating to those APIs, such as an image loading, a user clicking, or a value changing.", description_html: "The <code>Event</code> API and the <code>addEventListener()</code> method on objects that receive events (event targets) represent and handle significant things happening on a page. Many APIs fire events for a wide range of situations relating to those APIs, such as an image loading, a user clicking, or a value changing.", kind: "feature", name: "Events", spec: ["https://html.spec.whatwg.org/multipage/indices.htm\
l#events-2", "https://dom.spec.whatwg.org/#interface-customevent", "https://dom.spec.whatwg.org/#interface-eventtarget"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.CustomEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5", safari_ios: "5" } }, "api.CustomEvent.CustomEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.CustomEvent.detail": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5", safari_ios: "5" } }, "api.CustomEvent.worker_support": { baseline: "\
high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "43", chrome_android: "43", edge: "17", firefox: "48", firefox_android: "48", safari: "12", safari_ios: "12" } }, "api.Event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.Event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.Event.bubbles": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.cancelable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.currentTarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.defaultPrevented": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5", safari_ios: "5" } }, "api.Event.eventPhase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.isTrusted": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "\
46", chrome_android: "46", edge: "12", firefox: "1.5", firefox_android: "4", safari: "10", safari_ios: "10" } }, "api.Event.preventDefault": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.stopImmediatePropagation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "5", safari_ios: "5" } }, "api.Event.stopPropagation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.timeStamp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Event.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.EventTarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.EventTarget.EventTarget": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "59", firefox_android: "\
59", safari: "14", safari_ios: "14" } }, "api.EventTarget.addEventListener": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.EventTarget.addEventListener.options_parameter": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "49", chrome_android: "49", edge: "16", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.EventTarget.addEventListener.options_parameter.options_capture_parameter": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "49", chrome_android: "49", edge: "16", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.EventTarget.addEventListener.options_parameter.options_once_parameter": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "\
2017-10-17", support: { chrome: "55", chrome_android: "55", edge: "16", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "api.EventTarget.addEventListener.options_parameter.options_passive_parameter": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "51", chrome_android: "51", edge: "16", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.EventTarget.addEventListener.options_parameter.options_passive_parameter_default_true_touch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "61", firefox_android: "61", safari: "11.1", safari_ios: "11.3" } }, "api.EventTarget.addEventListener.options_parameter.options_passive_parameter_default_true_wheel": { baseline: false, support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "84", firefox_android: "84" } }, "api.EventTa\
rget.addEventListener.options_parameter.options_signal_parameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "86", firefox_android: "86", safari: "15", safari_ios: "15" } }, "api.EventTarget.addEventListener.useCapture_parameter_optional": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1", safari_ios: "1" } }, "api.EventTarget.dispatchEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.EventTarget.removeEventListener": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.EventTarget.removeEventListener.options_parameter": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "49", chrome_android: "49", edge: "16", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.EventTarget.removeEventListener.useCapture_parameter_optional": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, ex: { compat_features: ["css.types.length.ex"], description: "The ex CSS length unit is a font-relative length equal to the used x-height of the first available font. X-height is often equal to the height of the lowercase x.", description_html: "\
The <code>ex</code> CSS length unit is a font-relative length equal to the used x-height of the first available font. X-height is often equal to the height of the lowercase x.", group: ["units"], kind: "feature", name: "ex unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.length.ex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, execcommand: { compat_features: ["api.Document.execCommand", "api.Document.execCommand.copy", "api.Document.execCommand.cut", "api.Document.execCommand.defaultParagraphSeparator", "api.Document.execCommand.insertBrOn\
Return", "api.Document.queryCommandEnabled", "api.Document.queryCommandIndeterm", "api.Document.queryCommandState", "api.Document.queryCommandSupported", "api.Document.queryCommandValue"], description: "The execCommand() method reads and writes from the clipboard and performs editing commands on editable text, such as changing the font name or style. Related methods check whether commands are supported, enabled, or applied.", description_html: "The <code>execCommand()</code> method reads and writes from the clipboard and performs editing commands on editable text, such as changing the font name or style. Related methods check whether commands are supported, enabled, or applied.", discouraged: { according_to: ["https://w3c.github.io/editing/docs/execCommand/"], alternatives: ["async-clipboard", "contenteditable"], reason: 'The execCommand() method is "not implemented consistently or fully by user agents, and it is not expected that this will change in the foreseeable future."', reason_html: '\
The <code>execCommand()</code> method is "not implemented consistently or fully by user agents, and it is not expected that this will change in the foreseeable future."' }, group: ["clipboard"], kind: "feature", name: "execCommand()", spec: ["https://w3c.github.io/editing/docs/execCommand/"], status: { baseline: false, by_compat_key: { "api.Document.execCommand": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "79", safari: "1.3", safari_ios: "1" } }, "api.Document.execCommand.copy": { baseline: false, support: { chrome: "42", chrome_android: "42", edge: "12", firefox: "69", firefox_android: "79", safari: "10", safari_ios: "10" } }, "api.Document.execCommand.cut": { baseline: false, support: { chrome: "42", chrome_android: "42", edge: "12", firefox: "69", firefox_android: "79", safari: "10", safari_ios: "10" } }, "api.Document.execCommand.defaultParagraphSeparator": { baseline: false, support: { firefox: "69", firefox_android: "\
79" } }, "api.Document.execCommand.insertBrOnReturn": { baseline: false, support: { firefox: "69", firefox_android: "79" } }, "api.Document.queryCommandEnabled": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "79", safari: "2", safari_ios: "1" } }, "api.Document.queryCommandIndeterm": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "79", safari: "2", safari_ios: "1" } }, "api.Document.queryCommandState": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "79", safari: "2", safari_ios: "1" } }, "api.Document.queryCommandSupported": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "79", safari: "2", safari_ios: "1" } }, "api.Document.queryCommandValue": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "\
79", safari: "2", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "69", firefox_android: "79", safari: "1.3", safari_ios: "1" } } }, "exp-functions": { compat_features: ["css.types.exp", "css.types.hypot", "css.types.log", "css.types.pow", "css.types.sqrt"], description: "The pow(), sqrt(), hypot(), log(), and exp() CSS functions compute various exponential functions.", description_html: "The <code>pow()</code>, <code>sqrt()</code>, <code>hypot()</code>, <code>log()</code>, and <code>exp()</code> CSS functions compute various exponential functions.", group: ["css"], kind: "feature", name: "pow(), sqrt(), hypot(), log(), and exp()", spec: ["https://drafts.csswg.org/css-values-4/#exponent-funcs"], status: { baseline: "low", baseline_low_date: "2023-12-07", by_compat_key: { "css.types.exp": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "118", firefox_android: "118", safari: "\
15.4", safari_ios: "15.4" } }, "css.types.hypot": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.log": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.pow": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.sqrt": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "\
15.4" } } }, "explicit-resource-management": { compat_features: ["javascript.builtins.AsyncDisposableStack", "javascript.builtins.AsyncDisposableStack.@@asyncDispose", "javascript.builtins.AsyncDisposableStack.AsyncDisposableStack", "javascript.builtins.AsyncDisposableStack.adopt", "javascript.builtins.AsyncDisposableStack.defer", "javascript.builtins.AsyncDisposableStack.disposeAsync", "javascript.builtins.AsyncDisposableStack.disposed", "javascript.builtins.AsyncDisposableStack.move", "javascript.builtins.AsyncDisposableStack.use", "javascript.builtins.AsyncIterator.@@asyncDispose", "javascript.builtins.DisposableStack", "javascript.builtins.DisposableStack.@@dispose", "javascript.builtins.DisposableStack.DisposableStack", "javascript.builtins.DisposableStack.adopt", "javascript.builtins.DisposableStack.defer", "javascript.builtins.DisposableStack.dispose", "javascript.builtins.DisposableStack.disposed", "javascript.builtins.DisposableStack.move", "javascript.builtins.DisposableStack\
.use", "javascript.builtins.Iterator.@@dispose", "javascript.builtins.SuppressedError", "javascript.builtins.SuppressedError.SuppressedError", "javascript.builtins.SuppressedError.error", "javascript.builtins.SuppressedError.suppressed", "javascript.builtins.Symbol.asyncDispose", "javascript.builtins.Symbol.dispose", "javascript.statements.await_using", "javascript.statements.using"], description: "The using and await using declarations and the dispose and asyncDispose symbols manage the lifecycle of resources such as file handles and streams. The DisposableStack and AsyncDisposableStack objects can group, dispose, and coordinate dependencies between multiple disposable resources.", description_html: "The <code>using</code> and <code>await using</code> declarations and the <code>dispose</code> and <code>asyncDispose</code> symbols manage the lifecycle of resources such as file handles and streams. The <code>DisposableStack</code> and <code>AsyncDisposableStack</code> objects can group,\
 dispose, and coordinate dependencies between multiple disposable resources.", kind: "feature", name: "Explicit resource management", spec: ["https://tc39.es/proposal-async-explicit-resource-management/"], status: { baseline: false, by_compat_key: { "javascript.builtins.AsyncDisposableStack": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.@@asyncDispose": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.AsyncDisposableStack": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.adopt": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDispos\
ableStack.defer": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.disposeAsync": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.disposed": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.move": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncDisposableStack.use": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.AsyncIterator.@@asyncDispose": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "\
141" } }, "javascript.builtins.DisposableStack": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.@@dispose": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.DisposableStack": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.adopt": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.defer": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.dispose": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "\
141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.disposed": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.move": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.DisposableStack.use": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.Iterator.@@dispose": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.SuppressedError": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.SuppressedError.SuppressedError": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "\
134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.SuppressedError.error": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.SuppressedError.suppressed": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.builtins.Symbol.asyncDispose": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "141", firefox_android: "141" } }, "javascript.builtins.Symbol.dispose": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "141", firefox_android: "141" } }, "javascript.statements.await_using": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } }, "javascript.statements.using": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "\
141", firefox_android: "141" } } }, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "141", firefox_android: "141" } } }, exponentiation: { compat_features: ["javascript.operators.exponentiation", "javascript.operators.exponentiation_assignment"], description: "The exponentiation (**) operator returns the result of raising the first operand to the power of the second operand.", description_html: "The exponentiation (<code>**</code>) operator returns the result of raising the first operand to the power of the second operand.", group: ["javascript"], kind: "feature", name: "Exponentiation operator", snapshot: ["ecmascript-2016"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-exp-operator"], status: { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", by_compat_key: { "javascript.operators.exponentiation": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: {
    chrome: "52", chrome_android: "52", edge: "14", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "javascript.operators.exponentiation_assignment": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "52", chrome_android: "52", edge: "14", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "52", chrome_android: "52", edge: "14", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, "ext-blend-minmax": { compat_features: ["api.EXT_blend_minmax"], description: "The EXT_blend_minmax extension for WebGL 1.0 contexts adds two blend equations, the minimum and maximum color components of the source and destination colors.", description_html: "The <code>EXT_blend_minmax</code> extension for WebGL 1.0 contexts adds two blend equations, the minimum and maximum color components of the source and destination colors.", group: ["webgl-extensi\
ons"], kind: "feature", name: "EXT_blend_minmax WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_blend_minmax/"], status: { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", by_compat_key: { "api.EXT_blend_minmax": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "38", chrome_android: "38", edge: "17", firefox: "47", firefox_android: "35", safari: "9", safari_ios: "9" } } }, support: { chrome: "38", chrome_android: "38", edge: "17", firefox: "47", firefox_android: "35", safari: "9", safari_ios: "9" } } }, "ext-color-buffer-float": { compat_features: ["api.EXT_color_buffer_float"], description: "The EXT_color_buffer_float extension for WebGL 2.0 contexts adds color-renderable floating point formats to renderbufferStorage().", description_html: "The <code>EXT_color_buffer_float</code> extension for WebGL 2.0 contexts adds color-renderable floating point formats to <code>\
renderbufferStorage()</code>.", group: ["webgl-extensions"], kind: "feature", name: "EXT_color_buffer_float WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_color_buffer_float/"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "api.EXT_color_buffer_float": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } } }, support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } } }, "ext-color-buffer-half-float": { compat_features: ["api.EXT_color_buffer_half_float"], description: "The EXT_color_buffer_half_float extension for WebGL 1.0 and 2.0 contexts renders 16-bit floating-point color buffers.", description_html: "The <code>EXT_color_buffer_half_float</code> extension\
 for WebGL 1.0 and 2.0 contexts renders 16-bit floating-point color buffers.", group: ["webgl-extensions"], kind: "feature", name: "EXT_color_buffer_half_float WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_color_buffer_half_float/"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "api.EXT_color_buffer_half_float": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "63", chrome_android: "63", edge: "17", firefox: "47", firefox_android: "36", safari: "14", safari_ios: "14" } } }, support: { chrome: "63", chrome_android: "63", edge: "17", firefox: "47", firefox_android: "36", safari: "14", safari_ios: "14" } } }, "ext-disjoint-timer-query": { compat_features: ["api.EXT_disjoint_timer_query", "api.EXT_disjoint_timer_query.beginQueryEXT", "api.EXT_disjoint_timer_query.createQueryEXT", "api.EXT_disjoint_timer_query.deleteQueryEXT", "api.EXT_dis\
joint_timer_query.endQueryEXT", "api.EXT_disjoint_timer_query.getQueryEXT", "api.EXT_disjoint_timer_query.getQueryObjectEXT", "api.EXT_disjoint_timer_query.isQueryEXT", "api.EXT_disjoint_timer_query.queryCounterEXT", "api.WebGLTimerQueryEXT"], description: "The EXT_disjoint_timer_query extension for WebGL 1.0 contexts measures the duration of a set of GL commands, without stalling the rendering pipeline.", description_html: "The <code>EXT_disjoint_timer_query</code> extension for WebGL 1.0 contexts measures the duration of a set of GL commands, without stalling the rendering pipeline.", group: ["webgl-extensions"], kind: "feature", name: "EXT_disjoint_timer_query WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_disjoint_timer_query/"], status: { baseline: false, by_compat_key: { "api.EXT_disjoint_timer_query": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.beginQueryEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.createQ\
ueryEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.deleteQueryEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.endQueryEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.getQueryEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.getQueryObjectEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.isQueryEXT": { baseline: false, support: {} }, "api.EXT_disjoint_timer_query.queryCounterEXT": { baseline: false, support: {} }, "api.WebGLTimerQueryEXT": { baseline: false, support: {} } }, support: {} } }, "ext-float-blend": { compat_features: ["api.EXT_float_blend"], description: "The EXT_float_blend extension for WebGL 1.0 and 2.0 contexts adds 32-bit floating-point components to blending and draw buffers.", description_html: "The <code>EXT_float_blend</code> extension for WebGL 1.0 and 2.0 contexts adds 32-bit floating-point components to blending and draw buffers.", group: ["webgl-extensions"],
    kind: "feature", name: "EXT_float_blend WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_float_blend/"], status: { baseline: false, by_compat_key: { "api.EXT_float_blend": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "67", firefox_android: "67", safari: "14.1" } } }, support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "67", firefox_android: "67", safari: "14.1" } } }, "ext-frag-depth": { compat_features: ["api.EXT_frag_depth"], description: "The EXT_frag_depth extension for WebGL 1.0 and 2.0 contexts adds setting the depth value of a fragment from within the fragment shader.", description_html: "The <code>EXT_frag_depth</code> extension for WebGL 1.0 and 2.0 contexts adds setting the depth value of a fragment from within the fragment shader.", group: ["webgl-extensions"], kind: "feature", name: "EXT_frag_depth WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_frag_depth/"],
    status: { baseline: false, by_compat_key: { "api.EXT_frag_depth": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "93", firefox: "47", safari: "9", safari_ios: "15" } } }, support: { chrome: "38", chrome_android: "38", edge: "93", firefox: "47", safari: "9", safari_ios: "15" } } }, "ext-shader-texture-lod": { compat_features: ["api.EXT_shader_texture_lod"], description: "The EXT_shader_texture_lod extension for WebGL 1.0 and 2.0 contexts adds texture functions to the OpenGL ES Shading Language such that the shader writer explicitly controls of the level of detail (LOD).", description_html: "The <code>EXT_shader_texture_lod</code> extension for WebGL 1.0 and 2.0 contexts adds texture functions to the OpenGL ES Shading Language such that the shader writer explicitly controls of the level of detail (LOD).", group: ["webgl-extensions"], kind: "feature", name: "EXT_shader_texture_lod WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_shad\
er_texture_lod/"], status: { baseline: false, by_compat_key: { "api.EXT_shader_texture_lod": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "93", firefox: "47", safari: "8", safari_ios: "8" } } }, support: { chrome: "38", chrome_android: "38", edge: "93", firefox: "47", safari: "8", safari_ios: "8" } } }, "ext-srgb": { compat_features: ["api.EXT_sRGB"], description: "The EXT_sRGB extension for WebGL 1.0 contexts adds sRGB support to textures and framebuffer objects.", description_html: "The <code>EXT_sRGB</code> extension for WebGL 1.0 contexts adds sRGB support to textures and framebuffer objects.", group: ["webgl-extensions"], kind: "feature", name: "EXT_sRGB WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_sRGB/"], status: { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", by_compat_key: { "api.EXT_sRGB": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: {
    chrome: "40", chrome_android: "40", edge: "80", firefox: "58", firefox_android: "28", safari: "9", safari_ios: "9" } } }, support: { chrome: "40", chrome_android: "40", edge: "80", firefox: "58", firefox_android: "28", safari: "9", safari_ios: "9" } } }, "ext-texture-compression-bptc": { compat_features: ["api.EXT_texture_compression_bptc"], description: "The EXT_texture_compression_bptc extension for WebGL 1.0 and 2.0 contexts adds the BPTC compressed texture formats to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>EXT_texture_compression_bptc</code> extension for WebGL 1.0 and 2.0 contexts adds the BPTC compressed texture formats to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()</code>.", group: ["webgl-extensions"], kind: "feature", name: "EXT_texture_compression_bptc WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/"], status: { baseline: false, by_compat_key: { "\
api.EXT_texture_compression_bptc": { baseline: false, support: { chrome: "93", chrome_android: "92", edge: "93", firefox: "68", safari: "16" } } }, support: { chrome: "93", chrome_android: "92", edge: "93", firefox: "68", safari: "16" } } }, "ext-texture-compression-rgtc": { compat_features: ["api.EXT_texture_compression_rgtc"], description: "The EXT_texture_compression_rgtc extension for WebGL 1.0 and 2.0 contexts adds RGTC compressed texture formats. RGTC is a block-based texture compression format suited for unsigned and signed red and red-green textures. Also known as Red-Green Texture Compression.", description_html: "The <code>EXT_texture_compression_rgtc</code> extension for WebGL 1.0 and 2.0 contexts adds RGTC compressed texture formats. RGTC is a block-based texture compression format suited for unsigned and signed red and red-green textures. Also known as Red-Green Texture Compression.", group: ["webgl-extensions"], kind: "feature", name: "EXT_texture_compression_rgtc WebGL e\
xtension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/"], status: { baseline: false, by_compat_key: { "api.EXT_texture_compression_rgtc": { baseline: false, support: { chrome: "93", chrome_android: "83", edge: "93", safari: "14.1" } } }, support: { chrome: "93", chrome_android: "83", edge: "93", safari: "14.1" } } }, "ext-texture-filter-anisotropic": { compat_features: ["api.EXT_texture_filter_anisotropic"], description: "The EXT_texture_filter_anisotropic extension for WebGL 1.0 and 2.0 contexts adds anisotropic filtering (AF). AF improves the quality of mipmapped texture access when viewing a textured primitive at an oblique angle.", description_html: "The <code>EXT_texture_filter_anisotropic</code> extension for WebGL 1.0 and 2.0 contexts adds anisotropic filtering (AF). AF improves the quality of mipmapped texture access when viewing a textured primitive at an oblique angle.", group: ["webgl-extensions"], kind: "feature", name: "EXT_texture_f\
ilter_anisotropic WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_texture_filter_anisotropic/"], status: { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", by_compat_key: { "api.EXT_texture_filter_anisotropic": { baseline: "high", baseline_high_date: "2018-12-07", baseline_low_date: "2016-06-07", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "47", firefox_android: "47", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "47", firefox_android: "47", safari: "9.1", safari_ios: "9.3" } } }, "ext-texture-norm16": { compat_features: ["api.EXT_texture_norm16"], description: "The EXT_texture_norm16 extension to WebGL 2.0 contexts adds 16 bit signed normalized and unsigned normalized fixed-point texture, renderbuffer, and texture buffer formats.", description_html: "The <code>EXT_texture_norm16</code> extension to WebGL 2.0 contexts adds 16 bit signed n\
ormalized and unsigned normalized fixed-point texture, renderbuffer, and texture buffer formats.", group: ["webgl-extensions"], kind: "feature", name: "EXT_texture_norm16 WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/EXT_texture_norm16/"], status: { baseline: false, by_compat_key: { "api.EXT_texture_norm16": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", safari: "16", safari_ios: "16" } } }, support: { chrome: "87", chrome_android: "87", edge: "87", safari: "16", safari_ios: "16" } } }, external: { compat_features: ["api.External", "api.External.AddSearchProvider", "api.External.IsSearchProviderInstalled"], description: "The window.external.AddSearchProvider() and window.external.IsSearchProviderInstalled() do nothing. Historically, they added external search providers to the browser.", description_html: "The <code>window.external.AddSearchProvider()</code> and <code>window.external.IsSearchProviderInstalled()</code> do nothing. \
Historically, they added external search providers to the browser.", discouraged: { according_to: ["https://html.spec.whatwg.org/multipage/obsolete.html#external"], reason: "The window.external.AddSearchProvider() and window.external.IsSearchProviderInstalled() methods do nothing, by specification.", reason_html: "The <code>window.external.AddSearchProvider()</code> and <code>window.external.IsSearchProviderInstalled()</code> methods do nothing, by specification." }, kind: "feature", name: "window.external", spec: ["https://html.spec.whatwg.org/multipage/obsolete.html#external"], status: { baseline: false, by_compat_key: { "api.External": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4" } }, "api.External.AddSearchProvider": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4" } }, "api.External.IsSearchProviderInstalled": { baseline: false, support: { chrome: "9", chrome_android: "\
18", edge: "12", firefox: "2", firefox_android: "4" } } }, support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4" } } }, eyedropper: { compat_features: ["api.EyeDropper", "api.EyeDropper.EyeDropper", "api.EyeDropper.open", "api.EyeDropper.secure_context_required"], description: "The EyeDropper API opens an eyedropper tool, a color picker that allows users to select a color from their screen.", description_html: "The <code>EyeDropper</code> API opens an eyedropper tool, a color picker that allows users to select a color from their screen.", kind: "feature", name: "Eyedropper", spec: ["https://wicg.github.io/eyedropper-api/"], status: { baseline: false, by_compat_key: { "api.EyeDropper": { baseline: false, support: { chrome: "95", edge: "95" } }, "api.EyeDropper.EyeDropper": { baseline: false, support: { chrome: "95", edge: "95" } }, "api.EyeDropper.open": { baseline: false, support: { chrome: "95", edge: "95" } }, "api.EyeDropper.secure_context_requ\
ired": { baseline: false, support: { chrome: "96", edge: "96" } } }, support: { chrome: "96", edge: "96" } } }, "fast-seek": { compat_features: ["api.HTMLMediaElement.fastSeek"], description: "The fastSeek() method seeks an <audio> or <video> element as fast as possible, by seeking to a keyframe instead of exactly the requested time.", description_html: "The <code>fastSeek()</code> method seeks an <code>&#x3C;audio></code> or <code>&#x3C;video></code> element as fast as possible, by seeking to a keyframe instead of exactly the requested time.", group: ["media-elements"], kind: "feature", name: "fastSeek()", spec: ["https://html.spec.whatwg.org/multipage/media.html#dom-media-fastseek-dev"], status: { baseline: false, by_compat_key: { "api.HTMLMediaElement.fastSeek": { baseline: false, support: { firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } } }, support: { firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } } }, "feature-policy": { caniuse: ["feat\
ure-policy"], compat_features: ["api.Document.featurePolicy", "api.FeaturePolicy", "api.FeaturePolicy.allowedFeatures", "api.FeaturePolicy.allowsFeature", "api.FeaturePolicy.features", "api.FeaturePolicy.getAllowlistForFeature", "api.HTMLIFrameElement.featurePolicy", "http.headers.Feature-Policy", "http.headers.Feature-Policy.accelerometer", "http.headers.Feature-Policy.ambient-light-sensor", "http.headers.Feature-Policy.attribution-reporting", "http.headers.Feature-Policy.autoplay", "http.headers.Feature-Policy.bluetooth", "http.headers.Feature-Policy.browsing-topics", "http.headers.Feature-Policy.camera", "http.headers.Feature-Policy.compute-pressure", "http.headers.Feature-Policy.cross-origin-isolated", "http.headers.Feature-Policy.deferred-fetch", "http.headers.Feature-Policy.deferred-fetch-minimal", "http.headers.Feature-Policy.display-capture", "http.headers.Feature-Policy.document-domain", "http.headers.Feature-Policy.encrypted-media", "http.headers.Feature-Policy.fullscreen", "\
http.headers.Feature-Policy.geolocation", "http.headers.Feature-Policy.gyroscope", "http.headers.Feature-Policy.hid", "http.headers.Feature-Policy.identity-credentials-get", "http.headers.Feature-Policy.idle-detection", "http.headers.Feature-Policy.local-fonts", "http.headers.Feature-Policy.magnetometer", "http.headers.Feature-Policy.microphone", "http.headers.Feature-Policy.midi", "http.headers.Feature-Policy.otp-credentials", "http.headers.Feature-Policy.payment", "http.headers.Feature-Policy.picture-in-picture", "http.headers.Feature-Policy.publickey-credentials-create", "http.headers.Feature-Policy.publickey-credentials-get", "http.headers.Feature-Policy.screen-wake-lock", "http.headers.Feature-Policy.serial", "http.headers.Feature-Policy.storage-access", "http.headers.Feature-Policy.usb", "http.headers.Feature-Policy.web-share", "http.headers.Feature-Policy.wildcards", "http.headers.Feature-Policy.window-management", "http.headers.Feature-Policy.xr-spatial-tracking"], description: "\
The Feature-Policy response header sets whether a policy-controlled feature, such as an API, may be used in a document. Not to be confused with permissions policy.", description_html: "The <code>Feature-Policy</code> response header sets whether a policy-controlled feature, such as an API, may be used in a document. Not to be confused with permissions policy.", discouraged: { according_to: ["https://github.com/w3c/webappsec-permissions-policy/pull/379"], alternatives: ["permissions-policy"], reason: "Feature policy is superseded by permissions policy.", reason_html: "Feature policy is superseded by permissions policy." }, kind: "feature", name: "Feature policy", spec: ["https://www.w3.org/TR/2019/WD-feature-policy-1-20190416/"], status: { baseline: false, by_compat_key: { "api.Document.featurePolicy": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.FeaturePolicy": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "a\
pi.FeaturePolicy.allowedFeatures": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.FeaturePolicy.allowsFeature": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.FeaturePolicy.features": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.FeaturePolicy.getAllowlistForFeature": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.HTMLIFrameElement.featurePolicy": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "http.headers.Feature-Policy": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79" } }, "http.headers.Feature-Policy.accelerometer": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "http.headers.Feature-Policy.ambient-light-sensor": { baseline: false, support: {} }, "http.headers.Feature-Policy.attribution-reporting": { baseline: false, support: {
    chrome: "117", chrome_android: "117", edge: "117" } }, "http.headers.Feature-Policy.autoplay": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } }, "http.headers.Feature-Policy.bluetooth": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104" } }, "http.headers.Feature-Policy.browsing-topics": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "http.headers.Feature-Policy.camera": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } }, "http.headers.Feature-Policy.compute-pressure": { baseline: false, support: { chrome: "125", edge: "125" } }, "http.headers.Feature-Policy.cross-origin-isolated": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "http.headers.Feature-Policy.deferred-fetch": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "http.headers.Feature-Policy.deferred-fetch-minimal": { baseline: false,
    support: { chrome: "135", chrome_android: "135", edge: "135" } }, "http.headers.Feature-Policy.display-capture": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "http.headers.Feature-Policy.document-domain": { baseline: false, support: {} }, "http.headers.Feature-Policy.encrypted-media": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } }, "http.headers.Feature-Policy.fullscreen": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "79" } }, "http.headers.Feature-Policy.geolocation": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } }, "http.headers.Feature-Policy.gyroscope": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "http.headers.Feature-Policy.hid": { baseline: false, support: { chrome: "89", edge: "89" } }, "http.headers.Feature-Policy.identity-credentials-get": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "\
110" } }, "http.headers.Feature-Policy.idle-detection": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "http.headers.Feature-Policy.local-fonts": { baseline: false, support: { chrome: "103", edge: "103" } }, "http.headers.Feature-Policy.magnetometer": { baseline: false, support: {} }, "http.headers.Feature-Policy.microphone": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } }, "http.headers.Feature-Policy.midi": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79" } }, "http.headers.Feature-Policy.otp-credentials": { baseline: false, support: { chrome: "93", chrome_android: "84", edge: "93" } }, "http.headers.Feature-Policy.payment": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79" } }, "http.headers.Feature-Policy.picture-in-picture": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79" } }, "http.headers.Feature-Policy.publickey-credentials-cre\
ate": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "http.headers.Feature-Policy.publickey-credentials-get": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "http.headers.Feature-Policy.screen-wake-lock": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "http.headers.Feature-Policy.serial": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Feature-Policy.storage-access": { baseline: false, support: { chrome: "113", chrome_android: "113", edge: "113" } }, "http.headers.Feature-Policy.usb": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79" } }, "http.headers.Feature-Policy.web-share": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86" } }, "http.headers.Feature-Policy.wildcards": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "http.headers.Feature-Poli\
cy.window-management": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } }, "http.headers.Feature-Policy.xr-spatial-tracking": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } } }, support: { chrome: "74", chrome_android: "74", edge: "79" } } }, fedcm: { compat_features: ["api.CredentialsContainer.get.identity_option", "api.CredentialsContainer.get.identity_option.context_option", "api.CredentialsContainer.get.identity_option.providers_option_loginHint", "api.IdentityCredential", "api.IdentityCredential.token"], description: "The IdentityCredential API delegates authentication to a third-party identity provider, instead of using third-party cookies. Also known as FedCM.", description_html: "The <code>IdentityCredential</code> API delegates authentication to a third-party identity provider, instead of using third-party cookies. Also known as FedCM.", group: ["credential-management"], kind: "feature", name: "Federated credenti\
al management", spec: ["https://w3c-fedid.github.io/FedCM/"], status: { baseline: false, by_compat_key: { "api.CredentialsContainer.get.identity_option": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.CredentialsContainer.get.identity_option.context_option": { baseline: false, support: { chrome: "116", chrome_android: "116", edge: "116" } }, "api.CredentialsContainer.get.identity_option.providers_option_loginHint": { baseline: false, support: { chrome: "116", chrome_android: "116", edge: "116" } }, "api.IdentityCredential": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.IdentityCredential.token": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } } }, support: { chrome: "116", chrome_android: "116", edge: "116" } } }, "federated-credentials": { compat_features: ["api.FederatedCredential", "api.FederatedCredential.FederatedCredential", "api.FederatedCredential.protocol", "\
api.FederatedCredential.provider"], description: "The FederatedCredential API represents the details required to authenticate a user using a third-party identity provider. Not to be confused with federated credential management (FedCM).", description_html: "The <code>FederatedCredential</code> API represents the details required to authenticate a user using a third-party identity provider. Not to be confused with federated credential management (FedCM).", group: ["credential-management"], kind: "feature", name: "Federated credentials", spec: ["https://w3c.github.io/webappsec-credential-management/#federated"], status: { baseline: false, by_compat_key: { "api.FederatedCredential": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "api.FederatedCredential.FederatedCredential": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "api.FederatedCredential.protocol": { baseline: false, support: { chrome: "51", chrome_android: "51",
    edge: "79" } }, "api.FederatedCredential.provider": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } } }, support: { chrome: "51", chrome_android: "51", edge: "79" } } }, fencedframe: { compat_features: ["api.Fence", "api.Fence.getNestedConfigs", "api.Fence.reportEvent", "api.Fence.setReportEventDataForAutomaticBeacons", "api.FencedFrameConfig", "api.FencedFrameConfig.setSharedStorageContext", "api.HTMLFencedFrameElement", "api.HTMLFencedFrameElement.allow", "api.HTMLFencedFrameElement.config", "api.HTMLFencedFrameElement.height", "api.HTMLFencedFrameElement.sandbox", "api.HTMLFencedFrameElement.width", "api.Navigator.deprecatedReplaceInURN", "api.Window.fence", "html.elements.a.target.unfencedTop", "html.elements.fencedframe", "html.elements.fencedframe.allow", "html.elements.fencedframe.height", "html.elements.fencedframe.width", "http.headers.Content-Security-Policy.fenced-frame-src", "http.headers.Sec-Fetch-Dest.fencedframe"], description: "The <fe\
ncedframe> element embeds another HTML page into the current page in a more secure and privacy-preserving way than <iframe> elements.", description_html: "The <code>&#x3C;fencedframe></code> element embeds another HTML page into the current page in a more secure and privacy-preserving way than <code>&#x3C;iframe></code> elements.", kind: "feature", name: "<fencedframe>", spec: ["https://wicg.github.io/fenced-frame/"], status: { baseline: false, by_compat_key: { "api.Fence": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.Fence.getNestedConfigs": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.Fence.reportEvent": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.Fence.setReportEventDataForAutomaticBeacons": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.FencedFrameConfig": { baseline: false, support: { chrome: "126", chrome_android: "\
126", edge: "126" } }, "api.FencedFrameConfig.setSharedStorageContext": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLFencedFrameElement": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLFencedFrameElement.allow": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLFencedFrameElement.config": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLFencedFrameElement.height": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLFencedFrameElement.sandbox": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLFencedFrameElement.width": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.Navigator.deprecatedReplaceInURN": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128" } },
    "api.Window.fence": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "html.elements.a.target.unfencedTop": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "html.elements.fencedframe": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "html.elements.fencedframe.allow": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "html.elements.fencedframe.height": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "html.elements.fencedframe.width": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "http.headers.Content-Security-Policy.fenced-frame-src": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "http.headers.Sec-Fetch-Dest.fencedframe": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } } }, support: { chrome: "1\
26", chrome_android: "126", edge: "126" } } }, fetch: { caniuse: ["fetch"], compat_features: ["api.Headers", "api.Headers.@@iterator", "api.Headers.Headers", "api.Headers.append", "api.Headers.delete", "api.Headers.entries", "api.Headers.forEach", "api.Headers.get", "api.Headers.getSetCookie", "api.Headers.has", "api.Headers.iterate_combined_duplicates", "api.Headers.iterate_lexicographically", "api.Headers.keys", "api.Headers.set", "api.Headers.values", "api.Request", "api.Request.Request", "api.Request.Request.cross_origin_stripped", "api.Request.Request.init_keepalive_parameter", "api.Request.Request.init_referrer_parameter", "api.Request.Request.request_body_readablestream", "api.Request.Request.response_body_readablestream", "api.Request.arrayBuffer", "api.Request.blob", "api.Request.bodyUsed", "api.Request.bytes", "api.Request.cache", "api.Request.cache.only-if-cached", "api.Request.clone", "api.Request.credentials", "api.Request.credentials.default_same-origin", "api.Request.des\
tination", "api.Request.duplex", "api.Request.headers", "api.Request.isHistoryNavigation", "api.Request.json", "api.Request.keepalive", "api.Request.method", "api.Request.mode", "api.Request.mode.navigate_mode", "api.Request.redirect", "api.Request.referrer", "api.Request.referrerPolicy", "api.Request.text", "api.Request.url", "api.Response", "api.Response.Response", "api.Response.Response.accept_readablestream", "api.Response.Response.body_parameter_optional", "api.Response.arrayBuffer", "api.Response.blob", "api.Response.body", "api.Response.body.readable_byte_stream", "api.Response.bodyUsed", "api.Response.bytes", "api.Response.clone", "api.Response.error_static", "api.Response.headers", "api.Response.json", "api.Response.json_static", "api.Response.ok", "api.Response.redirect_static", "api.Response.redirected", "api.Response.status", "api.Response.statusText", "api.Response.text", "api.Response.type", "api.Response.url", "api.fetch", "api.fetch.authorization_removed_cross_origin", "\
api.fetch.blob_data_support", "api.fetch.init_keepalive_parameter", "api.fetch.init_referrerPolicy_parameter"], description: "The fetch() method makes asynchronous HTTP requests.", description_html: "The <code>fetch()</code> method makes asynchronous HTTP requests.", group: ["fetch"], kind: "feature", name: "Fetch", spec: ["https://fetch.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", by_compat_key: { "api.Headers": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.@@iterator": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.Headers": { baseline: "hig\
h", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.append": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.delete": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.entries": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.forEach": { baseline: "high", baseline_high_date: "\
2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "47", firefox_android: "47", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.get": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.getSetCookie": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "112", firefox_android: "112", safari: "17", safari_ios: "17" } }, "api.Headers.has": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.iterate_combined_duplicates": { baseline: "high", baseline_high_date: "\
2020-05-28", baseline_low_date: "2017-11-28", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "57", firefox_android: "57", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.iterate_lexicographically": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "57", chrome_android: "57", edge: "18", firefox: "57", firefox_android: "57", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.keys": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.set": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Headers.values": { baseline: "high", baseline_high_date: "20\
20-04-17", baseline_low_date: "2017-10-17", support: { chrome: "42", chrome_android: "42", edge: "16", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.Request": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.Request": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.Request.cross_origin_stripped": { baseline: "high", baseline_high_date: "2021-03-04", baseline_low_date: "2018-09-04", support: { chrome: "69", chrome_android: "69", edge: "15", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } }, "api.Request.Request.init_keepalive_parameter": { baseline: "low",
    baseline_low_date: "2024-11-26", support: { chrome: "66", chrome_android: "66", edge: "15", firefox: "133", firefox_android: "133", safari: "13", safari_ios: "13" } }, "api.Request.Request.init_referrer_parameter": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "47", chrome_android: "47", edge: "15", firefox: "47", firefox_android: "47", safari: "10.1", safari_ios: "10.3" } }, "api.Request.Request.request_body_readablestream": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105" } }, "api.Request.Request.response_body_readablestream": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "65", firefox_android: "65", safari_ios: "10.3" } }, "api.Request.arrayBuffer": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "\
10.3" } }, "api.Request.blob": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.bodyUsed": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.bytes": { baseline: "low", baseline_low_date: "2025-01-17", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.Request.cache": { baseline: "high", baseline_high_date: "2020-07-23", baseline_low_date: "2018-01-23", support: { chrome: "64", chrome_android: "64", edge: "14", firefox: "48", firefox_android: "48", safari: "10.1", safari_ios: "10.3" } }, "api.Request.cache.only-if-cached": { baseline: false,
    support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "50", safari: "10.1", safari_ios: "10.3" } }, "api.Request.clone": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.credentials": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.credentials.default_same-origin": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "72", chrome_android: "72", edge: "18", firefox: "61", firefox_android: "61", safari: "12.1", safari_ios: "12.2" } }, "api.Request.destination": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: {
    chrome: "65", chrome_android: "65", edge: "14", firefox: "61", firefox_android: "61", safari: "10.1", safari_ios: "10.3" } }, "api.Request.duplex": { baseline: false, support: { chrome: "131", edge: "131" } }, "api.Request.headers": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.isHistoryNavigation": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.Request.json": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.keepalive": { baseline: "low", baseline_low_date: "2024-11-26", support: { chrome: "66", chrome_android: "66", edge: "15", firefox: "133", firefox_android: "133", safari: "\
13", safari_ios: "13" } }, "api.Request.method": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.mode": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.mode.navigate_mode": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "≤18", firefox: "46", safari: "10.1", safari_ios: "10.3" } }, "api.Request.redirect": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "46", chrome_android: "46", edge: "14", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "api.Request.referrer": { baseline: "high", baseline_high_date: "\
2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.referrerPolicy": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "52", chrome_android: "52", edge: "14", firefox: "47", firefox_android: "47", safari: "10.1", safari_ios: "10.3" } }, "api.Request.text": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Request.url": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "\
2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.Response": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.Response.accept_readablestream": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.Response.body_parameter_optional": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "59", firefox_android: "59", safari: "10.1", safari_ios: "10.3" } }, "api.Response.arrayBuffer": { baseline: "high", baseline_high_date: "\
2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.blob": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.body": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "43", chrome_android: "43", edge: "14", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.Response.body.readable_byte_stream": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.Response.bodyUsed": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "\
2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.bytes": { baseline: "low", baseline_low_date: "2025-01-17", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.Response.clone": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.error_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.headers": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "\
42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.json": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.json_static": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } }, "api.Response.ok": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.redirect_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "44", chrome_android: "44",
    edge: "16", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.redirected": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.Response.status": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.statusText": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.text": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "\
14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.type": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.Response.url": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.fetch": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.fetch.authorization_removed_cross_origin": { baseline: false, support: { firefox: "111", firefox_android: "111", safari: "16.1", safari_ios: "16.1" } }, "api.fetch.blob_data_support": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } }, "api.fetch.init_keepalive_parameter": { baseline: "low", baseline_low_date: "2024-11-26", support: { chrome: "66", chrome_android: "66", edge: "15", firefox: "133", firefox_android: "133", safari: "13", safari_ios: "13" } }, "api.fetch.init_referrerPolicy_parameter": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "52", firefox_android: "52", safari: "11.1" } } }, support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "39", firefox_android: "39", safari: "10.1", safari_ios: "10.3" } } }, "fetch-formdata": { compat_features: ["api.Request.formData", "api.Response.formData"], description: "The Request.formData() and Response.formData() methods read a request or response body and return a FormData promise. You can use it to access\
 the fields of a form submission.", description_html: "The <code>Request.formData()</code> and <code>Response.formData()</code> methods read a request or response body and return a <code>FormData</code> promise. You can use it to access the fields of a form submission.", group: ["fetch"], kind: "feature", name: "Fetch form data", spec: ["https://fetch.spec.whatwg.org/#body-mixin"], status: { baseline: false, by_compat_key: { "api.Request.formData": { baseline: false, support: { firefox: "39", firefox_android: "39", safari: "14.1", safari_ios: "14.5" } }, "api.Response.formData": { baseline: false, support: { firefox: "39", firefox_android: "39", safari: "14.1", safari_ios: "14.5" } } }, support: { firefox: "39", firefox_android: "39", safari: "14.1", safari_ios: "14.5" } } }, "fetch-metadata": { compat_features: ["http.headers.Sec-Fetch-Dest", "http.headers.Sec-Fetch-Mode", "http.headers.Sec-Fetch-Site", "http.headers.Sec-Fetch-User"], description: "The Sec-Fetch-Dest, Sec-Fetch-Mode, \
Sec-Fetch-Site, and Sec-Fetch-User HTTP headers provide extra information about the way a request was made, to help servers reject certain kinds of malicious requests.", description_html: "The <code>Sec-Fetch-Dest</code>, <code>Sec-Fetch-Mode</code>, <code>Sec-Fetch-Site</code>, and <code>Sec-Fetch-User</code> HTTP headers provide extra information about the way a request was made, to help servers reject certain kinds of malicious requests.", group: ["fetch"], kind: "feature", name: "Fetch metadata request headers", spec: ["https://w3c.github.io/webappsec-fetch-metadata/"], status: { baseline: false, by_compat_key: { "http.headers.Sec-Fetch-Dest": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "90", firefox_android: "90", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Sec-Fetch-Mode": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: {
    chrome: "76", chrome_android: "76", edge: "79", firefox: "90", firefox_android: "90", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Sec-Fetch-Site": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "90", firefox_android: "90", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Sec-Fetch-User": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "90", firefox_android: "90" } } }, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "90", firefox_android: "90" } } }, "fetch-priority": { compat_features: ["api.HTMLImageElement.fetchPriority", "api.HTMLLinkElement.fetchPriority", "api.HTMLScriptElement.fetchPriority", "api.Request.Request.init_priority_parameter", "api.fetch.init_priority_parameter", "html.elements.img.fetchpriority", "html.elements.link.fetchpriority", "html.elements.script.fetchpriority", "http.headers.\
Link.fetchpriority", "svg.elements.feImage.fetchpriority", "svg.elements.image.fetchpriority", "svg.elements.script.fetchpriority"], description: "The fetch() priority option and the fetchpriority HTML attribute give hints to the browser about which requests to do before other requests of the same type.", description_html: "The <code>fetch()</code> <code>priority</code> option and the <code>fetchpriority</code> HTML attribute give hints to the browser about which requests to do before other requests of the same type.", group: ["resource-hints", "fetch"], kind: "feature", name: "Fetch priority", spec: ["https://fetch.spec.whatwg.org/#request-priority", "https://html.spec.whatwg.org/multipage/urls-and-fetching.html#fetch-priority-attributes"], status: { baseline: "low", baseline_low_date: "2024-10-29", by_compat_key: { "api.HTMLImageElement.fetchPriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "132", firefox_android: "\
132", safari: "17.2", safari_ios: "17.2" } }, "api.HTMLLinkElement.fetchPriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "api.HTMLScriptElement.fetchPriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "api.Request.Request.init_priority_parameter": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "api.fetch.init_priority_parameter": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "html.elements.img\
.fetchpriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "html.elements.link.fetchpriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "html.elements.script.fetchpriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "http.headers.Link.fetchpriority": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } }, "svg.elements.feImage.fetchpriority": { baseline: false, support: { firefox: "140", firefox_android: "\
140" } }, "svg.elements.image.fetchpriority": { baseline: false, support: { firefox: "140", firefox_android: "140" } }, "svg.elements.script.fetchpriority": { baseline: false, support: { firefox: "140", firefox_android: "140" } } }, support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "132", firefox_android: "132", safari: "17.2", safari_ios: "17.2" } } }, "fetch-request-streams": { compat_features: ["api.Request.body"], description: "A fetch() request uploads a stream of data to the server when a request's body property is a ReadableStream object.", description_html: "A <code>fetch()</code> request uploads a stream of data to the server when a request's <code>body</code> property is a <code>ReadableStream</code> object.", group: ["fetch"], kind: "feature", name: "Fetch upload streams", spec: ["https://fetch.spec.whatwg.org/#concept-body-stream"], status: { baseline: false, by_compat_key: { "api.Request.body": { baseline: false, support: { chrome: "105", chrome_android: "\
105", edge: "105", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "11.1", safari_ios: "11.3" } } }, fetchlater: { compat_features: ["api.FetchLaterResult", "api.FetchLaterResult.activated", "api.Window.fetchLater", "http.headers.Permissions-Policy.deferred-fetch", "http.headers.Permissions-Policy.deferred-fetch-minimal"], description: "The fetchLater() method requests a deferred fetch sent at an unknown time. The browser chooses a reliable time to send the request, ideally when the document is unloaded, and ignores the response. This API is useful for sending beacons to a server without expecting a particular response.", description_html: "The <code>fetchLater()</code> method requests a deferred fetch sent at an unknown time. The browser chooses a reliable time to send the request, ideally when the document is unloaded, and ignores the response. This API is useful for sending beacons to a server without expecting a partic\
ular response.", group: ["fetch"], kind: "feature", name: "fetchLater", spec: ["https://fetch.spec.whatwg.org/#dom-window-fetchlater"], status: { baseline: false, by_compat_key: { "api.FetchLaterResult": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.FetchLaterResult.activated": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Window.fetchLater": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "http.headers.Permissions-Policy.deferred-fetch": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "http.headers.Permissions-Policy.deferred-fetch-minimal": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, "field-sizing": { compat_features: ["css.properties.field-sizing", "css.properties.field-sizing.content", "css.properties.field-sizing\
.fixed"], description: "The field-sizing CSS property allows form controls such as <textarea> to be sized based on their content.", description_html: "The <code>field-sizing</code> CSS property allows form controls such as <code>&#x3C;textarea></code> to be sized based on their content.", group: ["css"], kind: "feature", name: "field-sizing", spec: ["https://drafts.csswg.org/css-forms-1/#field-sizing"], status: { baseline: false, by_compat_key: { "css.properties.field-sizing": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123", safari: "26.2", safari_ios: "26.2" } }, "css.properties.field-sizing.content": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123", safari: "26.2", safari_ios: "26.2" } }, "css.properties.field-sizing.fixed": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", safari: "26.2",
    safari_ios: "26.2" } } }, fieldset: { compat_features: ["api.HTMLFieldSetElement", "api.HTMLFieldSetElement.disabled", "api.HTMLFieldSetElement.elements", "api.HTMLFieldSetElement.elements.type_HTMLCollection", "api.HTMLFieldSetElement.form", "api.HTMLFieldSetElement.name", "api.HTMLFieldSetElement.type", "api.HTMLLegendElement", "api.HTMLLegendElement.form", "html.elements.fieldset", "html.elements.fieldset.disabled", "html.elements.fieldset.form", "html.elements.fieldset.name", "html.elements.legend"], description: "The <fieldset> and <legend> elements group several form control elements within a web form.", description_html: "The <code>&#x3C;fieldset></code> and <code>&#x3C;legend></code> elements group several form control elements within a web form.", group: ["forms", "html-elements"], kind: "feature", name: "<fieldset> and <legend>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-fieldset-element", "https://html.spec.whatwg.org/multipage/form-elements.h\
tml#the-legend-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLFieldSetElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFieldSetElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.HTMLFieldSetElement.elements": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "21", chrome_android: "25", edge: "17", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.HTMLFieldSetElement.elements.type_HTMLCollection": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "\
2019-09-19", support: { chrome: "57", chrome_android: "57", edge: "≤18", firefox: "4", firefox_android: "4", safari: "13", safari_ios: "13" } }, "api.HTMLFieldSetElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFieldSetElement.name": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "19", chrome_android: "25", edge: "14", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.HTMLFieldSetElement.type": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "19", chrome_android: "25", edge: "17", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.HTMLLegendElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLegendElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.fieldset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.fieldset.disabled": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "20", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "html.elements.fieldset.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.fieldset.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "html.elements.legend": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, figure: { compat_features: ["html.elements.figcaption", "html.elements.figure"], description: "The <figure> and <figcaption> HTML elements represent an illustration, diagram, text, or other self-contained reference content, with an optional capt\
ion.", description_html: "The <code>&#x3C;figure></code> and <code>&#x3C;figcaption></code> HTML elements represent an illustration, diagram, text, or other self-contained reference content, with an optional caption.", group: ["html-elements"], kind: "feature", name: "<figure> and <figcaption>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-figure-element", "https://html.spec.whatwg.org/multipage/grouping-content.html#the-figcaption-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.figcaption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.figure": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12",
    firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, file: { caniuse: ["fileapi"], compat_features: ["api.Blob", "api.Blob.Blob", "api.Blob.arrayBuffer", "api.Blob.bytes", "api.Blob.size", "api.Blob.slice", "api.Blob.stream", "api.Blob.text", "api.Blob.type", "api.File", "api.File.File", "api.File.lastModified", "api.File.name", "api.FileList", "api.FileList.item", "api.FileList.length", "api.FileReader", "api.FileReader.FileReader", "api.FileReader.abort", "api.FileReader.abort_event", "api.FileReader.error", "api.FileReader.error_event", "api.FileReader.load_event", "api.FileReader.loadend_event", "api.FileReader.loadstart_event", "api.FileReader.progress_event", "api.FileReader.readAsArrayBuffer", "api.FileReader.readAsDataURL", "api.FileReader.readAsText", "api.FileReader.readyState", "api.FileReader.result", "api.FileReader.wo\
rker_support", "api.FileReaderSync", "api.FileReaderSync.FileReaderSync", "api.FileReaderSync.readAsArrayBuffer", "api.FileReaderSync.readAsDataURL", "api.FileReaderSync.readAsText", "api.FileReaderSync.worker_support", "api.URL.createObjectURL_static", "api.URL.revokeObjectURL_static"], description: 'The File API represents and reads from file data and metadata. Typically, you get files through other APIs, such as the <input type="file"> element or drag-and-drop events. You may also send file data to other APIs, such as creating images or drawing on canvases.', description_html: 'The File API represents and reads from file data and metadata. Typically, you get files through other APIs, such as the <code>&#x3C;input type="file"></code> element or drag-and-drop events. You may also send file data to other APIs, such as creating images or drawing on canvases.', kind: "feature", name: "File API", spec: ["https://w3c.github.io/FileAPI/"], status: { baseline: "high", baseline_high_date: "20\
22-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Blob": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.Blob.Blob": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "13", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.Blob.arrayBuffer": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "69", firefox_android: "79", safari: "14", safari_ios: "14.5" } }, "api.Blob.bytes": { baseline: "low", baseline_low_date: "2026-01-21", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.Blob.size": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.Blob.slice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "13", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.Blob.stream": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.Blob.text": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "69", firefox_android: "79", safari: "14", safari_ios: "14.5" } }, "api.Blob.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.File": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "13", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.File.File": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "28", firefox_android: "28", safari: "10.1", safari_ios: "10.3" } }, "api.File.lastModified": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "13", chrome_android: "18", edge: "18", firefox: "15", firefox_android: "15", safari: "10", safari_ios: "10" } }, "api.File.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "13", chrome_android: "\
18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "8", safari_ios: "8" } }, "api.FileList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.FileList.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.FileList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.FileReader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32",
    safari: "6", safari_ios: "6" } }, "api.FileReader.FileReader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.abort": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.abort_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.error": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "\
6" } }, "api.FileReader.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.load_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.loadend_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.loadstart_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "79", firefox_android: "79", safari: "6", safari_ios: "6" } },
    "api.FileReader.progress_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.readAsArrayBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.readAsDataURL": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.readAsText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } },
    "api.FileReader.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "32", safari: "6", safari_ios: "6" } }, "api.FileReader.worker_support": { baseline: "high", baseline_high_date: "2018-10-26", baseline_low_date: "2016-04-26", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "46", firefox_android: "46", safari: "6", safari_ios: "6" } }, "api.FileReaderSync": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.FileReaderSync\
.FileReaderSync": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.FileReaderSync.readAsArrayBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.FileReaderSync.readAsDataURL": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.FileReaderSync.readAsText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.FileRead\
erSync.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.URL.createObjectURL_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } }, "api.URL.revokeObjectURL_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } } }, support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "28", firefox_android: "28", safari: "10.1", safari_ios: "10.3" } } }, "file-selector-button": { compat_features: ["css.selectors.file-selector-button"], description: 'The ::file-selector\
-button CSS pseudo-element selects the button of a <input type="file"> element.', description_html: 'The <code>::file-selector-button</code> CSS pseudo-element selects the button of a <code>&#x3C;input type="file"></code> element.', group: ["selectors"], kind: "feature", name: "::file-selector-button", spec: ["https://drafts.csswg.org/css-pseudo-4/#file-selector-button-pseudo"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "css.selectors.file-selector-button": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "82", firefox_android: "82", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "82", firefox_android: "82", safari: "14.1", safari_ios: "14.5" } } }, "file-system-access": { caniuse: ["native-filesystem-api"], compat_features: ["api.FileSystemDirectoryH\
andle.@@asyncIterator", "api.FileSystemFileHandle.createWritable", "api.FileSystemHandle.queryPermission", "api.FileSystemHandle.requestPermission", "api.FileSystemWritableFileStream", "api.FileSystemWritableFileStream.seek", "api.FileSystemWritableFileStream.truncate", "api.FileSystemWritableFileStream.write", "api.Window.showDirectoryPicker", "api.Window.showOpenFilePicker", "api.Window.showSaveFilePicker"], description: "The showOpenFilePicker(), showDirectoryPicker(), and showSaveFilePicker() methods request access to files and directories on the user's device and returns a handle for reading and writing to them.", description_html: "The <code>showOpenFilePicker()</code>, <code>showDirectoryPicker()</code>, and <code>showSaveFilePicker()</code> methods request access to files and directories on the user's device and returns a handle for reading and writing to them.", group: ["file-system"], kind: "feature", name: "File system access", spec: ["https://wicg.github.io/file-system-acce\
ss/"], status: { baseline: false, by_compat_key: { "api.FileSystemDirectoryHandle.@@asyncIterator": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.FileSystemFileHandle.createWritable": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "26", safari_ios: "26" } }, "api.FileSystemHandle.queryPermission": { baseline: false, support: { chrome: "86", chrome_android: "109", edge: "86" } }, "api.FileSystemHandle.requestPermission": { baseline: false, support: { chrome: "86", chrome_android: "109", edge: "86" } }, "api.FileSystemWritableFileStream": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "\
26", safari_ios: "26" } }, "api.FileSystemWritableFileStream.seek": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "26", safari_ios: "26" } }, "api.FileSystemWritableFileStream.truncate": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "26", safari_ios: "26" } }, "api.FileSystemWritableFileStream.write": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "26", safari_ios: "26" } }, "api.Window.showDirectoryPicker": { baseline: false, support: { chrome: "86", chrome_android: "132", edge: "86" } }, "api.Window.showOpenFilePicker": { baseline: false, support: { chrome: "86", chrome_android: "132", edge: "86" } }, "api.Window.showSaveFilePicker": { baseline: false,
    support: { chrome: "86", chrome_android: "132", edge: "86" } } }, support: { chrome: "86", chrome_android: "132", edge: "86" } } }, filter: { caniuse: ["css-filters"], compat_features: ["css.properties.filter", "css.properties.filter.blur", "css.properties.filter.brightness", "css.properties.filter.contrast", "css.properties.filter.drop-shadow", "css.properties.filter.grayscale", "css.properties.filter.hue-rotate", "css.properties.filter.invert", "css.properties.filter.opacity", "css.properties.filter.saturate", "css.properties.filter.sepia", "css.types.filter-function", "css.types.filter-function.blur", "css.types.filter-function.brightness", "css.types.filter-function.contrast", "css.types.filter-function.drop-shadow", "css.types.filter-function.grayscale", "css.types.filter-function.hue-rotate", "css.types.filter-function.invert", "css.types.filter-function.opacity", "css.types.filter-function.saturate", "css.types.filter-function.sepia"], description: "The filter CSS property a\
pplies one or more graphic effects to an element. You can use filter functions, such as blur() and drop-shadow(), alone or combined to produce different effects. For instance, filter: blur(2px).", description_html: "The <code>filter</code> CSS property applies one or more graphic effects to an element. You can use filter functions, such as <code>blur()</code> and <code>drop-shadow()</code>, alone or combined to produce different effects. For instance, <code>filter: blur(2px)</code>.", group: ["css"], kind: "feature", name: "filter", spec: ["https://drafts.csswg.org/filter-effects-1/#propdef-filter"], status: { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", by_compat_key: { "css.properties.filter": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.blur": { baseline: "\
high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.brightness": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.contrast": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.drop-shadow": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.fi\
lter.grayscale": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.hue-rotate": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.invert": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.opacity": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } },
    "css.properties.filter.saturate": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.properties.filter.sepia": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } }, "css.types.filter-function": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.blur": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "\
6" } }, "css.types.filter-function.brightness": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.contrast": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.drop-shadow": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.grayscale": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "3\
5", safari: "6", safari_ios: "6" } }, "css.types.filter-function.hue-rotate": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.invert": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.opacity": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.saturate": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "3\
5", firefox_android: "35", safari: "6", safari_ios: "6" } }, "css.types.filter-function.sepia": { baseline: "high", baseline_high_date: "2019-03-07", baseline_low_date: "2016-09-07", support: { chrome: "18", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } } }, support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "35", firefox_android: "35", safari: "9.1", safari_ios: "9.3" } } }, "filter-function": { caniuse: ["css-filter-function"], compat_features: ["css.types.image.filter"], description: "The filter() CSS function applies one or more graphic effects to a CSS image, such as a background image. You can use functions, such as blur() and drop-shadow(), alone or combined to produce different effects. For instance, background: filter(url(image.png), blur(2px)).", description_html: "The <code>filter()</code> CSS function applies one or more graphic effects to a CSS image, such as a background image. You can use functions\
, such as <code>blur()</code> and <code>drop-shadow()</code>, alone or combined to produce different effects. For instance, <code>background: filter(url(image.png), blur(2px))</code>.", group: ["css"], kind: "feature", name: "filter()", spec: ["https://drafts.csswg.org/filter-effects-1/#FilterCSSImageValue"], status: { baseline: false, by_compat_key: { "css.types.image.filter": { baseline: false, support: { safari: "9.1", safari_ios: "9.3" } } }, support: { safari: "9.1", safari_ios: "9.3" } } }, "first-letter": { caniuse: ["css-first-letter"], compat_features: ["css.selectors.first-letter", "css.selectors.first-letter.dutch_ij_digraph", "css.selectors.first-letter.svg_text_element"], description: "The ::first-letter CSS pseudo-element selects the first letter in an element for styling.", description_html: "The <code>::first-letter</code> CSS pseudo-element selects the first letter in an element for styling.", group: ["selectors"], kind: "feature", name: "::first-letter", spec: ["https\
://drafts.csswg.org/css-pseudo-4/#first-letter-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.first-letter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.first-letter.dutch_ij_digraph": { baseline: false, support: { firefox: "87", firefox_android: "87" } }, "css.selectors.first-letter.svg_text_element": { baseline: false, support: { firefox: "124", firefox_android: "124" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "first-line": { caniuse: ["css-first-line"], compat_features: ["css.selectors.first-line", "css.selectors.first-line.svg_text_element"], description: "The ::first-line CSS pseudo-element selects the first line of t\
ext in an element for styling.", description_html: "The <code>::first-line</code> CSS pseudo-element selects the first line of text in an element for styling.", group: ["selectors"], kind: "feature", name: "::first-line", spec: ["https://drafts.csswg.org/css-pseudo-4/#first-line-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.first-line": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.first-line.svg_text_element": { baseline: false, support: { firefox: "124", firefox_android: "124" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "fit-content": { compat_features: ["css.properties.height.fit-content", "css.properties.max-height.fit-c\
ontent", "css.properties.max-width.fit-content", "css.properties.min-height.fit-content", "css.properties.min-width.fit-content", "css.properties.width.fit-content"], description: "The fit-content CSS keyword expands a box as needed to fit its contents until the maximum size is reached, preserving the content's preferred aspect ratio.", description_html: "The <code>fit-content</code> CSS keyword expands a box as needed to fit its contents until the maximum size is reached, preserving the content's preferred aspect ratio.", group: ["layout"], kind: "feature", name: "fit-content", spec: ["https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content"], status: { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", by_compat_key: { "css.properties.height.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "94", firefox_android: "94", safari: "\
11", safari_ios: "11" } }, "css.properties.max-height.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "94", firefox_android: "94", safari: "11", safari_ios: "11" } }, "css.properties.max-width.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "94", firefox_android: "94", safari: "11", safari_ios: "11" } }, "css.properties.min-height.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "94", firefox_android: "94", safari: "11", safari_ios: "11" } }, "css.properties.min-width.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "\
94", firefox_android: "94", safari: "11", safari_ios: "11" } }, "css.properties.width.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "94", firefox_android: "94", safari: "11", safari_ios: "11" } } }, support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "94", firefox_android: "94", safari: "11", safari_ios: "11" } } }, "fit-content-function": { compat_features: ["css.properties.block-size.fit-content_function", "css.properties.height.fit-content_function", "css.properties.inline-size.fit-content_function", "css.properties.max-block-size.fit-content_function", "css.properties.max-height.fit-content_function", "css.properties.max-inline-size.fit-content_function", "css.properties.max-width.fit-content_function", "css.properties.min-block-size.fit-content_function", "css.properties.min-height.fit-content_function", "css.properties.min-inline-size.fit-cont\
ent_function", "css.properties.min-width.fit-content_function", "css.properties.width.fit-content_function"], description: "The fit-content() CSS function, used outside of a grid layout property, clamps a length between min-content and max-content.", description_html: "The <code>fit-content()</code> CSS function, used outside of a grid layout property, clamps a length between <code>min-content</code> and <code>max-content</code>.", group: ["layout"], kind: "feature", name: "fit-content()", spec: ["https://drafts.csswg.org/css-sizing-3/#funcdef-width-fit-content"], status: { baseline: false, by_compat_key: { "css.properties.block-size.fit-content_function": { baseline: false, support: {} }, "css.properties.height.fit-content_function": { baseline: false, support: {} }, "css.properties.inline-size.fit-content_function": { baseline: false, support: {} }, "css.properties.max-block-size.fit-content_function": { baseline: false, support: {} }, "css.properties.max-height.fit-content_function": {
    baseline: false, support: {} }, "css.properties.max-inline-size.fit-content_function": { baseline: false, support: {} }, "css.properties.max-width.fit-content_function": { baseline: false, support: {} }, "css.properties.min-block-size.fit-content_function": { baseline: false, support: {} }, "css.properties.min-height.fit-content_function": { baseline: false, support: {} }, "css.properties.min-inline-size.fit-content_function": { baseline: false, support: {} }, "css.properties.min-width.fit-content_function": { baseline: false, support: {} }, "css.properties.width.fit-content_function": { baseline: false, support: {} } }, support: {} } }, "fixed-positioning": { caniuse: ["css-fixed"], compat_features: ["css.properties.position.fixed"], description: "The position: fixed CSS declaration removes an element from the normal flow and positions it relative to the viewport or page.", description_html: "The <code>position: fixed</code> CSS declaration removes an element from the normal flow \
and positions it relative to the viewport or page.", group: ["positioning"], kind: "feature", name: "Fixed positioning", spec: ["https://drafts.csswg.org/css-position-3/#abspos-insets"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.position.fixed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, flexbox: { caniuse: ["flexbox"], compat_features: ["css.properties.align-content", "css.properties.align-content.flex_context", "css.properties.align-content.flex_context.baseline", "css.properties.align-content.flex_context.first_baseline", "css.properties.align-content.flex_context.last_baseline", "css.properties.alig\
n-content.flex_context.safe_unsafe", "css.properties.align-content.flex_context.space-evenly", "css.properties.align-content.flex_context.start_end", "css.properties.align-content.flex_context.stretch", "css.properties.align-content.normal", "css.properties.align-items", "css.properties.align-items.flex_context", "css.properties.align-items.flex_context.baseline", "css.properties.align-items.flex_context.first_baseline", "css.properties.align-items.flex_context.last_baseline", "css.properties.align-items.flex_context.safe_unsafe", "css.properties.align-items.flex_context.start_end", "css.properties.align-self", "css.properties.align-self.auto", "css.properties.align-self.flex_context", "css.properties.align-self.flex_context.baseline", "css.properties.align-self.flex_context.first_baseline", "css.properties.align-self.flex_context.last_baseline", "css.properties.align-self.flex_context.safe_unsafe", "css.properties.align-self.flex_context.start_end", "css.properties.align-self.flex_con\
text.stretch", "css.properties.align-self.normal", "css.properties.align-self.stretch", "css.properties.display.flex", "css.properties.display.inline-flex", "css.properties.flex", "css.properties.flex-basis", "css.properties.flex-basis.auto", "css.properties.flex-basis.content", "css.properties.flex-basis.fit-content", "css.properties.flex-basis.max-content", "css.properties.flex-basis.min-content", "css.properties.flex-direction", "css.properties.flex-direction.column", "css.properties.flex-direction.column-reverse", "css.properties.flex-direction.row", "css.properties.flex-direction.row-reverse", "css.properties.flex-flow", "css.properties.flex-grow", "css.properties.flex-grow.less_than_zero_animate", "css.properties.flex-shrink", "css.properties.flex-wrap", "css.properties.flex-wrap.nowrap", "css.properties.flex-wrap.wrap", "css.properties.flex-wrap.wrap-reverse", "css.properties.flex.none", "css.properties.justify-content", "css.properties.justify-content.flex_context", "css.proper\
ties.justify-content.flex_context.left_right", "css.properties.justify-content.flex_context.safe_unsafe", "css.properties.justify-content.flex_context.space-evenly", "css.properties.justify-content.flex_context.start_end", "css.properties.justify-content.flex_context.stretch", "css.properties.justify-content.left", "css.properties.justify-content.normal", "css.properties.justify-content.right", "css.properties.justify-items", "css.properties.justify-items.center", "css.properties.justify-items.flex_context", "css.properties.justify-items.left", "css.properties.justify-items.legacy", "css.properties.justify-items.right", "css.properties.order", "css.properties.place-content", "css.properties.place-content.flex_context", "css.properties.place-items", "css.properties.place-items.flex_context", "css.properties.place-self", "css.properties.place-self.flex_context", "css.properties.position.absolutely_positioned_flex_children"], description: "Flexbox is a one-dimensional layout system, which\
 places content either horizontally or vertically, with optional wrapping.", description_html: "Flexbox is a one-dimensional layout system, which places content either horizontally or vertically, with optional wrapping.", group: ["flexbox"], kind: "feature", name: "Flexbox", spec: ["https://drafts.csswg.org/css-flexbox-1/"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "css.properties.align-content": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-content.flex_context": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-content.flex_context.basel\
ine": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "css.properties.align-content.flex_context.first_baseline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "css.properties.align-content.flex_context.last_baseline": { baseline: false, support: { firefox: "52", firefox_android: "52" } }, "css.properties.align-content.flex_context.safe_unsafe": { baseline: "low", baseline_low_date: "2024-07-29", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "63", firefox_android: "63", safari: "17.6", safari_ios: "17.6" } }, "css.properties.align-content.flex_context.space-evenly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "css.properties.align-content.flex_context.start_end": { baseline: "high", baseline_high_date: "2025-01-20", baseline_low_date: "2022-07-20", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "45", firefox_android: "45", safari: "15.6", safari_ios: "15.6" } }, "css.properties.align-content.flex_context.stretch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.align-content.normal": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-items": { baseline: "high",
    baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.align-items.flex_context": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.align-items.flex_context.baseline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-items.flex_context.first_baseline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "\
11" } }, "css.properties.align-items.flex_context.last_baseline": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "52", firefox_android: "52", safari: "16.2", safari_ios: "16.2" } }, "css.properties.align-items.flex_context.safe_unsafe": { baseline: "low", baseline_low_date: "2024-07-29", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "63", firefox_android: "63", safari: "17.6", safari_ios: "17.6" } }, "css.properties.align-items.flex_context.start_end": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "45", firefox_android: "45", safari: "15.4", safari_ios: "15.4" } }, "css.properties.align-self": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "\
20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.align-self.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-self.flex_context": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.align-self.flex_context.baseline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-self.flex_context.first_baseline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
59", chrome_android: "59", edge: "79", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "css.properties.align-self.flex_context.last_baseline": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "52", firefox_android: "52", safari: "16.2", safari_ios: "16.2" } }, "css.properties.align-self.flex_context.safe_unsafe": { baseline: "low", baseline_low_date: "2024-07-29", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "63", firefox_android: "63", safari: "17.6", safari_ios: "17.6" } }, "css.properties.align-self.flex_context.start_end": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "45", firefox_android: "45", safari: "15.4", safari_ios: "15.4" } }, "css.properties.align-self.flex_context.stretch": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.align-self.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.align-self.stretch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.display.flex": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.display.inline-flex": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.flex": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.flex-basis": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.flex-basis.auto": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.flex-basis.content": { baseline: "high", baseline_high_date: "2024-\
09-14", baseline_low_date: "2022-03-14", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "61", firefox_android: "61", safari: "15.4", safari_ios: "15.4" } }, "css.properties.flex-basis.fit-content": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "94", firefox_android: "94", safari: "16", safari_ios: "16" } }, "css.properties.flex-basis.max-content": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "66", firefox_android: "66", safari: "16", safari_ios: "16" } }, "css.properties.flex-basis.min-content": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "66", firefox_android: "66", safari: "16", safari_ios: "16" } }, "css.properties.flex-direction": { baseline: "\
high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.flex-direction.column": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.flex-direction.column-reverse": { baseline: "high", baseline_high_date: "2023-03-22", baseline_low_date: "2020-09-22", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "81", firefox_android: "81", safari: "9", safari_ios: "9" } }, "css.properties.flex-direction.row": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.\
flex-direction.row-reverse": { baseline: "high", baseline_high_date: "2023-03-22", baseline_low_date: "2020-09-22", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "81", firefox_android: "81", safari: "9", safari_ios: "9" } }, "css.properties.flex-flow": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.flex-grow": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.flex-grow.less_than_zero_animate": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "32", firefox_android: "32" } }, "css.properties.flex-shrink": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "\
2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.flex-wrap": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.flex-wrap.nowrap": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.flex-wrap.wrap": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.flex-wrap.wrap-reverse": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "\
2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "28", firefox_android: "28", safari: "9", safari_ios: "9" } }, "css.properties.flex.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.justify-content": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-content.flex_context": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-content.flex_context.left_right": { baseline: "high", baseline_high_date: "\
2024-03-02", baseline_low_date: "2021-09-02", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.justify-content.flex_context.safe_unsafe": { baseline: "low", baseline_low_date: "2024-07-29", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "63", firefox_android: "63", safari: "17.6", safari_ios: "17.6" } }, "css.properties.justify-content.flex_context.space-evenly": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "css.properties.justify-content.flex_context.start_end": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "45", firefox_android: "45", safari: "15.4", safari_ios: "15.4" } }, "css.proper\
ties.justify-content.flex_context.stretch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.justify-content.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-content.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-content.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "20", firefox_android: "20",
    safari: "9", safari_ios: "9" } }, "css.properties.justify-items": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-items.center": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-items.flex_context": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-items.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "\
20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-items.legacy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.justify-items.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.order": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } }, "css.properties.place-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "\
45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "css.properties.place-content.flex_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "45", firefox_android: "45", safari: "9", safari_ios: "9" } }, "css.properties.place-items": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "css.properties.place-items.flex_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "css.properties.place-self": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59",
    edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "css.properties.place-self.flex_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "css.properties.position.absolutely_positioned_flex_children": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } } }, support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "20", firefox_android: "20", safari: "9", safari_ios: "9" } } }, "flexbox-gap": { caniuse: ["flexbox-gap"], compat_features: ["css.properties.column-gap.flex_context", "css.properties.gap.flex_context", "css.properties.row-gap.flex_context"], description: "The gap CSS property in a flexbox layo\
ut sets the size of the space between items.", description_html: "The <code>gap</code> CSS property in a flexbox layout sets the size of the space between items.", group: ["flexbox"], kind: "feature", name: "Flexbox gap", spec: ["https://drafts.csswg.org/css-align-3/#gaps"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "css.properties.column-gap.flex_context": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.gap.flex_context": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.row-gap.flex_context": { baseline: "high", baseline_high_date: "2023-10\
-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } } }, "float-clear": { compat_features: ["css.properties.clear", "css.properties.clear.both", "css.properties.clear.left", "css.properties.clear.none", "css.properties.clear.right", "css.properties.float", "css.properties.float.left", "css.properties.float.none", "css.properties.float.right"], description: "The float CSS property aligns an element to either side of its container, allowing text and inline elements to flow around it. The clear CSS property sets whether an element is moved below floating elements that proceed it.", description_html: "The <code>float</code> CSS property aligns an element to either side of its container, allowing text and inline elements to flow around\
 it. The <code>clear</code> CSS property sets whether an element is moved below floating elements that proceed it.", group: ["css"], kind: "feature", name: "float and clear", spec: ["https://drafts.csswg.org/css2/#propdef-float", "https://drafts.csswg.org/css2/#propdef-clear"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.clear.both": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.clear.left": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.clear.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.clear.right": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.float": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.float.left": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.float.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.float.right": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, float16array: { compat_features: ["javascript.builtins.DataView.getFloat16", "javascript.builtins.DataView.setFloat16", "javascript.builtins.Float16Array", "javascript.builtins.Float16Array.Float16Array", "javascript.builtins.Math.f16round"], description: "Float16Array is a typed array of 16\
-bit floating point numbers.", description_html: "Float16Array is a typed array of 16-bit floating point numbers.", group: ["typed-arrays"], kind: "feature", name: "Float16Array", spec: ["https://tc39.es/ecma262/multipage/global-object.html#sec-float16array"], status: { baseline: "low", baseline_low_date: "2025-04-04", by_compat_key: { "javascript.builtins.DataView.getFloat16": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.DataView.setFloat16": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Float16Array": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "129", firefox_android: "129",
    safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Float16Array.Float16Array": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Math.f16round": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } } }, "focus-events": { compat_features: ["api.Element.blur_event", "api.Element.focus_event", "api.Element.focusin_event", "api.Element.focusout_event", "api.FocusEvent", "api.FocusEvent.FocusEvent", "api.FocusEvent.relatedTarget", "api.HTMLElement.blur", "api.HTMLElement.focus", "api.HTMLElement.focus.options_focusVisible_parameter", "api\
.HTMLElement.focus.options_preventScroll_parameter"], description: "Focus events, such as focus and blur, fire when an element gets or loses focus.", description_html: "Focus events, such as <code>focus</code> and <code>blur</code>, fire when an element gets or loses focus.", kind: "feature", name: "Focus events", spec: ["https://w3c.github.io/uievents/#events-focusevent"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Element.blur_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "2" } }, "api.Element.focus_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "24", firefox_android: "24", safari: "3.1", safari_ios: "2" } }, "api.Element.focusin_e\
vent": { baseline: false, support: { safari: "5", safari_ios: "4.2" } }, "api.Element.focusout_event": { baseline: false, support: { safari: "5", safari_ios: "4.2" } }, "api.FocusEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "24", firefox_android: "24", safari: "7", safari_ios: "7" } }, "api.FocusEvent.FocusEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "24", firefox_android: "24", safari: "7", safari_ios: "7" } }, "api.FocusEvent.relatedTarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "24", firefox_android: "24", safari: "7", safari_ios: "7" } }, "api.HTMLElement.blur": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.focus": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLElement.focus.options_focusVisible_parameter": { baseline: "low", baseline_low_date: "2026-02-14", support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "104", firefox_android: "104", safari: "18.4", safari_ios: "18.4" } }, "api.HTMLElement.focus.options_preventScroll_parameter": { baseline: false, support: { chrome: "64", edge: "17", firefox: "68", safari: "15", safari_ios: "15.5" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "24", firefox_android: "24", safari: "3.1", safari_ios: "2" } } }, "focus-visible": { caniuse: ["css-focus-visible"], compat_features: [
    "css.selectors.focus-visible"], description: "The :focus-visible CSS pseudo-class selects elements that match the :focus pseudo-class and meets the browser's criteria for visually emphasizing focused elements.", description_html: "The <code>:focus-visible</code> CSS pseudo-class selects elements that match the <code>:focus</code> pseudo-class and meets the browser's criteria for visually emphasizing focused elements.", group: ["selectors"], kind: "feature", name: ":focus-visible", spec: ["https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.selectors.focus-visible": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "85", firefox_android: "85", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "\
85", firefox_android: "85", safari: "15.4", safari_ios: "15.4" } } }, "focus-within": { caniuse: ["css-focus-within"], compat_features: ["css.selectors.focus-within"], description: "The :focus-within CSS pseudo-class matches an element if the element or any of its children are focused.", description_html: "The <code>:focus-within</code> CSS pseudo-class matches an element if the element or any of its children are focused.", group: ["selectors"], kind: "feature", name: ":focus-within", spec: ["https://drafts.csswg.org/selectors-4/#the-focus-within-pseudo"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.focus-within": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "\
52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, focusgroup: { description: "The focusgroup global HTML attribute combines descendant elements into a single tab stop, with arrow-key navigation between them, for toolbars, tabs, menus, radio groups, and other composite controls. It's an alternative to the sequential navigation of tabindex.", description_html: "The <code>focusgroup</code> global HTML attribute combines descendant elements into a single tab stop, with arrow-key navigation between them, for toolbars, tabs, menus, radio groups, and other composite controls. It's an alternative to the sequential navigation of <code>tabindex</code>.", group: ["html", "reading-order"], kind: "feature", name: "focusgroup", spec: ["https://github.com/whatwg/html/pull/11723"], status: { baseline: false, support: {} } }, "font-display": { caniuse: ["css-font-rendering-controls"], compat_features: ["css.at-rules.font-face.font-display"], description: "The font-display CSS descri\
ptor sets whether to show a substitute font or nothing while a font face loads. The property manages what's known as a flash of unstyled text or flash of invisible text.", description_html: "The <code>font-display</code> CSS descriptor sets whether to show a substitute font or nothing while a font face loads. The property manages what's known as a flash of unstyled text or flash of invisible text.", group: ["fonts"], kind: "feature", name: "font-display", spec: ["https://drafts.csswg.org/css-fonts-4/#font-display-desc"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.at-rules.font-face.font-display": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "58", firefox_android: "58", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "58", firefox_android: "58",
    safari: "11.1", safari_ios: "11.3" } } }, "font-face": { caniuse: ["fontface", "font-unicode-range"], compat_features: ["api.CSSFontFaceRule", "api.CSSFontFaceRule.style", "css.at-rules.font-face", "css.at-rules.font-face.OpenType_CBDT_CBLC", "css.at-rules.font-face.OpenType_SBIX", "css.at-rules.font-face.WOFF", "css.at-rules.font-face.WOFF_2", "css.at-rules.font-face.font-family", "css.at-rules.font-face.src", "css.at-rules.font-face.src.drop_invalid_item", "css.at-rules.font-face.src.format_keyword", "css.at-rules.font-face.src.format_variations", "css.at-rules.font-face.src.tech_keyword", "css.at-rules.font-face.unicode-range", "css.types.url"], description: "The @font-face CSS at-rule creates a custom font-family value. The at-rule's descriptors set the font's name, source, and various display settings.", description_html: "The <code>@font-face</code> CSS at-rule creates a custom <code>font-family</code> value. The at-rule's descriptors set the font's name, source, and various \
display settings.", group: ["fonts"], kind: "feature", name: "@font-face", spec: ["https://drafts.csswg.org/css-fonts-5/#font-face-rule"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "api.CSSFontFaceRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.CSSFontFaceRule.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.at-rules.font-face": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.at-rules.\
font-face.OpenType_CBDT_CBLC": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "css.at-rules.font-face.OpenType_SBIX": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-face.WOFF": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.at-rules.font-face.WOFF_2": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "39", firefox_android: "39", safari: "10", safari_ios: "10" } }, "css.at-rules.font-face.font-family": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "\
3.1", safari_ios: "2" } }, "css.at-rules.font-face.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.at-rules.font-face.src.drop_invalid_item": { baseline: false, support: { firefox: "109", firefox_android: "109" } }, "css.at-rules.font-face.src.format_keyword": { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "105", firefox_android: "105", safari: "4", safari_ios: "5" } }, "css.at-rules.font-face.src.format_variations": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "66", chrome_android: "66", edge: "17", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "css.at-rules.font-face.src.tech_keyword": { baseline: "high", baseline_high_date: "\
2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "107", firefox_android: "107", safari: "17", safari_ios: "17" } }, "css.at-rules.font-face.unicode-range": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "36", firefox_android: "36", safari: "3.1", safari_ios: "3" } }, "css.types.url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "36", chrome_android: "36", edge: "14", firefox: "39", firefox_android: "39", safari: "10", safari_ios: "10" } } }, "font-family": { compat_features: ["css.properties.font-family", "css.properties.font-family.cursive", "css.properties.font-family.fantasy", "css.properties.font-family.monospace", "css.pr\
operties.font-family.sans-serif", "css.properties.font-family.serif", "svg.global_attributes.font-family"], description: "The font-family CSS property sets the desired font face for text, along with optional fallback font faces.", description_html: "The <code>font-family</code> CSS property sets the desired font face for text, along with optional fallback font faces.", group: ["fonts"], kind: "feature", name: "font-family", spec: ["https://drafts.csswg.org/css-fonts-4/#font-family-prop"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.font-family": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-family.cursive": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-family.fantasy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-family.monospace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-family.sans-serif": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-family.serif": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.font-family": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "font-family-math": { compat_features: ["css.properties.font-family.math"], description: "The font-family: math CSS declaration uses the browser default font face for displaying mathematical expressions.", description_html: "The <code>font-family: math</code> CSS declaration uses the browser default font face for displaying mathematical expressions.", group: ["mathml", "css"], kind: "feature", name: "Math font family", spec: ["https://drafts.csswg.org/css-fonts-4/#math-def"], status: { baseline: "low", baseline_low_date: "2\
026-03-24", by_compat_key: { "css.properties.font-family.math": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "149", firefox_android: "149", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "149", firefox_android: "149", safari: "26.2", safari_ios: "26.2" } } }, "font-family-system": { caniuse: ["font-family-system-ui"], compat_features: ["css.properties.font-family.system-ui"], description: "The font-family: system-ui CSS declaration uses the operating system default font for text.", description_html: "The <code>font-family: system-ui</code> CSS declaration uses the operating system default font for text.", kind: "feature", name: "System font", spec: ["https://drafts.csswg.org/css-fonts-4/#system-ui-def"], status: { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", by_compat_key: { "css.properties.font-family.sy\
stem-ui": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "92", firefox_android: "92", safari: "11", safari_ios: "11" } } }, support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "92", firefox_android: "92", safari: "11", safari_ios: "11" } } }, "font-family-ui": { caniuse: ["extended-system-fonts"], compat_features: ["css.properties.font-family.ui-monospace", "css.properties.font-family.ui-rounded", "css.properties.font-family.ui-sans-serif", "css.properties.font-family.ui-serif"], description: "The ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for the font-family CSS property use device-default user interface fonts for text.", description_html: "The <code>ui-serif</code>, <code>ui-sans-serif</code>, <code>ui-monospace</code> and <code>ui-rounded</code> values for the <code>font-family</code> CSS property use device-default user interface fonts for tex\
t.", group: ["fonts"], kind: "feature", name: "UI fonts", spec: ["https://drafts.csswg.org/css-fonts-4/#ui-serif-def"], status: { baseline: false, by_compat_key: { "css.properties.font-family.ui-monospace": { baseline: false, support: { safari: "13.1", safari_ios: "13.4" } }, "css.properties.font-family.ui-rounded": { baseline: false, support: { safari: "13.1", safari_ios: "13.4" } }, "css.properties.font-family.ui-sans-serif": { baseline: false, support: { safari: "13.1", safari_ios: "13.4" } }, "css.properties.font-family.ui-serif": { baseline: false, support: { safari: "13.1", safari_ios: "13.4" } } }, support: { safari: "13.1", safari_ios: "13.4" } } }, "font-feature-settings": { caniuse: ["font-feature"], compat_features: ["css.at-rules.font-face.font-feature-settings", "css.properties.font-feature-settings", "css.properties.font-feature-settings.normal"], description: "The font-feature-settings CSS property sets low-level OpenType feature tags for a font. When possible, use font-\
variant instead.", description_html: "The <code>font-feature-settings</code> CSS property sets low-level OpenType feature tags for a font. When possible, use <code>font-variant</code> instead.", group: ["font-features"], kind: "feature", name: "font-feature-settings", spec: ["https://drafts.csswg.org/css-fonts-4/#font-feature-settings-prop"], status: { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", by_compat_key: { "css.at-rules.font-face.font-feature-settings": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "34", firefox_android: "34", safari: "10", safari_ios: "10" } }, "css.properties.font-feature-settings": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "48", chrome_android: "48", edge: "15", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-feature-settings.normal": {
    baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "48", chrome_android: "48", edge: "15", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "48", chrome_android: "48", edge: "15", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, "font-kerning": { caniuse: ["font-kerning"], compat_features: ["css.properties.font-kerning", "css.properties.font-kerning.auto", "css.properties.font-kerning.none", "css.properties.font-kerning.normal"], description: "The font-kerning CSS property sets whether kerning data from a font is used to adjust the space between letters.", description_html: "The <code>font-kerning</code> CSS property sets whether kerning data from a font is used to adjust the space between letters.", group: ["font-features"], kind: "feature", name: "font-kerning", spec: ["https://drafts.csswg.org/css-fonts-4/#font-kerning-prop"], status: { baseline: "hig\
h", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.font-kerning": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } }, "css.properties.font-kerning.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } }, "css.properties.font-kerning.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } }, "css.properties.font-kerning.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "\
33", edge: "79", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } } }, support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "32", firefox_android: "32", safari: "9", safari_ios: "9" } } }, "font-language-override": { compat_features: ["css.properties.font-language-override"], description: "The font-language-override CSS property sets which language-specific glyphs are displayed.", description_html: "The <code>font-language-override</code> CSS property sets which language-specific glyphs are displayed.", group: ["font-features"], kind: "feature", name: "font-language-override", spec: ["https://drafts.csswg.org/css-fonts-4/#font-language-override-prop"], status: { baseline: false, by_compat_key: { "css.properties.font-language-override": { baseline: false, support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "34", firefox_android: "34" } } }, support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "34", firefox_android: "\
34" } } }, "font-loading": { caniuse: ["font-loading"], compat_features: ["api.Document.fonts", "api.FontFace", "api.FontFace.FontFace", "api.FontFace.display", "api.FontFace.family", "api.FontFace.featureSettings", "api.FontFace.load", "api.FontFace.loaded", "api.FontFace.status", "api.FontFace.stretch", "api.FontFace.style", "api.FontFace.unicodeRange", "api.FontFace.variant", "api.FontFace.variationSettings", "api.FontFace.weight", "api.FontFace.worker_support", "api.FontFaceSet", "api.FontFaceSet.@@iterator", "api.FontFaceSet.add", "api.FontFaceSet.check", "api.FontFaceSet.clear", "api.FontFaceSet.delete", "api.FontFaceSet.entries", "api.FontFaceSet.forEach", "api.FontFaceSet.has", "api.FontFaceSet.keys", "api.FontFaceSet.load", "api.FontFaceSet.loading_event", "api.FontFaceSet.loadingdone_event", "api.FontFaceSet.loadingerror_event", "api.FontFaceSet.ready", "api.FontFaceSet.size", "api.FontFaceSet.status", "api.FontFaceSet.values", "api.FontFaceSet.worker_support", "api.FontFaceS\
etLoadEvent", "api.FontFaceSetLoadEvent.FontFaceSetLoadEvent", "api.FontFaceSetLoadEvent.fontfaces", "api.FontFaceSetLoadEvent.worker_support", "api.WorkerGlobalScope.fonts"], description: "The document.fonts API dynamically loads custom fonts and tracks when fonts are loading or ready to use.", description_html: "The <code>document.fonts</code> API dynamically loads custom fonts and tracks when fonts are loading or ready to use.", kind: "feature", name: "Font loading", spec: ["https://drafts.csswg.org/css-font-loading-3/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Document.fonts": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.FontFace": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.display": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "58", firefox_android: "58", safari: "11.1", safari_ios: "11.3" } }, "api.FontFace.family": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.featureSettings": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "\
41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.load": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.loaded": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.status": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.stretch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "\
10", safari_ios: "10" } }, "api.FontFace.style": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.unicodeRange": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.variant": { baseline: false, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41" } }, "api.FontFace.variationSettings": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "62", firefox_android: "62" } }, "api.FontFace.weight": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41",
    firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFace.worker_support": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "15", safari_ios: "15" } }, "api.FontFaceSet": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.@@iterator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.add": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "\
41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.check": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.clear": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.delete": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.entries": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.Fon\
tFaceSet.forEach": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.has": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.keys": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.load": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.loading_event": {
    baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "26.2", safari_ios: "26.2" } }, "api.FontFaceSet.loadingdone_event": { baseline: false, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41" } }, "api.FontFaceSet.loadingerror_event": { baseline: false, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41" } }, "api.FontFaceSet.ready": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.\
FontFaceSet.status": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.values": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "api.FontFaceSet.worker_support": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "15", safari_ios: "15" } }, "api.FontFaceSetLoadEvent": { baseline: false, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41" } }, "api.FontFaceSetLoadEvent.FontFaceSetLoadEvent": { baseline: false, support: { chrome: "57", chrome_android: "\
57", edge: "79", firefox: "41", firefox_android: "41" } }, "api.FontFaceSetLoadEvent.fontfaces": { baseline: false, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41" } }, "api.FontFaceSetLoadEvent.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WorkerGlobalScope.fonts": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "15", safari_ios: "15" } } }, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } } }, "font-metric-overrides": { compat_features: ["api.FontFace.ascentOverride", "api.FontFace.descentOverride", "api.FontFace.lineGapOverride", "css.at-rules.font-face.ascent-override", "css.at-rules.font-face.descent-override", "css.at-rules.font-face.line-gap-override"], description: "\
The ascent-override, descent-override, and line-gap-override descriptors adjust the display of a font declared in an @font-face statement. This can help make fallback fonts look the same size.", description_html: "The <code>ascent-override</code>, <code>descent-override</code>, and <code>line-gap-override</code> descriptors adjust the display of a font declared in an <code>@font-face</code> statement. This can help make fallback fonts look the same size.", group: ["fonts"], kind: "feature", name: "Font metric overrides", spec: ["https://drafts.csswg.org/css-fonts-4/#font-metrics-override-desc"], status: { baseline: false, by_compat_key: { "api.FontFace.ascentOverride": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } }, "api.FontFace.descentOverride": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } }, "api.FontFace.lineGapOverride": { baseline: false,
    support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } }, "css.at-rules.font-face.ascent-override": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } }, "css.at-rules.font-face.descent-override": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } }, "css.at-rules.font-face.line-gap-override": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } } }, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "89", firefox_android: "89" } } }, "font-optical-sizing": { compat_features: ["css.properties.font-optical-sizing", "css.properties.font-optical-sizing.auto", "css.properties.font-optical-sizing.none"], description: "The font-optical-sizing CSS property sets whether text rendering is optimized for viewing at different sizes.", description_html: "\
The <code>font-optical-sizing</code> CSS property sets whether text rendering is optimized for viewing at different sizes.", group: ["fonts"], kind: "feature", name: "font-optical-sizing", spec: ["https://drafts.csswg.org/css-fonts-4/#font-optical-sizing-def"], status: { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", by_compat_key: { "css.properties.font-optical-sizing": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "79", chrome_android: "79", edge: "17", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } }, "css.properties.font-optical-sizing.auto": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "79", chrome_android: "79", edge: "17", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } }, "css.properties.font-optical-sizing.none": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "\
2020-03-24", support: { chrome: "79", chrome_android: "79", edge: "17", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "79", chrome_android: "79", edge: "17", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } } }, "font-palette": { caniuse: ["css-font-palette"], compat_features: ["api.CSSFontPaletteValuesRule", "api.CSSFontPaletteValuesRule.basePalette", "api.CSSFontPaletteValuesRule.fontFamily", "api.CSSFontPaletteValuesRule.name", "api.CSSFontPaletteValuesRule.overrideColors", "css.at-rules.font-palette-values", "css.at-rules.font-palette-values.base-palette", "css.at-rules.font-palette-values.font-family", "css.at-rules.font-palette-values.override-colors", "css.properties.font-palette", "css.properties.font-palette.dark", "css.properties.font-palette.light", "css.properties.font-palette.normal"], description: "The font-palette CSS property selects a color palette from the font, optionally overriding indivi\
dual colors in the @font-palette-values at-rule.", description_html: "The <code>font-palette</code> CSS property selects a color palette from the font, optionally overriding individual colors in the <code>@font-palette-values</code> at-rule.", group: ["fonts"], kind: "feature", name: "font-palette", spec: ["https://drafts.csswg.org/css-fonts-4/#font-palette-prop", "https://drafts.csswg.org/css-fonts-4/#font-palette-values"], status: { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", by_compat_key: { "api.CSSFontPaletteValuesRule": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "api.CSSFontPaletteValuesRule.basePalette": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "\
107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "api.CSSFontPaletteValuesRule.fontFamily": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "api.CSSFontPaletteValuesRule.name": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "api.CSSFontPaletteValuesRule.overrideColors": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.at-rules.font-palette-values": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-1\
1-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.at-rules.font-palette-values.base-palette": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.at-rules.font-palette-values.font-family": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.at-rules.font-palette-values.override-colors": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.properties\
.font-palette": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.properties.font-palette.dark": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.properties.font-palette.light": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } }, "css.properties.font-palette.normal": { baseline: "high", baseline_high_date: "2025-05-15", baseline_low_date: "2022-11-15", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107",
    safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "107", firefox_android: "107", safari: "15.4", safari_ios: "15.4" } } }, "font-palette-animation": { compat_features: ["css.properties.font-palette.animation_computed", "css.properties.font-palette.palette-mix_function"], description: "You can animate color fonts between two font-palette values.", description_html: "You can animate color fonts between two <code>font-palette</code> values.", group: ["fonts"], kind: "feature", name: "font-palette animation", spec: ["https://drafts.csswg.org/css-fonts-4/#font-palette-prop"], status: { baseline: false, by_compat_key: { "css.properties.font-palette.animation_computed": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "css.properties.font-palette.palette-mix_function": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } } }, support: { chrome: "121", chrome_android: "\
121", edge: "121" } } }, "font-shorthand": { compat_features: ["css.properties.font", "css.properties.font.caption", "css.properties.font.icon", "css.properties.font.menu", "css.properties.font.message-box", "css.properties.font.small-caption", "css.properties.font.status-bar"], description: "The font CSS property shorthand sets multiple font properties, including style, weight, size, and font family.", description_html: "The <code>font</code> CSS property shorthand sets multiple font properties, including style, weight, size, and font family.", group: ["fonts"], kind: "feature", name: "Font shorthand", spec: ["https://drafts.csswg.org/css-fonts-4/#font-prop"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.font": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "css.properties.font.caption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font.icon": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font.menu": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font.message-box": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.prope\
rties.font.small-caption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font.status-bar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "font-size": { compat_features: ["css.properties.font-size", "css.properties.font-size.rem_values", "css.properties.font-size.xxx-large", "svg.global_attributes.font-size"], description: "The font-size CSS property sets the text height.", description_html: "The <code>font-size</code> CSS property sets the text height.", group: ["fonts"], kind: "feature", name: "font-size", spec: [
    "https://drafts.csswg.org/css-fonts-4/#font-size-prop"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.font-size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-size.rem_values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "42", edge: "12", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "css.properties.font-size.xxx-large": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "70", firefox_android: "79", safari: "16.4", safari_ios: "16.4" } }, "svg.global_attributes.font-size": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "font-size-adjust": { caniuse: ["font-size-adjust"], compat_features: ["css.at-rules.font-face.size-adjust", "css.properties.font-size-adjust", "css.properties.font-size-adjust.from-font", "css.properties.font-size-adjust.none", "css.properties.font-size-adjust.two-values", "svg.global_attributes.font-size-adjust"], description: "The font-size-adjust CSS property preserves apparent text size, regardless of the font used, by scaling fonts to the same size with respect to a specific metric, such as x-height. This can help make fallback fonts look the same size.", description_html: "The <code>font-size-adjust</code> CSS property preserves apparent text size, regardless of the font used, b\
y scaling fonts to the same size with respect to a specific metric, such as x-height. This can help make fallback fonts look the same size.", group: ["fonts"], kind: "feature", name: "font-size-adjust", spec: ["https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop"], status: { baseline: "low", baseline_low_date: "2024-07-25", by_compat_key: { "css.at-rules.font-face.size-adjust": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "92", firefox_android: "92", safari: "17", safari_ios: "17" } }, "css.properties.font-size-adjust": { baseline: "low", baseline_low_date: "2024-07-25", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "3", firefox_android: "4", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-size-adjust.from-font": { baseline: "low", baseline_low_date: "2024-07-25", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "\
118", firefox_android: "118", safari: "17", safari_ios: "17" } }, "css.properties.font-size-adjust.none": { baseline: "low", baseline_low_date: "2024-07-25", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "3", firefox_android: "4", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-size-adjust.two-values": { baseline: "low", baseline_low_date: "2024-07-25", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "92", firefox_android: "92", safari: "17", safari_ios: "17" } }, "svg.global_attributes.font-size-adjust": { baseline: "low", baseline_low_date: "2024-07-25", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "3", firefox_android: "4", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "118", firefox_android: "118", safari: "17", safari_ios: "17" } } }, "font-stretch": { caniuse: ["css-font-stretch"], compat_features: ["css.at-rules.font-face.font-\
stretch", "css.properties.font-stretch", "css.properties.font-stretch.condensed", "css.properties.font-stretch.expanded", "css.properties.font-stretch.extra-condensed", "css.properties.font-stretch.extra-expanded", "css.properties.font-stretch.normal", "css.properties.font-stretch.percentage", "css.properties.font-stretch.semi-condensed", "css.properties.font-stretch.semi-expanded", "css.properties.font-stretch.ultra-condensed", "css.properties.font-stretch.ultra-expanded", "css.properties.font.font-width_keyword_values"], description: "The font-stretch CSS property selects a font face from a font family based on width, either by a keyword such as condensed or a percentage.", description_html: "The <code>font-stretch</code> CSS property selects a font face from a font family based on width, either by a keyword such as <code>condensed</code> or a percentage.", group: ["fonts"], kind: "feature", name: "font-stretch", spec: ["https://drafts.csswg.org/css-fonts-4/#font-stretch-prop"], status: {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.at-rules.font-face.font-stretch": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "62", chrome_android: "62", edge: "17", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.font-stretch": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.condensed": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.expanded": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-1\
9", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.extra-condensed": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.extra-expanded": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.normal": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.percentage": { baseline: "high", baseline_high_date: "\
2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "62", chrome_android: "62", edge: "18", firefox: "61", firefox_android: "61", safari: "11.1", safari_ios: "11.3" } }, "css.properties.font-stretch.semi-condensed": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.semi-expanded": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stretch.ultra-condensed": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font-stre\
tch.ultra-expanded": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "11", safari_ios: "11" } }, "css.properties.font.font-width_keyword_values": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "43", firefox_android: "43", safari: "11", safari_ios: "11" } } }, support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "62", firefox_android: "62", safari: "11.1", safari_ios: "11.3" } } }, "font-style": { compat_features: ["css.at-rules.font-face.font-style", "css.properties.font-style", "css.properties.font-style.italic", "css.properties.font-style.normal", "css.properties.font-style.oblique", "css.properties.font-style.oblique-angle", "svg.global_attributes.font-style"], description: "The font-style CSS property sets the text style,\
 with normal, italic, and oblique options.", description_html: "The <code>font-style</code> CSS property sets the text style, with <code>normal</code>, <code>italic</code>, and <code>oblique</code> options.", group: ["fonts"], kind: "feature", name: "font-style", spec: ["https://drafts.csswg.org/css-fonts-4/#font-style-prop"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.at-rules.font-face.font-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.properties.font-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-style.italic": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-style.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-style.oblique": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-style.oblique-angle": { baseline: false, support: { firefox: "61", firefox_android: "61" } }, "svg.global_attributes.font-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "font-synthesis": { compat_features: ["css.properties.font-synthesis", "css.properties.font-synthesis.position", "css.properties.font-synthesis.small-caps", "css.properties.font-synthesis.style", "css.properties.font-synthesis.weight"], description: "The font-synthesis CSS shorthand property disables all font synthesis except the given kinds. To disable a specific kind of font synthesis, instead use the longhand properties such as font-synthesis-style and font-synthesis-weight.", description_html: "The <code>font-synthesis</code> CSS shorthand property disables all font synthesis except the given kinds. To disable a specific kind of font synthesis, instead use the longhand properties such as <code>font-synthesis-style</code> and <code>font-synthesis-weight</code>.", group: ["font-synthesis"], kind: "feature", name: "fo\
nt-synthesis", spec: ["https://drafts.csswg.org/css-fonts-4/#font-synthesis"], status: { baseline: "high", baseline_high_date: "2024-07-06", baseline_low_date: "2022-01-06", by_compat_key: { "css.properties.font-synthesis": { baseline: "high", baseline_high_date: "2024-07-06", baseline_low_date: "2022-01-06", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "css.properties.font-synthesis.position": { baseline: false, support: { firefox: "118", firefox_android: "118" } }, "css.properties.font-synthesis.small-caps": { baseline: "high", baseline_high_date: "2024-07-06", baseline_low_date: "2022-01-06", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "93", firefox_android: "93", safari: "10.1", safari_ios: "10.3" } }, "css.properties.font-synthesis.style": { baseline: "high", baseline_high_date: "2024-07-06", baseline_low_date: "2022-01-06", support: { chrome: "97", chrome_android: "97", edge: "\
97", firefox: "34", firefox_android: "34", safari: "10.1", safari_ios: "10.3" } }, "css.properties.font-synthesis.weight": { baseline: "high", baseline_high_date: "2024-07-06", baseline_low_date: "2022-01-06", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "34", firefox_android: "34", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } } }, "font-synthesis-position": { compat_features: ["css.properties.font-synthesis-position", "css.properties.font-synthesis-position.auto", "css.properties.font-synthesis-position.none"], description: "The font-synthesis-position CSS property sets whether or not the browser should synthesize subscript and superscript typefaces when they're missing from the font.", description_html: "The <code>font-synthesis-position</code> CSS property sets whether or not the browser should synthesize subscript and superscript typefa\
ces when they're missing from the font.", group: ["font-synthesis"], kind: "feature", name: "font-synthesis-position", spec: ["https://drafts.csswg.org/css-fonts-4/#font-synthesis-position"], status: { baseline: false, by_compat_key: { "css.properties.font-synthesis-position": { baseline: false, support: { firefox: "118", firefox_android: "118" } }, "css.properties.font-synthesis-position.auto": { baseline: false, support: { firefox: "118", firefox_android: "118" } }, "css.properties.font-synthesis-position.none": { baseline: false, support: { firefox: "118", firefox_android: "118" } } }, support: { firefox: "118", firefox_android: "118" } } }, "font-synthesis-small-caps": { compat_features: ["css.properties.font-synthesis-small-caps", "css.properties.font-synthesis-small-caps.auto", "css.properties.font-synthesis-small-caps.none"], description: "The font-synthesis-small-caps CSS property sets whether or not the browser should synthesize small caps typefaces when they're missing from t\
he font.", description_html: "The <code>font-synthesis-small-caps</code> CSS property sets whether or not the browser should synthesize small caps typefaces when they're missing from the font.", group: ["font-synthesis"], kind: "feature", name: "font-synthesis-small-caps", spec: ["https://drafts.csswg.org/css-fonts-4/#font-synthesis-small-caps"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "css.properties.font-synthesis-small-caps": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-synthesis-small-caps.auto": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } },
    "css.properties.font-synthesis-small-caps.none": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } } }, "font-synthesis-style": { compat_features: ["css.properties.font-synthesis-style", "css.properties.font-synthesis-style.auto", "css.properties.font-synthesis-style.none"], description: "The font-synthesis-style CSS property sets whether or not the browser should synthesize italic and oblique typefaces when they're missing from the font.", description_html: "The <code>font-synthesis-style</code> CSS property sets whether or not the browser should synthesize italic and oblique typefaces when they're missing from the font.", group: ["font-synthesis"], kind: "feature", name: "\
font-synthesis-style", spec: ["https://drafts.csswg.org/css-fonts-4/#font-synthesis-style"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "css.properties.font-synthesis-style": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-synthesis-style.auto": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-synthesis-style.none": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "1\
6.4" } } }, support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } } }, "font-synthesis-weight": { compat_features: ["css.properties.font-synthesis-weight", "css.properties.font-synthesis-weight.auto", "css.properties.font-synthesis-weight.none"], description: "The font-synthesis-weight CSS property sets whether or not the browser should synthesize bold typefaces when they're missing from the font.", description_html: "The <code>font-synthesis-weight</code> CSS property sets whether or not the browser should synthesize bold typefaces when they're missing from the font.", group: ["font-synthesis"], kind: "feature", name: "font-synthesis-weight", spec: ["https://drafts.csswg.org/css-fonts-4/#font-synthesis-weight"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "css.properties.font-synthesis-weight": { baseline: "high", baseline_high_date: "20\
25-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-synthesis-weight.auto": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "css.properties.font-synthesis-weight.none": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } } }, "font-variant": { compat_features: ["css.at-rules.font-face.font-variant", "css.properties.font-variant", "css.properties.font-varia\
nt.css_fonts_shorthand", "css.properties.font-variant.greek_accented_characters", "css.properties.font-variant.historical-forms", "css.properties.font-variant.none", "css.properties.font-variant.normal", "css.properties.font-variant.sub", "css.properties.font-variant.super", "css.properties.font-variant.turkic_is", "css.properties.font-variant.uppercase_eszett", "svg.global_attributes.font-variant"], description: "The font-variant CSS property is a shorthand for font-variant-alternates, font-variant-caps, font-variant-east-asian, font-variant-emoji, font-variant-ligatures, font-variant-numeric, and font-variant-position.", description_html: "The <code>font-variant</code> CSS property is a shorthand for <code>font-variant-alternates</code>, <code>font-variant-caps</code>, <code>font-variant-east-asian</code>, <code>font-variant-emoji</code>, <code>font-variant-ligatures</code>, <code>font-variant-numeric</code>, and <code>font-variant-position</code>.", group: ["font-features"], kind: "\
feature", name: "font-variant", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-prop"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.at-rules.font-face.font-variant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.properties.font-variant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-variant.css_fonts_shorthand": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.propert\
ies.font-variant.greek_accented_characters": { baseline: false, support: {} }, "css.properties.font-variant.historical-forms": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "css.properties.font-variant.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-variant.sub": { baseline: "high", baseline_high_date: "2025-08-09", baseline_low_date: "2023-02-09", support: { chrome: "\
110", chrome_android: "110", edge: "110", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant.super": { baseline: "high", baseline_high_date: "2025-08-09", baseline_low_date: "2023-02-09", support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant.turkic_is": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "14", firefox_android: "14", safari: "8", safari_ios: "8" } }, "css.properties.font-variant.uppercase_eszett": { baseline: false, support: {} }, "svg.global_attributes.font-variant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "font-variant-alternates": { caniuse: ["font-variant-alternates"], compat_features: ["api.CSSFontFeatureValuesMap", "api.CSSFontFeatureValuesMap.@@iterator", "api.CSSFontFeatureValuesMap.clear", "api.CSSFontFeatureValuesMap.delete", "api.CSSFontFeatureValuesMap.entries", "api.CSSFontFeatureValuesMap.forEach", "api.CSSFontFeatureValuesMap.get", "api.CSSFontFeatureValuesMap.has", "api.CSSFontFeatureValuesMap.keys", "api.CSSFontFeatureValuesMap.set", "api.CSSFontFeatureValuesMap.size", "api.CSSFontFeatureValuesMap.values", "api.CSSFontFeatureValuesRule", "api.CSSFontFeatureValuesRule.annotation", "api.CSSFontFeatureValuesRule.characterVariant", "api.CSSFontFeatureValuesRule.fontFamily", "api.CSSFontFeatureValuesRule.ornaments", "api.CSSFontFeatureValuesRule.styleset", "api.CSSFontFeatureValuesRule.stylistic", "api.CSSFontFeatureValuesRule.swash", "css.at-rules.font-feature-values", "css.at-rules.font-\
feature-values.annotation", "css.at-rules.font-feature-values.character-variant", "css.at-rules.font-feature-values.historical-forms", "css.at-rules.font-feature-values.ornaments", "css.at-rules.font-feature-values.styleset", "css.at-rules.font-feature-values.stylistic", "css.at-rules.font-feature-values.swash", "css.properties.font-variant-alternates", "css.properties.font-variant-alternates.annotation", "css.properties.font-variant-alternates.character_variant", "css.properties.font-variant-alternates.historical-forms", "css.properties.font-variant-alternates.normal", "css.properties.font-variant-alternates.ornaments", "css.properties.font-variant-alternates.styleset", "css.properties.font-variant-alternates.stylistic", "css.properties.font-variant-alternates.swash"], description: "The font-variant-alternates CSS property, along with the @font-feature-values at-rule, chooses when to use a font's alternate glyphs.", description_html: "The <code>font-variant-alternates</code> CSS prope\
rty, along with the <code>@font-feature-values</code> at-rule, chooses when to use a font's alternate glyphs.", group: ["fonts"], kind: "feature", name: "font-variant-alternates", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-alternates-prop"], status: { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", by_compat_key: { "api.CSSFontFeatureValuesMap": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.@@iterator": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.clear": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.delete": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.entries": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatur\
eValuesMap.forEach": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.get": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.has": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.keys": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.set": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.size": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesMap.values": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.CSSFontFeatureValuesRule": { baseline: "low", baseline_low_date: "2025-03-06", support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "34", firefox_android: "\
34", safari: "16.2", safari_ios: "16.2" } }, "api.CSSFontFeatureValuesRule.annotation": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.CSSFontFeatureValuesRule.characterVariant": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.CSSFontFeatureValuesRule.fontFamily": { baseline: "low", baseline_low_date: "2025-03-06", support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "34", firefox_android: "34", safari: "16.2", safari_ios: "16.2" } }, "api.CSSFontFeatureValuesRule.ornaments": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.CSSFontFeatureValuesRule.styleset": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.CSSFontFeatureValuesRule.stylistic": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.CSSFontFeatureValuesRule.swash": { baseline: false, support: { chrome: "1\
34", chrome_android: "134", edge: "134" } }, "css.at-rules.font-feature-values": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.annotation": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.character-variant": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.historical-forms": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: {
    chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.ornaments": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.styleset": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.stylistic": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.at-rules.font-feature-values.swash": { baseline: "hi\
gh", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-alternates": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-alternates.annotation": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "16.2", safari_ios: "16.2" } }, "css.properties.font-variant-alternates.character_variant": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "3\
4", safari: "16.2", safari_ios: "16.2" } }, "css.properties.font-variant-alternates.historical-forms": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-alternates.normal": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-alternates.ornaments": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "16.2", safari_ios: "16.2" } }, "css.properties.font-variant-alternates.styleset": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "\
2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "16.2", safari_ios: "16.2" } }, "css.properties.font-variant-alternates.stylistic": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "16.2", safari_ios: "16.2" } }, "css.properties.font-variant-alternates.swash": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "16.2", safari_ios: "16.2" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, "font-variant-caps": { compat_features: ["css.properties.font-variant-caps", "css.properties.font-variant-caps.all-petite-caps", "css.properties.font-v\
ariant-caps.all-small-caps", "css.properties.font-variant-caps.normal", "css.properties.font-variant-caps.petite-caps", "css.properties.font-variant-caps.small-caps", "css.properties.font-variant-caps.titling-caps", "css.properties.font-variant-caps.unicase"], description: "The font-variant-caps CSS property sets whether text should be displayed in small caps, petite caps, or with capital letters designed for titles.", description_html: "The <code>font-variant-caps</code> CSS property sets whether text should be displayed in small caps, petite caps, or with capital letters designed for titles.", group: ["font-features"], kind: "feature", name: "font-variant-caps", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-caps-prop"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.font-variant-caps": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.all-petite-caps": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.all-small-caps": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.petite-caps": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.small-caps": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.titling-caps": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-caps.unicase": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "\
52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, "font-variant-east-asian": { compat_features: ["css.properties.font-variant-east-asian", "css.properties.font-variant-east-asian.full-width", "css.properties.font-variant-east-asian.jis04", "css.properties.font-variant-east-asian.jis78", "css.properties.font-variant-east-asian.jis83", "css.properties.font-variant-east-asian.jis90", "css.properties.font-variant-east-asian.normal", "css.properties.font-variant-east-asian.proportional-width", "css.properties.font-variant-east-asian.ruby", "css.properties.font-variant-east-asian.simplified", "css.properties.font-variant-east-asian.traditional"], description: "The font-variant-east-asian CSS property controls glyph substitution and sizing in East Asian text.", description_html: "The <code>font-variant-east-asian</code> CSS property controls glyph substitution and sizing in East Asian text.", group: ["font-features"], kind: "f\
eature", name: "font-variant-east-asian", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-east-asian-prop"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.font-variant-east-asian": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.full-width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.jis04": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34",
    safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.jis78": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.jis83": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.jis90": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.proportional-width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.ruby": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.simplified": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-east-asian.traditional": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, "font-variant-emoji": { compat_features: ["css.properties.font-variant-emoji", "css.properties.font-variant-emoji.emoji", "css.properties.font-variant-emoji.normal", "css.properties.font-variant-emoji.text", "css.properties.font-variant-emoji.unicode"], description: "The font-variant-emoji CSS property sets the default presentation for emoji characters.", description_html: "The <code>font-variant-emoji</code> CSS property sets the default presentation for emoji characters.", group: ["font-features"], kind: "feature", name: "font-variant-emoji", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-emoji-prop"], status: { baseline: false, by_compat_key: {
    "css.properties.font-variant-emoji": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "141", firefox_android: "141" } }, "css.properties.font-variant-emoji.emoji": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "141", firefox_android: "141" } }, "css.properties.font-variant-emoji.normal": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "141", firefox_android: "141" } }, "css.properties.font-variant-emoji.text": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "141", firefox_android: "141" } }, "css.properties.font-variant-emoji.unicode": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "141", firefox_android: "141" } } }, support: { chrome: "131", chrome_android: "131", edge: "131", firefox: "141", firefox_android: "141" } } }, "font-variant-ligatures": { compat_features: ["css\
.properties.font-variant-ligatures", "css.properties.font-variant-ligatures.common-ligatures", "css.properties.font-variant-ligatures.contextual", "css.properties.font-variant-ligatures.discretionary-ligatures", "css.properties.font-variant-ligatures.historical-ligatures", "css.properties.font-variant-ligatures.no-common-ligatures", "css.properties.font-variant-ligatures.no-contextual", "css.properties.font-variant-ligatures.no-discretionary-ligatures", "css.properties.font-variant-ligatures.no-historical-ligatures", "css.properties.font-variant-ligatures.none", "css.properties.font-variant-ligatures.normal"], description: "The font-variant-ligatures CSS property sets how characters can be visually combined for readability or stylistic reasons.", description_html: "The <code>font-variant-ligatures</code> CSS property sets how characters can be visually combined for readability or stylistic reasons.", group: ["font-features"], kind: "feature", name: "font-variant-ligatures", spec: ["htt\
ps://drafts.csswg.org/css-fonts-4/#font-variant-ligatures-prop"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.font-variant-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.common-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.contextual": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.\
properties.font-variant-ligatures.discretionary-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.historical-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.no-common-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.no-contextual": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.no-discretionary-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.no-historical-ligatures": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-ligatures.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-varian\
t-ligatures.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, "font-variant-numeric": { caniuse: ["font-variant-numeric"], compat_features: ["css.properties.font-variant-numeric", "css.properties.font-variant-numeric.diagonal-fractions", "css.properties.font-variant-numeric.lining-nums", "css.properties.font-variant-numeric.normal", "css.properties.font-variant-numeric.oldstyle-nums", "css.properties.font-variant-numeric.ordinal", "css.properties.font-variant-numeric.proportional-nums", "css.properties.font-variant-numeric.slashed-zero", "css.properties.font-variant-numeric.stacked-fractions", "css.properties.font-variant-numeric.tabular-nums"], description: "The font-var\
iant-numeric CSS property sets how numeric characters are displayed. For example, you can align columns of numbers or use zeroes that have a slash.", description_html: "The <code>font-variant-numeric</code> CSS property sets how numeric characters are displayed. For example, you can align columns of numbers or use zeroes that have a slash.", group: ["font-features"], kind: "feature", name: "font-variant-numeric", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-numeric-prop"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.font-variant-numeric": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.diagonal-fractions": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "202\
0-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.lining-nums": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.oldstyle-nums": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.or\
dinal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.proportional-nums": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.slashed-zero": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.stacked-fractions": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34",
    firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-numeric.tabular-nums": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } } }, "font-variant-position": { compat_features: ["css.properties.font-variant-position", "css.properties.font-variant-position.normal", "css.properties.font-variant-position.sub", "css.properties.font-variant-position.super"], description: "The font-variant-position CSS property sets whether to use alternate glyphs for subscript and superscript text.", description_html: "The <code>font-variant-position</code> CSS property sets whether to use alternate glyphs for subscript and superscript text.", group: ["font-features"],
    kind: "feature", name: "font-variant-position", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variant-position-prop"], status: { baseline: false, by_compat_key: { "css.properties.font-variant-position": { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-position.normal": { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "css.properties.font-variant-position.sub": { baseline: false, support: { firefox: "34", firefox_android: "34" } }, "css.properties.font-variant-position.super": { baseline: false, support: { firefox: "34", firefox_android: "34" } } }, support: { firefox: "34", firefox_android: "34" } } }, "\
font-variation-settings": { caniuse: ["variable-fonts"], compat_features: ["css.at-rules.font-face.font-variation-settings", "css.properties.font-variation-settings"], description: 'The font-variation-settings CSS property sets an "axis of variability" on a variable font, such as weight, optical size, or a custom axis defined by the typeface designer. When possible, use other CSS font properties, such as font-weight: bold. Also known as variable fonts.', description_html: 'The <code>font-variation-settings</code> CSS property sets an "axis of variability" on a variable font, such as weight, optical size, or a custom axis defined by the typeface designer. When possible, use other CSS font properties, such as <code>font-weight: bold</code>. Also known as variable fonts.', group: ["fonts"], kind: "feature", name: "font-variation-settings", spec: ["https://drafts.csswg.org/css-fonts-4/#font-variation-settings-def"], status: { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "\
2018-09-05", by_compat_key: { "css.at-rules.font-face.font-variation-settings": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "62", firefox_android: "62" } }, "css.properties.font-variation-settings": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "62", chrome_android: "62", edge: "17", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } } }, support: { chrome: "62", chrome_android: "62", edge: "17", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } } }, "font-weight": { compat_features: ["css.at-rules.font-face.font-weight", "css.properties.font-weight", "css.properties.font-weight.bold", "css.properties.font-weight.bolder", "css.properties.font-weight.lighter", "css.properties.font-weight.normal", "css.properties.font-weight.number", "svg.global_attributes.font-weight"], description: "The font-weight CSS property controls the thickness of a fo\
nt. It is set explicitly with the keyword bold or a number, or relative to the inherited thickness with the keywords bolder or lighter.", description_html: "The <code>font-weight</code> CSS property controls the thickness of a font. It is set explicitly with the keyword <code>bold</code> or a number, or relative to the inherited thickness with the keywords <code>bolder</code> or <code>lighter</code>.", group: ["fonts"], kind: "feature", name: "font-weight", spec: ["https://drafts.csswg.org/css-fonts-4/#font-weight-prop"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.at-rules.font-face.font-weight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.properties.font-weight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-weight.bold": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-weight.bolder": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-weight.lighter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-weight.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.font-weight.number": { baseline: "high", baseline_high_date: "2020-12-26", baseline_low_date: "2018-06-26", support: { chrome: "62", chrome_android: "62", edge: "17", firefox: "61", firefox_android: "61", safari: "11", safari_ios: "11" } }, "svg.global_attributes.font-weight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "font-width": { compat_features: ["api.CSSFontFaceDescriptors.fontWidth", "css.at-rules.font-face.font-width", "css.properties.font-width", "css.properties.font-width.condensed", "css.properties.font-width.expanded", "\
css.properties.font-width.extra-condensed", "css.properties.font-width.extra-expanded", "css.properties.font-width.normal", "css.properties.font-width.semi-condensed", "css.properties.font-width.semi-expanded", "css.properties.font-width.ultra-condensed", "css.properties.font-width.ultra-expanded"], description: "The font-width CSS property selects a font face from a font family based on width, either by a keyword such as condensed or a percentage.", description_html: "The <code>font-width</code> CSS property selects a font face from a font family based on width, either by a keyword such as <code>condensed</code> or a percentage.", group: ["fonts"], kind: "feature", name: "font-width", spec: ["https://drafts.csswg.org/css-fonts-4/#font-width-prop"], status: { baseline: false, by_compat_key: { "api.CSSFontFaceDescriptors.fontWidth": { baseline: false, support: { safari: "26", safari_ios: "26" } }, "css.at-rules.font-face.font-width": { baseline: false, support: { safari: "18.4" } }, "cs\
s.properties.font-width": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.condensed": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.expanded": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.extra-condensed": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.extra-expanded": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.normal": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.semi-condensed": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.semi-expanded": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.ultra-condensed": { baseline: false, support: { safari: "18.4" } }, "css.properties.font-width.ultra-expanded": { baseline: false, support: { safari: "18.4" } } }, support: { safari: "18.4" } } }, "forced-colors": { compat_features: ["css.at-rules.media.forc\
ed-colors", "css.properties.forced-color-adjust", "css.properties.forced-color-adjust.auto", "css.properties.forced-color-adjust.none", "css.properties.forced-color-adjust.preserve-parent-color"], description: "The forced-colors CSS @media rule detects when a user has chosen to use a forced colors mode, also known as high-contrast mode, and the forced-color-adjust CSS property sets whether forced colors apply to an element.", description_html: "The <code>forced-colors</code> CSS @media rule detects when a user has chosen to use a forced colors mode, also known as high-contrast mode, and the <code>forced-color-adjust</code> CSS property sets whether forced colors apply to an element.", group: ["css"], kind: "feature", name: "Forced colors", spec: ["https://drafts.csswg.org/mediaqueries-5/#forced-colors", "https://drafts.csswg.org/css-color-adjust-1/#forced-color-adjust-prop"], status: { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: {
    "css.at-rules.media.forced-colors": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "89", chrome_android: "89", edge: "79", firefox: "89", firefox_android: "89", safari: "16", safari_ios: "16" } }, "css.properties.forced-color-adjust": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "79", firefox: "113", firefox_android: "113" } }, "css.properties.forced-color-adjust.auto": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "79", firefox: "113", firefox_android: "113" } }, "css.properties.forced-color-adjust.none": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "79", firefox: "113", firefox_android: "113" } }, "css.properties.forced-color-adjust.preserve-parent-color": { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106" } } }, support: { chrome: "89", chrome_android: "89", edge: "79", firefox: "89", firefox_android: "89", safari: "\
16", safari_ios: "16" } } }, form: { compat_features: ["api.FormDataEvent", "api.FormDataEvent.FormDataEvent", "api.FormDataEvent.formData", "api.HTMLFormControlsCollection", "api.HTMLFormControlsCollection.namedItem", "api.HTMLFormElement", "api.HTMLFormElement.acceptCharset", "api.HTMLFormElement.action", "api.HTMLFormElement.autocomplete", "api.HTMLFormElement.elements", "api.HTMLFormElement.encoding", "api.HTMLFormElement.enctype", "api.HTMLFormElement.formdata_event", "api.HTMLFormElement.length", "api.HTMLFormElement.method", "api.HTMLFormElement.name", "api.HTMLFormElement.noValidate", "api.HTMLFormElement.rel", "api.HTMLFormElement.relList", "api.HTMLFormElement.requestSubmit", "api.HTMLFormElement.reset", "api.HTMLFormElement.reset_event", "api.HTMLFormElement.submit", "api.HTMLFormElement.submit_event", "api.HTMLFormElement.target", "api.SubmitEvent", "api.SubmitEvent.SubmitEvent", "api.SubmitEvent.submitter", "html.elements.form", "html.elements.form.accept-charset", "html.e\
lements.form.action", "html.elements.form.autocomplete", "html.elements.form.enctype", "html.elements.form.method", "html.elements.form.name", "html.elements.form.novalidate", "html.elements.form.rel", "html.elements.form.target"], description: "The <form> element contains interactive controls for submitting information.", description_html: "The <code>&#x3C;form></code> element contains interactive controls for submitting information.", group: ["forms", "landmark-elements"], kind: "feature", name: "<form>", spec: ["https://html.spec.whatwg.org/multipage/forms.html#the-form-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.FormDataEvent": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "72", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.FormDataEvent.FormDataEvent": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "72", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.FormDataEvent.formData": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "72", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.HTMLFormControlsCollection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormControlsCollection.namedItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "33", firefox_android: "33", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.acceptCharset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.action": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.autocomplete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.HTMLFormElement.elements": { baseline: "high", baseline_high_date: "2018\
-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.encoding": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.enctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.formdata_event": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "72", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.HTMLFormElement.length": { baseline: "high", baseline_high_date: "2018-01-\
29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.method": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.noValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLFormElement.rel": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "\
2023-03-14", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "111", firefox_android: "111", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLFormElement.relList": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "111", firefox_android: "111", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLFormElement.requestSubmit": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "75", firefox_android: "79", safari: "16", safari_ios: "16" } }, "api.HTMLFormElement.reset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.reset_event": { baseline: "high", baseline_high_date: "2018-01-\
29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.submit": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.submit_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLFormElement.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SubmitEvent": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "\
2021-09-20", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "75", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.SubmitEvent.SubmitEvent": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "75", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.SubmitEvent.submitter": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "html.elements.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.form.accept-charset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.form.action": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.form.autocomplete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "html.elements.form.enctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.form.method": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.form.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.form.novalidate": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "10.1", safari_ios: "10.3" } }, "html.elements.form.rel": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "111", firefox_android: "111", safari: "15.4", safari_ios: "15.4" } }, "html.elements.form.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, "form-associated-custom-elements": { compat_features: ["api.ElementInternals", "api.ElementInternals.checkValidity", "api.ElementInternals.form", "api.ElementInternals.labels", "api.ElementInternals.reportValidity", "api.ElementInternals.setFormValue", "api.ElementInternals.setValidity", "api.ElementInternals.validationMessage", "api.ElementInternals.validity", "api.ElementInternals.willValidate", "api.HTMLElement.attachInternals"], description: "Custom elements may act like built-in form elements, via the attachInternals() method of HTMLElement and the ElementInternals API.", description_html: "Custom elements may act like built-in form elements, via the <code>attachInternals()</code> method of <code>HTMLElement</code> and the <code>ElementInternals\
</code> API.", group: ["custom-elements", "forms"], kind: "feature", name: "Form-associated custom elements", spec: ["https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.ElementInternals": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "93", firefox_android: "93", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.checkValidity": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.form": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "\
79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.labels": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.reportValidity": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.setFormValue": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.setValidity": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "\
77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.validationMessage": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.validity": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.ElementInternals.willValidate": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } }, "api.HTMLElement.attachInternals": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "\
2023-03-27", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "93", firefox_android: "93", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "98", firefox_android: "98", safari: "16.4", safari_ios: "16.4" } } }, "form-validity-pseudos": { caniuse: ["css-optional-pseudo", "css-in-out-of-range"], compat_features: ["css.selectors.in-range", "css.selectors.invalid", "css.selectors.invalid.form", "css.selectors.optional", "css.selectors.out-of-range", "css.selectors.required", "css.selectors.valid", "css.selectors.valid.form"], description: "The form validity CSS pseudo-classes match <form> elements based on the constraints of a form field, such as validity (:valid, :invalid, :in-range, :out-of-range) and necessity (:optional or :required).", description_html: "The form validity CSS pseudo-classes match <code>&#x3C;form></code> elements based on the constraints of a form field, such as validity (<code>:valid</cod\
e>, <code>:invalid</code>, <code>:in-range</code>, <code>:out-of-range</code>) and necessity (<code>:optional</code> or <code>:required</code>).", group: ["selectors"], kind: "feature", name: "Form validity pseudo-classes", spec: ["https://drafts.csswg.org/selectors-4/#ui-validity"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.in-range": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "10", chrome_android: "18", edge: "13", firefox: "29", firefox_android: "16", safari: "5.1", safari_ios: "5" } }, "css.selectors.invalid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.selectors.invalid.form": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "13", firefox_android: "14", safari: "9", safari_ios: "9" } }, "css.selectors.optional": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.selectors.out-of-range": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "10", chrome_android: "18", edge: "13", firefox: "29", firefox_android: "16", safari: "5.1", safari_ios: "5" } }, "css.selectors.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.selectors.valid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1\
0", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.selectors.valid.form": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "13", firefox_android: "14", safari: "9", safari_ios: "9" } } }, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } } }, fullscreen: { caniuse: ["fullscreen"], compat_features: ["api.Document.exitFullscreen", "api.Document.exitFullscreen.returns_promise", "api.Document.fullscreenElement", "api.Document.fullscreenEnabled", "api.Document.fullscreenchange_event", "api.Document.fullscreenerror_event", "api.Element.fullscreenchange_event", "api.Element.fullscreenerror_event", "api.Element.requestFullscreen", "api.Element.requestFullscreen.options_navigationUI_parameter", "api.Element.requestFullscreen.returns_promise", "api.HTMLIFr\
ameElement.allowFullscreen", "api.ShadowRoot.fullscreenElement", "css.selectors.backdrop.fullscreen", "css.selectors.fullscreen", "css.selectors.fullscreen.all_elements", "html.elements.iframe.allow.fullscreen", "html.elements.iframe.allowfullscreen", "http.headers.Permissions-Policy.fullscreen"], description: "The fullscreen API makes a specific element fill the whole screen and hides most browser UI.", description_html: "The fullscreen API makes a specific element fill the whole screen and hides most browser UI.", kind: "feature", name: "Fullscreen API", spec: ["https://fullscreen.spec.whatwg.org/"], status: { baseline: false, by_compat_key: { "api.Document.exitFullscreen": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Document.exitFullscreen.returns_promise": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } },
    "api.Document.fullscreenElement": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Document.fullscreenEnabled": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "12", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Document.fullscreenchange_event": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Document.fullscreenerror_event": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Element.fullscreenchange_event": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Element.fullscreenerror_event": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "\
64", safari: "16.4" } }, "api.Element.requestFullscreen": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.Element.requestFullscreen.options_navigationUI_parameter": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", safari: "16.4" } }, "api.Element.requestFullscreen.returns_promise": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "api.HTMLIFrameElement.allowFullscreen": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "22", firefox_android: "22", safari: "10.1" } }, "api.ShadowRoot.fullscreenElement": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "16.4" } }, "css.selectors.backdrop.fullscreen": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "\
2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "47", firefox_android: "47", safari: "16.4", safari_ios: "16.4" } }, "css.selectors.fullscreen": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "12", firefox: "64", firefox_android: "64", safari: "16.4" } }, "css.selectors.fullscreen.all_elements": { baseline: false, support: { firefox: "64", firefox_android: "64" } }, "html.elements.iframe.allow.fullscreen": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "80", firefox_android: "80" } }, "html.elements.iframe.allowfullscreen": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "18", firefox_android: "18", safari: "10.1" } }, "http.headers.Permissions-Policy.fullscreen": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "\
16.4" } } }, function: { compat_features: ["api.CSSFunctionDeclarations", "api.CSSFunctionDeclarations.style", "api.CSSFunctionDescriptors", "api.CSSFunctionDescriptors.result", "api.CSSFunctionRule", "api.CSSFunctionRule.getParameters", "api.CSSFunctionRule.name", "api.CSSFunctionRule.returnType", "css.at-rules.function", "css.at-rules.function.result", "css.types.dashed-function", "css.types.type"], description: "The @function CSS at-rule defines a custom function that takes CSS values or custom properties as arguments, and returns a CSS value. It can be based on conditional logic such as by using the @media at-rule.", description_html: "The <code>@function</code> CSS at-rule defines a custom function that takes CSS values or custom properties as arguments, and returns a CSS value. It can be based on conditional logic such as by using the <code>@media</code> at-rule.", group: ["css"], kind: "feature", name: "@function", spec: ["https://drafts.csswg.org/css-mixins-1/#function-rule"], status: {
    baseline: false, by_compat_key: { "api.CSSFunctionDeclarations": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionDeclarations.style": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionDescriptors": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionDescriptors.result": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionRule": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionRule.getParameters": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionRule.name": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.CSSFunctionRule.returnType": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.at-rules.function": {
    baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.at-rules.function.result": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.dashed-function": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "css.types.type": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, functions: { compat_features: ["javascript.builtins.Function", "javascript.builtins.Function.@@hasInstance", "javascript.builtins.Function.Function", "javascript.builtins.Function.apply", "javascript.builtins.Function.apply.generic_arrays_as_arguments", "javascript.builtins.Function.bind", "javascript.builtins.Function.call", "javascript.builtins.Function.length", "javascript.builtins.Function.length.configurable_true", "javascript.builtins.Function.name", "javascript.builtins.Function.name.configurable_\
true", "javascript.builtins.Function.name.inferred_names", "javascript.builtins.Function.toString", "javascript.builtins.Function.toString.toString_revision", "javascript.functions", "javascript.functions.arguments", "javascript.functions.arguments.@@iterator", "javascript.functions.arguments.length", "javascript.functions.arrow_functions", "javascript.functions.arrow_functions.trailing_comma", "javascript.functions.block_level_functions", "javascript.functions.default_parameters", "javascript.functions.default_parameters.destructured_parameter_with_default_value_assignment", "javascript.functions.default_parameters.parameters_without_defaults_after_default_parameters", "javascript.functions.get", "javascript.functions.get.computed_property_names", "javascript.functions.method_definitions", "javascript.functions.method_definitions.async_methods", "javascript.functions.method_definitions.generator_methods_not_constructable", "javascript.functions.rest_parameters", "javascript.functions.\
rest_parameters.destructuring", "javascript.functions.set", "javascript.functions.set.computed_property_names", "javascript.grammar.trailing_commas.trailing_commas_in_functions", "javascript.operators.function", "javascript.operators.function.trailing_comma", "javascript.statements.function", "javascript.statements.function.trailing_comma_in_parameters"], description: "Functions are series of statements that can be called and return a value. The function keyword (as in function () { }) and arrow (=>) expression create functions. The JavaScript functions protocol includes default and rest parameters and binding to this.", description_html: "Functions are series of statements that can be called and return a value. The <code>function</code> keyword (as in <code>function () { }</code>) and arrow (<code>=></code>) expression create functions. The JavaScript functions protocol includes default and rest parameters and binding to <code>this</code>.", group: ["javascript"], kind: "feature", name: "\
Functions", spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-ecmascript-language-functions-and-classes", "https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-function-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Function": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.@@hasInstance": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "50", chrome_android: "50", edge: "15", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "javascript.builtins.Function.Function": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.apply": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.apply.generic_arrays_as_arguments": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "17", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "javascript.builtins.Function.bind": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "6" } }, "javascript.builtins.Function.call": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.length.configurable_true": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.Function.name": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "15", chrome_android: "18", edge: "14", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "javascript.builtins.Function.name.configurable_true": { baseline: "high", baseline_high_date: "\
2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "43", chrome_android: "43", edge: "14", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } }, "javascript.builtins.Function.name.inferred_names": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "53", firefox_android: "53", safari: "10", safari_ios: "10" } }, "javascript.builtins.Function.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.toString.toString_revision": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "54", firefox_android: "54", safari: "17", safari_ios: "17" } }, "javascript.fu\
nctions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.functions.arguments": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.functions.arguments.@@iterator": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "46", firefox_android: "46", safari: "9", safari_ios: "9" } }, "javascript.functions.arguments.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javasc\
ript.functions.arrow_functions": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "javascript.functions.arrow_functions.trailing_comma": { baseline: "high", baseline_high_date: "2019-10-25", baseline_low_date: "2017-04-25", support: { chrome: "58", chrome_android: "58", edge: "12", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.functions.block_level_functions": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "46", firefox_android: "46", safari: "10", safari_ios: "10" } }, "javascript.functions.default_parameters": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "15", firefox_android: "\
15", safari: "10", safari_ios: "10" } }, "javascript.functions.default_parameters.destructured_parameter_with_default_value_assignment": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "javascript.functions.default_parameters.parameters_without_defaults_after_default_parameters": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.functions.get": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.functions.get.computed_property_names": { baseline: "high", baseline_high_date: "\
2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "javascript.functions.method_definitions": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "39", chrome_android: "39", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.functions.method_definitions.async_methods": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "javascript.functions.method_definitions.generator_methods_not_constructable": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "42", chrome_android: "42", edge: "13", firefox: "43", firefox_android: "43", safari: "9.1",
    safari_ios: "9.3" } }, "javascript.functions.rest_parameters": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "15", firefox_android: "15", safari: "10", safari_ios: "10" } }, "javascript.functions.rest_parameters.destructuring": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.functions.set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.functions.set.computed_property_names": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "46", chrome_android: "46", edge: "1\
2", firefox: "34", firefox_android: "34", safari: "9.1", safari_ios: "9.3" } }, "javascript.grammar.trailing_commas.trailing_commas_in_functions": { baseline: "high", baseline_high_date: "2019-10-25", baseline_low_date: "2017-04-25", support: { chrome: "58", chrome_android: "58", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.operators.function": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.function.trailing_comma": { baseline: "high", baseline_high_date: "2019-10-25", baseline_low_date: "2017-04-25", support: { chrome: "58", chrome_android: "58", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.statements.function": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-2\
9", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.function.trailing_comma_in_parameters": { baseline: "high", baseline_high_date: "2019-10-25", baseline_low_date: "2017-04-25", support: { chrome: "58", chrome_android: "58", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "functions-caller-arguments": { compat_features: ["javascript.builtins.Function.arguments", "javascript.builtins.Function.caller"], description: "The caller and arguments properties of a non-strict mode Function object are the function that called it and the arguments it was called with. Not to be confused with the arguments variable in a function body's local scope.", description_html: "The <code>caller</code> and <code>arguments</code> properties \
of a non-strict mode <code>Function</code> object are the function that called it and the arguments it was called with. Not to be confused with the <code>arguments</code> variable in a function body's local scope.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/error-handling-and-language-extensions.html#sec-forbidden-extensions"], reason: "JavaScript strict mode prohibits accessing the caller and arguments properties of a Function object.", reason_html: "JavaScript strict mode prohibits accessing the <code>caller</code> and <code>arguments</code> properties of a <code>Function</code> object." }, group: ["javascript"], kind: "feature", name: "Function caller and arguments", spec: ["https://tc39.es/ecma262/multipage/error-handling-and-language-extensions.html#sec-forbidden-extensions"], status: { baseline: false, by_compat_key: { "javascript.builtins.Function.arguments": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Function.caller": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, gamepad: { caniuse: ["gamepad"], compat_features: ["api.Gamepad", "api.Gamepad.axes", "api.Gamepad.buttons", "api.Gamepad.connected", "api.Gamepad.id", "api.Gamepad.index", "api.Gamepad.mapping", "api.Gamepad.secure_context_required", "api.Gamepad.timestamp", "api.GamepadButton", "api.GamepadButton.pressed", "api.GamepadButton.secure_context_required", "api.GamepadButton.value", "api.GamepadEvent", "api.GamepadEvent.GamepadEvent", "api.GamepadEvent.gamepad", "api.GamepadEvent.secure_context_required", "api.Navigator.getGamepads", "api.Navigator.getGamepads.secure_context_required", "api.Window.gamepadconnected_event", "api.Window.gamepa\
ddisconnected_event", "html.elements.iframe.allow.gamepad"], description: "The navigator.getGamepads() API accesses and responds to signals from game controllers.", description_html: "The <code>navigator.getGamepads()</code> API accesses and responds to signals from game controllers.", group: ["gamepad"], kind: "feature", name: "Gamepad", spec: ["https://w3c.github.io/gamepad/"], status: { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", by_compat_key: { "api.Gamepad": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.axes": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.buttons": {
    baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.connected": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.id": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.index": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.mapping": { baseline: "hi\
gh", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Gamepad.secure_context_required": { baseline: false, support: { firefox: "91", firefox_android: "91" } }, "api.Gamepad.timestamp": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadButton": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadButton.pressed": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "2\
9", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadButton.secure_context_required": { baseline: false, support: { firefox: "91", firefox_android: "91" } }, "api.GamepadButton.value": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadEvent": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadEvent.GamepadEvent": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadEvent.gamepad": { baseline: "high", baseline_high_date: "\
2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.GamepadEvent.secure_context_required": { baseline: false, support: { firefox: "91", firefox_android: "91" } }, "api.Navigator.getGamepads": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Navigator.getGamepads.secure_context_required": { baseline: false, support: { firefox: "91" } }, "api.Window.gamepadconnected_event": { baseline: "low", baseline_low_date: "2025-12-05", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "89", firefox_android: "89", safari: "16", safari_ios: "16" } }, "api.Window.gamepaddisconnected_event": { baseline: "low", baseline_low_date: "2025-12-05", support: { chrome: "143", chrome_android: "\
143", edge: "143", firefox: "89", firefox_android: "89", safari: "16", safari_ios: "16" } }, "html.elements.iframe.allow.gamepad": { baseline: false, support: {} } }, support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "29", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } } }, "gamepad-haptics": { compat_features: ["api.Gamepad.hapticActuators", "api.Gamepad.vibrationActuator", "api.GamepadHapticActuator", "api.GamepadHapticActuator.effects", "api.GamepadHapticActuator.effects.type_trigger-rumble", "api.GamepadHapticActuator.playEffect", "api.GamepadHapticActuator.playEffect.params_leftTrigger_parameter", "api.GamepadHapticActuator.playEffect.params_rightTrigger_parameter", "api.GamepadHapticActuator.playEffect.type_trigger-rumble", "api.GamepadHapticActuator.pulse", "api.GamepadHapticActuator.reset", "api.GamepadHapticActuator.secure_context_required"], description: "The gamepad.vibrationActuator property represents a gamepad's haptics hardware, which allow\
s you to control the vibration motors in a gamepad.", description_html: "The <code>gamepad.vibrationActuator</code> property represents a gamepad's haptics hardware, which allows you to control the vibration motors in a gamepad.", group: ["gamepad"], kind: "feature", name: "Gamepad haptic feedback", spec: ["https://w3c.github.io/gamepad/#gamepadhapticactuator-interface"], status: { baseline: false, by_compat_key: { "api.Gamepad.hapticActuators": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.Gamepad.vibrationActuator": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79", safari: "16.4" } }, "api.GamepadHapticActuator": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "15", firefox: "55", firefox_android: "55", safari: "16.4" } }, "api.GamepadHapticActuator.effects": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.GamepadHapticActuator.effects.type_trigger-rumble": { baseline: false,
    support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.GamepadHapticActuator.playEffect": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "15", safari: "16.4" } }, "api.GamepadHapticActuator.playEffect.params_leftTrigger_parameter": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.GamepadHapticActuator.playEffect.params_rightTrigger_parameter": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.GamepadHapticActuator.playEffect.type_trigger-rumble": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.GamepadHapticActuator.pulse": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadHapticActuator.reset": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "15", safari: "16.4" } }, "api.GamepadHapticActuator.secure_context_required": { baseline: false, support: { firefox: "91", firefox_android: "\
91" } } }, support: { chrome: "68", chrome_android: "68", edge: "79", safari: "16.4" } } }, "gamepad-touch": { compat_features: ["api.GamepadButton.touched"], description: "The touched property of a GamepadButton object indicates whether a button capable of detecting touch is currently touched.", description_html: "The <code>touched</code> property of a <code>GamepadButton</code> object indicates whether a button capable of detecting touch is currently touched.", group: ["gamepad"], kind: "feature", name: "Gamepad touch buttons", spec: ["https://w3c.github.io/gamepad/#dom-gamepadbutton-touched"], status: { baseline: false, by_compat_key: { "api.GamepadButton.touched": { baseline: false, support: { chrome: "73", chrome_android: "73", edge: "15", firefox: "55", firefox_android: "55" } } }, support: { chrome: "73", chrome_android: "73", edge: "15", firefox: "55", firefox_android: "55" } } }, "gamepad-vr": { compat_features: ["api.Gamepad.hand", "api.Gamepad.pose", "api.GamepadPose", "api.\
GamepadPose.angularAcceleration", "api.GamepadPose.angularVelocity", "api.GamepadPose.hasOrientation", "api.GamepadPose.hasPosition", "api.GamepadPose.linearAcceleration", "api.GamepadPose.linearVelocity", "api.GamepadPose.orientation", "api.GamepadPose.position", "api.GamepadPose.secure_context_required"], description: "The hand and pose properties of a Gamepad object represent the position in space and the hand that WebVR controllers are held in.", description_html: "The <code>hand</code> and <code>pose</code> properties of a <code>Gamepad</code> object represent the position in space and the hand that WebVR controllers are held in.", group: ["gamepad"], kind: "feature", name: "Gamepad VR hands and poses", spec: ["https://w3c.github.io/gamepad/extensions.html"], status: { baseline: false, by_compat_key: { "api.Gamepad.hand": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.Gamepad.pose": { baseline: false, support: { firefox: "55", firefox_android: "55" } },
    "api.GamepadPose": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.angularAcceleration": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.angularVelocity": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.hasOrientation": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.hasPosition": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.linearAcceleration": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.linearVelocity": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.orientation": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.position": { baseline: false, support: { firefox: "55", firefox_android: "55" } }, "api.GamepadPose.secure_context_required": { baseline: false,
    support: { firefox: "91", firefox_android: "91" } } }, support: { firefox: "55", firefox_android: "55" } } }, "gap-decorations": { description: "The column-rule and row-rule CSS properties display decorative lines between columns and rows of a flex, grid, or multi-column layout. The rule-break, rule-outset, and rule-paint-order properties control the appearance of these lines.", description_html: "The <code>column-rule</code> and <code>row-rule</code> CSS properties display decorative lines between columns and rows of a flex, grid, or multi-column layout. The <code>rule-break</code>, <code>rule-outset</code>, and <code>rule-paint-order</code> properties control the appearance of these lines.", group: ["grid", "flexbox", "multi-column"], kind: "feature", name: "Gap decorations", spec: ["https://drafts.csswg.org/css-gaps-1/"], status: { baseline: false, support: {} } }, generators: { caniuse: ["es6-generators"], compat_features: ["javascript.builtins.Generator", "javascript.builtins.\
Generator.next", "javascript.builtins.Generator.return", "javascript.builtins.Generator.throw", "javascript.builtins.GeneratorFunction", "javascript.builtins.GeneratorFunction.GeneratorFunction", "javascript.operators.generator_function", "javascript.operators.generator_function.trailing_comma", "javascript.operators.yield", "javascript.operators.yield_star", "javascript.statements.generator_function", "javascript.statements.generator_function.IteratorResult_object", "javascript.statements.generator_function.not_constructable_with_new", "javascript.statements.generator_function.trailing_comma_in_parameters"], description: "Generator functions (function*) create iterators that return multiple values, one after another, on-demand.", description_html: "Generator functions (<code>function*</code>) create iterators that return multiple values, one after another, on-demand.", group: ["javascript"], kind: "feature", name: "Generators", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ec\
ma262/multipage/control-abstraction-objects.html#sec-generator-objects", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generatorfunction-objects"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Generator": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.builtins.Generator.next": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.builtins.Generator.return": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "50", chrome_android: "50", edge: "13", firefox: "38", firefox_android: "\
38", safari: "10", safari_ios: "10" } }, "javascript.builtins.Generator.throw": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.builtins.GeneratorFunction": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.builtins.GeneratorFunction.GeneratorFunction": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.operators.generator_function": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "\
49", edge: "12", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.operators.generator_function.trailing_comma": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.operators.yield": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "12", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.operators.yield_star": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "39", chrome_android: "39", edge: "12", firefox: "27", firefox_android: "27", safari: "10", safari_ios: "10" } }, "javascript.statements.generator_function": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-\
20", support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "javascript.statements.generator_function.IteratorResult_object": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "13", firefox: "29", firefox_android: "29", safari: "10", safari_ios: "10" } }, "javascript.statements.generator_function.not_constructable_with_new": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "50", chrome_android: "50", edge: "13", firefox: "43", firefox_android: "43", safari: "10", safari_ios: "10" } }, "javascript.statements.generator_function.trailing_comma_in_parameters": { baseline: "high", baseline_high_date: "2019-10-25", baseline_low_date: "2017-04-25", support: { chrome: "58", chrome_android: "58", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "1\
0" } } }, support: { chrome: "39", chrome_android: "39", edge: "13", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } } }, geolocation: { caniuse: ["geolocation"], compat_features: ["api.Geolocation", "api.Geolocation.clearWatch", "api.Geolocation.getCurrentPosition", "api.Geolocation.secure_context_required", "api.Geolocation.watchPosition", "api.GeolocationCoordinates", "api.GeolocationCoordinates.accuracy", "api.GeolocationCoordinates.altitude", "api.GeolocationCoordinates.altitudeAccuracy", "api.GeolocationCoordinates.heading", "api.GeolocationCoordinates.latitude", "api.GeolocationCoordinates.longitude", "api.GeolocationCoordinates.secure_context_required", "api.GeolocationCoordinates.speed", "api.GeolocationCoordinates.toJSON", "api.GeolocationPosition", "api.GeolocationPosition.coords", "api.GeolocationPosition.secure_context_required", "api.GeolocationPosition.timestamp", "api.GeolocationPosition.toJSON", "api.GeolocationPositionError", "api.GeolocationPos\
itionError.code", "api.GeolocationPositionError.message", "api.GeolocationPositionError.secure_context_required", "api.Navigator.geolocation", "api.Navigator.geolocation.secure_context_required", "api.Permissions.permission_geolocation", "html.elements.iframe.allow.geolocation", "http.headers.Permissions-Policy.geolocation"], description: "The navigator.geolocation API requests the user's latitude, longitude, heading, and speed.", description_html: "The <code>navigator.geolocation</code> API requests the user's latitude, longitude, heading, and speed.", group: ["geolocation"], kind: "feature", name: "Geolocation API", spec: ["https://w3c.github.io/geolocation/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Geolocation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "\
≤3" } }, "api.Geolocation.clearWatch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "≤3" } }, "api.Geolocation.getCurrentPosition": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "≤3" } }, "api.Geolocation.secure_context_required": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "55", firefox_android: "55", safari: "10", safari_ios: "10" } }, "api.Geolocation.watchPosition": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "\
5", safari_ios: "≤3" } }, "api.GeolocationCoordinates": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.accuracy": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.altitude": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.altitudeAccuracy": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79",
    firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.heading": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.latitude": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.longitude": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.secure_context_required": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2\
020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.speed": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationCoordinates.toJSON": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "129", firefox_android: "129", safari: "18", safari_ios: "18" } }, "api.GeolocationPosition": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPosition.coords": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-\
07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPosition.secure_context_required": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPosition.timestamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPosition.toJSON": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "129", firefox_android: "129", safari: "18", safari_ios: "18" } }, "api.GeolocationPositionError": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "\
2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPositionError.code": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPositionError.message": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.GeolocationPositionError.secure_context_required": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Navigator.geolocation": { baseline: "hig\
h", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "≤3" } }, "api.Navigator.geolocation.secure_context_required": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55", safari: "10", safari_ios: "10" } }, "api.Permissions.permission_geolocation": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "16", safari_ios: "16" } }, "html.elements.iframe.allow.geolocation": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "74", firefox_android: "79" } }, "http.headers.Permissions-Policy.geolocation": { baseline: false, support: { chrome: "88", chrome_android: "\
88", edge: "88" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "≤3" } } }, "geolocation-element": { compat_features: ["api.HTMLGeolocationElement", "api.HTMLGeolocationElement.HTMLGeolocationElement", "api.HTMLGeolocationElement.autolocate", "api.HTMLGeolocationElement.error", "api.HTMLGeolocationElement.initialPermissionStatus", "api.HTMLGeolocationElement.invalidReason", "api.HTMLGeolocationElement.isValid", "api.HTMLGeolocationElement.location_event", "api.HTMLGeolocationElement.permissionStatus", "api.HTMLGeolocationElement.position", "api.HTMLGeolocationElement.promptaction_event", "api.HTMLGeolocationElement.promptdismiss_event", "api.HTMLGeolocationElement.validationstatuschange_event", "api.HTMLGeolocationElement.watch", "html.elements.geolocation", "html.elements.geolocation.autolocate", "html.elements.geolocation.watch"], description: "The <geolocation> HTML element represents a button that, up\
on activation, prompts the user to choose whether to grant the page access to geolocation data.", description_html: "The <code>&#x3C;geolocation></code> HTML element represents a button that, upon activation, prompts the user to choose whether to grant the page access to geolocation data.", group: ["html-elements", "geolocation"], kind: "feature", name: "<geolocation>", spec: ["https://wicg.github.io/PEPC/geolocation-element.html"], status: { baseline: false, by_compat_key: { "api.HTMLGeolocationElement": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.HTMLGeolocationElement": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.autolocate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.error": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocatio\
nElement.initialPermissionStatus": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.invalidReason": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.isValid": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.location_event": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.permissionStatus": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.position": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.promptaction_event": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.promptdismiss_event": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144" } }, "api.HTMLGeolocationElement.validationstatuschange_event": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "api.HTMLGeolocationElement.watch": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "html.elements.geolocation": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "html.elements.geolocation.autolocate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "html.elements.geolocation.watch": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } } }, support: { chrome: "144", chrome_android: "144", edge: "144" } } }, "get-computed-style": { caniuse: ["getcomputedstyle"], compat_features: ["api.Window.getComputedStyle", "api.Window.getComputedStyle.pseudo_element_support"], description: "The getComputedStyle() global method returns an CSSStyleDeclaration object that represents all CSS declaration\
s applied to a given element.", description_html: "The <code>getComputedStyle()</code> global method returns an <code>CSSStyleDeclaration</code> object that represents all CSS declarations applied to a given element.", group: ["cssom"], kind: "feature", name: "getComputedStyle()", spec: ["https://drafts.csswg.org/cssom-1/#extensions-to-the-window-interface"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Window.getComputedStyle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.getComputedStyle.pseudo_element_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, support: {
    chrome: "11", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, getallrecords: { compat_features: ["api.IDBIndex.getAllRecords", "api.IDBObjectStore.getAllRecords"], description: "The getAllRecords() method of IDBObjectStore and IDBIndex return records and their primary keys from an IndexedDB store or index. The records can be read in batches and in reverse order. The getAllRecords() methods speed up read operations on large datasets.", description_html: "The <code>getAllRecords()</code> method of <code>IDBObjectStore</code> and <code>IDBIndex</code> return records and their primary keys from an IndexedDB store or index. The records can be read in batches and in reverse order. The <code>getAllRecords()</code> methods speed up read operations on large datasets.", group: ["indexeddb"], kind: "feature", name: "IndexedDB getAllRecords()", spec: ["https://w3c.github.io/IndexedDB/#dom-idbindex-getallrecords", "https://w3c.github\
.io/IndexedDB/#dom-idbobjectstore-getallrecords"], status: { baseline: false, by_compat_key: { "api.IDBIndex.getAllRecords": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141" } }, "api.IDBObjectStore.getAllRecords": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141" } } }, support: { chrome: "141", chrome_android: "141", edge: "141" } } }, getboxquads: { compat_features: ["api.Document.getBoxQuads", "api.Element.getBoxQuads", "api.Text.getBoxQuads"], description: "The getBoxQuads() method, when called on a document, element, pseudo-element, or text node, returns the list of DOMQuad objects that represent the CSS boxes used to render the node.", description_html: "The <code>getBoxQuads()</code> method, when called on a document, element, pseudo-element, or text node, returns the list of <code>DOMQuad</code> objects that represent the CSS boxes used to render the node.", kind: "feature", name: "getBoxQuads()", spec: ["https://dra\
fts.csswg.org/cssom-view-1/"], status: { baseline: false, by_compat_key: { "api.Document.getBoxQuads": { baseline: false, support: {} }, "api.Element.getBoxQuads": { baseline: false, support: {} }, "api.Text.getBoxQuads": { baseline: false, support: {} } }, support: {} } }, gethtml: { compat_features: ["api.Element.getHTML", "api.ShadowRoot.getHTML"], description: "The getHTML() method of Element and ShadowRoot objects serializes an element's DOM to an HTML string.", description_html: "The <code>getHTML()</code> method of <code>Element</code> and <code>ShadowRoot</code> objects serializes an element's DOM to an HTML string.", group: ["dom"], kind: "feature", name: "getHTML()", spec: ["https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#html-serialization-methods"], status: { baseline: "low", baseline_low_date: "2024-09-16", by_compat_key: { "api.Element.getHTML": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "125", chrome_android: "125", edge: "\
125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.ShadowRoot.getHTML": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } } }, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } } }, getorinsert: { compat_features: ["javascript.builtins.Map.getOrInsert", "javascript.builtins.Map.getOrInsertComputed", "javascript.builtins.WeakMap.getOrInsert", "javascript.builtins.WeakMap.getOrInsertComputed"], description: "The getOrInsert() and getOrInsertComputed() methods of Map objects get a value, setting and getting a default value if needed.", description_html: "The <code>getOrInsert()</code> and <code>getOrInsertComputed()</code> methods of <code>Map</code> objects get a value, setting and getting a default value if needed.", group: ["maps"],
    kind: "feature", name: "Map getOrInsert()", spec: ["https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.getorinsert"], status: { baseline: "low", baseline_low_date: "2026-02-14", by_compat_key: { "javascript.builtins.Map.getOrInsert": { baseline: "low", baseline_low_date: "2026-02-14", support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "javascript.builtins.Map.getOrInsertComputed": { baseline: "low", baseline_low_date: "2026-02-14", support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "javascript.builtins.WeakMap.getOrInsert": { baseline: "low", baseline_low_date: "2026-02-14", support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "javascript.builtins.WeakMap.getOrInsertComputed": { baseline: "lo\
w", baseline_low_date: "2026-02-14", support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } } }, gif: { compat_features: ["mediatypes.image.gif"], description: "The GIF (Graphics Interchange Format) image format is a raster graphics file format with animation and lossless compression.", description_html: "The GIF (Graphics Interchange Format) image format is a raster graphics file format with animation and lossless compression.", kind: "feature", name: "GIF", spec: ["https://www.w3.org/Graphics/GIF/spec-gif89a.txt#top"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "mediatypes.image.gif": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, globalthis: { compat_features: ["javascript.builtins.globalThis"], description: "The globalThis property accesses the global this value (and hence the global object itself) across environments.", description_html: "The <code>globalThis</code> property accesses the global <code>this</code> value (and hence the global object itself) across environments.", group: ["javascript"], kind: "feature", name: "globalThis", snapshot: ["ecmascript-2020"], spec: ["https://tc39.es/ecma262/multipage/global-object.html#sec-globalthis"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.builtins.globalThis": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "12.1", safari_ios: "12.2" } } }, "glyph-orientation-vertical": { compat_features: ["css.properties.glyph-orientation-vertical"], description: "The glyph-orientation-vertical CSS property sets the orientation of glyphs in text rendered in a vertical writing mode.", description_html: "The <code>glyph-orientation-vertical</code> CSS property sets the orientation of glyphs in text rendered in a vertical writing mode.", discouraged: { according_to: ["https://drafts.csswg.org/css-writing-modes-4/#glyph-orientation"], alternatives: ["text-orientation"], reason: "The glyph-orientation-vertical property was defined by SVG 1.1 and formally obsoleted by SVG 2.", reason_html: "The <code>glyph-orientation-vertical</code> property was defined by SVG 1.1 and formally\
 obsoleted by SVG 2." }, group: ["css"], kind: "feature", name: "glyph-orientation-vertical", spec: ["https://drafts.csswg.org/css-writing-modes-4/#glyph-orientation"], status: { baseline: false, by_compat_key: { "css.properties.glyph-orientation-vertical": { baseline: false, support: { safari: "4", safari_ios: "3.2" } } }, support: { safari: "4", safari_ios: "3.2" } } }, gpc: { compat_features: ["api.Navigator.globalPrivacyControl", "api.WorkerNavigator.globalPrivacyControl", "http.headers.Sec-GPC"], description: "The Sec-GPC request header indicates that the user does not consent to a website or service selling or sharing their personal information with third parties.", description_html: "The <code>Sec-GPC</code> request header indicates that the user does not consent to a website or service selling or sharing their personal information with third parties.", kind: "feature", name: "Global privacy control", spec: ["https://w3c.github.io/gpc/"], status: { baseline: false, by_compat_key: {
    "api.Navigator.globalPrivacyControl": { baseline: false, support: { firefox: "120", firefox_android: "122" } }, "api.WorkerNavigator.globalPrivacyControl": { baseline: false, support: { firefox: "120", firefox_android: "122" } }, "http.headers.Sec-GPC": { baseline: false, support: { firefox: "120", firefox_android: "122" } } }, support: { firefox: "120", firefox_android: "122" } } }, "gradient-interpolation": { compat_features: ["css.types.gradient.conic-gradient.hue_interpolation_method", "css.types.gradient.conic-gradient.interpolation_color_space", "css.types.gradient.linear-gradient.hue_interpolation_method", "css.types.gradient.linear-gradient.interpolation_color_space", "css.types.gradient.radial-gradient.hue_interpolation_method", "css.types.gradient.radial-gradient.interpolation_color_space", "css.types.gradient.repeating-conic-gradient.hue_interpolation_method", "css.types.gradient.repeating-conic-gradient.interpolation_color_space", "css.types.gradient.repeating-linear-gr\
adient.hue_interpolation_method", "css.types.gradient.repeating-linear-gradient.interpolation_color_space", "css.types.gradient.repeating-radial-gradient.hue_interpolation_method", "css.types.gradient.repeating-radial-gradient.interpolation_color_space"], description: "Gradient interpolation controls how the colors between gradient stops are calculated in CSS. For example, linear-gradient(to right in oklch longer hue, red, red); calculates in the oklch color space, with the hue going all the way around the hue circle from red back to red.", description_html: "Gradient interpolation controls how the colors between gradient stops are calculated in CSS. For example, <code>linear-gradient(to right in oklch longer hue, red, red);</code> calculates in the <code>oklch</code> color space, with the hue going all the way around the hue circle from red back to red.", group: ["gradients"], kind: "feature", name: "Gradient interpolation", spec: ["https://drafts.csswg.org/css-color-4/#interpolation-\
space"], status: { baseline: "low", baseline_low_date: "2024-06-11", by_compat_key: { "css.types.gradient.conic-gradient.hue_interpolation_method": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.conic-gradient.interpolation_color_space": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.linear-gradient.hue_interpolation_method": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.linear-gradient.interpolation_color_space": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "\
111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.radial-gradient.hue_interpolation_method": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.radial-gradient.interpolation_color_space": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.repeating-conic-gradient.hue_interpolation_method": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.repeating-conic-gradient.interpolation_color_space": { baseline: "low", baseline_low_date: "2024-06-\
11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.repeating-linear-gradient.hue_interpolation_method": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.repeating-linear-gradient.interpolation_color_space": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.repeating-radial-gradient.hue_interpolation_method": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } }, "css.types.gradient.repeating-radial-gradient.inter\
polation_color_space": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "127", firefox_android: "127", safari: "16.2", safari_ios: "16.2" } } }, gradients: { compat_features: ["css.properties.background-image.gradients", "css.types.gradient", "css.types.gradient.linear-gradient", "css.types.gradient.linear-gradient.doubleposition", "css.types.gradient.linear-gradient.interpolation_hints", "css.types.gradient.linear-gradient.premultiplied_gradients", "css.types.gradient.linear-gradient.single_color_stop", "css.types.gradient.linear-gradient.to", "css.types.gradient.linear-gradient.unitless_0_angle", "css.types.gradient.radial-gradient", "css.types.gradient.radial-gradient.at", "css.types.gradient.radial-gradient.doubleposition", "css.types.gradient.radial-gradient.interpol\
ation_hints", "css.types.gradient.radial-gradient.premultiplied_gradients", "css.types.gradient.radial-gradient.single_color_stop", "css.types.gradient.repeating-linear-gradient", "css.types.gradient.repeating-linear-gradient.doubleposition", "css.types.gradient.repeating-linear-gradient.interpolation_hints", "css.types.gradient.repeating-linear-gradient.single_color_stop", "css.types.gradient.repeating-linear-gradient.to", "css.types.gradient.repeating-linear-gradient.unitless_0_angle", "css.types.gradient.repeating-radial-gradient", "css.types.gradient.repeating-radial-gradient.at", "css.types.gradient.repeating-radial-gradient.doubleposition", "css.types.gradient.repeating-radial-gradient.interpolation_hints", "css.types.gradient.repeating-radial-gradient.single_color_stop", "css.types.image"], description: "The linear-gradient() and radial-gradient() CSS functions and their repeating counterparts create backgrounds that progress smoothly between multiple colors.", description_html: "\
The <code>linear-gradient()</code> and <code>radial-gradient()</code> CSS functions and their repeating counterparts create backgrounds that progress smoothly between multiple colors.", group: ["gradients"], kind: "feature", name: "Gradients", spec: ["https://drafts.csswg.org/css-images-3/#gradients"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.background-image.gradients": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.types.gradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "3.6", firefox_android: "4", safari: "7", safari_ios: "7" } }, "css.types.gradient.linear-gradient": { baseline: "high", baseline_high_date: "2\
018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.linear-gradient.doubleposition": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } }, "css.types.gradient.linear-gradient.interpolation_hints": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "36", firefox_android: "36", safari: "7", safari_ios: "7" } }, "css.types.gradient.linear-gradient.premultiplied_gradients": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "29", chrome_android: "29", edge: "79", firefox: "36", firefox_android: "36", safari: "15", safari_ios: "\
15" } }, "css.types.gradient.linear-gradient.single_color_stop": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "18.4", safari_ios: "18.4" } }, "css.types.gradient.linear-gradient.to": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.linear-gradient.unitless_0_angle": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "7" } }, "css.types.gradient.radial-gradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "\
16", safari: "7", safari_ios: "7" } }, "css.types.gradient.radial-gradient.at": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.radial-gradient.doubleposition": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } }, "css.types.gradient.radial-gradient.interpolation_hints": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "36", firefox_android: "36", safari: "7", safari_ios: "7" } }, "css.types.gradient.radial-gradient.premultiplied_gradients": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: {
    chrome: "29", chrome_android: "29", edge: "79", firefox: "36", firefox_android: "36", safari: "15", safari_ios: "15" } }, "css.types.gradient.radial-gradient.single_color_stop": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "18.4", safari_ios: "18.4" } }, "css.types.gradient.repeating-linear-gradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.repeating-linear-gradient.doubleposition": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } }, "css.types.gradient.repeating-linear-gradient.interpolation_hints": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "40", chrome_android: "40", edge: "79", firefox: "36", firefox_android: "36", safari: "7", safari_ios: "7" } }, "css.types.gradient.repeating-linear-gradient.single_color_stop": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "18.4", safari_ios: "18.4" } }, "css.types.gradient.repeating-linear-gradient.to": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.repeating-linear-gradient.unitless_0_angle": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "\
7" } }, "css.types.gradient.repeating-radial-gradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.repeating-radial-gradient.at": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.gradient.repeating-radial-gradient.doubleposition": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } }, "css.types.gradient.repeating-radial-gradient.interpolation_hints": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
40", chrome_android: "40", edge: "79", firefox: "36", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.types.gradient.repeating-radial-gradient.single_color_stop": { baseline: "low", baseline_low_date: "2025-04-04", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "136", firefox_android: "136", safari: "18.4", safari_ios: "18.4" } }, "css.types.image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "3.6", firefox_android: "4", safari: "7", safari_ios: "7" } } }, grid: { caniuse: ["css-grid"], compat_features: ["css.properties.align-content.grid_context", "css.properties.align-items.grid_context", "css.properties.align-items.grid_context.start_end", "css.properties.align-self.grid_context", "css.properties.column-gap.g\
rid_context", "css.properties.display.grid", "css.properties.display.inline-grid", "css.properties.gap", "css.properties.gap.grid_context", "css.properties.gap.grid_context.calc_values", "css.properties.gap.grid_context.percentage_values", "css.properties.gap.normal", "css.properties.grid", "css.properties.grid-area", "css.properties.grid-auto-columns", "css.properties.grid-auto-flow", "css.properties.grid-auto-flow.column", "css.properties.grid-auto-flow.dense", "css.properties.grid-auto-flow.row", "css.properties.grid-auto-rows", "css.properties.grid-column", "css.properties.grid-column-end", "css.properties.grid-column-start", "css.properties.grid-row", "css.properties.grid-row-end", "css.properties.grid-row-start", "css.properties.grid-template", "css.properties.grid-template-areas", "css.properties.grid-template-areas.none", "css.properties.grid-template-columns", "css.properties.grid-template-columns.auto", "css.properties.grid-template-columns.fit-content", "css.properties.grid-\
template-columns.max-content", "css.properties.grid-template-columns.min-content", "css.properties.grid-template-columns.minmax", "css.properties.grid-template-columns.none", "css.properties.grid-template-columns.repeat", "css.properties.grid-template-rows", "css.properties.grid-template-rows.auto", "css.properties.grid-template-rows.fit-content", "css.properties.grid-template-rows.max-content", "css.properties.grid-template-rows.min-content", "css.properties.grid-template-rows.minmax", "css.properties.grid-template-rows.none", "css.properties.grid-template-rows.repeat", "css.properties.grid-template.none", "css.properties.justify-content.grid_context", "css.properties.justify-items.grid_context", "css.properties.justify-self", "css.properties.justify-self.auto", "css.properties.justify-self.grid_context", "css.properties.justify-self.left", "css.properties.justify-self.normal", "css.properties.justify-self.right", "css.properties.justify-self.stretch", "css.properties.place-content.gr\
id_context", "css.properties.place-items.grid_context", "css.properties.place-self.grid_context", "css.properties.row-gap", "css.properties.row-gap.grid_context", "css.properties.row-gap.normal", "css.types.flex"], description: "CSS grid is a two-dimensional layout system, which lays content out in rows and columns.", description_html: "CSS grid is a two-dimensional layout system, which lays content out in rows and columns.", group: ["grid"], kind: "feature", name: "Grid", spec: ["https://drafts.csswg.org/css-grid-3/"], status: { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", by_compat_key: { "css.properties.align-content.grid_context": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "52", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.align-items.grid_context": { baseline: "high", baseline_high_date: "2020-04-1\
7", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "52", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.align-items.grid_context.start_end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "css.properties.align-self.grid_context": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "52", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.column-gap.grid_context": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "css.properties.display.g\
rid": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.display.inline-grid": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.gap": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.gap.grid_context": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "css.pr\
operties.gap.grid_context.calc_values": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12.1", safari_ios: "12.2" } }, "css.properties.gap.grid_context.percentage_values": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "css.properties.gap.normal": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "\
10.1", safari_ios: "10.3" } }, "css.properties.grid-area": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-auto-columns": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "70", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-auto-flow": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-auto-flow.column": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52",
    firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-auto-flow.dense": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-auto-flow.row": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-auto-rows": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "70", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-column": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "\
57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-column-end": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-column-start": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-row": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-row-end": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "\
57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-row-start": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-areas": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-areas.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.fit-content": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.max\
-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.minmax": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "\
52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-columns.repeat": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "76", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.fit-content": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "5\
7", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.minmax": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.none": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template-rows.repeat": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "76", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "css.properties.grid-template.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-content.grid_context": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "52", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.j\
ustify-items.grid_context": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-self": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-self.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-self.grid_context": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "45", firefox_android: "45", safari: "\
10.1", safari_ios: "10.3" } }, "css.properties.justify-self.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-self.normal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-self.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.justify-self.stretch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "\
45", firefox_android: "45", safari: "10.1", safari_ios: "10.3" } }, "css.properties.place-content.grid_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "53", firefox_android: "53", safari: "11", safari_ios: "11" } }, "css.properties.place-items.grid_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "css.properties.place-self.grid_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "css.properties.row-gap": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "47", chrome_android: "\
47", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.properties.row-gap.grid_context": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "css.properties.row-gap.normal": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "47", chrome_android: "47", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "css.types.flex": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "40", firefox_android: "40", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } } }, "grid-\
animation": { compat_features: ["css.properties.grid-template-columns.animation", "css.properties.grid-template-rows.animation"], description: "Grid animation allows you to animate the grid-template-columns and grid-template-rows CSS properties.", description_html: "Grid animation allows you to animate the <code>grid-template-columns</code> and <code>grid-template-rows</code> CSS properties.", group: ["grid"], kind: "feature", name: "Grid animation", spec: ["https://drafts.csswg.org/css-grid-2/#track-sizing"], status: { baseline: "high", baseline_high_date: "2025-04-27", baseline_low_date: "2022-10-27", by_compat_key: { "css.properties.grid-template-columns.animation": { baseline: "high", baseline_high_date: "2025-04-27", baseline_low_date: "2022-10-27", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "66", firefox_android: "66", safari: "16", safari_ios: "16" } }, "css.properties.grid-template-rows.animation": { baseline: "high", baseline_high_date: "2025-04-27",
    baseline_low_date: "2022-10-27", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "66", firefox_android: "66", safari: "16", safari_ios: "16" } } }, support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "66", firefox_android: "66", safari: "16", safari_ios: "16" } } }, "grid-lanes": { kind: "moved", redirect_target: "masonry" }, gyroscope: { compat_features: ["api.Gyroscope", "api.Gyroscope.Gyroscope", "api.Gyroscope.x", "api.Gyroscope.y", "api.Gyroscope.z", "api.Permissions.permission_gyroscope", "html.elements.iframe.allow.gyroscope", "http.headers.Permissions-Policy.gyroscope"], description: "The Gyroscope API reads the angular velocity of a device in three dimensions.", description_html: "The <code>Gyroscope</code> API reads the angular velocity of a device in three dimensions.", group: ["sensors"], kind: "feature", name: "Gyroscope", spec: ["https://w3c.github.io/gyroscope/#gyroscope-interface"], status: { baseline: false, by_compat_key: {
    "api.Gyroscope": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Gyroscope.Gyroscope": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Gyroscope.x": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Gyroscope.y": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Gyroscope.z": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Permissions.permission_gyroscope": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.iframe.allow.gyroscope": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "http.headers.Permissions-Policy.gyroscope": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "67", chrome_android: "67", edge: "79" } } }, "hanging-punctuation": { caniuse: ["css-hanging\
-punctuation"], compat_features: ["css.properties.hanging-punctuation", "css.properties.hanging-punctuation.allow-end", "css.properties.hanging-punctuation.first", "css.properties.hanging-punctuation.force-end", "css.properties.hanging-punctuation.last", "css.properties.hanging-punctuation.none"], description: "The hanging-punctuation CSS property puts punctuation characters outside of the box to align the text with the rest of the document.", description_html: "The <code>hanging-punctuation</code> CSS property puts punctuation characters outside of the box to align the text with the rest of the document.", kind: "feature", name: "Hanging punctuation", spec: ["https://drafts.csswg.org/css-text-4/#hanging-punctuation-property"], status: { baseline: false, by_compat_key: { "css.properties.hanging-punctuation": { baseline: false, support: {} }, "css.properties.hanging-punctuation.allow-end": { baseline: false, support: {} }, "css.properties.hanging-punctuation.first": { baseline: false, support: {} },
    "css.properties.hanging-punctuation.force-end": { baseline: false, support: {} }, "css.properties.hanging-punctuation.last": { baseline: false, support: {} }, "css.properties.hanging-punctuation.none": { baseline: false, support: {} } }, support: {} } }, "hardware-concurrency": { caniuse: ["hardwareconcurrency"], compat_features: ["api.Navigator.hardwareConcurrency", "api.WorkerNavigator.hardwareConcurrency"], description: "The navigator.hardwareConcurrency property is the number of logical processors available to run threads on the user's computer.", description_html: "The <code>navigator.hardwareConcurrency</code> property is the number of logical processors available to run threads on the user's computer.", kind: "feature", name: "hardwareConcurrency", spec: ["https://html.spec.whatwg.org/multipage/workers.html#navigator.hardwareconcurrency"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "api.Navigator.hardwareCo\
ncurrency": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "15", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } }, "api.WorkerNavigator.hardwareConcurrency": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "37", chrome_android: "37", edge: "15", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "37", chrome_android: "37", edge: "15", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } } }, has: { caniuse: ["css-has"], compat_features: ["css.selectors.has"], description: "The :has() CSS functional pseudo-class matches an element if any of the selectors passed as parameters would match at least one element.", description_html: "The <code>:has()</code> CSS functional pseudo-class matches an element if any of the selectors passed as parameters\
 would match at least one element.", group: ["selectors"], kind: "feature", name: ":has()", spec: ["https://drafts.csswg.org/selectors-4/#relational"], status: { baseline: "low", baseline_low_date: "2023-12-19", by_compat_key: { "css.selectors.has": { baseline: "low", baseline_low_date: "2023-12-19", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "121", firefox_android: "121", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "121", firefox_android: "121", safari: "15.4", safari_ios: "15.4" } } }, "has-slotted": { compat_features: ["css.selectors.has-slotted"], description: "The :has-slotted CSS pseudo-class matches <slot> elements where the fallback content is not shown. The pseudo-class matches any slotted content, including white space, text nodes, or elements.", description_html: "The <code>:has-slotted</code> CSS pseudo-class matches <code>&#x3C;slot></code> elements where the fallback content i\
s not shown. The pseudo-class matches any slotted content, including white space, text nodes, or elements.", group: ["selectors", "web-components"], kind: "feature", name: ":has-slotted", spec: ["https://drafts.csswg.org/css-shadow-1/#the-has-slotted-pseudo"], status: { baseline: false, by_compat_key: { "css.selectors.has-slotted": { baseline: false, support: { firefox: "136", firefox_android: "136" } } }, support: { firefox: "136", firefox_android: "136" } } }, "hashbang-comments": { compat_features: ["javascript.grammar.hashbang_comments"], description: "The #! comment at the absolute start of a script or module is treated as a normal comment and is ignored by the JavaScript engine.", description_html: "The <code>#!</code> comment at the absolute start of a script or module is treated as a normal comment and is ignored by the JavaScript engine.", group: ["javascript"], kind: "feature", name: "Hashbang comments", snapshot: ["ecmascript-2023"], spec: ["https://tc39.es/ecma262/multipage\
/ecmascript-language-lexical-grammar.html#sec-hashbang"], status: { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", by_compat_key: { "javascript.grammar.hashbang_comments": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "67", firefox_android: "67", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "67", firefox_android: "67", safari: "13.1", safari_ios: "13.4" } } }, hashchange: { caniuse: ["hashchange"], compat_features: ["api.HashChangeEvent", "api.HashChangeEvent.HashChangeEvent", "api.HashChangeEvent.newURL", "api.HashChangeEvent.oldURL", "api.Window.hashchange_event"], description: "The hashchange event fires when the URL fragment identifier (the part of the URL starting with #) of the current page has changed.", description_html: "The <code>hashchange</code> event fires when the\
 URL fragment identifier (the part of the URL starting with <code>#</code>) of the current page has changed.", kind: "feature", name: "hashchange", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-hashchangeevent-interface"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HashChangeEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HashChangeEvent.HashChangeEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.HashChangeEvent.newURL": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "\
18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.HashChangeEvent.oldURL": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.Window.hashchange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5", safari_ios: "5" } } }, support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } } }, head: { compat_features: ["api.HTMLHeadElement", "html.elements.head"], description: "The <head> element contains machine-readable information (metadata) about the document, such as the title, <script> and <style> elements, and <meta> elements.", description_html: "The <code>&#x3C\
;head></code> element contains machine-readable information (metadata) about the document, such as the title, <code>&#x3C;script></code> and <code>&#x3C;style></code> elements, and <code>&#x3C;meta></code> elements.", group: ["html-elements"], kind: "feature", name: "<head>", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#the-head-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLHeadElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.head": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "header-footer": { compat_features: ["html.elements.footer", "html.elements.header"], description: "The <header> and <footer> HTML elements represent content that precedes and follows the main page content, respectively.", description_html: "The <code>&#x3C;header></code> and <code>&#x3C;footer></code> HTML elements represent content that precedes and follows the main page content, respectively.", group: ["landmark-elements"], kind: "feature", name: "<header> and <footer>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-header-element", "https://html.spec.whatwg.org/multipage/sections.html#the-footer-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.footer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "\
4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "html.elements.header": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, "heading-selectors": { compat_features: ["css.selectors.heading", "css.selectors.headingfunction"], description: "The :heading and :heading() CSS pseudo-classes match headings of varying levels. The :heading pseudo-class matches any heading (<h1> through <h6>). The :heading() selector matches any of the given levels. For example, :heading(1, 2) matches headings level 1 and 2.", description_html: "The <code>:heading</code> and <code>:heading()</code> CSS pseudo-classes match headings of varying levels. The <code>:heading</code> pseudo-class matches any headi\
ng (<code>&#x3C;h1></code> through <code>&#x3C;h6></code>). The <code>:heading()</code> selector matches any of the given levels. For example, <code>:heading(1, 2)</code> matches headings level 1 and 2.", group: ["selectors"], kind: "feature", name: "Heading pseudo-classes", spec: ["https://drafts.csswg.org/selectors-5/#headings"], status: { baseline: false, by_compat_key: { "css.selectors.heading": { baseline: false, support: {} }, "css.selectors.headingfunction": { baseline: false, support: {} } }, support: {} } }, headings: { compat_features: ["api.HTMLHeadingElement", "html.elements.h1", "html.elements.h2", "html.elements.h3", "html.elements.h4", "html.elements.h5", "html.elements.h6"], description: "The <h1> through <h6> HTML elements represent six levels of section headings, in order of decreasing importance.", description_html: "The <code>&#x3C;h1></code> through <code>&#x3C;h6></code> HTML elements represent six levels of section headings, in order of decreasing importance.", group: [
    "html-elements"], kind: "feature", name: "<h1> through <h6>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLHeadingElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.h1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.h2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.e\
lements.h3": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.h4": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.h5": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.h6": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, hgroup: { compat_features: ["html.elements.hgroup"], description: "The <hgroup> element represents a heading and related content.", description_html: "The <code>&#x3C;hgroup></code> element represents a heading and related content.", group: ["html-elements"], kind: "feature", name: "<hgroup>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-hgroup-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.hgroup": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, "hidden-until-found": { compat_features: ["api.Element.beforematch_event",
    "html.global_attributes.hidden.until-found"], description: `The hidden="until-found" attribute hides an element until it is found using the browser's find-in-page search or it is directly navigated to by following a URL fragment.`, description_html: `The <code>hidden="until-found"</code> attribute hides an element until it is found using the browser's find-in-page search or it is directly navigated to by following a URL fragment.`, group: ["html"], kind: "feature", name: 'hidden="until-found"', spec: ["https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found"], status: { baseline: false, by_compat_key: { "api.Element.beforematch_event": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "139", firefox_android: "139", safari: "26.2", safari_ios: "26.2" } }, "html.global_attributes.hidden.until-found": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "\
148", firefox_android: "148" } } }, support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "148", firefox_android: "148" } } }, highlight: { compat_features: ["api.CSS.highlights_static", "api.Highlight", "api.Highlight.@@iterator", "api.Highlight.Highlight", "api.Highlight.add", "api.Highlight.clear", "api.Highlight.delete", "api.Highlight.entries", "api.Highlight.forEach", "api.Highlight.has", "api.Highlight.keys", "api.Highlight.priority", "api.Highlight.size", "api.Highlight.type", "api.Highlight.values", "api.HighlightRegistry", "api.HighlightRegistry.@@iterator", "api.HighlightRegistry.clear", "api.HighlightRegistry.delete", "api.HighlightRegistry.entries", "api.HighlightRegistry.forEach", "api.HighlightRegistry.get", "api.HighlightRegistry.has", "api.HighlightRegistry.keys", "api.HighlightRegistry.set", "api.HighlightRegistry.size", "api.HighlightRegistry.values", "css.selectors.highlight"], description: "Custom highlights style arbitrary text ranges, without add\
ing extra elements to the DOM.", description_html: "Custom highlights style arbitrary text ranges, without adding extra elements to the DOM.", kind: "feature", name: "Custom highlights", spec: ["https://drafts.csswg.org/css-highlight-api-1/"], status: { baseline: "low", baseline_low_date: "2026-03-24", by_compat_key: { "api.CSS.highlights_static": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.@@iterator": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.Highligh\
t": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.add": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.clear": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.delete": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.entries": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140",
    firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.forEach": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.has": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.keys": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.priority": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.size": { baseline: "low", baseline_low_date: "2\
025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.type": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.Highlight.values": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.@@iterator": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "\
17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.clear": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.delete": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.entries": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.forEach": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.get": { baseline: "low", baseline_low_date: "\
2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.has": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.keys": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.set": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.size": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "\
140", safari: "17.2", safari_ios: "17.2" } }, "api.HighlightRegistry.values": { baseline: "low", baseline_low_date: "2025-06-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "140", firefox_android: "140", safari: "17.2", safari_ios: "17.2" } }, "css.selectors.highlight": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "149", firefox_android: "149", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "149", firefox_android: "149", safari: "17.2", safari_ios: "17.2" } } }, highlightsfrompoint: { compat_features: ["api.HighlightRegistry.highlightsFromPoint"], description: "The CSS.highlights.highlightsFromPoint() method returns an array of Highlight objects at a specified point.", description_html: "The <code>CSS.highlights.highlightsFromPoint()</code> method returns an array of <code>Highlight</code> objects at a specified poin\
t.", kind: "feature", name: "Custom highlights from point", spec: ["https://drafts.csswg.org/css-highlight-api-1/#dom-highlightregistry-highlightsfrompoint"], status: { baseline: false, by_compat_key: { "api.HighlightRegistry.highlightsFromPoint": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "150", firefox_android: "150" } } }, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "150", firefox_android: "150" } } }, history: { caniuse: ["history"], compat_features: ["api.History", "api.History.back", "api.History.forward", "api.History.go", "api.History.length", "api.History.pushState", "api.History.replaceState", "api.History.scrollRestoration", "api.History.state", "api.PopStateEvent", "api.PopStateEvent.PopStateEvent", "api.PopStateEvent.hasUAVisualTransition", "api.PopStateEvent.state", "api.Window.history", "api.Window.popstate_event"], description: "The window.history API manipulates the browser session history, from \
navigations to state management, in the tab or frame that the current page is loaded in.", description_html: "The <code>window.history</code> API manipulates the browser session history, from navigations to state management, in the tab or frame that the current page is loaded in.", kind: "feature", name: "History", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-history-interface"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.History": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.History.back": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.History\
.forward": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.History.go": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.History.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.History.pushState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.History.replaceState": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.History.scrollRestoration": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "46", firefox_android: "46", safari: "11", safari_ios: "11" } }, "api.History.state": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.PopStateEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.PopStateEvent.PopStateEvent": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "\
2016-08-02", support: { chrome: "16", chrome_android: "18", edge: "14", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.PopStateEvent.hasUAVisualTransition": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "149", firefox_android: "149", safari: "18", safari_ios: "18" } }, "api.PopStateEvent.state": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.Window.history": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.popstate_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } } }, host: { compat_features: ["css.selectors.host", "css.selectors.hostfunction"], description: "The :host CSS pseudo-class selects the containing element of the shadow tree in which it is used. The :host() CSS pseudo-class selects the that element only if it matches the provided selector.", description_html: "The <code>:host</code> CSS pseudo-class selects the containing element of the shadow tree in which it is used. The <code>:host()</code> CSS pseudo-class selects the that element only if it matches the provided selector.", group: ["selectors", "web-components"], kind: "feature", name: "Host", spec: ["https://drafts.csswg.org/css-shadow-1/#host-selector"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "c\
ss.selectors.host": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "css.selectors.hostfunction": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } } }, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } } }, "host-context": { compat_features: ["css.selectors.host-context"], description: "The :host-context() CSS pseudo-class selects the containing element of the shadow tree in which it is used if that element or an ancestor matches the provided selector.", description_html: "The <code>:host-context()</code> CSS pseudo-class selects the containing element of the shadow tree in\
 which it is used if that element or an ancestor matches the provided selector.", discouraged: { according_to: ["https://github.com/w3c/csswg-drafts/issues/1914#issuecomment-2737310093"], alternatives: ["container-style-queries"], reason: "The CSS Working Group removed :host-context() from the specification, due to opposition from vendors, performance considerations, and interest in alternatives.", reason_html: "The CSS Working Group removed <code>:host-context()</code> from the specification, due to opposition from vendors, performance considerations, and interest in alternatives." }, group: ["selectors", "web-components"], kind: "feature", name: ":host-context()", spec: ["https://drafts.csswg.org/css-shadow-1/#host-selector"], status: { baseline: false, by_compat_key: { "css.selectors.host-context": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79" } } }, support: { chrome: "54", chrome_android: "54", edge: "79" } } }, hr: { compat_features: ["api.HTMLHREle\
ment", "html.elements.hr"], description: "The <hr> element represents a thematic break between paragraphs, often shown as a horizontal rule.", description_html: "The <code>&#x3C;hr></code> element represents a thematic break between paragraphs, often shown as a horizontal rule.", group: ["html-elements"], kind: "feature", name: "<hr>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-hr-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLHRElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.hr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "\
1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, hsl: { caniuse: ["css3-colors"], compat_features: ["css.types.color.hsl", "css.types.color.hsl.alpha_parameter", "css.types.color.hsl.mixed_type_parameters", "css.types.color.hsl.space_separated_parameters"], description: "The hsl() and hsla() CSS functions pick colors using hue, saturation, lightness, and alpha (transparency) channels.", description_html: "The <code>hsl()</code> and <code>hsla()</code> CSS functions pick colors using hue, saturation, lightness, and alpha (transparency) channels.", group: ["color-types"], kind: "feature", name: "HSL", spec: ["https://drafts.csswg.org/css-color-4/#the-hsl-notation"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.types.color.hsl": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.types.color.hsl.alpha_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } }, "css.types.color.hsl.mixed_type_parameters": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.types.color.hsl.space_separated_parameters": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "\
12.2" } } }, hsts: { compat_features: ["http.headers.Strict-Transport-Security"], description: "The Strict-Transport-Security HTTP response header informs browsers that the site should only be accessed using HTTPS, and that any future attempts to access it using HTTP should automatically be converted to HTTPS. Also known as HSTS.", description_html: "The <code>Strict-Transport-Security</code> HTTP response header informs browsers that the site should only be accessed using HTTPS, and that any future attempts to access it using HTTP should automatically be converted to HTTPS. Also known as HSTS.", group: ["security", "http"], kind: "feature", name: "HTTP Strict Transport Security", spec: ["https://www.rfc-editor.org/rfc/rfc6797"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "http.headers.Strict-Transport-Security": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } } }, html: { compat_features: ["api.HTMLHtmlElement", "html.elements.html"], description: "The <html> element represents the top-level of an HTML document and is referred to as the root element.", description_html: "The <code>&#x3C;html></code> element represents the top-level of an HTML document and is referred to as the root element.", group: ["html-elements"], kind: "feature", name: "<html>", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#the-html-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLHtmlElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.html": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "html-media-capture": { caniuse: ["html-media-capture"], compat_features: ["api.HTMLInputElement.capture", "html.elements.input.capture"], description: `The capture HTML attribute for <input type="file"> elements allows the user to capture media using the device's camera or microphone.`, description_html: `The <code>capture</code> HTML attribute for <code>&#x3C;input type="file"></code> elements allows the user to capture media using the device's camera or microphone.`, kind: "feature", name: "HTML media capture", spec: ["https://w3c.github.io/html-media-capture/"],
    status: { baseline: false, by_compat_key: { "api.HTMLInputElement.capture": { baseline: false, support: { chrome_android: "25", firefox_android: "79", safari_ios: "10" } }, "html.elements.input.capture": { baseline: false, support: { chrome_android: "25", firefox_android: "79", safari_ios: "10" } } }, support: { chrome_android: "25", firefox_android: "79", safari_ios: "10" } } }, "html-wrapper-methods": { compat_features: ["javascript.builtins.String.anchor", "javascript.builtins.String.big", "javascript.builtins.String.blink", "javascript.builtins.String.bold", "javascript.builtins.String.fixed", "javascript.builtins.String.fontcolor", "javascript.builtins.String.fontsize", "javascript.builtins.String.italics", "javascript.builtins.String.link", "javascript.builtins.String.small", "javascript.builtins.String.strike", "javascript.builtins.String.sub", "javascript.builtins.String.substr", "javascript.builtins.String.sup"], description: "JavaScript built-in methods such as, String.bo\
ld() and String.italics(), wrap strings in (often historic) HTML.", description_html: "JavaScript built-in methods such as, <code>String.bold()</code> and <code>String.italics()</code>, wrap strings in (often historic) HTML.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers"], alternatives: ["dom"], reason: "HTML wrapper methods exist only for backwards compatibility. Use DOM APIs to create elements instead.", reason_html: "HTML wrapper methods exist only for backwards compatibility. Use DOM APIs to create elements instead." }, group: ["javascript"], kind: "feature", name: "HTML wrapper methods", spec: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-properties-of-the-string.prototype-object"], status: { baseline: false, by_compat_key: { "javascript.builtins.String.anchor": { baseline: false, support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.big": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.blink": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.bold": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.fixed": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.fontcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1",
    safari_ios: "1" } }, "javascript.builtins.String.fontsize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.italics": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.link": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.small": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.strike": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.sub": { baseline: false, support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.substr": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.sup": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "http-authentication": { compat_features: ["http.headers.Authorization", "http.headers.Authorization.Basic", "http.headers.Authorization.Digest", "http.headers.Authorization.Digest.SHA-256", "http.headers.Authorization.Digest.md5", "http.headers.Authorization.NTLM", "http.headers.Authorization.Negotiate", "http.headers.Authorization.authorization_removed_cross_origin", "http.head\
ers.WWW-Authenticate", "http.headers.WWW-Authenticate.Basic", "http.headers.WWW-Authenticate.Digest", "http.headers.WWW-Authenticate.Digest.SHA-256", "http.headers.WWW-Authenticate.Digest.md5", "http.headers.WWW-Authenticate.NTLM", "http.headers.WWW-Authenticate.Negotiate"], description: "The Authorization and WWW-Authenticate headers authenticate a user with a server.", description_html: "The <code>Authorization</code> and <code>WWW-Authenticate</code> headers authenticate a user with a server.", group: ["http"], kind: "feature", name: "HTTP authentication", spec: ["https://httpwg.org/specs/rfc9110.html#authentication", "https://httpwg.org/specs/rfc7616.html", "https://www.rfc-editor.org/rfc/rfc4120"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "http.headers.Authorization": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Authorization.Basic": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Authorization.Digest": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Authorization.Digest.SHA-256": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "93", firefox_android: "93" } }, "http.headers.Authorization.Digest.md5": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers\
.Authorization.NTLM": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤7", safari_ios: "≤7" } }, "http.headers.Authorization.Negotiate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤7", safari_ios: "≤7" } }, "http.headers.Authorization.authorization_removed_cross_origin": { baseline: false, support: { firefox: "111", firefox_android: "111", safari: "16.1", safari_ios: "16.1" } }, "http.headers.WWW-Authenticate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.WWW-Authenticate.Basic": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.WWW-Authenticate.Digest": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.WWW-Authenticate.Digest.SHA-256": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "93", firefox_android: "93" } }, "http.headers.WWW-Authenticate.Digest.md5": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.WWW-Authenticate.NTLM": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤7", safari_ios: "≤7" } }, "http.headers.WWW-Authenticate.Negotiate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤7", safari_ios: "≤7" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, http11: { compat_features: ["http.headers.Accept", "http.headers.Accept-Encoding", "http.headers.Accept-Language", "http.headers.Accept-Ranges", "http.headers.Age", "http.headers.Cache-Control", "http.headers.Connection", "http.headers.Content-Disposition", "http.headers.Content-Encoding", "http.headers.Content-Language", "http.headers.Content-Length", "http.headers.Content-Location", "http.headers.Content-Range", "http.headers.Content-Type", "http.headers.Date", "http.headers.ETag", "\
http.headers.Expires", "http.headers.From", "http.headers.Host", "http.headers.If-Match", "http.headers.If-Modified-Since", "http.headers.If-None-Match", "http.headers.If-Range", "http.headers.If-Unmodified-Since", "http.headers.Keep-Alive", "http.headers.Last-Modified", "http.headers.Location", "http.headers.Origin", "http.headers.Proxy-Authenticate", "http.headers.Range", "http.headers.Referer", "http.headers.Server", "http.headers.TE", "http.headers.Trailer", "http.headers.Transfer-Encoding", "http.headers.User-Agent", "http.headers.Vary", "http.headers.Via", "http.methods.CONNECT", "http.methods.DELETE", "http.methods.GET", "http.methods.HEAD", "http.methods.OPTIONS", "http.methods.POST", "http.methods.PUT"], description: "HTTP/1.1 is a network protocol used by browsers and servers. It has been superseded by HTTP/2 and HTTP/3.", description_html: "HTTP/1.1 is a network protocol used by browsers and servers. It has been superseded by HTTP/2 and HTTP/3.", group: ["http"], kind: "feat\
ure", name: "HTTP/1.1", spec: ["https://httpwg.org/specs/rfc9112.html"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "http.headers.Accept": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Accept-Encoding": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Accept-Language": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Accept-Ranges": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Age": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Cache-Control": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Connection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Disposition": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "201\
5-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Encoding": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Language": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Location": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Range": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Content-Type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Date": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.ETag": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Expires": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.From": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Host": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.If-Match": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "http.headers.If-Modified-Since": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.If-None-Match": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.If-Range": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.If-Unmodified-Since": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "http.headers.Keep-Alive": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Last-Modified": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Location": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Origin": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "70", firefox_android: "79", safari: "1", safari_ios: "1" } }, "http.headers.Proxy-Authe\
nticate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Range": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Referer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Server": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.TE": { baseline: "high", baseline_high_date: "2\
018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Trailer": { baseline: false, support: {} }, "http.headers.Transfer-Encoding": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.User-Agent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Vary": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.headers.Via": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.CONNECT": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.DELETE": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.GET": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.HEAD": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.OPTIONS": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.POST": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "http.methods.PUT": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, http2: { caniuse: ["http2"], description: "\
The HTTP/2 protocol is a major revision of the HTTP network protocol, providing improved performance and efficiency by using a single TCP connection to send multiple streams of data at once.", description_html: "The HTTP/2 protocol is a major revision of the HTTP network protocol, providing improved performance and efficiency by using a single TCP connection to send multiple streams of data at once.", group: ["http"], kind: "feature", name: "HTTP/2", spec: ["https://httpwg.org/specs/rfc9113.html"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } } }, http3: { caniuse: ["http3"], description: "HTTP/3 is a major revision of the HTTP network protocol, providing improved performance and efficiency by using QUIC as the underlying transport protocol.", description_html: "HTTP/3 is a major revision of the HTTP network pr\
otocol, providing improved performance and efficiency by using QUIC as the underlying transport protocol.", group: ["http"], kind: "feature", name: "HTTP/3", spec: ["https://httpwg.org/specs/rfc9114.html"], status: { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "88", firefox_android: "88", safari: "18", safari_ios: "18" } } }, hwb: { compat_features: ["css.types.color.hwb", "css.types.color.hwb.mixed_type_parameters"], description: "The hwb() CSS function picks colors using hue, whiteness, and blackness channels.", description_html: "The <code>hwb()</code> CSS function picks colors using hue, whiteness, and blackness channels.", group: ["color-types"], kind: "feature", name: "HWB", spec: ["https://drafts.csswg.org/css-color-4/#the-hwb-notation"], status: { baseline: "high", baseline_high_date: "2024-10-28", baseline_low_date: "2022-04-28", by_compat_key: { "css.types.color.hwb": { baseline: "high", baseline_high_date: "\
2024-10-28", baseline_low_date: "2022-04-28", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "96", firefox_android: "96", safari: "15", safari_ios: "15" } }, "css.types.color.hwb.mixed_type_parameters": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } } }, support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "96", firefox_android: "96", safari: "15", safari_ios: "15" } } }, "hyphenate-character": { compat_features: ["css.properties.hyphenate-character", "css.properties.hyphenate-character.auto"], description: "The hyphenate-character CSS property sets the character or string to use at the end of a line before a line break.", description_html: "The <code>hyphenate-character</code> CSS property sets the character or string to use at the end of a line before a line break.", group: ["text-wrap"], kind: "feature",
    name: "Hyphenate character", spec: ["https://drafts.csswg.org/css-text-4/#hyphenate-character"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "css.properties.hyphenate-character": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "98", firefox_android: "98", safari: "17", safari_ios: "17" } }, "css.properties.hyphenate-character.auto": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "98", firefox_android: "98", safari: "17", safari_ios: "17" } } }, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "98", firefox_android: "98", safari: "17", safari_ios: "17" } } }, "hyphenate-limit-chars": { compat_features: ["css.properties.hyphenate-limit-chars", "css.properties.hyphenate-limit-cha\
rs.auto"], description: "The hyphenate-limit-chars CSS property sets the number of characters in a word before it is hyphenated and the minimum number of characters on either side of the hyphen.", description_html: "The <code>hyphenate-limit-chars</code> CSS property sets the number of characters in a word before it is hyphenated and the minimum number of characters on either side of the hyphen.", group: ["text-wrap"], kind: "feature", name: "Hyphenate limit chars", spec: ["https://drafts.csswg.org/css-text-4/#hyphenate-char-limits"], status: { baseline: false, by_compat_key: { "css.properties.hyphenate-limit-chars": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "137", firefox_android: "137" } }, "css.properties.hyphenate-limit-chars.auto": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "137", firefox_android: "137" } } }, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "137", firefox_android: "\
137" } } }, hyphens: { caniuse: ["css-hyphens"], compat_features: ["css.properties.hyphens", "css.properties.hyphens.auto", "css.properties.hyphens.language_afrikaans", "css.properties.hyphens.language_albanian", "css.properties.hyphens.language_amharic", "css.properties.hyphens.language_armenian", "css.properties.hyphens.language_assamese", "css.properties.hyphens.language_basque", "css.properties.hyphens.language_belarusian", "css.properties.hyphens.language_bengali", "css.properties.hyphens.language_bosnian", "css.properties.hyphens.language_bulgarian", "css.properties.hyphens.language_catalan", "css.properties.hyphens.language_croatian", "css.properties.hyphens.language_cyrillic_mongolian", "css.properties.hyphens.language_czech", "css.properties.hyphens.language_danish", "css.properties.hyphens.language_dutch", "css.properties.hyphens.language_english", "css.properties.hyphens.language_esperanto", "css.properties.hyphens.language_estonian", "css.properties.hyphens.language_ethiopi\
c_script_mul", "css.properties.hyphens.language_ethiopic_script_und", "css.properties.hyphens.language_finnish", "css.properties.hyphens.language_french", "css.properties.hyphens.language_galician", "css.properties.hyphens.language_georgian", "css.properties.hyphens.language_german_reformed_orthography", "css.properties.hyphens.language_german_swiss_orthography", "css.properties.hyphens.language_german_traditional_orthography", "css.properties.hyphens.language_gujarati", "css.properties.hyphens.language_hindi", "css.properties.hyphens.language_hungarian", "css.properties.hyphens.language_icelandic", "css.properties.hyphens.language_interlingua", "css.properties.hyphens.language_irish", "css.properties.hyphens.language_italian", "css.properties.hyphens.language_kannada", "css.properties.hyphens.language_kurmanji", "css.properties.hyphens.language_latin", "css.properties.hyphens.language_latvian", "css.properties.hyphens.language_lithuanian", "css.properties.hyphens.language_malayalam", "\
css.properties.hyphens.language_marathi", "css.properties.hyphens.language_modern_greek", "css.properties.hyphens.language_mongolian", "css.properties.hyphens.language_norwegian_nn", "css.properties.hyphens.language_norwegian_no", "css.properties.hyphens.language_old_slavonic", "css.properties.hyphens.language_oriya", "css.properties.hyphens.language_polish", "css.properties.hyphens.language_portuguese", "css.properties.hyphens.language_punjabi", "css.properties.hyphens.language_russian", "css.properties.hyphens.language_slovak", "css.properties.hyphens.language_slovenian", "css.properties.hyphens.language_spanish", "css.properties.hyphens.language_swedish", "css.properties.hyphens.language_tamil", "css.properties.hyphens.language_telugu", "css.properties.hyphens.language_turkish", "css.properties.hyphens.language_turkmen", "css.properties.hyphens.language_ukrainian", "css.properties.hyphens.language_upper_sorbian", "css.properties.hyphens.language_welsh"], description: "The hyphens CS\
S property controls when long words are broken by line wrapping. Although called hyphens, the property applies to word-splitting behavior across languages, such as customary spelling changes or the use of other characters. Support for non-English languages varies significantly.", description_html: "The <code>hyphens</code> CSS property controls when long words are broken by line wrapping. Although called <code>hyphens</code>, the property applies to word-splitting behavior across languages, such as customary spelling changes or the use of other characters. Support for non-English languages varies significantly.", group: ["css"], kind: "feature", name: "Hyphenation", spec: ["https://drafts.csswg.org/css-text-3/#hyphens-property"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "css.properties.hyphens": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "55", chrome_android: "\
55", edge: "79", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.auto": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "88", chrome_android: "55", edge: "88", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_afrikaans": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_albanian": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112" } }, "css.properties.hyphens.language_amharic": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112" } }, "css.properties.hyphens.language_armenian": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_assamese": { baseline: false, support: { chrome: "87", chrome_android: "87",
    edge: "87" } }, "css.properties.hyphens.language_basque": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_belarusian": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_bengali": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_bosnian": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_bulgarian": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_catalan": { baseline: false, support: { firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_croatian": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87",
    edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_cyrillic_mongolian": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_czech": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_danish": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_dutch": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.h\
yphens.language_english": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_esperanto": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_estonian": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_ethiopic_script_mul": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112" } }, "css.properties.hyphens.language_ethiopic_script_und": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_finnish": { baseline: false, support: { firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_french": { baseline: "\
high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_galician": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_georgian": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112" } }, "css.properties.hyphens.language_german_reformed_orthography": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_german_swiss_orthography": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_g\
erman_traditional_orthography": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_gujarati": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_hindi": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_hungarian": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_icelandic": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_interlingua": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_irish": { baseline: false, support: { chrome: "87", chrome_android: "\
87", edge: "87" } }, "css.properties.hyphens.language_italian": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_kannada": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_kurmanji": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_latin": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_latvian": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112" } }, "css.properties.hyphens.language_lithuanian": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43" } }, "css.propertie\
s.hyphens.language_malayalam": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_marathi": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_modern_greek": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112" } }, "css.properties.hyphens.language_mongolian": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_norwegian_nn": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari_ios: "17" } }, "css.properties.hyphens.language_norwegian_no": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_old_slavonic": { baseline: false,
    support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_oriya": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_polish": { baseline: false, support: { firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_portuguese": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_punjabi": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_russian": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.pr\
operties.hyphens.language_slovak": { baseline: false, support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "130", firefox_android: "130" } }, "css.properties.hyphens.language_slovenian": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_spanish": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_swedish": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_tamil": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens\
.language_telugu": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_turkish": { baseline: false, support: { firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_turkmen": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "css.properties.hyphens.language_ukrainian": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "43", firefox_android: "43", safari: "17", safari_ios: "17" } }, "css.properties.hyphens.language_upper_sorbian": { baseline: false, support: { firefox: "43", firefox_android: "43" } }, "css.properties.hyphens.language_welsh": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "43", firefox_android: "43" } } }, support: { chrome: "88", chrome_android: "55", edge: "88", firefox: "43", firefox_android: "\
43", safari: "17", safari_ios: "17" } } }, i: { compat_features: ["html.elements.i"], description: "The <i> HTML element identifies idiomatic content, styling text as italic by default.", description_html: "The <code>&#x3C;i></code> HTML element identifies idiomatic content, styling text as italic by default.", group: ["html-elements"], kind: "feature", name: "<i>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-i-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.i": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, ic: { compat_features: ["css.types.length.ic"], description: "T\
he ic CSS length unit corresponds to the width of CJK ideographic characters.", description_html: "The <code>ic</code> CSS length unit corresponds to the width of CJK ideographic characters.", group: ["units"], kind: "feature", name: "ic unit", spec: ["https://drafts.csswg.org/css-values-4/#ic"], status: { baseline: "high", baseline_high_date: "2025-04-03", baseline_low_date: "2022-10-03", by_compat_key: { "css.types.length.ic": { baseline: "high", baseline_high_date: "2025-04-03", baseline_low_date: "2022-10-03", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, "idle-detection": { compat_features: ["api.IdleDetector", "api.IdleDetector.IdleDetector", "api.IdleDetector.change_event", "api.IdleDetector.requestPermission_static", "api.IdleDetector.screenSta\
te", "api.IdleDetector.start", "api.IdleDetector.userState", "html.elements.iframe.allow.idle-detection", "http.headers.Permissions-Policy.idle-detection"], description: "The IdleDetector API is used to notify a webpage of the user's idle, active, and locked state.", description_html: "The <code>IdleDetector</code> API is used to notify a webpage of the user's idle, active, and locked state.", kind: "feature", name: "Idle detection", spec: ["https://wicg.github.io/idle-detection/"], status: { baseline: false, by_compat_key: { "api.IdleDetector": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "api.IdleDetector.IdleDetector": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "api.IdleDetector.change_event": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "api.IdleDetector.requestPermission_static": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "api.\
IdleDetector.screenState": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "api.IdleDetector.start": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "api.IdleDetector.userState": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "114" } }, "html.elements.iframe.allow.idle-detection": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "http.headers.Permissions-Policy.idle-detection": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } } }, support: { chrome: "94", chrome_android: "94", edge: "114" } } }, if: { compat_features: ["css.types.if"], description: "The if() CSS function is an inline conditional value that returns a value based on a set of conditions.", description_html: "The <code>if()</code> CSS function is an inline conditional value that returns a value based on a set of conditions.", group: ["css"], kind: "feature", name: "if\
()", spec: ["https://drafts.csswg.org/css-values-5/#if-notation"], status: { baseline: false, by_compat_key: { "css.types.if": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } } }, support: { chrome: "137", chrome_android: "137", edge: "137" } } }, iframe: { compat_features: ["api.HTMLIFrameElement", "api.HTMLIFrameElement.contentDocument", "api.HTMLIFrameElement.contentWindow", "api.HTMLIFrameElement.getSVGDocument", "api.HTMLIFrameElement.height", "api.HTMLIFrameElement.name", "api.HTMLIFrameElement.src", "api.HTMLIFrameElement.width", "html.elements.iframe", "html.elements.iframe.height", "html.elements.iframe.name", "html.elements.iframe.src", "html.elements.iframe.width"], description: "The <iframe> element embeds another HTML page into the current page.", description_html: "The <code>&#x3C;iframe></code> element embeds another HTML page into the current page.", group: ["html-elements"], kind: "feature", name: "<iframe>", spec: ["https://html.spec.\
whatwg.org/multipage/iframe-embed-object.html#the-iframe-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLIFrameElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLIFrameElement.contentDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLIFrameElement.contentWindow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLIFrameElement.getSVGDocument": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.HTMLIFrameElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLIFrameElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLIFrameElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLIFrameElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.iframe": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.iframe.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.iframe.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.iframe.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015\
-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.iframe.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "iframe-credentialless": { compat_features: ["api.HTMLIFrameElement.credentialless", "api.Window.credentialless", "html.elements.iframe.credentialless"], description: "The credentialless attribute for the <iframe> HTML element loads third-party content in an ephemeral context and does not send any credentials such as cookies. When using cross-origin isolation, this allows you to embed content that does not send Cross-Origin-Embedder-Policy headers.", description_html: "\
The <code>credentialless</code> attribute for the <code>&#x3C;iframe></code> HTML element loads third-party content in an ephemeral context and does not send any credentials such as cookies. When using cross-origin isolation, this allows you to embed content that does not send <code>Cross-Origin-Embedder-Policy</code> headers.", group: ["security"], kind: "feature", name: "Credentialless iframes", spec: ["https://wicg.github.io/anonymous-iframe/"], status: { baseline: false, by_compat_key: { "api.HTMLIFrameElement.credentialless": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.Window.credentialless": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "html.elements.iframe.credentialless": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } } }, support: { chrome: "110", chrome_android: "110", edge: "110" } } }, "iframe-sandbox": { caniuse: ["iframe-sandbox"], compat_features: ["ap\
i.HTMLIFrameElement.sandbox", "html.elements.iframe.sandbox", "html.elements.iframe.sandbox.allow-downloads", "html.elements.iframe.sandbox.allow-forms", "html.elements.iframe.sandbox.allow-modals", "html.elements.iframe.sandbox.allow-popups", "html.elements.iframe.sandbox.allow-popups-to-escape-sandbox", "html.elements.iframe.sandbox.allow-same-origin", "html.elements.iframe.sandbox.allow-scripts", "html.elements.iframe.sandbox.allow-top-navigation", "html.elements.iframe.sandbox.allow-top-navigation-by-user-activation", "html.elements.iframe.sandbox.allow-top-navigation-to-custom-protocols"], description: "The sandbox attribute for the <iframe> HTML element sets many security restrictions on the iframe, such as preventing form submissions or opening modal dialogs. Optional allow- values relax specific restrictions.", description_html: "The <code>sandbox</code> attribute for the <code>&#x3C;iframe></code> HTML element sets many security restrictions on the iframe, such as preventing f\
orm submissions or opening modal dialogs. Optional <code>allow-</code> values relax specific restrictions.", kind: "feature", name: "Sandboxed iframes", spec: ["https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-sandbox", "https://privacycg.github.io/storage-access/#sandboxing-storage-access"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLIFrameElement.sandbox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "17", firefox_android: "17", safari: "5", safari_ios: "4" } }, "html.elements.iframe.sandbox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "17", firefox_android: "17", safari: "5", safari_ios: "4" } }, "html.elements.iframe.sandbox.allow-downloads": { baseline: "high", baseline_high_date: "\
2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "82", firefox_android: "82", safari: "17", safari_ios: "17" } }, "html.elements.iframe.sandbox.allow-forms": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "≤49", firefox_android: "≤49", safari: "5", safari_ios: "4" } }, "html.elements.iframe.sandbox.allow-modals": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "49", firefox_android: "49", safari: "11.1", safari_ios: "11.3" } }, "html.elements.iframe.sandbox.allow-popups": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "17", chrome_android: "18", edge: "12", firefox: "28", firefox_android: "27", safari: "6", safari_ios: "6" } }, "html.elements.iframe.\
sandbox.allow-popups-to-escape-sandbox": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "49", firefox_android: "49", safari: "11.1", safari_ios: "11.3" } }, "html.elements.iframe.sandbox.allow-same-origin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "≤49", firefox_android: "≤49", safari: "5", safari_ios: "4" } }, "html.elements.iframe.sandbox.allow-scripts": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "≤49", firefox_android: "≤49", safari: "5", safari_ios: "4" } }, "html.elements.iframe.sandbox.allow-top-navigation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "\
79", firefox: "≤49", firefox_android: "≤49", safari: "5", safari_ios: "4.2" } }, "html.elements.iframe.sandbox.allow-top-navigation-by-user-activation": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "79", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "html.elements.iframe.sandbox.allow-top-navigation-to-custom-protocols": { baseline: false, support: { firefox: "101", firefox_android: "101", safari: "16", safari_ios: "16" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "17", firefox_android: "17", safari: "5", safari_ios: "4" } } }, "iframe-srcdoc": { caniuse: ["iframe-srcdoc"], compat_features: ["api.HTMLIFrameElement.srcdoc", "html.elements.iframe.srcdoc"], description: "The srcdoc attribute for the <iframe> HTML element sets a string of HTML to embed in the document. The value of srcdoc overrides loading a document from the src at\
tribute.", description_html: "The <code>srcdoc</code> attribute for the <code>&#x3C;iframe></code> HTML element sets a string of HTML to embed in the document. The value of <code>srcdoc</code> overrides loading a document from the <code>src</code> attribute.", kind: "feature", name: "srcdoc", spec: ["https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-srcdoc"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.HTMLIFrameElement.srcdoc": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "20", chrome_android: "25", edge: "79", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "html.elements.iframe.srcdoc": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "20", chrome_android: "25", edge: "79", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } } },
    support: { chrome: "20", chrome_android: "25", edge: "79", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } } }, "image-function": { description: "The image() CSS function creates an image similar to url() but with additional functionality. It can create a solid color as an image, provide a fallback from an image URL to a solid color, or clip a sprite image using media fragments. Not to be confused with the Image() constructor.", description_html: "The <code>image()</code> CSS function creates an image similar to <code>url()</code> but with additional functionality. It can create a solid color as an image, provide a fallback from an image URL to a solid color, or clip a sprite image using media fragments. Not to be confused with the <code>Image()</code> constructor.", group: ["images"], kind: "feature", name: "image()", spec: ["https://drafts.csswg.org/css-images-4/#image-notation"], status: { baseline: false, support: {} } }, "image-maps": { compat_features: ["\
api.HTMLAreaElement", "api.HTMLAreaElement.alt", "api.HTMLAreaElement.coords", "api.HTMLAreaElement.hash", "api.HTMLAreaElement.host", "api.HTMLAreaElement.hostname", "api.HTMLAreaElement.href", "api.HTMLAreaElement.origin", "api.HTMLAreaElement.password", "api.HTMLAreaElement.pathname", "api.HTMLAreaElement.port", "api.HTMLAreaElement.protocol", "api.HTMLAreaElement.rel", "api.HTMLAreaElement.relList", "api.HTMLAreaElement.search", "api.HTMLAreaElement.shape", "api.HTMLAreaElement.target", "api.HTMLAreaElement.toString", "api.HTMLAreaElement.username", "api.HTMLImageElement.isMap", "api.HTMLImageElement.useMap", "api.HTMLMapElement", "api.HTMLMapElement.areas", "api.HTMLMapElement.name", "html.elements.area", "html.elements.area.alt", "html.elements.area.coords", "html.elements.area.href", "html.elements.area.implicit_noopener", "html.elements.area.rel", "html.elements.area.rel.noopener", "html.elements.area.rel.noreferrer", "html.elements.area.shape", "html.elements.area.target", "ht\
ml.elements.img.ismap", "html.elements.img.usemap", "html.elements.map", "html.elements.map.name"], description: "The <area> and <map> elements define a clickable area on an image.", description_html: "The <code>&#x3C;area></code> and <code>&#x3C;map></code> elements define a clickable area on an image.", group: ["html-elements"], kind: "feature", name: "Image maps", spec: ["https://html.spec.whatwg.org/multipage/image-maps.html"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLAreaElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.alt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "api.HTMLAreaElement.coords": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.hash": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.host": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.hostname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } },
    "api.HTMLAreaElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.origin": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "32", chrome_android: "32", edge: "17", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "api.HTMLAreaElement.password": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "api.HTMLAreaElement.pathname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api\
.HTMLAreaElement.port": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.protocol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.rel": { baseline: "high", baseline_high_date: "2019-04-19", baseline_low_date: "2016-10-19", support: { chrome: "54", chrome_android: "54", edge: "12", firefox: "30", firefox_android: "30", safari: "9", safari_ios: "9" } }, "api.HTMLAreaElement.relList": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "65", chrome_android: "65", edge: "18", firefox: "30", firefox_android: "30", safari: "9", safari_ios: "9" } }, "api.HTMLAreaElement\
.search": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.shape": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLAreaElement.toString": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "22", firefox_android: "22", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLAreaElement.username": {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "api.HTMLImageElement.isMap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.useMap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLMapElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLMapElement.areas": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLMapElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.area": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.area.alt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.area.coords": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "201\
5-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.area.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.area.implicit_noopener": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "79", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "html.elements.area.rel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "30", firefox_android: "30", safari: "5", safari_ios: "4.2" } }, "html.elements.area.rel.noopener": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2\
020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "52", firefox_android: "52", safari: "10.1", safari_ios: "10.3" } }, "html.elements.area.rel.noreferrer": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "16", chrome_android: "18", edge: "13", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "html.elements.area.shape": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.area.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.img.ismap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-0\
7-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.img.usemap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.map": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.map.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "image-orient\
ation": { caniuse: ["css-image-orientation"], compat_features: ["css.properties.image-orientation", "css.properties.image-orientation.from-image", "css.properties.image-orientation.none"], description: "The image-orientation CSS property corrects the rotation of an image using the image's metadata, such as EXIF.", description_html: "The <code>image-orientation</code> CSS property corrects the rotation of an image using the image's metadata, such as EXIF.", group: ["images"], kind: "feature", name: "image-orientation", spec: ["https://drafts.csswg.org/css-images-3/#the-image-orientation"], status: { baseline: "high", baseline_high_date: "2022-10-13", baseline_low_date: "2020-04-13", by_compat_key: { "css.properties.image-orientation": { baseline: "high", baseline_high_date: "2022-10-13", baseline_low_date: "2020-04-13", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "26", firefox_android: "26", safari: "13.1", safari_ios: "13.4" } }, "css.properties.image-orientatio\
n.from-image": { baseline: "high", baseline_high_date: "2022-10-13", baseline_low_date: "2020-04-13", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "26", firefox_android: "26", safari: "13.1", safari_ios: "13.4" } }, "css.properties.image-orientation.none": { baseline: "high", baseline_high_date: "2022-10-13", baseline_low_date: "2020-04-13", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "26", firefox_android: "26", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "26", firefox_android: "26", safari: "13.1", safari_ios: "13.4" } } }, "image-rendering": { caniuse: ["css-crisp-edges"], compat_features: ["css.properties.image-rendering", "css.properties.image-rendering.auto", "css.properties.image-rendering.pixelated"], description: "The image-rendering CSS property sets how images are scaled, retaining smoothness for photos, or hard edges for pixel art and QR codes.", description_html: "\
The <code>image-rendering</code> CSS property sets how images are scaled, retaining smoothness for photos, or hard edges for pixel art and QR codes.", group: ["image-scaling"], kind: "feature", name: "image-rendering", spec: ["https://drafts.csswg.org/css-images-3/#the-image-rendering"], status: { baseline: "high", baseline_high_date: "2024-04-05", baseline_low_date: "2021-10-05", by_compat_key: { "css.properties.image-rendering": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "3.6", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.image-rendering.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "3.6", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.image-rendering.pixelated": { baseline: "high", baseline_high_date: "2024-\
04-05", baseline_low_date: "2021-10-05", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "93", firefox_android: "93", safari: "10", safari_ios: "10" } } }, support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "93", firefox_android: "93", safari: "10", safari_ios: "10" } } }, "image-set": { caniuse: ["css-image-set"], compat_features: ["css.properties.background-image.image-set", "css.properties.content.image-set", "css.types.image.image-set"], description: "The image-set() CSS function provides a set of images at different resolutions or pixel densities, which the browser can pick from, depending on the device capabilities.", description_html: "The <code>image-set()</code> CSS function provides a set of images at different resolutions or pixel densities, which the browser can pick from, depending on the device capabilities.", group: ["css"], kind: "feature", name: "image-set()", spec: ["https://drafts.csswg.org/css-images-4/#image-set-notation"], status: {
    baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "css.properties.background-image.image-set": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "89", firefox_android: "89", safari: "17", safari_ios: "17" } }, "css.properties.content.image-set": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "89", firefox_android: "89", safari: "17", safari_ios: "17" } }, "css.types.image.image-set": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "89", firefox_android: "89", safari: "17", safari_ios: "17" } } }, support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "89", firefox_android: "89", safari: "17",
    safari_ios: "17" } } }, imagebitmaprenderingcontext: { compat_features: ["api.HTMLCanvasElement.getContext.bitmaprenderer_context", "api.HTMLCanvasElement.getContext.bitmaprenderer_context.options_alpha_parameter", "api.ImageBitmapRenderingContext", "api.ImageBitmapRenderingContext.canvas", "api.ImageBitmapRenderingContext.transferFromImageBitmap"], description: 'The ImageBitmapRenderingContext API is the "bitmaprenderer" rendering context for the <canvas> element. It is commonly used to transfer frames from an OffscreenCanvas to a user-visible <canvas> element.', description_html: 'The <code>ImageBitmapRenderingContext</code> API is the <code>"bitmaprenderer"</code> rendering context for the <code>&#x3C;canvas></code> element. It is commonly used to transfer frames from an <code>OffscreenCanvas</code> to a user-visible <code>&#x3C;canvas></code> element.', kind: "feature", name: "ImageBitmapRenderingContext", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#the-imagebitm\
aprenderingcontext-interface"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.HTMLCanvasElement.getContext.bitmaprenderer_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "46", firefox_android: "46", safari: "11.1", safari_ios: "11.3" } }, "api.HTMLCanvasElement.getContext.bitmaprenderer_context.options_alpha_parameter": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "11.1", safari_ios: "11.3" } }, "api.ImageBitmapRenderingContext": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "46", firefox_android: "46", safari: "11.1", safari_ios: "11.3" } }, "api.ImageBitmapRenderingContext.canvas": { baseline: "high", baseline_high_date: "2024-08-08", baseline_low_date: "\
2022-02-08", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "97", firefox_android: "97", safari: "11.1", safari_ios: "11.3" } }, "api.ImageBitmapRenderingContext.transferFromImageBitmap": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "50", firefox_android: "50", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "50", firefox_android: "50", safari: "11.1", safari_ios: "11.3" } } }, "ime-mode": { compat_features: ["css.properties.ime-mode"], description: "The ime-mode CSS property sets the state of the input method editor for text fields.", description_html: "The <code>ime-mode</code> CSS property sets the state of the input method editor for text fields.", discouraged: { according_to: ["https://drafts.csswg.org/css-ui-3/#input-method-editor"], alternatives: ["inputmode", "lang-attr"], reason: "You sh\
ould not modify the state of input method editor. Instead, you should use hints (such as a lang or inputmode attribute) to help the browser select the right user interface for text input.", reason_html: "You should not modify the state of input method editor. Instead, you should use hints (such as a <code>lang</code> or <code>inputmode</code> attribute) to help the browser select the right user interface for text input." }, group: ["css"], kind: "feature", name: "ime-mode", spec: ["https://drafts.csswg.org/css-ui-3/#input-method-editor"], status: { baseline: false, by_compat_key: { "css.properties.ime-mode": { baseline: false, support: { firefox: "3", firefox_android: "4" } } }, support: { firefox: "3", firefox_android: "4" } } }, img: { compat_features: ["api.HTMLImageElement", "api.HTMLImageElement.Image", "api.HTMLImageElement.alt", "api.HTMLImageElement.complete", "api.HTMLImageElement.crossOrigin", "api.HTMLImageElement.decode", "api.HTMLImageElement.decoding", "api.HTMLImageEleme\
nt.height", "api.HTMLImageElement.naturalHeight", "api.HTMLImageElement.naturalWidth", "api.HTMLImageElement.src", "api.HTMLImageElement.width", "api.HTMLImageElement.x", "api.HTMLImageElement.y", "html.elements.img", "html.elements.img.alt", "html.elements.img.crossorigin", "html.elements.img.decoding", "html.elements.img.height", "html.elements.img.src", "html.elements.img.width"], description: "The <img> element adds an image into the document.", description_html: "The <code>&#x3C;img></code> element adds an image into the document.", group: ["html-elements"], kind: "feature", name: "<img>", spec: ["https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLImageElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "api.HTMLImageElement.Image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLImageElement.alt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.complete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.crossOrigin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "13", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "\
6", safari_ios: "6" } }, "api.HTMLImageElement.decode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "68", firefox_android: "68", safari: "11.1", safari_ios: "11.3" } }, "api.HTMLImageElement.decoding": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "63", firefox_android: "63", safari: "11.1", safari_ios: "11.3" } }, "api.HTMLImageElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.naturalHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4",
    safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.naturalWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLImageElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "3", safari_ios: "\
1" } }, "api.HTMLImageElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "3", safari_ios: "1" } }, "html.elements.img": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.img.alt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.img.crossorigin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "13", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "html.elements.img.decod\
ing": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "63", firefox_android: "63", safari: "11.1", safari_ios: "11.3" } }, "html.elements.img.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.img.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.img.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, import: { compat_features: ["api.CSSImportRule", "api.CSSImportRule.href", "api.CSSImportRule.media", "api.CSSImportRule.styleSheet", "css.at-rules.import"], description: "The @import CSS at-rule loads styles from another stylesheet.", description_html: "The <code>@import</code> CSS at-rule loads styles from another stylesheet.", group: ["css"], kind: "feature", name: "@import", spec: ["https://drafts.csswg.org/css-cascade-5/#at-import"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.CSSImportRule": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSImportRule.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSImportRule.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.CSSImportRule.styleSheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.at-rules.import": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "import-assertions": {
    compat_features: ["javascript.statements.import.import_assertions", "javascript.statements.import.import_assertions.type_css", "javascript.statements.import.import_assertions.type_json"], description: 'Module import … assert { type: "json" } and import … assert { type: "css" } JavaScript statements load JSON and CSS data.', description_html: 'Module <code>import … assert { type: "json" }</code> and <code>import … assert { type: "css" }</code> JavaScript statements load JSON and CSS data.', discouraged: { according_to: ["https://github.com/tc39/proposal-import-attributes/pull/131"], alternatives: ["css-modules", "json-modules"], reason: "Import assertions are superseded by import attributes.", reason_html: "Import assertions are superseded by import attributes.", removal_date: "2024-06-13" }, group: ["js-modules"], kind: "feature", name: "Import assertions", spec: ["https://github.com/tc39/proposal-import-attributes/tree/abca60286360b47f9a6be25a28f489c2cb157beb"], status: { baseline: false,
    by_compat_key: { "javascript.statements.import.import_assertions": { baseline: false, support: {} }, "javascript.statements.import.import_assertions.type_css": { baseline: false, support: {} }, "javascript.statements.import.import_assertions.type_json": { baseline: false, support: {} } }, support: {} } }, "import-maps": { caniuse: ["import-maps"], compat_features: ["html.elements.script.type.importmap"], description: 'A <script type="importmap"> HTML element provides an import map as a JSON string. An import map controls how the browser should resolve module specifiers when importing JavaScript modules.', description_html: 'A <code>&#x3C;script type="importmap"></code> HTML element provides an import map as a JSON string. An import map controls how the browser should resolve module specifiers when importing JavaScript modules.', kind: "feature", name: "Import maps", spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#import-maps"], status: { baseline: "high", baseline_high_date: "\
2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "html.elements.script.type.importmap": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "108", firefox_android: "108", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "108", firefox_android: "108", safari: "16.4", safari_ios: "16.4" } } }, indeterminate: { caniuse: ["css-indeterminate-pseudo"], compat_features: ["css.selectors.indeterminate", "css.selectors.indeterminate.checkbox", "css.selectors.indeterminate.progress", "css.selectors.indeterminate.radio"], description: "The :indeterminate CSS pseudo-class selects any form element whose state is indeterminate, such as checkboxes that have been set to an indeterminate state with JavaScript, or radio buttons which are members of a group in which all radio buttons are unchecked.", description_html: "The <code>:\
indeterminate</code> CSS pseudo-class selects any form element whose state is indeterminate, such as checkboxes that have been set to an indeterminate state with JavaScript, or radio buttons which are members of a group in which all radio buttons are unchecked.", group: ["forms"], kind: "feature", name: ":indeterminate", spec: ["https://drafts.csswg.org/selectors-4/#indeterminate", "https://html.spec.whatwg.org/multipage/semantics-other.html#selector-indeterminate"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.indeterminate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.selectors.indeterminate.checkbox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "3.6", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.selectors.indeterminate.progress": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "css.selectors.indeterminate.radio": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "51", firefox_android: "51", safari: "10", safari_ios: "10" } } }, support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "51", firefox_android: "51", safari: "10", safari_ios: "10" } } }, indexeddb: { caniuse: ["indexeddb", "indexeddb2"], compat_features: ["api.IDBCursor", "api.IDBCursor.advance", "api.IDBCursor.continue", "api.IDBCursor.continuePrimaryKey", "api.IDBCursor.delete", "api.IDBCursor.direction", "api.IDBCursor.key", "api.IDBCursor.k\
ey.binary_keys", "api.IDBCursor.primaryKey", "api.IDBCursor.request", "api.IDBCursor.source", "api.IDBCursor.update", "api.IDBCursor.worker_support", "api.IDBCursorWithValue", "api.IDBCursorWithValue.value", "api.IDBCursorWithValue.worker_support", "api.IDBDatabase", "api.IDBDatabase.close", "api.IDBDatabase.close_event", "api.IDBDatabase.createObjectStore", "api.IDBDatabase.deleteObjectStore", "api.IDBDatabase.name", "api.IDBDatabase.objectStoreNames", "api.IDBDatabase.transaction", "api.IDBDatabase.version", "api.IDBDatabase.versionchange_event", "api.IDBDatabase.worker_support", "api.IDBFactory", "api.IDBFactory.cmp", "api.IDBFactory.databases", "api.IDBFactory.deleteDatabase", "api.IDBFactory.open", "api.IDBFactory.worker_support", "api.IDBIndex", "api.IDBIndex.count", "api.IDBIndex.get", "api.IDBIndex.getAll", "api.IDBIndex.getAllKeys", "api.IDBIndex.getKey", "api.IDBIndex.keyPath", "api.IDBIndex.multiEntry", "api.IDBIndex.name", "api.IDBIndex.name.renaming_through_name_setter", "\
api.IDBIndex.objectStore", "api.IDBIndex.openCursor", "api.IDBIndex.openKeyCursor", "api.IDBIndex.unique", "api.IDBIndex.worker_support", "api.IDBKeyRange", "api.IDBKeyRange.bound_static", "api.IDBKeyRange.includes", "api.IDBKeyRange.lower", "api.IDBKeyRange.lowerBound_static", "api.IDBKeyRange.lowerOpen", "api.IDBKeyRange.only_static", "api.IDBKeyRange.upper", "api.IDBKeyRange.upperBound_static", "api.IDBKeyRange.upperOpen", "api.IDBKeyRange.worker_support", "api.IDBObjectStore", "api.IDBObjectStore.add", "api.IDBObjectStore.autoIncrement", "api.IDBObjectStore.clear", "api.IDBObjectStore.count", "api.IDBObjectStore.createIndex", "api.IDBObjectStore.delete", "api.IDBObjectStore.deleteIndex", "api.IDBObjectStore.get", "api.IDBObjectStore.getAll", "api.IDBObjectStore.getAllKeys", "api.IDBObjectStore.getKey", "api.IDBObjectStore.index", "api.IDBObjectStore.indexNames", "api.IDBObjectStore.keyPath", "api.IDBObjectStore.name", "api.IDBObjectStore.name.renaming_through_name_setter", "api.IDB\
ObjectStore.openCursor", "api.IDBObjectStore.openKeyCursor", "api.IDBObjectStore.put", "api.IDBObjectStore.transaction", "api.IDBObjectStore.worker_support", "api.IDBOpenDBRequest", "api.IDBOpenDBRequest.blocked_event", "api.IDBOpenDBRequest.upgradeneeded_event", "api.IDBOpenDBRequest.worker_support", "api.IDBRequest", "api.IDBRequest.error", "api.IDBRequest.error.DOMException", "api.IDBRequest.error_event", "api.IDBRequest.readyState", "api.IDBRequest.result", "api.IDBRequest.source", "api.IDBRequest.success_event", "api.IDBRequest.transaction", "api.IDBRequest.worker_support", "api.IDBTransaction", "api.IDBTransaction.abort", "api.IDBTransaction.abort_event", "api.IDBTransaction.commit", "api.IDBTransaction.complete_event", "api.IDBTransaction.db", "api.IDBTransaction.durability", "api.IDBTransaction.error", "api.IDBTransaction.error.DOMException", "api.IDBTransaction.error_event", "api.IDBTransaction.mode", "api.IDBTransaction.objectStore", "api.IDBTransaction.objectStoreNames", "ap\
i.IDBTransaction.worker_support", "api.IDBVersionChangeEvent", "api.IDBVersionChangeEvent.IDBVersionChangeEvent", "api.IDBVersionChangeEvent.newVersion", "api.IDBVersionChangeEvent.oldVersion", "api.IDBVersionChangeEvent.worker_support", "api.indexedDB", "api.indexedDB.worker_support"], description: "The IndexedDB API is a local storage transactional object database.", description_html: "The IndexedDB API is a local storage transactional object database.", group: ["indexeddb"], kind: "feature", name: "IndexedDB", spec: ["https://w3c.github.io/IndexedDB/"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "api.IDBCursor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.advance": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.continue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.continuePrimaryKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "16", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "api.IDBCursor.delete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.direction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-2\
9", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.key": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.key.binary_keys": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "api.IDBCursor.primaryKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.request": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "\
76", chrome_android: "76", edge: "79", firefox: "77", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.IDBCursor.source": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.update": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursor.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBCursorWithValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "\
25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursorWithValue.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBCursorWithValue.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "api.IDBDatabase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.close": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "\
12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.close_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "50", firefox_android: "50", safari: "10.1", safari_ios: "10.3" } }, "api.IDBDatabase.createObjectStore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.deleteObjectStore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "\
12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.objectStoreNames": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.transaction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.version": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.versionchange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "\
12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBDatabase.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBFactory": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBFactory.cmp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBFactory.databases": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "126", firefox_android: "126", safari: "14", safari_ios: "\
14" } }, "api.IDBFactory.deleteDatabase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBFactory.open": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "15", safari_ios: "15" } }, "api.IDBFactory.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIn\
dex.count": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.get": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.getAll": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.IDBIndex.getAllKeys": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.IDBIndex.getKey": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.keyPath": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.multiEntry": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.name.renaming_through_name_setter": { baseline: "high",
    baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.IDBIndex.objectStore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.openCursor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.openKeyCursor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.unique": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBIndex.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBKeyRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.bound_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.includes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "47", firefox_android: "47", safari: "10.1", safari_ios: "10.3" } }, "api.IDBKeyRange.lower": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.lowerBound_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.lowerOpen": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.only_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.upper": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.upperBound_static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.upperOpen": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBKeyRange.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "201\
6-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBObjectStore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.add": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.autoIncrement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.count": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.createIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.delete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.deleteIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.get": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.getAll": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "44", firefox_android: "48", safari: "10.1", safari_ios: "10.3" } }, "api.IDBObjectStore.getAllKeys": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "44", firefox_android: "48", safari: "10.1", safari_ios: "10.3" } }, "api.IDBObjectStore.getKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "48", chrome_android: "48", edge: "79", firefox: "51", firefox_android: "58", safari: "10.1", safari_ios: "10.3" } }, "api.IDBObjectStore.index": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.indexNames": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.keyPath": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.name.renaming_through_name_setter": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "55", chrome_android: "55", edge: "≤18", firefox: "49", firefox_android: "49", safari: "10.1", safari_ios: "10.3" } }, "api.IDBObjectStore.openCursor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.openKeyCursor": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.IDBObjectStore.put": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.transaction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBObjectStore.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBOpenDBRequest": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBOpenDBRequest.blocked_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBOpenDBRequest.upgradeneeded_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBOpenDBRequest.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBRequest": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.error": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2\
015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.error.DOMException": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "≤18", firefox: "58", firefox_android: "58" } }, "api.IDBRequest.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "\
22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.source": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.success_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.transaction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBRequest.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "\
10", safari_ios: "10" } }, "api.IDBTransaction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.abort": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.abort_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.commit": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "74", firefox_android: "79", safari: "15", safari_ios: "\
15" } }, "api.IDBTransaction.complete_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.db": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.durability": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "126", firefox_android: "126", safari: "15", safari_ios: "15" } }, "api.IDBTransaction.error": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.error.D\
OMException": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "≤18", firefox: "58", firefox_android: "58" } }, "api.IDBTransaction.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.mode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.objectStore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBTransaction.objectStoreNames": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2\
020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "16", firefox_android: "22", safari: "10.1", safari_ios: "10.3" } }, "api.IDBTransaction.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.IDBVersionChangeEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBVersionChangeEvent.IDBVersionChangeEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "25", firefox_android: "25", safari: "10", safari_ios: "10" } }, "api.IDBVersionChangeEvent.newVersion": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBVersionChangeEvent.oldVersion": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.IDBVersionChangeEvent.worker_support": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "api.indexedDB": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.indexedDB.worker_support": { baseline: "high", baseline_high_date: "\
2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } } }, "individual-transforms": { compat_features: ["css.properties.rotate", "css.properties.rotate.none", "css.properties.rotate.x_y_z_angle", "css.properties.scale", "css.properties.scale.none", "css.properties.translate", "css.properties.translate.none"], description: "The translate, rotate, and scale CSS properties apply single transformations independently, as opposed to applying multiple transformations with the transform CSS property.", description_html: "The <code>translate</code>, <code>rotate</code>, and <code>scale</code> CSS properties apply single transformations independently, as opposed to applying multiple transformations with the <code>transform</code> CSS property.",
    group: ["transforms"], kind: "feature", name: "Individual transform properties", spec: ["https://drafts.csswg.org/css-transforms-2/#individual-transforms"], status: { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", by_compat_key: { "css.properties.rotate": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.rotate.none": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.rotate.x_y_z_angle": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "\
79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scale": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scale.none": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.translate": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.translate.none": { baseline: "high", baseline_high_date: "2025-02-05", baseline_low_date: "2022-08-05", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "7\
2", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, inert: { compat_features: ["api.HTMLElement.inert", "api.HTMLElement.inert.ignores_find_in_page", "html.global_attributes.inert", "html.global_attributes.inert.ignores_find_in_page"], description: "The inert HTML attribute marks an element and its descendants as non-interactive. Inert elements don't get focus or fire click events.", description_html: "The <code>inert</code> HTML attribute marks an element and its descendants as non-interactive. Inert elements don't get focus or fire <code>click</code> events.", group: ["html"], kind: "feature", name: "inert", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#inert-subtrees"], status: { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", by_compat_key: { "api.HTMLElement.inert": { baseline: "\
high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "112", firefox_android: "112", safari: "15.5", safari_ios: "15.5" } }, "api.HTMLElement.inert.ignores_find_in_page": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "120", firefox_android: "120" } }, "html.global_attributes.inert": { baseline: "high", baseline_high_date: "2025-10-11", baseline_low_date: "2023-04-11", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "112", firefox_android: "112", safari: "15.5", safari_ios: "15.5" } }, "html.global_attributes.inert.ignores_find_in_page": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "120", firefox_android: "120" } } }, support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "112", firefox_android: "112", safari: "15.5", safari_ios: "15.5" } } }, "inherit-value": { compat_features: [
    "css.types.global_keywords", "css.types.global_keywords.inherit"], description: "The inherit keyword resets any CSS property to the computed value of that property from the parent element.", description_html: "The <code>inherit</code> keyword resets any CSS property to the computed value of that property from the parent element.", group: ["explicit-defaults"], kind: "feature", name: "inherit", spec: ["https://drafts.csswg.org/css-cascade-3/#inherit"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.global_keywords": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.global_keywords.inherit": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "initial-letter": { caniuse: ["css-initial-letter"], compat_features: ["css.properties.initial-letter", "css.properties.initial-letter.normal"], description: "The initial-letter CSS property sets the number of lines the first letter of an element occupies. You can use the property to make a raised capital or drop cap.", description_html: "The <code>initial-letter</code> CSS property sets the number of lines the first letter of an element occupies. You can use the property to make a raised capital or drop cap.", group: ["css"], kind: "feature", name: "initial-letter", spec: ["https://drafts.csswg.org/css-inline-3/#sizing-drop-initials"], status: { baseline: false, by_compat_key: { "css.properties.initial-letter": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "\
css.properties.initial-letter.normal": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } } }, support: { chrome: "110", chrome_android: "110", edge: "110" } } }, "initial-value": { caniuse: ["css-initial-value"], compat_features: ["css.types.global_keywords.initial"], description: "The initial keyword resets any CSS property to its initial value as defined by the specification. For example, the initial value of the display property is inline, regardless of the element being styled. Not to be confused with revert, which resets to the user or browser default style.", description_html: "The <code>initial</code> keyword resets any CSS property to its initial value as defined by the specification. For example, the <code>initial</code> value of the <code>display</code> property is <code>inline</code>, regardless of the element being styled. Not to be confused with <code>revert</code>, which resets to the user or browser default style.", group: ["explicit-defau\
lts"], kind: "feature", name: "initial", spec: ["https://drafts.csswg.org/css-cascade-3/#initial"], status: { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", by_compat_key: { "css.types.global_keywords.initial": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "1", chrome_android: "18", edge: "13", firefox: "19", firefox_android: "19", safari: "1.2", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "13", firefox: "19", firefox_android: "19", safari: "1.2", safari_ios: "1" } } }, ink: { compat_features: ["api.DelegatedInkTrailPresenter", "api.DelegatedInkTrailPresenter.presentationArea", "api.DelegatedInkTrailPresenter.updateInkTrailStartPoint", "api.Ink", "api.Ink.requestPresenter", "api.Navigator.ink"], description: "The navigator.ink API uses the system compositor to draw to a <canvas> element ahead of pointer events, reducing the delay between moving a stylus or cu\
rsor and a pen stroke appearing on screen.", description_html: "The <code>navigator.ink</code> API uses the system compositor to draw to a <code>&#x3C;canvas></code> element ahead of pointer events, reducing the delay between moving a stylus or cursor and a pen stroke appearing on screen.", kind: "feature", name: "Ink", spec: ["https://wicg.github.io/ink-enhancement/"], status: { baseline: false, by_compat_key: { "api.DelegatedInkTrailPresenter": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "93" } }, "api.DelegatedInkTrailPresenter.presentationArea": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "93" } }, "api.DelegatedInkTrailPresenter.updateInkTrailStartPoint": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "93" } }, "api.Ink": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "93" } }, "api.Ink.requestPresenter": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "\
93" } }, "api.Navigator.ink": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "93" } } }, support: { chrome: "94", chrome_android: "94", edge: "93" } } }, input: { compat_features: ["api.HTMLInputElement", "api.HTMLInputElement.accept", "api.HTMLInputElement.alt", "api.HTMLInputElement.autocomplete", "api.HTMLInputElement.cancel_event", "api.HTMLInputElement.checked", "api.HTMLInputElement.defaultValue", "api.HTMLInputElement.disabled", "api.HTMLInputElement.form", "api.HTMLInputElement.formAction", "api.HTMLInputElement.formEnctype", "api.HTMLInputElement.formMethod", "api.HTMLInputElement.formNoValidate", "api.HTMLInputElement.formTarget", "api.HTMLInputElement.height", "api.HTMLInputElement.invalid_event", "api.HTMLInputElement.labels", "api.HTMLInputElement.list", "api.HTMLInputElement.maxLength", "api.HTMLInputElement.minLength", "api.HTMLInputElement.name", "api.HTMLInputElement.pattern", "api.HTMLInputElement.placeholder", "api.HTMLInputElement.readOnly",
    "api.HTMLInputElement.required", "api.HTMLInputElement.select", "api.HTMLInputElement.select_event", "api.HTMLInputElement.selectionDirection", "api.HTMLInputElement.selectionEnd", "api.HTMLInputElement.selectionStart", "api.HTMLInputElement.setRangeText", "api.HTMLInputElement.setSelectionRange", "api.HTMLInputElement.size", "api.HTMLInputElement.type", "api.HTMLInputElement.value", "api.HTMLInputElement.width", "html.elements.input", "html.elements.input.accept", "html.elements.input.alt", "html.elements.input.checked", "html.elements.input.disabled", "html.elements.input.form", "html.elements.input.formaction", "html.elements.input.formenctype", "html.elements.input.formmethod", "html.elements.input.formnovalidate", "html.elements.input.formtarget", "html.elements.input.maxlength", "html.elements.input.minlength", "html.elements.input.name", "html.elements.input.pattern", "html.elements.input.placeholder", "html.elements.input.readonly", "html.elements.input.required", "html.ele\
ments.input.size", "html.elements.input.src", "html.elements.input.type_text"], description: 'The <input type="text"> HTML element allows the user to enter information into a form. By default, an <input> element is a text input.', description_html: 'The <code>&#x3C;input type="text"></code> HTML element allows the user to enter information into a form. By default, an <code>&#x3C;input></code> element is a text input.', group: ["forms", "html-elements"], kind: "feature", name: "<input>", spec: ["https://html.spec.whatwg.org/multipage/input.html#the-input-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLInputElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.accept": { baseline: "high", baseline_high_date: "2018-0\
1-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.alt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.autocomplete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.HTMLInputElement.cancel_event": { baseline: "high", baseline_high_date: "2025-11-05", baseline_low_date: "2023-05-05", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "91", firefox_android: "91", safari: "16.4", safari_ios: "16.4" } }, "api.HTMLInputElement.checked": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.defaultValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.formAction": { baseline: "high", baseline_high_date: "2018-0\
1-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "api.HTMLInputElement.formEnctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "api.HTMLInputElement.formMethod": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "api.HTMLInputElement.formNoValidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.formTarget": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "api.HTMLInputElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "api.HTMLInputElement.invalid_event": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "64", safari: "5", safari_ios: "5" } }, "api.HTMLInputElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "5", safari_ios: "4.2" } }, "api.HTMLInputElement.list": { baseline: "high", baseline_high_date: "\
2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "api.HTMLInputElement.maxLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.minLength": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLInputElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.pattern": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.placeholder": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.HTMLInputElement.readOnly": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.select": { baseline: "high", baseline_high_date: "2018-\
01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.select_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.selectionDirection": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "15", chrome_android: "18", edge: "13", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.HTMLInputElement.selectionEnd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.HTMLInputElement.selectionStart": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.HTMLInputElement.setRangeText": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "27", firefox_android: "27", safari: "7", safari_ios: "7" } }, "api.HTMLInputElement.setSelectionRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLInputElement.size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.type": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "html.elements.input": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.accept": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.alt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.checked": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.formaction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "html.elements.input.formenctype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "html.elements.input.formmethod": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "html.elements.input.formnovalidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "html.elements.input.formtarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "html.elements.input.maxlength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.minlength": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "html.elements.input.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.pattern": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "html.elements.input.placeholder": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "html.elements.input.readonly": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "html.elements.input.size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.type_text": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-button": { compat_features: [
    "html.elements.input.type_button"], description: 'The <input type="button"> HTML element represents a button that triggers some action, such as submitting a form or opening a dialog, styled as a labeled rectangular box by default. Not to be confused with the <button> element, which contains HTML content.', description_html: 'The <code>&#x3C;input type="button"></code> HTML element represents a button that triggers some action, such as submitting a form or opening a dialog, styled as a labeled rectangular box by default. Not to be confused with the <code>&#x3C;button></code> element, which contains HTML content.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="button">', spec: ["https://html.spec.whatwg.org/multipage/input.html#button-state-(type=button)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_button": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-checkbox": { compat_features: ["api.HTMLInputElement.defaultChecked", "api.HTMLInputElement.indeterminate", "html.elements.input.type_checkbox"], description: 'The <input type="checkbox"> HTML element represents a tickable box with two states, checked and unchecked.', description_html: 'The <code>&#x3C;input type="checkbox"></code> HTML element represents a tickable box with two states, checked and unchecked.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="checkbox">', spec: ["https://html.spec.whatwg.org/multipage/input.html#checkbox-state-(type=checkbox)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLInputEl\
ement.defaultChecked": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLInputElement.indeterminate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.input.type_checkbox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "input-color": { caniuse: ["input-color"], compat_features: ["html.elements.input.type_color"], description: 'The <input \
type="color"> HTML element shows a color picker from which users can choose a color value.', description_html: 'The <code>&#x3C;input type="color"></code> HTML element shows a color picker from which users can choose a color value.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="color">', spec: ["https://html.spec.whatwg.org/multipage/input.html#color-state-(type=color)"], status: { baseline: false, by_compat_key: { "html.elements.input.type_color": { baseline: false, support: { chrome: "20", chrome_android: "25", edge: "14", firefox: "29", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "20", chrome_android: "25", edge: "14", firefox: "29", safari: "12.1", safari_ios: "12.2" } } }, "input-color-alpha": { compat_features: ["api.HTMLInputElement.alpha", "api.HTMLInputElement.colorSpace", "html.elements.input.alpha", "html.elements.input.colorspace"], description: 'The ability to control the opacity of a color picked using <input type="color"> and d\
etermine the colorspace of the selected color.', description_html: 'The ability to control the opacity of a color picked using <code>&#x3C;input type="color"></code> and determine the colorspace of the selected color.', group: ["forms", "html-elements"], kind: "feature", name: "`alpha` and `colorspace` attributes for `<input type=color>`", spec: ["https://html.spec.whatwg.org/multipage/input.html#attr-input-alpha"], status: { baseline: false, by_compat_key: { "api.HTMLInputElement.alpha": { baseline: false, support: { safari: "18.4", safari_ios: "18.4" } }, "api.HTMLInputElement.colorSpace": { baseline: false, support: { firefox: "149", firefox_android: "149", safari: "18.4", safari_ios: "18.4" } }, "html.elements.input.alpha": { baseline: false, support: { safari: "18.4", safari_ios: "18.4" } }, "html.elements.input.colorspace": { baseline: false, support: { safari: "18.4", safari_ios: "18.4" } } }, support: { safari: "18.4", safari_ios: "18.4" } } }, "input-date-time": { caniuse: ["i\
nput-datetime"], compat_features: ["api.HTMLInputElement.valueAsDate", "html.elements.input.type_date", "html.elements.input.type_datetime-local", "html.elements.input.type_month", "html.elements.input.type_time", "html.elements.input.type_week"], description: 'The <input type="date"> and <input type="time"> HTML elements show date and time pickers.', description_html: 'The <code>&#x3C;input type="date"></code> and <code>&#x3C;input type="time"></code> HTML elements show date and time pickers.', group: ["forms", "html-elements"], kind: "feature", name: "Date and time <input> types", spec: ["https://html.spec.whatwg.org/multipage/input.html#date-state-(type=date)"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.HTMLInputElement.valueAsDate": { baseline: "high", baseline_high_date: "2020-05-28", baseline_low_date: "2017-11-28", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "57", firefox_android: "\
57", safari: "5", safari_ios: "4" } }, "html.elements.input.type_date": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "57", firefox_android: "57", safari: "14.1", safari_ios: "5" } }, "html.elements.input.type_datetime-local": { baseline: "high", baseline_high_date: "2024-04-05", baseline_low_date: "2021-10-05", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "93", firefox_android: "93", safari: "14.1", safari_ios: "5" } }, "html.elements.input.type_month": { baseline: false, support: { chrome: "20", chrome_android: "25", edge: "12", firefox_android: "18", safari_ios: "≤11.3" } }, "html.elements.input.type_time": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "57", firefox_android: "57", safari: "14.1", safari_ios: "5" } }, "html.elements.input.type_w\
eek": { baseline: false, support: { chrome: "20", chrome_android: "25", edge: "12", firefox_android: "18", safari_ios: "18.2" } } }, support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "57", firefox_android: "57", safari: "14.1", safari_ios: "5" } } }, "input-email-tel-url": { caniuse: ["input-email-tel-url"], compat_features: ["html.elements.input.type_email", "html.elements.input.type_tel", "html.elements.input.type_url"], description: 'The <input type="email">, <input type="tel">, and <input type="url"> HTML elements represent email address, telephone number, and URL fields in a form.', description_html: 'The <code>&#x3C;input type="email"></code>, <code>&#x3C;input type="tel"></code>, and <code>&#x3C;input type="url"></code> HTML elements represent email address, telephone number, and URL fields in a form.', group: ["forms", "html-elements"], kind: "feature", name: "Email, telephone, and URL <input> types", spec: ["https://html.spec.whatwg.org/multipage/input.html#e\
mail-state-(type=email)", "https://html.spec.whatwg.org/multipage/input.html#telephone-state-(type=tel)", "https://html.spec.whatwg.org/multipage/input.html#url-state-(type=url)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_email": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "3" } }, "html.elements.input.type_tel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3" } }, "html.elements.input.type_url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4",
    safari: "1", safari_ios: "1" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "3" } } }, "input-event": { caniuse: ["input-event"], compat_features: ["api.Element.beforeinput_event", "api.Element.input_event", "api.InputEvent", "api.InputEvent.InputEvent", "api.InputEvent.data", "api.InputEvent.dataTransfer", "api.InputEvent.getTargetRanges", "api.InputEvent.inputType", "api.InputEvent.inputType.insertFromPasteAsQuotation", "api.InputEvent.isComposing"], description: "The input event fires when a form control changes or an element with the contenteditable attribute changes.", description_html: "The <code>input</code> event fires when a form control changes or an element with the <code>contenteditable</code> attribute changes.", kind: "feature", name: "input (event)", spec: ["https://w3c.github.io/uievents/#event-type-input"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", by_compat_key: { "api.Element.beforeinput_event": { baseline: "high", baseline_high_date: "2023-09-23", baseline_low_date: "2021-03-23", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "87", firefox_android: "87", safari: "10.1", safari_ios: "10.3" } }, "api.Element.input_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "2" } }, "api.InputEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "10.3" } }, "api.InputEvent.InputEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1",
    safari_ios: "10.3" } }, "api.InputEvent.data": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "67", firefox_android: "67", safari: "10.1", safari_ios: "10.3" } }, "api.InputEvent.dataTransfer": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "67", firefox_android: "67", safari: "10.1", safari_ios: "10.3" } }, "api.InputEvent.getTargetRanges": { baseline: "high", baseline_high_date: "2023-09-23", baseline_low_date: "2021-03-23", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "87", firefox_android: "87", safari: "10.1", safari_ios: "10.3" } }, "api.InputEvent.inputType": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "66", firefox_android: "66", safari: "\
10.1", safari_ios: "10.3" } }, "api.InputEvent.inputType.insertFromPasteAsQuotation": { baseline: false, support: { firefox: "67", firefox_android: "67" } }, "api.InputEvent.isComposing": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "31", firefox_android: "31", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "2" } } }, "input-file": { compat_features: ["api.HTMLInputElement.files", "html.elements.input.type_file"], description: 'The <input type="file"> HTML element shows a file picker from which users can choose a file to upload with the form.', description_html: 'The <code>&#x3C;input type="file"></code> HTML element shows a file picker from which users can choose a file to upload with the form.', group: ["forms", "html-elements"], kind: "feature", name: '<input t\
ype="file">', spec: ["https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLInputElement.files": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3" } }, "html.elements.input.type_file": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3" } } }, "input-file-multiple": { caniuse: ["input-file-multiple"], compat_features: ["api.HTMLInputElement.multiple", "api.HTMLInputElement.webkitEntries", "html.elem\
ents.input.multiple"], description: 'The <input type="file" multiple> HTML element shows a file picker from which users can choose one or more files to upload with a form.', description_html: 'The <code>&#x3C;input type="file" multiple></code> HTML element shows a file picker from which users can choose one or more files to upload with a form.', group: ["forms", "file-system"], kind: "feature", name: '<input type="file" multiple>', spec: ["https://html.spec.whatwg.org/multipage/input.html#attr-input-multiple"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLInputElement.multiple": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.HTMLInputElement.webkitEntries": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "\
50", safari: "11.1", safari_ios: "11.3" } }, "html.elements.input.multiple": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "input-file-webkitdirectory": { caniuse: ["input-file-directory"], compat_features: ["api.File.webkitRelativePath", "api.HTMLInputElement.webkitdirectory", "html.elements.input.webkitdirectory"], description: 'The <input type="file" webkitdirectory> HTML element shows a file picker from which users can choose a folder to upload with the form.', description_html: 'The <code>&#x3C;input type="file" webkitdirectory></code> HTML element shows a file picker from which users can choose a folder to upload with the form.', group: ["forms", "file-system"], kind: "feature",
    name: '<input type="file" webkitdirectory>', spec: ["https://wicg.github.io/entries-api/#html-forms"], status: { baseline: "low", baseline_low_date: "2025-08-19", by_compat_key: { "api.File.webkitRelativePath": { baseline: "low", baseline_low_date: "2025-08-19", support: { chrome: "13", chrome_android: "18", edge: "13", firefox: "50", firefox_android: "142", safari: "11.1", safari_ios: "11.3" } }, "api.HTMLInputElement.webkitdirectory": { baseline: "low", baseline_low_date: "2025-08-19", support: { chrome: "7", chrome_android: "132", edge: "13", firefox: "50", firefox_android: "142", safari: "11.1", safari_ios: "18.4" } }, "html.elements.input.webkitdirectory": { baseline: "low", baseline_low_date: "2025-07-22", support: { chrome: "7", chrome_android: "132", edge: "13", firefox: "50", firefox_android: "141", safari: "11.1", safari_ios: "18.4" } } }, support: { chrome: "13", chrome_android: "132", edge: "13", firefox: "50", firefox_android: "142", safari: "11.1", safari_ios: "18.4" } } },
    "input-hidden": { compat_features: ["html.elements.input.type_hidden"], description: 'The <input type="hidden"> HTML element represents a form field that is not shown visually but is still included in the form submission.', description_html: 'The <code>&#x3C;input type="hidden"></code> HTML element represents a form field that is not shown visually but is still included in the form submission.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="hidden">', spec: ["https://html.spec.whatwg.org/multipage/input.html#hidden-state-(type=hidden)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-image": { compat_features: ["api.HTMLInputElement.src", "html.elements.input.type_image"], description: 'The <input type="image"> HTML element is an image that can be used to submit a form, like the <input type="submit"> element.', description_html: 'The <code>&#x3C;input type="image"></code> HTML element is an image that can be used to submit a form, like the <code>&#x3C;input type="submit"></code> element.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="image">', spec: ["https://html.spec.whatwg.org/multipage/input.html#image-button-state-(type=image)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLInputElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "html.elements.input.type_image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-number": { caniuse: ["input-number"], compat_features: ["api.HTMLInputElement.max", "api.HTMLInputElement.min", "api.HTMLInputElement.step", "api.HTMLInputElement.stepDown", "api.HTMLInputElement.stepUp", "api.HTMLInputElement.valueAsNumber", "html.elements.input.max", "html.elements.input.min", "html.elements.input.step", "html.elements.input.type_number"], description: 'The <input type="number"> HTML element represents numeric input data.', description_html: 'The <code>&#x3C;input type="number"></code> HTML element represents numeric input data.', group: ["forms", "html-elements"], kind: "featur\
e", name: '<input type="number">', spec: ["https://html.spec.whatwg.org/multipage/input.html#number-state-(type=number)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLInputElement.max": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.min": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.step": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.stepDow\
n": { baseline: false, support: { chrome: "5", chrome_android: "18", edge: "12", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.stepUp": { baseline: false, support: { chrome: "5", chrome_android: "18", edge: "12", safari: "5", safari_ios: "4" } }, "api.HTMLInputElement.valueAsNumber": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "html.elements.input.max": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "html.elements.input.min": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "\
html.elements.input.step": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "16", firefox_android: "16", safari: "5", safari_ios: "4" } }, "html.elements.input.type_number": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "5.1", safari_ios: "5" } } }, "input-password": { compat_features: ["html.elements.input.type_password", "html.elements.input.type_password.insecure_login_handling"], description: 'The <input type="password"> HTML element represents a field for users to enter a password. The password is hidden from view, typically replaced by dots or asterisks.', description_html: 'The <code>&#x3C;input type="\
password"></code> HTML element represents a field for users to enter a password. The password is hidden from view, typically replaced by dots or asterisks.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="password">', spec: ["https://html.spec.whatwg.org/multipage/input.html#password-state-(type=password)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_password": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.input.type_password.insecure_login_handling": { baseline: false, support: { firefox: "52", firefox_android: "52" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-radio": { compat_features: ["\
html.elements.input.type_radio"], description: 'The <input type="radio"> HTML element represents one button in a group such that only one can be chosen at a time.', description_html: 'The <code>&#x3C;input type="radio"></code> HTML element represents one button in a group such that only one can be chosen at a time.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="radio">', spec: ["https://html.spec.whatwg.org/multipage/input.html#radio-button-state-(type=radio)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_radio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-range": {
    caniuse: ["input-range"], compat_features: ["html.elements.input.type_range", "html.elements.input.type_range.tick_marks", "html.elements.input.type_range.vertical_orientation"], description: 'The <input type="range"> element represents a slider for choosing an inexact value between a minimum and maximum value.', description_html: 'The <code>&#x3C;input type="range"></code> element represents a slider for choosing an inexact value between a minimum and maximum value.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="range">', spec: ["https://html.spec.whatwg.org/multipage/input.html#range-state-(type=range)"], status: { baseline: "high", baseline_high_date: "2019-09-16", baseline_low_date: "2017-03-16", by_compat_key: { "html.elements.input.type_range": { baseline: "high", baseline_high_date: "2019-09-16", baseline_low_date: "2017-03-16", support: { chrome: "4", chrome_android: "57", edge: "12", firefox: "23", firefox_android: "52", safari: "3.1", safari_ios: "\
5" } }, "html.elements.input.type_range.tick_marks": { baseline: "high", baseline_high_date: "2025-07-17", baseline_low_date: "2023-01-17", support: { chrome: "≤67", chrome_android: "≤67", edge: "79", firefox: "109", firefox_android: "109", safari: "12.1", safari_ios: "12.2" } }, "html.elements.input.type_range.vertical_orientation": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "124", chrome_android: "124", edge: "12", firefox: "120", firefox_android: "120", safari: "16.5", safari_ios: "16.5" } } }, support: { chrome: "4", chrome_android: "57", edge: "12", firefox: "23", firefox_android: "52", safari: "3.1", safari_ios: "5" } } }, "input-reset": { compat_features: ["html.elements.input.type_reset"], description: 'The <input type="reset"> HTML element represents a button that sets all form fields to their initial values.', description_html: 'The <code>&#x3C;input type="reset"></code> HTML element represents a button that sets all form fields to their initia\
l values.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="reset">', spec: ["https://html.spec.whatwg.org/multipage/input.html#reset-button-state-(type=reset)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_reset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "input-selectors": { compat_features: ["css.selectors.checked", "css.selectors.disabled", "css.selectors.enabled"], description: "The :checked, :disabled, and :enabled CSS pseudo-classes match form elements based on their state.", description_html: "The <code>:checked</code>, <code>:disabled</code>, and <code>:enabled<\
/code> CSS pseudo-classes match form elements based on their state.", group: ["forms", "selectors"], kind: "feature", name: "Input selectors", spec: ["https://drafts.csswg.org/selectors-4/#checked", "https://drafts.csswg.org/selectors-4/#enableddisabled"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.checked": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.enabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "input-submit": { compat_features: ["html.elements.input.type_submit"], description: 'The <input type="submit"> HTML element represents a button that triggers an action on its associated <form>, such as sending the form data to a server.', description_html: 'The <code>&#x3C;input type="submit"></code> HTML element represents a button that triggers an action on its associated <code>&#x3C;form></code>, such as sending the form data to a server.', group: ["forms", "html-elements"], kind: "feature", name: '<input type="submit">', spec: ["https://html.spec.whatwg.org/multipage/input.html#submit-button-state-(type=submit)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_submit": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, inputmode: { caniuse: ["input-inputmode"], compat_features: ["api.HTMLElement.inputMode", "html.global_attributes.inputmode"], description: "The inputmode global HTML attribute gives a hint about what type of data is to be entered into an <input> element, such as text, numeric, or email, so the browser may help the user enter data using an adapted input mechanism, such as an on-screen virtual keyboard.", description_html: "The <code>inputmode</code> global HTML attribute gives a hint about what type of data is to be entered into an <code>&#x3C;input></code> element, such as <code>text</code>, <code>numeric</code>, or <code>email</code>, so the browser may he\
lp the user enter data using an adapted input mechanism, such as an on-screen virtual keyboard.", kind: "feature", name: "inputmode", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#attr-inputmode"], status: { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", by_compat_key: { "api.HTMLElement.inputMode": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "95", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "html.global_attributes.inputmode": { baseline: "high", baseline_high_date: "2024-06-07", baseline_low_date: "2021-12-07", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "95", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "95", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, ins: { compat_features: [
    "html.elements.ins", "html.elements.ins.cite", "html.elements.ins.datetime"], description: "The <ins> element represents a range of text that has been inserted into a document, styling text as underlined by default.", description_html: "The <code>&#x3C;ins></code> element represents a range of text that has been inserted into a document, styling text as underlined by default.", group: ["html-elements"], kind: "feature", name: "<ins>", spec: ["https://html.spec.whatwg.org/multipage/edits.html#the-ins-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.ins": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.ins.cite": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.ins.datetime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "insertable-streams": { compat_features: ["api.MediaStreamTrackProcessor", "api.MediaStreamTrackProcessor.MediaStreamTrackProcessor", "api.MediaStreamTrackProcessor.readable", "api.VideoTrackGenerator", "api.VideoTrackGenerator.VideoTrackGenerator", "api.VideoTrackGenerator.muted", "api.VideoTrackGenerator.track", "api.VideoTrackGenerator.writable"], description: "The MediaStreamTrackProcessor and MediaStreamTrackGenerator APIs modify the contents of a media track for merging streams, a\
pplying real-time effects like funny hats, and content overlays.", description_html: "The <code>MediaStreamTrackProcessor</code> and <code>MediaStreamTrackGenerator</code> APIs modify the contents of a media track for merging streams, applying real-time effects like funny hats, and content overlays.", kind: "feature", name: "Insertable streams for MediaStreamTrack", spec: ["https://w3c.github.io/mediacapture-transform/"], status: { baseline: false, by_compat_key: { "api.MediaStreamTrackProcessor": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "api.MediaStreamTrackProcessor.MediaStreamTrackProcessor": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "api.MediaStreamTrackProcessor.readable": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "api.VideoTrackGenerator": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "api.VideoTrackGenerator.VideoTrackGenerator": { baseline: false, support: { safari: "18", safari_ios: "1\
8" } }, "api.VideoTrackGenerator.muted": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "api.VideoTrackGenerator.track": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "api.VideoTrackGenerator.writable": { baseline: false, support: { safari: "18", safari_ios: "18" } } }, support: { safari: "18", safari_ios: "18" } } }, install: { description: "The <install> HTML element represents a button that, upon activation, prompts the user to choose whether to install a progressive web app.", description_html: "The <code>&#x3C;install></code> HTML element represents a button that, upon activation, prompts the user to choose whether to install a progressive web app.", group: ["progressive-web-app"], kind: "feature", name: "<install>", spec: ["https://github.com/WICG/install-element"], status: { baseline: false, support: {} } }, interaction: { caniuse: ["css-media-interaction"], compat_features: ["css.at-rules.media.any-hover", "css.at-rules.media.any-pointer",
    "css.at-rules.media.hover", "css.at-rules.media.pointer"], description: "The pointer, any-pointer, hover, and any-hover CSS media queries set styles based on the presence of pointing devices and their ability to hover over elements. For example, most smartphones match the (hover: none) and (pointer: coarse) media query.", description_html: "The <code>pointer</code>, <code>any-pointer</code>, <code>hover</code>, and <code>any-hover</code> CSS media queries set styles based on the presence of pointing devices and their ability to hover over elements. For example, most smartphones match the <code>(hover: none) and (pointer: coarse)</code> media query.", group: ["media-queries"], kind: "feature", name: "Interaction media queries", spec: ["https://drafts.csswg.org/mediaqueries-5/#mf-interaction"], status: { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", by_compat_key: { "css.at-rules.media.any-hover": { baseline: "high", baseline_high_date: "2021-06\
-11", baseline_low_date: "2018-12-11", support: { chrome: "41", chrome_android: "41", edge: "16", firefox: "64", firefox_android: "64", safari: "9", safari_ios: "9" } }, "css.at-rules.media.any-pointer": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "64", firefox_android: "64", safari: "9", safari_ios: "9" } }, "css.at-rules.media.hover": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "38", chrome_android: "50", edge: "12", firefox: "64", firefox_android: "64", safari: "9", safari_ios: "9" } }, "css.at-rules.media.pointer": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "41", chrome_android: "50", edge: "12", firefox: "64", firefox_android: "64", safari: "9", safari_ios: "9" } } }, support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "64", firefox_android: "\
64", safari: "9", safari_ios: "9" } } }, interactivity: { compat_features: ["css.properties.interactivity", "css.properties.interactivity.auto", "css.properties.interactivity.inert"], description: "The interactivity: inert CSS declaration makes an element and its descendants inert, like when using the inert HTML attribute. Inert elements can't be focused or clicked, their text can't be selected or found using the browser's find-in-page feature.", description_html: "The <code>interactivity: inert</code> CSS declaration makes an element and its descendants inert, like when using the <code>inert</code> HTML attribute. Inert elements can't be focused or clicked, their text can't be selected or found using the browser's find-in-page feature.", kind: "feature", name: "interactivity", spec: ["https://drafts.csswg.org/css-ui-4/#inertness"], status: { baseline: false, by_compat_key: { "css.properties.interactivity": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } },
    "css.properties.interactivity.auto": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.properties.interactivity.inert": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, "interest-invokers": { compat_features: ["api.HTMLAnchorElement.interestForElement", "api.HTMLAreaElement.interestForElement", "api.HTMLButtonElement.interestForElement", "api.HTMLElement.interest_event", "api.HTMLElement.loseinterest_event", "api.InterestEvent", "api.InterestEvent.InterestEvent", "api.InterestEvent.source", "api.SVGAElement.interestForElement", "css.selectors.interest-source", "css.selectors.interest-target", "html.elements.a.interestfor", "html.elements.area.interestfor", "html.elements.button.interestfor", "svg.elements.a.interestfor"], description: "Interest invokers, registered by the interestfor HTML attribute, trigger events and actions on a target \
element when a user shows interest in the element, through behaviors such as hover, focus, or long-press. Pseudo-elements apply styles to sources and targets of interest.", description_html: "Interest invokers, registered by the <code>interestfor</code> HTML attribute, trigger events and actions on a target element when a user shows interest in the element, through behaviors such as hover, focus, or long-press. Pseudo-elements apply styles to sources and targets of interest.", group: ["html"], kind: "feature", name: "Interest invokers", spec: ["https://github.com/whatwg/html/pull/11006"], status: { baseline: false, by_compat_key: { "api.HTMLAnchorElement.interestForElement": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.HTMLAreaElement.interestForElement": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.HTMLButtonElement.interestForElement": { baseline: false, support: { chrome: "142", chrome_android: "\
142", edge: "142" } }, "api.HTMLElement.interest_event": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.HTMLElement.loseinterest_event": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.InterestEvent": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.InterestEvent.InterestEvent": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.InterestEvent.source": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "api.SVGAElement.interestForElement": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "css.selectors.interest-source": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "css.selectors.interest-target": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "html.elements.a.interestfor": { baseline: false,
    support: { chrome: "142", chrome_android: "142", edge: "142" } }, "html.elements.area.interestfor": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "html.elements.button.interestfor": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "svg.elements.a.interestfor": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } } }, support: { chrome: "142", chrome_android: "142", edge: "142" } } }, "interpolate-size": { compat_features: ["css.properties.interpolate-size", "css.properties.interpolate-size.allow-keywords", "css.properties.interpolate-size.numeric-only"], description: "The interpolate-size CSS property sets whether animations and transitions interpolate between a numeric value and a keyword value, such as from a fixed length to auto or fit-content.", description_html: "The <code>interpolate-size</code> CSS property sets whether animations and transitions interpolate between a nume\
ric value and a keyword value, such as from a fixed length to <code>auto</code> or <code>fit-content</code>.", group: ["transitions", "animation"], kind: "feature", name: "interpolate-size", spec: ["https://drafts.csswg.org/css-values-5/#interpolate-size"], status: { baseline: false, by_compat_key: { "css.properties.interpolate-size": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "css.properties.interpolate-size.allow-keywords": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "css.properties.interpolate-size.numeric-only": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, "intersection-observer": { caniuse: ["intersectionobserver"], compat_features: ["api.IntersectionObserver", "api.IntersectionObserver.IntersectionObserver", "api.IntersectionObserver.IntersectionObserver.options_root_parameter_Document", "a\
pi.IntersectionObserver.delay", "api.IntersectionObserver.disconnect", "api.IntersectionObserver.observe", "api.IntersectionObserver.root", "api.IntersectionObserver.rootMargin", "api.IntersectionObserver.scrollMargin", "api.IntersectionObserver.takeRecords", "api.IntersectionObserver.thresholds", "api.IntersectionObserver.trackVisibility", "api.IntersectionObserver.unobserve", "api.IntersectionObserverEntry", "api.IntersectionObserverEntry.IntersectionObserverEntry", "api.IntersectionObserverEntry.boundingClientRect", "api.IntersectionObserverEntry.intersectionRatio", "api.IntersectionObserverEntry.intersectionRect", "api.IntersectionObserverEntry.isIntersecting", "api.IntersectionObserverEntry.isVisible", "api.IntersectionObserverEntry.rootBounds", "api.IntersectionObserverEntry.target", "api.IntersectionObserverEntry.time"], description: "The IntersectionObserver API asynchronously observes changes in the intersection of a target element with an ancestor element or with a top-level \
document's viewport.", description_html: "The <code>IntersectionObserver</code> API asynchronously observes changes in the intersection of a target element with an ancestor element or with a top-level document's viewport.", kind: "feature", name: "Intersection observer", spec: ["https://w3c.github.io/IntersectionObserver/"], status: { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", by_compat_key: { "api.IntersectionObserver": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.IntersectionObserver": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.Intersecti\
onObserver.options_root_parameter_Document": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "76", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.IntersectionObserver.delay": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.IntersectionObserver.disconnect": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.observe": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.root": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "\
2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.rootMargin": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.scrollMargin": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "141", firefox_android: "141", safari: "26", safari_ios: "26" } }, "api.IntersectionObserver.takeRecords": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.thresholds": { baseline: "high", baseline_high_date: "2021-09-25",
    baseline_low_date: "2019-03-25", support: { chrome: "52", chrome_android: "52", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserver.trackVisibility": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.IntersectionObserver.unobserve": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.IntersectionObserverEntry": { baseline: false, support: { safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.boundingClientRect": {
    baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.intersectionRatio": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.intersectionRect": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.isIntersecting": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "58", chrome_android: "58", edge: "16", firefox: "55", firefox_android: "\
55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.isVisible": { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } }, "api.IntersectionObserverEntry.rootBounds": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.target": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.IntersectionObserverEntry.time": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "51", chrome_android: "51", edge: "15", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "58", chrome_android: "\
58", edge: "16", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } } }, "intersection-observer-v2": { caniuse: ["intersectionobserver-v2"], description: "The trackVisibility parameter for the IntersectionObserver constructor enables tracking the visibility of an element, to detect if it may be obscured by other content or visual effects. Also known as IntersectionObserver v2.", description_html: "The <code>trackVisibility</code> parameter for the <code>IntersectionObserver</code> constructor enables tracking the visibility of an element, to detect if it may be obscured by other content or visual effects. Also known as IntersectionObserver v2.", kind: "feature", name: "Intersection observer visibility tracking", spec: ["https://w3c.github.io/IntersectionObserver/#calculate-visibility-algo"], status: { baseline: false, support: { chrome: "74", chrome_android: "74", edge: "79" } } }, intl: { caniuse: ["internationalization"], compat_features: ["javascript.builtins\
.Array.toLocaleString", "javascript.builtins.Array.toLocaleString.locales_parameter", "javascript.builtins.Array.toLocaleString.options_parameter", "javascript.builtins.BigInt.toLocaleString", "javascript.builtins.BigInt.toLocaleString.locales_parameter", "javascript.builtins.BigInt.toLocaleString.options_parameter", "javascript.builtins.Date.toLocaleDateString", "javascript.builtins.Date.toLocaleDateString.iana_time_zone_names", "javascript.builtins.Date.toLocaleDateString.locales_parameter", "javascript.builtins.Date.toLocaleDateString.options_parameter", "javascript.builtins.Date.toLocaleString", "javascript.builtins.Date.toLocaleString.iana_time_zone_names", "javascript.builtins.Date.toLocaleString.locales_parameter", "javascript.builtins.Date.toLocaleString.options_parameter", "javascript.builtins.Date.toLocaleTimeString", "javascript.builtins.Date.toLocaleTimeString.iana_time_zone_names", "javascript.builtins.Date.toLocaleTimeString.locales_parameter", "javascript.builtins.Date.t\
oLocaleTimeString.options_parameter", "javascript.builtins.Intl", "javascript.builtins.Intl.Collator", "javascript.builtins.Intl.Collator.Collator", "javascript.builtins.Intl.Collator.Collator.options_caseFirst_parameter", "javascript.builtins.Intl.Collator.Collator.options_collation_parameter", "javascript.builtins.Intl.Collator.Collator.options_ignorePunctuation_parameter", "javascript.builtins.Intl.Collator.Collator.options_localeMatcher_parameter", "javascript.builtins.Intl.Collator.Collator.options_numeric_parameter", "javascript.builtins.Intl.Collator.Collator.options_sensitivity_parameter", "javascript.builtins.Intl.Collator.Collator.options_usage_parameter", "javascript.builtins.Intl.Collator.compare", "javascript.builtins.Intl.Collator.resolvedOptions", "javascript.builtins.Intl.Collator.supportedLocalesOf", "javascript.builtins.Intl.DateTimeFormat", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.IntlLegacyCons\
tructedSymbol", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.locales_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_calendar_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_dateStyle_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_dayPeriod_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_fractionalSecondDigits_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_hourCycle_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_numberingSystem_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeStyle_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_time\
ZoneName_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZoneName_parameter.extended_values", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZone_parameter", "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZone_parameter.iana_time_zones", "javascript.builtins.Intl.DateTimeFormat.format", "javascript.builtins.Intl.DateTimeFormat.formatRange", "javascript.builtins.Intl.DateTimeFormat.formatRangeToParts", "javascript.builtins.Intl.DateTimeFormat.formatToParts", "javascript.builtins.Intl.DateTimeFormat.resolvedOptions", "javascript.builtins.Intl.DateTimeFormat.resolvedOptions.computed_timezone", "javascript.builtins.Intl.DateTimeFormat.supportedLocalesOf", "javascript.builtins.Intl.NumberFormat", "javascript.builtins.Intl.NumberFormat.NumberFormat", "javascript.builtins.Intl.NumberFormat.NumberFormat.IntlLegacyConstructedSymbol", "javascript.builtins.Intl.NumberFor\
mat.NumberFormat.locales_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_compactDisplay_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_currencyDisplay_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_currencySign_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_currency_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_localeMatcher_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_maximumFractionDigits_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_maximumSignificantDigits_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_minimumFractionDigits_parameter", "javascript.builtins.Intl.NumberFor\
mat.NumberFormat.options_parameter.options_minimumIntegerDigits_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_minimumSignificantDigits_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_notation_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_numberingSystem_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_roundingIncrement_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_roundingMode_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_roundingPriority_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_signDisplay_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_signDisplay_parameter.negative", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.opt\
ions_style_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_trailingZeroDisplay_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_unitDisplay_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_unit_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_useGrouping_parameter", "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_useGrouping_parameter.string_values", "javascript.builtins.Intl.NumberFormat.format", "javascript.builtins.Intl.NumberFormat.format.number_parameter-string_decimal", "javascript.builtins.Intl.NumberFormat.formatRange", "javascript.builtins.Intl.NumberFormat.formatRangeToParts", "javascript.builtins.Intl.NumberFormat.formatToParts", "javascript.builtins.Intl.NumberFormat.resolvedOptions", "javascript.builtins.Intl.NumberFormat.supportedLocalesOf", "javascript.builtins.Intl.getCanonicalL\
ocales", "javascript.builtins.Intl.supportedValuesOf", "javascript.builtins.Number.toLocaleString", "javascript.builtins.Number.toLocaleString.locales_parameter", "javascript.builtins.Number.toLocaleString.options_parameter", "javascript.builtins.Object.toLocaleString", "javascript.builtins.String.localeCompare", "javascript.builtins.String.localeCompare.locales_parameter", "javascript.builtins.String.localeCompare.options_parameter", "javascript.builtins.String.toLocaleLowerCase", "javascript.builtins.String.toLocaleLowerCase.locales_parameter", "javascript.builtins.String.toLocaleUpperCase", "javascript.builtins.String.toLocaleUpperCase.locales_parameter", "javascript.builtins.TypedArray.toLocaleString"], description: "The Intl API provides language sensitive string comparison, number formatting, date and time formatting, and more.", description_html: "The <code>Intl</code> API provides language sensitive string comparison, number formatting, date and time formatting, and more.", group: [
    "intl"], kind: "feature", name: "Intl", spec: ["https://tc39.es/ecma402/#introduction"], status: { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", by_compat_key: { "javascript.builtins.Array.toLocaleString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Array.toLocaleString.locales_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "56", safari: "7", safari_ios: "7" } }, "javascript.builtins.Array.toLocaleString.options_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "56", safari: "7",
    safari_ios: "7" } }, "javascript.builtins.BigInt.toLocaleString": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "68", firefox_android: "68", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.toLocaleString.locales_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "70", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.BigInt.toLocaleString.options_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "70", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Date.toLocaleDateString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toLocaleDateString.iana_time_zone_names": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "14", firefox: "52", firefox_android: "56", safari: "7", safari_ios: "7" } }, "javascript.builtins.Date.toLocaleDateString.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Date.toLocaleDateString.options_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Da\
te.toLocaleString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toLocaleString.iana_time_zone_names": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "14", firefox: "52", firefox_android: "56", safari: "7", safari_ios: "7" } }, "javascript.builtins.Date.toLocaleString.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Date.toLocaleString.options_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "\
12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Date.toLocaleTimeString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Date.toLocaleTimeString.iana_time_zone_names": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "14", firefox: "52", firefox_android: "56", safari: "7", safari_ios: "7" } }, "javascript.builtins.Date.toLocaleTimeString.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Date.toLocaleTimeString.options_parameter": { baseline: "high", baseline_high_date: "\
2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.Collator": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.Collator.option\
s_caseFirst_parameter": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "24", chrome_android: "25", edge: "18", firefox: "55", firefox_android: "56", safari: "11", safari_ios: "11" } }, "javascript.builtins.Intl.Collator.Collator.options_collation_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "85", firefox_android: "85", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Collator.Collator.options_ignorePunctuation_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.Collator.options_localeMatcher_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020\
-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.Collator.options_numeric_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.Collator.options_sensitivity_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.Collator.options_usage_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "\
10" } }, "javascript.builtins.Intl.Collator.compare": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.resolvedOptions": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.Collator.supportedLocalesOf": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "\
12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.IntlLegacyConstructedSymbol": { baseline: "high", baseline_high_date: "2023-11-27", baseline_low_date: "2021-05-27", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "54", firefox_android: "56", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFor\
mat.DateTimeFormat.options_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_calendar_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_dateStyle_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_dayP\
eriod_parameter": { baseline: "high", baseline_high_date: "2024-01-22", baseline_low_date: "2021-07-22", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_fractionalSecondDigits_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "84", firefox_android: "84", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_hourCycle_parameter": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "73", chrome_android: "73", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_numberingSy\
stem_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeStyle_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZoneName_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZoneName_parameter\
.extended_values": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "91", firefox_android: "91", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZone_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.DateTimeFormat.options_parameter.options_timeZone_parameter.iana_time_zones": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "14", firefox: "52", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.format": { baseline: "high", baseline_high_date: "2020\
-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.formatRange": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "91", firefox_android: "91", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.formatRangeToParts": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "91", firefox_android: "91", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DateTimeFormat.formatToParts": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "57", chrome_android: "57", edge: "18", firefox: "51", firefox_android: "56", safari: "11", safari_ios: "\
11" } }, "javascript.builtins.Intl.DateTimeFormat.resolvedOptions": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.resolvedOptions.computed_timezone": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "35", chrome_android: "35", edge: "14", firefox: "53", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.DateTimeFormat.supportedLocalesOf": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: {
    chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.IntlLegacyConstructedSymbol": { baseline: "high", baseline_high_date: "2023-11-27", baseline_low_date: "2021-05-27", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "54", firefox_android: "56", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "j\
avascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_compactDisplay_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_currencyDisplay_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "42", firefox_android: "56", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat\
.options_parameter.options_currencySign_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_currency_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_localeMatcher_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_max\
imumFractionDigits_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_maximumSignificantDigits_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_minimumFractionDigits_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_mini\
mumIntegerDigits_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_minimumSignificantDigits_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_notation_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_numberingSystem\
_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "76", firefox_android: "56", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_roundingIncrement_parameter": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_roundingMode_parameter": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_roundingPriority\
_parameter": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_signDisplay_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_signDisplay_parameter.negative": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_style_paramete\
r": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_trailingZeroDisplay_parameter": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_unitDisplay_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_unit_parameter": { baseline: "hig\
h", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_useGrouping_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.NumberFormat.options_parameter.options_useGrouping_parameter.string_values": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.Intl.NumberFormat.format": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "201\
7-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.format.number_parameter-string_decimal": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.formatRange": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.NumberFormat.formatRangeToParts": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "\
15.4" } }, "javascript.builtins.Intl.NumberFormat.formatToParts": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "64", chrome_android: "64", edge: "12", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } }, "javascript.builtins.Intl.NumberFormat.resolvedOptions": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.NumberFormat.supportedLocalesOf": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Intl.getCanonicalLocales": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "54",
    chrome_android: "54", edge: "16", firefox: "48", firefox_android: "56", safari: "10.1", safari_ios: "10.3" } }, "javascript.builtins.Intl.supportedValuesOf": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "93", firefox_android: "93", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Number.toLocaleString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.toLocaleString.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "26", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Number.toLocaleString.options_parameter": { baseline: "\
high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "26", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.Object.toLocaleString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.localeCompare": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.String.localeCompare.locales_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "26", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "1\
0" } }, "javascript.builtins.String.localeCompare.options_parameter": { baseline: "high", baseline_high_date: "2020-03-28", baseline_low_date: "2017-09-28", support: { chrome: "24", chrome_android: "26", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } }, "javascript.builtins.String.toLocaleLowerCase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "javascript.builtins.String.toLocaleLowerCase.locales_parameter": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "58", chrome_android: "58", edge: "12", firefox: "55", firefox_android: "55", safari: "10", safari_ios: "10" } }, "javascript.builtins.String.toLocaleUpperCase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "javascript.builtins.String.toLocaleUpperCase.locales_parameter": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "58", chrome_android: "58", edge: "12", firefox: "55", firefox_android: "55", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.toLocaleString": { baseline: "high", baseline_high_date: "2019-07-24", baseline_low_date: "2017-01-24", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "51", firefox_android: "51", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "29", firefox_android: "56", safari: "10", safari_ios: "10" } } }, "intl-display-names": { compat_features: ["javascript.builtins.Intl.DisplayNames", "javascript.builtins.Intl.DisplayNames.DisplayNames", "javascript.builtins.Intl.DisplayNames.of", "javascript.builtins.Intl.DisplayNames.\
resolvedOptions", "javascript.builtins.Intl.DisplayNames.supportedLocalesOf"], description: "The Intl.DisplayNames API provides localized names of language, region, script, and currency codes.", description_html: "The <code>Intl.DisplayNames</code> API provides localized names of language, region, script, and currency codes.", group: ["intl"], kind: "feature", name: "Intl.DisplayNames", spec: ["https://tc39.es/ecma402/#intl-displaynames-objects"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "javascript.builtins.Intl.DisplayNames": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "86", firefox_android: "86", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DisplayNames.DisplayNames": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "81", chrome_android: "\
81", edge: "81", firefox: "86", firefox_android: "86", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DisplayNames.of": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "86", firefox_android: "86", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DisplayNames.resolvedOptions": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "86", firefox_android: "86", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.DisplayNames.supportedLocalesOf": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "86", firefox_android: "86", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "8\
6", firefox_android: "86", safari: "14.1", safari_ios: "14.5" } } }, "intl-duration-format": { compat_features: ["javascript.builtins.Intl.DurationFormat", "javascript.builtins.Intl.DurationFormat.DurationFormat", "javascript.builtins.Intl.DurationFormat.format", "javascript.builtins.Intl.DurationFormat.formatToParts", "javascript.builtins.Intl.DurationFormat.resolvedOptions", "javascript.builtins.Intl.DurationFormat.supportedLocalesOf"], description: "The Intl.DurationFormat API creates a locale-aware formatter that turns an object representing a duration (such as days, hours, and minutes) into a string.", description_html: "The <code>Intl.DurationFormat</code> API creates a locale-aware formatter that turns an object representing a duration (such as days, hours, and minutes) into a string.", group: ["intl"], kind: "feature", name: "Intl.DurationFormat", spec: ["https://tc39.es/proposal-intl-duration-format/"], status: { baseline: "low", baseline_low_date: "2025-03-04", by_compat_key: {
    "javascript.builtins.Intl.DurationFormat": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.Intl.DurationFormat.DurationFormat": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.Intl.DurationFormat.format": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.Intl.DurationFormat.formatToParts": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "javascript.\
builtins.Intl.DurationFormat.resolvedOptions": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.Intl.DurationFormat.supportedLocalesOf": { baseline: "low", baseline_low_date: "2025-03-04", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "136", firefox_android: "136", safari: "16.4", safari_ios: "16.4" } } }, "intl-list-format": { compat_features: ["javascript.builtins.Intl.ListFormat", "javascript.builtins.Intl.ListFormat.ListFormat", "javascript.builtins.Intl.ListFormat.format", "javascript.builtins.Intl.ListFormat.formatToParts", "javascript.builtins.Intl.ListFormat.resolvedOptions", "javascript.builtins.Intl.ListFormat.supportedLocalesOf"], description: "T\
he Intl.ListFormat API creates a locale-aware formatter that turns iterable objects into localized strings.", description_html: "The <code>Intl.ListFormat</code> API creates a locale-aware formatter that turns iterable objects into localized strings.", group: ["intl"], kind: "feature", name: "Intl.ListFormat", spec: ["https://tc39.es/ecma402/#listformat-objects"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "javascript.builtins.Intl.ListFormat": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.ListFormat.ListFormat": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "\
14.5" } }, "javascript.builtins.Intl.ListFormat.format": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.ListFormat.formatToParts": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.ListFormat.resolvedOptions": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.ListFormat.supportedLocalesOf": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "\
72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, "intl-locale": { compat_features: ["javascript.builtins.Intl.Locale", "javascript.builtins.Intl.Locale.Locale", "javascript.builtins.Intl.Locale.baseName", "javascript.builtins.Intl.Locale.calendar", "javascript.builtins.Intl.Locale.caseFirst", "javascript.builtins.Intl.Locale.collation", "javascript.builtins.Intl.Locale.hourCycle", "javascript.builtins.Intl.Locale.language", "javascript.builtins.Intl.Locale.maximize", "javascript.builtins.Intl.Locale.minimize", "javascript.builtins.Intl.Locale.numberingSystem", "javascript.builtins.Intl.Locale.numeric", "javascript.builtins.Intl.Locale.region", "javascript.builtins.Intl.Locale.script", "javascript.builtins.Intl.Locale.toString"], description: "The Intl.Locale API parses Unicode loc\
ale identifiers, with language, region, and script codes, such as zh-Hans-CN or en-GB.", description_html: "The <code>Intl.Locale</code> API parses Unicode locale identifiers, with language, region, and script codes, such as <code>zh-Hans-CN</code> or <code>en-GB</code>.", group: ["intl"], kind: "feature", name: "Intl.Locale", spec: ["https://tc39.es/ecma402/#locale-objects"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "javascript.builtins.Intl.Locale": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.Locale": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "\
14" } }, "javascript.builtins.Intl.Locale.baseName": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.calendar": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.caseFirst": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.collation": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "\
75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.hourCycle": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.language": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.maximize": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.minimize": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "\
74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.numberingSystem": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.numeric": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.region": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.script": { baseline: "high", baseline_high_date: "2023-03-\
16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.Locale.toString": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } } }, support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } } }, "intl-locale-info": { compat_features: ["javascript.builtins.Intl.Locale.getCalendars", "javascript.builtins.Intl.Locale.getCollations", "javascript.builtins.Intl.Locale.getHourCycles", "javascript.builtins.Intl.Locale.getNumberingSystems", "javascript.builtins.Intl.Locale.getTextInfo", "javascript.builtins.Intl.Locale.getTimeZones", "javascript.builtins.Intl.Locale.getWeekInfo"], description: "The getter methods of the Intl\
.Locale API provide supplemental information about a Unicode locale, such as the locale's calendar (for example, the first day in a week or the weekend start day), writing direction, 12- or 24-hour cycles, and numbering system.", description_html: "The getter methods of the <code>Intl.Locale</code> API provide supplemental information about a Unicode locale, such as the locale's calendar (for example, the first day in a week or the weekend start day), writing direction, 12- or 24-hour cycles, and numbering system.", group: ["intl"], kind: "feature", name: "Intl.Locale info", spec: ["https://tc39.es/ecma402/#locale-objects"], status: { baseline: false, by_compat_key: { "javascript.builtins.Intl.Locale.getCalendars": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } }, "javascript.builtins.Intl.Locale.getCollations": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "1\
7" } }, "javascript.builtins.Intl.Locale.getHourCycles": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } }, "javascript.builtins.Intl.Locale.getNumberingSystems": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } }, "javascript.builtins.Intl.Locale.getTextInfo": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } }, "javascript.builtins.Intl.Locale.getTimeZones": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } }, "javascript.builtins.Intl.Locale.getWeekInfo": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } } }, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "17", safari_ios: "17" } } }, "intl-plural-rules": { compat_features: ["javascript.builti\
ns.Intl.PluralRules", "javascript.builtins.Intl.PluralRules.PluralRules", "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter", "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_roundingIncrement_parameter", "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_roundingMode_parameter", "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_roundingPriority_parameter", "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_trailingZeroDisplay_parameter", "javascript.builtins.Intl.PluralRules.resolvedOptions", "javascript.builtins.Intl.PluralRules.select", "javascript.builtins.Intl.PluralRules.selectRange", "javascript.builtins.Intl.PluralRules.supportedLocalesOf"], description: "The Intl.PluralRules API creates a locale-aware object that tells you which of the language's pluralization rules apply based on a given number.", description_html: "The <code>Intl.PluralRules</code> API cre\
ates a locale-aware object that tells you which of the language's pluralization rules apply based on a given number.", group: ["intl"], kind: "feature", name: "Intl.PluralRules", spec: ["https://tc39.es/ecma402/#pluralrules-objects"], status: { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", by_compat_key: { "javascript.builtins.Intl.PluralRules": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } }, "javascript.builtins.Intl.PluralRules.PluralRules": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } }, "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter": { baseline: "high", baseline_high_date: "2026-02-01",
    baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "15.4" } }, "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_roundingIncrement_parameter": { baseline: false, support: { firefox: "116", firefox_android: "116", safari: "17.2", safari_ios: "17.2" } }, "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_roundingMode_parameter": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "116", firefox_android: "116", safari: "17.2", safari_ios: "17.2" } }, "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_roundingPriority_parameter": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "\
15.4" } }, "javascript.builtins.Intl.PluralRules.PluralRules.options_parameter.options_trailingZeroDisplay_parameter": { baseline: false, support: { firefox: "116", firefox_android: "116" } }, "javascript.builtins.Intl.PluralRules.resolvedOptions": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } }, "javascript.builtins.Intl.PluralRules.select": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } }, "javascript.builtins.Intl.PluralRules.selectRange": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "116", firefox_android: "116", safari: "15.4", safari_ios: "\
15.4" } }, "javascript.builtins.Intl.PluralRules.supportedLocalesOf": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } } }, support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "13", safari_ios: "13" } } }, "intl-relative-time-format": { compat_features: ["javascript.builtins.Intl.RelativeTimeFormat", "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat", "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.locales_parameter", "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.options_parameter.options_localeMatcher_parameter", "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.options_parameter.options_numberingSystem_parameter", "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.options_parameter.options_num\
eric_parameter", "javascript.builtins.Intl.RelativeTimeFormat.format", "javascript.builtins.Intl.RelativeTimeFormat.formatToParts", "javascript.builtins.Intl.RelativeTimeFormat.resolvedOptions", "javascript.builtins.Intl.RelativeTimeFormat.supportedLocalesOf"], description: "The Intl.RelativeTimeFormat API creates a locale-aware formatter that turns an object representing a relative time (such as '1 day ago') into a localized string.", description_html: "The <code>Intl.RelativeTimeFormat</code> API creates a locale-aware formatter that turns an object representing a relative time (such as '1 day ago') into a localized string.", group: ["intl"], kind: "feature", name: "Intl.RelativeTimeFormat", spec: ["https://tc39.es/ecma402/#relativetimeformat-objects"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "javascript.builtins.Intl.RelativeTimeFormat": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2\
020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.locales_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.options_parameter.options_localeMatcher_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "\
65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.options_parameter.options_numberingSystem_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "76", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.RelativeTimeFormat.options_parameter.options_numeric_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.format": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } },
    "javascript.builtins.Intl.RelativeTimeFormat.formatToParts": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "70", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.resolvedOptions": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "javascript.builtins.Intl.RelativeTimeFormat.supportedLocalesOf": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } } }, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "76", firefox_android: "79", safari: "14", safari_ios: "14" } } }, "intl-seg\
menter": { compat_features: ["javascript.builtins.Intl.Segmenter", "javascript.builtins.Intl.Segmenter.Segmenter", "javascript.builtins.Intl.Segmenter.resolvedOptions", "javascript.builtins.Intl.Segmenter.segment", "javascript.builtins.Intl.Segmenter.supportedLocalesOf", "javascript.builtins.Intl.Segments", "javascript.builtins.Intl.Segments.@@iterator", "javascript.builtins.Intl.Segments.containing"], description: "The Intl.Segmenter API creates a locale-aware text splitter that can separate a string into meaningful graphemes, words, or sentences.", description_html: "The <code>Intl.Segmenter</code> API creates a locale-aware text splitter that can separate a string into meaningful graphemes, words, or sentences.", group: ["intl"], kind: "feature", name: "Intl.Segmenter", spec: ["https://tc39.es/ecma402/#segmenter-objects"], status: { baseline: "low", baseline_low_date: "2024-04-16", by_compat_key: { "javascript.builtins.Intl.Segmenter": { baseline: "low", baseline_low_date: "2024-04-\
16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segmenter.Segmenter": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segmenter.resolvedOptions": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segmenter.segment": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segmenter.supportedLocalesOf": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "\
87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segments": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segments.@@iterator": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.Intl.Segments.containing": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "125", firefox_android: "125", safari: "14.1", safari_ios: "14.5" } } }, "inverted-colors": { compat_features: ["css.at-rules.m\
edia.inverted-colors"], description: "The inverted-colors CSS media query sets styles based on whether the user has inverted all colors, such as with mobile accessibility settings.", description_html: "The <code>inverted-colors</code> CSS media query sets styles based on whether the user has inverted all colors, such as with mobile accessibility settings.", group: ["media-queries"], kind: "feature", name: "inverted-colors media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#inverted"], status: { baseline: false, by_compat_key: { "css.at-rules.media.inverted-colors": { baseline: false, support: { safari: "9.1", safari_ios: "10" } } }, support: { safari: "9.1", safari_ios: "10" } } }, "invoker-commands": { compat_features: ["api.CommandEvent", "api.CommandEvent.CommandEvent", "api.CommandEvent.command", "api.CommandEvent.source", "api.HTMLButtonElement.command", "api.HTMLButtonElement.commandForElement", "api.HTMLElement.command_event", "html.elements.button.command", "html.ele\
ments.button.commandfor"], description: "The command and commandfor attributes for the <button> HTML element dispatch an action to an element when the button is invoked (by click or keystroke), as a declarative alternative to addEventListener() calls or onclick attribute handlers.", description_html: "The <code>command</code> and <code>commandfor</code> attributes for the <code>&#x3C;button></code> HTML element dispatch an action to an element when the button is invoked (by click or keystroke), as a declarative alternative to <code>addEventListener()</code> calls or <code>onclick</code> attribute handlers.", kind: "feature", name: "Invoker commands", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#attr-button-command"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "api.CommandEvent": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "\
26.2", safari_ios: "26.2" } }, "api.CommandEvent.CommandEvent": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "api.CommandEvent.command": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "api.CommandEvent.source": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "api.HTMLButtonElement.command": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "api.HTMLButtonElement.commandForElement": { baseline: "low", baseline_low_date: "\
2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "api.HTMLElement.command_event": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "html.elements.button.command": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } }, "html.elements.button.commandfor": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "144", firefox_android: "144", safari: "26.2", safari_ios: "26.2" } } }, is: { caniuse: ["\
css-matches-pseudo"], compat_features: ["css.selectors.is", "css.selectors.is.forgiving_selector_list"], description: "The :is() CSS functional pseudo-class takes a selector list as its argument, and matches any element that can be selected by one of the selectors in that list.", description_html: "The <code>:is()</code> CSS functional pseudo-class takes a selector list as its argument, and matches any element that can be selected by one of the selectors in that list.", group: ["selectors"], kind: "feature", name: ":is()", spec: ["https://drafts.csswg.org/selectors-4/#matches"], status: { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", by_compat_key: { "css.selectors.is": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "78", firefox_android: "79", safari: "14", safari_ios: "14" } }, "css.selectors.is.forgiving_selector_list": { baseline: "high",
    baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "82", firefox_android: "82", safari: "14", safari_ios: "14" } } }, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "82", firefox_android: "82", safari: "14", safari_ios: "14" } } }, "is-error": { compat_features: ["javascript.builtins.Error.isError"], description: "The Error.isError() static method checks whether a value is an Error object.", description_html: "The <code>Error.isError()</code> static method checks whether a value is an <code>Error</code> object.", group: ["javascript"], kind: "feature", name: "Error.isError()", spec: ["https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-error.iserror"], status: { baseline: false, by_compat_key: { "javascript.builtins.Error.isError": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "138", firefox_android: "138" } } }, support: { chrome: "\
134", chrome_android: "134", edge: "134", firefox: "138", firefox_android: "138" } } }, "is-input-pending": { compat_features: ["api.Navigator.scheduling", "api.Scheduling", "api.Scheduling.isInputPending"], description: "The navigator.scheduling.isInputPending() method checks if there are pending input events, such as touch or mouse events. This allows you to yield from long-running scripts that might be blocking user interaction.", description_html: "The <code>navigator.scheduling.isInputPending()</code> method checks if there are pending input events, such as touch or mouse events. This allows you to yield from long-running scripts that might be blocking user interaction.", discouraged: { according_to: ["https://web.dev/articles/optimize-long-tasks#isinputpending"], alternatives: ["scheduler"], reason: "The navigator.scheduling.isInputPending() method may incorrectly return false and is not the only case where you might expect to yield.", reason_html: "The <code>navigator.scheduling\
.isInputPending()</code> method may incorrectly return <code>false</code> and is not the only case where you might expect to yield." }, kind: "feature", name: "isInputPending()", spec: ["https://wicg.github.io/is-input-pending/"], status: { baseline: false, by_compat_key: { "api.Navigator.scheduling": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "api.Scheduling": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } }, "api.Scheduling.isInputPending": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87" } } }, support: { chrome: "87", chrome_android: "87", edge: "87" } } }, "is-secure-context": { compat_features: ["api.isSecureContext", "api.isSecureContext.worker_support"], description: "The isSecureContext global property is a boolean for whether the current browsing context is secure. This is primarily a check that the page has been served over an HTTPS URL.", description_html: "The <code>isSecureC\
ontext</code> global property is a boolean for whether the current browsing context is secure. This is primarily a check that the page has been served over an HTTPS URL.", kind: "feature", name: "isSecureContext", spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#dom-issecurecontext-dev"], status: { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", by_compat_key: { "api.isSecureContext": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "47", chrome_android: "47", edge: "15", firefox: "49", firefox_android: "49", safari: "11.1", safari_ios: "11.3" } }, "api.isSecureContext.worker_support": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52", firefox_android: "52", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "55", chrome_android: "55", edge: "15", firefox: "52",
    firefox_android: "52", safari: "11.1", safari_ios: "11.3" } } }, isolation: { compat_features: ["css.properties.isolation"], description: "The isolation CSS property creates a new stacking context, which impacts z-index ordering and blend modes.", description_html: "The <code>isolation</code> CSS property creates a new stacking context, which impacts <code>z-index</code> ordering and blend modes.", group: ["blend-mode"], kind: "feature", name: "isolation", spec: ["https://drafts.csswg.org/compositing-2/#isolation"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.isolation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "8", safari_ios: "8" } } }, support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "8", safari_ios: "\
8" } } }, "iterator-concat": { compat_features: ["javascript.builtins.Iterator.concat"], description: "The Iterator.concat() JavaScript method returns an iterator that yields values from a sequence of iterators, exhausting each iterator before moving on to the next.", description_html: "The <code>Iterator.concat()</code> JavaScript method returns an iterator that yields values from a sequence of iterators, exhausting each iterator before moving on to the next.", group: ["iterators"], kind: "feature", name: "Iterator.concat()", spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator.concat"], status: { baseline: "low", baseline_low_date: "2026-03-24", by_compat_key: { "javascript.builtins.Iterator.concat": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "147", firefox_android: "147", safari: "26.4", safari_ios: "26.4" } } }, support: { chrome: "146", chrome_android: "146", edge: "1\
46", firefox: "147", firefox_android: "147", safari: "26.4", safari_ios: "26.4" } } }, "iterator-methods": { compat_features: ["javascript.builtins.Iterator.Iterator", "javascript.builtins.Iterator.drop", "javascript.builtins.Iterator.every", "javascript.builtins.Iterator.filter", "javascript.builtins.Iterator.find", "javascript.builtins.Iterator.flatMap", "javascript.builtins.Iterator.forEach", "javascript.builtins.Iterator.from", "javascript.builtins.Iterator.map", "javascript.builtins.Iterator.reduce", "javascript.builtins.Iterator.some", "javascript.builtins.Iterator.take", "javascript.builtins.Iterator.toArray"], description: "The Iterator object is an abstract base for objects that implement the iterator protocol. It provides methods common to built-in iterators, such as filter(), find(), map(), and reduce(). You can also use the static method Iterator.from() to convert an existing iterable into an Iterator.", description_html: "The <code>Iterator</code> object is an abstract bas\
e for objects that implement the iterator protocol. It provides methods common to built-in iterators, such as <code>filter()</code>, <code>find()</code>, <code>map()</code>, and <code>reduce()</code>. You can also use the static method <code>Iterator.from()</code> to convert an existing iterable into an <code>Iterator</code>.", group: ["iterators"], kind: "feature", name: "Iterator methods", spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-helper-objects"], status: { baseline: "low", baseline_low_date: "2025-03-31", by_compat_key: { "javascript.builtins.Iterator.Iterator": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.drop": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "13\
1", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.every": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.filter": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.find": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.flatMap": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Itera\
tor.forEach": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.from": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.map": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.reduce": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.some": { baseline: "low", baseline_low_date: "2025-03-31", support: {
    chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.take": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.Iterator.toArray": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } } }, iterators: { compat_features: ["javascript.builtins.Iterator", "javascript.builtins.Iterator.@@iterator", "javascript.statements.for_of", "javascript.statements.for_of.closing_iterators"], description: "The for...of loop operates on a sequence of values \
sourced from an iterable object, such as arrays, array-like objects, DOM collections, iterators, generators, and user-defined iterables. All built-in iterators inherit from the Iterator class.", description_html: "The <code>for...of</code> loop operates on a sequence of values sourced from an iterable object, such as arrays, array-like objects, DOM collections, iterators, generators, and user-defined iterables. All built-in iterators inherit from the <code>Iterator</code> class.", group: ["iterators"], kind: "feature", name: "Iterators and the for...of loop", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-%iteratorprototype%-object", "https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-for-in-and-for-of-statements"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Iterator": { baseline: "high", baseline_high_date: "\
2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "17", firefox_android: "17", safari: "10", safari_ios: "10" } }, "javascript.builtins.Iterator.@@iterator": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "javascript.statements.for_of": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "7", safari_ios: "7" } }, "javascript.statements.for_of.closing_iterators": { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "51", chrome_android: "51", edge: "14", firefox: "53", firefox_android: "53", safari: "7", safari_ios: "7" } } }, support: { chrome: "38", chrome_android: "\
38", edge: "12", firefox: "13", firefox_android: "14", safari: "7", safari_ios: "7" } } }, javascript: { compat_features: ["javascript.builtins.Boolean", "javascript.builtins.Boolean.Boolean", "javascript.builtins.Boolean.toString", "javascript.builtins.Boolean.valueOf", "javascript.builtins.Error", "javascript.builtins.Error.Error", "javascript.builtins.Error.message", "javascript.builtins.Error.name", "javascript.builtins.Error.toString", "javascript.builtins.EvalError", "javascript.builtins.EvalError.EvalError", "javascript.builtins.RangeError", "javascript.builtins.RangeError.RangeError", "javascript.builtins.ReferenceError", "javascript.builtins.ReferenceError.ReferenceError", "javascript.builtins.SyntaxError", "javascript.builtins.SyntaxError.SyntaxError", "javascript.builtins.TypeError", "javascript.builtins.TypeError.TypeError", "javascript.builtins.URIError", "javascript.builtins.URIError.URIError", "javascript.builtins.decodeURI", "javascript.builtins.decodeURIComponent", "ja\
vascript.builtins.encodeURI", "javascript.builtins.encodeURIComponent", "javascript.builtins.eval", "javascript.builtins.isFinite", "javascript.builtins.parseFloat", "javascript.builtins.undefined", "javascript.grammar.boolean_literals", "javascript.grammar.hexadecimal_escape_sequences", "javascript.grammar.null_literal", "javascript.grammar.trailing_commas", "javascript.grammar.trailing_commas.trailing_commas_in_object_literals", "javascript.grammar.unicode_escape_sequences", "javascript.operators.addition", "javascript.operators.addition_assignment", "javascript.operators.assignment", "javascript.operators.bitwise_and", "javascript.operators.bitwise_and_assignment", "javascript.operators.bitwise_not", "javascript.operators.bitwise_or", "javascript.operators.bitwise_or_assignment", "javascript.operators.bitwise_xor", "javascript.operators.bitwise_xor_assignment", "javascript.operators.comma", "javascript.operators.conditional", "javascript.operators.decrement", "javascript.operators.d\
elete", "javascript.operators.division", "javascript.operators.division_assignment", "javascript.operators.equality", "javascript.operators.greater_than", "javascript.operators.greater_than_or_equal", "javascript.operators.grouping", "javascript.operators.in", "javascript.operators.increment", "javascript.operators.inequality", "javascript.operators.instanceof", "javascript.operators.left_shift", "javascript.operators.left_shift_assignment", "javascript.operators.less_than", "javascript.operators.less_than_or_equal", "javascript.operators.logical_and", "javascript.operators.logical_not", "javascript.operators.logical_or", "javascript.operators.multiplication", "javascript.operators.multiplication_assignment", "javascript.operators.new", "javascript.operators.null", "javascript.operators.property_accessors", "javascript.operators.remainder", "javascript.operators.remainder_assignment", "javascript.operators.right_shift", "javascript.operators.right_shift_assignment", "javascript.operato\
rs.strict_equality", "javascript.operators.strict_inequality", "javascript.operators.subtraction", "javascript.operators.subtraction_assignment", "javascript.operators.this", "javascript.operators.typeof", "javascript.operators.unary_negation", "javascript.operators.unary_plus", "javascript.operators.unsigned_right_shift", "javascript.operators.unsigned_right_shift_assignment", "javascript.operators.void", "javascript.statements.block", "javascript.statements.break", "javascript.statements.continue", "javascript.statements.debugger", "javascript.statements.do_while", "javascript.statements.empty", "javascript.statements.for", "javascript.statements.for_in", "javascript.statements.if_else", "javascript.statements.label", "javascript.statements.return", "javascript.statements.switch", "javascript.statements.throw", "javascript.statements.try_catch", "javascript.statements.var", "javascript.statements.while"], description: "JavaScript is a programming language that runs in browsers, usual\
ly through the <script> element. JavaScript has changed over many years. This feature represents the oldest language features, such as built-in objects, statements, and operators. Also known as ECMAScript.", description_html: "JavaScript is a programming language that runs in browsers, usually through the <code>&#x3C;script></code> element. JavaScript has changed over many years. This feature represents the oldest language features, such as built-in objects, statements, and operators. Also known as ECMAScript.", group: ["javascript"], kind: "feature", name: "JavaScript (initial core language support)", spec: ["https://tc39.es/ecma262/multipage/#sec-intro"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Boolean": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1",
    safari_ios: "1" } }, "javascript.builtins.Boolean.Boolean": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Boolean.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Boolean.valueOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Error": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "javascript.builtins.Error.Error": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Error.message": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Error.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Error.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "javascript.builtins.EvalError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.EvalError.EvalError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RangeError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RangeError.RangeError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.builtins.ReferenceError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.ReferenceError.ReferenceError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.SyntaxError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.SyntaxError.SyntaxError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.TypeError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.TypeError.TypeError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.URIError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.URIError.URIError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.decodeURI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "javascript.builtins.decodeURIComponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "javascript.builtins.encodeURI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "javascript.builtins.encodeURIComponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "javascript.builtins.eval": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.isFinite": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.parseFloat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.undefined": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.boolean_literals": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.hexadecimal_escape_sequences": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.null_literal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.trailing_commas": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.trailing_commas.trailing_commas_in_object_literals": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.grammar.unicode_escape_sequences": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.addition": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.addition_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_and": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_and_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_not": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_or": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_or_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_xor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.bitwise_xor_assignment": { baseline: "high", baseline_high_date: "2018-01-2\
9", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.comma": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.conditional": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.decrement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "javascript.operators.delete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.division": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.division_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.equality": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.greater_than": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.greater_than_or_equal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.grouping": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.increment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "javascript.operators.inequality": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.instanceof": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.left_shift": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.left_shift_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.less_than": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.less_than_or_equal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.logical_and": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.logical_not": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.logical_or": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.multiplication": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.multiplication_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.new": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.null": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.property_accessors": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.remainder": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.remainder_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.right_shift": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.right_shift_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.strict_equality": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.strict_inequality": { baseline: "high", baseline_high_date: "2018-01-\
29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.subtraction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.subtraction_assignment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.this": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.typeof": { baseline: "high", baseline_high_date: "2018-\
01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.unary_negation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.unary_plus": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.unsigned_right_shift": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.unsigned_right_shift_assignment": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.void": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "javascript.statements.block": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.break": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.continue": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.debugger": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "javascript.statements.do_while": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.empty": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "javascript.statements.for": { baseline: "high", baseline_high_date: "2018-01-\
29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.for_in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.if_else": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.return": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.switch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.throw": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.try_catch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.var": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.statements.while": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, jpeg: { compat_features: ["mediatypes.image.jpeg"], description: "The JPEG image format is a raster graphics file format with lossy compression.", description_html: "The JPEG image format is a raster graphics file format with lossy compression.", kind: "feature", name: "JPEG", spec: ["https://jpeg.org/jpeg/#content"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "mediatypes.image.jpeg": { baseline: "high", baseline_high_date: "2\
018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, jpegxl: { caniuse: ["jpegxl"], compat_features: ["mediatypes.image.jxl"], description: "The JPEG XL image format is a raster graphics file format that supports animation, alpha transparency, and lossy as well as lossless compression.", description_html: "The JPEG XL image format is a raster graphics file format that supports animation, alpha transparency, and lossy as well as lossless compression.", group: ["image-formats"], kind: "feature", name: "JPEG XL", spec: ["https://www.iso.org/standard/85253.html"], status: { baseline: false, by_compat_key: { "mediatypes.image.jxl": { baseline: false, support: { safari: "17", safari_ios: "17" } } }, support: { safari: "17", safari_ios: "17" } } },
    "js-modules": { caniuse: ["es6-module"], compat_features: ["api.Worklet.ecmascript_modules", "html.elements.script.nomodule", "html.elements.script.type.module", "javascript.operators.import", "javascript.operators.import_meta", "javascript.operators.import_meta.resolve", "javascript.statements.export", "javascript.statements.export.arbitrary_module_namespace_identifier_names", "javascript.statements.export.default", "javascript.statements.export.namespace", "javascript.statements.import", "javascript.statements.import.arbitrary_module_namespace_identifier_names", "javascript.statements.import.import_attributes", "javascript.statements.import.worklet_support", "svg.elements.script.type.module"], description: 'JavaScript modules allow code to be organized into reusable units. Modules use import to load other modules and export to declare what is available to import from other modules. In HTML, modules are loaded with <script type="module">.', description_html: 'JavaScript modules al\
low code to be organized into reusable units. Modules use <code>import</code> to load other modules and <code>export</code> to declare what is available to import from other modules. In HTML, modules are loaded with <code>&#x3C;script type="module"></code>.', group: ["js-modules"], kind: "feature", name: "JavaScript modules", snapshot: ["ecmascript-2015"], spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#javascript-module-script", "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sec-modules"], status: { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", by_compat_key: { "api.Worklet.ecmascript_modules": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "15", safari_ios: "15" } }, "html.elements.script.nomodule": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "\
2018-05-09", support: { chrome: "61", chrome_android: "61", edge: "16", firefox: "60", firefox_android: "60", safari: "11", safari_ios: "11" } }, "html.elements.script.type.module": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "61", chrome_android: "61", edge: "16", firefox: "60", firefox_android: "60", safari: "10.1", safari_ios: "10.3" } }, "javascript.operators.import": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "67", firefox_android: "67", safari: "11.1", safari_ios: "11.3" } }, "javascript.operators.import_meta": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "62", firefox_android: "62", safari: "11.1", safari_ios: "12" } }, "javascript.operators.import_meta.resolve": { baseline: "high", baseline_high_date: "\
2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "106", firefox_android: "106", safari: "16.4", safari_ios: "16.4" } }, "javascript.statements.export": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "61", chrome_android: "61", edge: "16", firefox: "60", firefox_android: "60", safari: "10.1", safari_ios: "10.3" } }, "javascript.statements.export.arbitrary_module_namespace_identifier_names": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "87", firefox_android: "87", safari: "14.1", safari_ios: "14.5" } }, "javascript.statements.export.default": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "61", chrome_android: "61", edge: "16", firefox: "60", firefox_android: "60", safari: "10.1", safari_ios: "10.\
3" } }, "javascript.statements.export.namespace": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "80", firefox_android: "80", safari: "14.1", safari_ios: "14.5" } }, "javascript.statements.import": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "61", chrome_android: "61", edge: "16", firefox: "60", firefox_android: "60", safari: "10.1", safari_ios: "10.3" } }, "javascript.statements.import.arbitrary_module_namespace_identifier_names": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "87", firefox_android: "87", safari: "14.1", safari_ios: "14.5" } }, "javascript.statements.import.import_attributes": { baseline: "low", baseline_low_date: "2025-04-29", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "\
138", firefox_android: "138", safari: "17.2", safari_ios: "17.2" } }, "javascript.statements.import.worklet_support": { baseline: false, support: { firefox: "114", firefox_android: "114" } }, "svg.elements.script.type.module": { baseline: false, support: { firefox: "117", firefox_android: "117" } } }, support: { chrome: "61", chrome_android: "61", edge: "16", firefox: "60", firefox_android: "60", safari: "11", safari_ios: "11" } } }, "js-modules-service-workers": { compat_features: ["api.ServiceWorker.ecmascript_modules", "javascript.statements.import.service_worker_support"], description: 'The navigator.serviceWorker.register() method accepts { type: "module" } to load scripts that use import and export. Also known as ECMAScript modules or ESM in service workers.', description_html: 'The <code>navigator.serviceWorker.register()</code> method accepts <code>{ type: "module" }</code> to load scripts that use <code>import</code> and <code>export</code>. Also known as ECMAScript modules or\
 ESM in service workers.', group: ["js-modules", "workers"], kind: "feature", name: "JavaScript modules in service workers", spec: ["https://w3c.github.io/ServiceWorker/#dom-registrationoptions-type"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: { "api.ServiceWorker.ecmascript_modules": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "147", firefox_android: "147", safari: "15", safari_ios: "15" } }, "javascript.statements.import.service_worker_support": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "147", firefox_android: "147", safari: "15", safari_ios: "15" } } }, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "147", firefox_android: "147", safari: "15", safari_ios: "15" } } }, "js-modules-shared-workers": { compat_features: ["api.SharedWorker.SharedWorker.ecmascript_modules", "api.SharedW\
orker.SharedWorker.options_type_parameter"], description: 'The SharedWorker() constructor accepts { type: "module" } to load scripts that use import and export. Also known as ECMAScript modules or ESM in shared workers.', description_html: 'The <code>SharedWorker()</code> constructor accepts <code>{ type: "module" }</code> to load scripts that use <code>import</code> and <code>export</code>. Also known as ECMAScript modules or ESM in shared workers.', group: ["js-modules", "workers"], kind: "feature", name: "JavaScript modules in shared workers", spec: ["https://html.spec.whatwg.org/multipage/workers.html#shared-workers-and-the-sharedworker-interface:dom-sharedworker-2"], status: { baseline: false, by_compat_key: { "api.SharedWorker.SharedWorker.ecmascript_modules": { baseline: false, support: { chrome: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "16", safari_ios: "16" } }, "api.SharedWorker.SharedWorker.options_type_parameter": { baseline: false, support: { chrome: "\
80", edge: "80", firefox: "114", firefox_android: "114", safari: "16", safari_ios: "16" } } }, support: { chrome: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "16", safari_ios: "16" } } }, "js-modules-workers": { compat_features: ["api.Worker.Worker.ecmascript_modules", "api.Worker.Worker.options_type_parameter", "javascript.operators.import.worker_support", "javascript.statements.import.worker_support"], description: 'The Worker() constructor accepts { type: "module" } to load scripts that use import and export. Also known as ECMAScript modules or ESM in workers.', description_html: 'The <code>Worker()</code> constructor accepts <code>{ type: "module" }</code> to load scripts that use <code>import</code> and <code>export</code>. Also known as ECMAScript modules or ESM in workers.', group: ["js-modules", "workers"], kind: "feature", name: "JavaScript modules in workers", spec: ["https://html.spec.whatwg.org/multipage/workers.html#dom-worker-dev"], status: { baseline: "\
high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", by_compat_key: { "api.Worker.Worker.ecmascript_modules": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "15", safari_ios: "15" } }, "api.Worker.Worker.options_type_parameter": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "15", safari_ios: "15" } }, "javascript.operators.import.worker_support": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "15", safari_ios: "15" } }, "javascript.statements.import.worker_support": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "\
2023-06-06", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "15", safari_ios: "15" } } }, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "114", firefox_android: "114", safari: "15", safari_ios: "15" } } }, json: { compat_features: ["javascript.builtins.JSON", "javascript.builtins.JSON.json_superset", "javascript.builtins.JSON.parse", "javascript.builtins.JSON.stringify", "javascript.builtins.JSON.stringify.well_formed_stringify"], description: "The JSON API provides static methods for parsing values from and converting values to JavaScript Object Notation (JSON), a serialization format for objects, arrays, numbers, strings, Boolean values, and null.", description_html: "The <code>JSON</code> API provides static methods for parsing values from and converting values to JavaScript Object Notation (JSON), a serialization format for objects, arrays, numbers, strings, Boolean values, and null.", group: ["json"],
    kind: "feature", name: "JSON", spec: ["https://tc39.es/ecma262/multipage/structured-data.html#sec-json-object"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.JSON": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "4" } }, "javascript.builtins.JSON.json_superset": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "62", firefox_android: "62", safari: "12", safari_ios: "12" } }, "javascript.builtins.JSON.parse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "4" } }, "javascript.b\
uiltins.JSON.stringify": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "4" } }, "javascript.builtins.JSON.stringify.well_formed_stringify": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "4" } } }, "json-modules": { compat_features: ["javascript.grammar.trailing_commas.trailing_commas_in_dynamic_import", "javascript.statements.import.import_attributes.type_json"], description: 'Module import … with { type: "json" } statements load JSON data. Also known as JSON module scripts.', description_html: 'Module <code>import … with { type:\
 "json" }</code> statements load JSON data. Also known as JSON module scripts.', group: ["json"], kind: "feature", name: "JSON import attributes", spec: ["https://html.spec.whatwg.org/multipage/webappapis.html#json-module-script"], status: { baseline: "low", baseline_low_date: "2025-04-29", by_compat_key: { "javascript.grammar.trailing_commas.trailing_commas_in_dynamic_import": { baseline: "low", baseline_low_date: "2025-04-29", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "138", firefox_android: "138", safari: "15", safari_ios: "15" } }, "javascript.statements.import.import_attributes.type_json": { baseline: "low", baseline_low_date: "2025-04-29", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "138", firefox_android: "138", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "138", firefox_android: "138", safari: "17.2", safari_ios: "17.2" } } }, "json-raw": { compat_features: [
    "javascript.builtins.JSON.isRawJSON", "javascript.builtins.JSON.parse.reviver_parameter_context_argument", "javascript.builtins.JSON.rawJSON"], description: "To serialize and parse JSON in a lossless way, JSON.stringify() handles rawJSON values and JSON.parse()'s reviver callback takes a source context parameter.", description_html: "To serialize and parse JSON in a lossless way, <code>JSON.stringify()</code> handles <code>rawJSON</code> values and <code>JSON.parse()</code>'s reviver callback takes a source context parameter.", group: ["json"], kind: "feature", name: "JSON source text access", spec: ["https://tc39.es/proposal-json-parse-with-source/#sec-json-object"], status: { baseline: "low", baseline_low_date: "2025-03-31", by_compat_key: { "javascript.builtins.JSON.isRawJSON": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "135", firefox_android: "135", safari: "18.4", safari_ios: "18.4" } }, "javascrip\
t.builtins.JSON.parse.reviver_parameter_context_argument": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "135", firefox_android: "135", safari: "18.4", safari_ios: "18.4" } }, "javascript.builtins.JSON.rawJSON": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "135", firefox_android: "135", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "135", firefox_android: "135", safari: "18.4", safari_ios: "18.4" } } }, "justify-self-block": { compat_features: ["css.properties.justify-items.block_context", "css.properties.justify-self.block_context"], description: "The justify-self CSS property aligns an item along a container's inline axis in block layouts, like it does in grid layouts. Likewise, the justify-items property sets a default justify-self value for all items in a containe\
r in a block layout.", description_html: "The <code>justify-self</code> CSS property aligns an item along a container's inline axis in block layouts, like it does in grid layouts. Likewise, the <code>justify-items</code> property sets a default <code>justify-self</code> value for all items in a container in a block layout.", group: ["layout"], kind: "feature", name: "justify-self in block layouts", spec: ["https://drafts.csswg.org/css-align-3/#justify-block"], status: { baseline: false, by_compat_key: { "css.properties.justify-items.block_context": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } }, "css.properties.justify-self.block_context": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130" } } }, support: { chrome: "130", chrome_android: "130", edge: "130" } } }, kbd: { compat_features: ["html.elements.kbd"], description: "The <kbd> element represents textual user input, such as keyboard or voice input, styling text in m\
onospaced type by default.", description_html: "The <code>&#x3C;kbd></code> element represents textual user input, such as keyboard or voice input, styling text in monospaced type by default.", group: ["html-elements"], kind: "feature", name: "<kbd>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-kbd-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.kbd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "keyboard-events": { compat_features: ["api.Element.keydown_event", "api.Element.keyup_event", "api.KeyboardEvent", "api.KeyboardEvent.KeyboardEvent", "api.Keyb\
oardEvent.altKey", "api.KeyboardEvent.code", "api.KeyboardEvent.ctrlKey", "api.KeyboardEvent.getModifierState", "api.KeyboardEvent.getModifierState.key_parameter_alt", "api.KeyboardEvent.getModifierState.key_parameter_altgraph", "api.KeyboardEvent.getModifierState.key_parameter_capslock", "api.KeyboardEvent.getModifierState.key_parameter_control", "api.KeyboardEvent.getModifierState.key_parameter_fn", "api.KeyboardEvent.getModifierState.key_parameter_meta", "api.KeyboardEvent.getModifierState.key_parameter_numlock", "api.KeyboardEvent.getModifierState.key_parameter_scrolllock", "api.KeyboardEvent.getModifierState.key_parameter_shift", "api.KeyboardEvent.getModifierState.key_parameter_symbol", "api.KeyboardEvent.isComposing", "api.KeyboardEvent.key", "api.KeyboardEvent.key.dead_key", "api.KeyboardEvent.key.non_printable_keys", "api.KeyboardEvent.key.printable_key", "api.KeyboardEvent.location", "api.KeyboardEvent.metaKey", "api.KeyboardEvent.repeat", "api.KeyboardEvent.shiftKey"], description: "\
The keydown and keyup events fire for each key press (or, with modifier keys, a combination of key presses) on a keyboard.", description_html: "The <code>keydown</code> and <code>keyup</code> events fire for each key press (or, with modifier keys, a combination of key presses) on a keyboard.", kind: "feature", name: "Keyboard events", spec: ["https://w3c.github.io/uievents/#events-keyboardevents"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Element.keydown_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1.2", safari_ios: "1" } }, "api.Element.keyup_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1.2", safari_ios: "1" } },
    "api.KeyboardEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.KeyboardEvent.KeyboardEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.KeyboardEvent.altKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.KeyboardEvent.code": { baseline: false, support: { chrome: "48", edge: "79", firefox: "38", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.ctrlKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.KeyboardEvent.getModifierState": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getModifierState.key_parameter_alt": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getModifierState.key_parameter_altgraph": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getModifierState.key_paramete\
r_capslock": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getModifierState.key_parameter_control": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getModifierState.key_parameter_fn": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "15", firefox_android: "15" } }, "api.KeyboardEvent.getModifierState.key_parameter_meta": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getM\
odifierState.key_parameter_numlock": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "15", firefox_android: "15" } }, "api.KeyboardEvent.getModifierState.key_parameter_scrolllock": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "15", firefox_android: "15" } }, "api.KeyboardEvent.getModifierState.key_parameter_shift": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "15", firefox_android: "15", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.getModifierState.key_parameter_symbol": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79" } }, "api.KeyboardEvent.isComposing": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "31", firefox_android: "31", safari: "10.1", safari_ios: "\
10.3" } }, "api.KeyboardEvent.key": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "23", firefox_android: "23", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.key.dead_key": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "37", firefox_android: "37", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.key.non_printable_keys": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "23", firefox_android: "23", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.key.printable_key": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "29", firefox_android: "\
29", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.location": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "15", firefox_android: "15", safari: "8", safari_ios: "8" } }, "api.KeyboardEvent.metaKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.KeyboardEvent.repeat": { baseline: "low", baseline_low_date: "2025-05-27", support: { chrome: "137", chrome_android: "137", edge: "12", firefox: "28", firefox_android: "28", safari: "10.1", safari_ios: "10.3" } }, "api.KeyboardEvent.shiftKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "\
1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1.2", safari_ios: "1" } } }, "keyboard-lock": { compat_features: ["api.Keyboard", "api.Keyboard.lock", "api.Keyboard.unlock", "api.Navigator.keyboard"], description: "The navigator.keyboard.lock() API allows you to capture keys that are normally reserved by the operating system. It can be used to provide an immersive fullscreen experience such as games.", description_html: "The <code>navigator.keyboard.lock()</code> API allows you to capture keys that are normally reserved by the operating system. It can be used to provide an immersive fullscreen experience such as games.", kind: "feature", name: "Keyboard lock", spec: ["https://wicg.github.io/keyboard-lock/"], status: { baseline: false, by_compat_key: { "api.Keyboard": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } }, "api.Keyboard.lock": { baseline: false, support: { chrome: "68", chrome_android: "\
68", edge: "79" } }, "api.Keyboard.unlock": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } }, "api.Navigator.keyboard": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } } }, support: { chrome: "68", chrome_android: "68", edge: "79" } } }, "keyboard-map": { compat_features: ["api.Keyboard.getLayoutMap", "api.KeyboardLayoutMap", "api.KeyboardLayoutMap.@@iterator", "api.KeyboardLayoutMap.entries", "api.KeyboardLayoutMap.forEach", "api.KeyboardLayoutMap.get", "api.KeyboardLayoutMap.has", "api.KeyboardLayoutMap.keys", "api.KeyboardLayoutMap.size", "api.KeyboardLayoutMap.values"], description: "The navigator.keyboard.getLayoutMap() API returns a map from key codes to human readable key names. It can be used to describe buttons to the user when using the keyboard as a set of buttons, such as in games.", description_html: "The <code>navigator.keyboard.getLayoutMap()</code> API returns a map from key codes to human readable key names\
. It can be used to describe buttons to the user when using the keyboard as a set of buttons, such as in games.", kind: "feature", name: "Keyboard map", spec: ["https://wicg.github.io/keyboard-map/"], status: { baseline: false, by_compat_key: { "api.Keyboard.getLayoutMap": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.@@iterator": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.entries": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.forEach": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.get": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.has": { baseline: false, support: { chrome: "69", chrome_android: "\
69", edge: "79" } }, "api.KeyboardLayoutMap.keys": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.size": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.KeyboardLayoutMap.values": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } } }, support: { chrome: "69", chrome_android: "69", edge: "79" } } }, "khr-parallel-shader-compile": { compat_features: ["api.KHR_parallel_shader_compile"], description: "The KHR_parallel_shader_compile extension for WebGL 1.0 and 2.0 contexts checks the status of shader compilation without blocking the runtime.", description_html: "The <code>KHR_parallel_shader_compile</code> extension for WebGL 1.0 and 2.0 contexts checks the status of shader compilation without blocking the runtime.", group: ["webgl-extensions"], kind: "feature", name: "KHR_parallel_shader_compile WebGL extension", spec: ["https://registry.khronos.org/webgl/extension\
s/KHR_parallel_shader_compile/"], status: { baseline: false, by_compat_key: { "api.KHR_parallel_shader_compile": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "14.1", safari_ios: "14.5" } } }, lab: { caniuse: ["css-lch-lab"], compat_features: ["css.types.color.lab", "css.types.color.lab.mixed_type_parameters", "css.types.color.lch", "css.types.color.lch.mixed_type_parameters"], description: "The CIE Lab color space expresses colors in terms of lightness and how red/green and blue/yellow a color is. LCH is a variant of Lab with polar coordinates. These color spaces can be used with the CSS color(), lab(), and lch() functions. Also known as CIELAB and CIELCH.", description_html: "The CIE Lab color space expresses colors in terms of lightness and how red/green and blue/yellow a color is. LCH is a variant of Lab with polar coordinates. These color spa\
ces can be used with the CSS <code>color()</code>, <code>lab()</code>, and <code>lch()</code> functions. Also known as CIELAB and CIELCH.", group: ["color-types"], kind: "feature", name: "Lab and LCH", spec: ["https://drafts.csswg.org/css-color-4/#cie-lab"], status: { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", by_compat_key: { "css.types.color.lab": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15", safari_ios: "15" } }, "css.types.color.lab.mixed_type_parameters": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "113", firefox_android: "113", safari: "16.2", safari_ios: "16.2" } }, "css.types.color.lch": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09",
    support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15", safari_ios: "15" } }, "css.types.color.lch.mixed_type_parameters": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "113", firefox_android: "113", safari: "16.2", safari_ios: "16.2" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15", safari_ios: "15" } } }, label: { compat_features: ["api.HTMLLabelElement", "api.HTMLLabelElement.control", "api.HTMLLabelElement.form", "api.HTMLLabelElement.htmlFor", "html.elements.label", "html.elements.label.for"], description: "The <label> HTML element represents a caption for a form field.", description_html: "The <code>&#x3C;label></code> HTML element represents a caption for a form field.", group: ["forms", "html-elements"], kind: "feature", name: "<labe\
l>", spec: ["https://html.spec.whatwg.org/multipage/forms.html#the-label-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLLabelElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLLabelElement.control": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLLabelElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLLabelElement.htmlFor": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.label.for": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, lang: { compat_features: ["css.selectors.lang", "css.selectors.lang.argument_list", "css.selectors.lang.wildcards"], description: "The :lang() CSS functional pseudo-class matches elements ba\
sed on their content language.", description_html: "The <code>:lang()</code> CSS functional pseudo-class matches elements based on their content language.", group: ["selectors"], kind: "feature", name: ":lang()", spec: ["https://drafts.csswg.org/selectors-4/#the-lang-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.lang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.lang.argument_list": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "9", safari_ios: "9" } }, "css.selectors.lang.wildcards": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "9", safari_ios: "9" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4",
    safari: "3.1", safari_ios: "2" } } }, "lang-attr": { compat_features: ["api.HTMLElement.lang", "html.global_attributes.lang"], description: "The lang global HTML attribute defines the language of an element. It's used by assistive technology to correctly read the content, translation tools to select the origin language, and other applications.", description_html: "The <code>lang</code> global HTML attribute defines the language of an element. It's used by assistive technology to correctly read the content, translation tools to select the origin language, and other applications.", kind: "feature", name: "lang", spec: ["https://html.spec.whatwg.org/multipage/dom.html#attr-lang"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLElement.lang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "html.global_attributes.lang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, language: { compat_features: ["api.Navigator.language", "api.Navigator.languages", "api.Window.languagechange_event", "api.WorkerGlobalScope.languagechange_event", "api.WorkerNavigator.language", "api.WorkerNavigator.languages"], description: "The navigator.language property is a string representing the preferred language of the user, usually the language of the browser UI. The navigator.languages property is an array of strings representing the user's preferred languages.", description_html: "The <code>navigator.language</code> property is a string representing\
 the preferred language of the user, usually the language of the browser UI. The <code>navigator.languages</code> property is an array of strings representing the user's preferred languages.", kind: "feature", name: "Language", spec: ["https://html.spec.whatwg.org/multipage/system-state.html#language-preferences"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Navigator.language": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.languages": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "37", chrome_android: "37", edge: "16", firefox: "32", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } }, "api.Window.languagechange_event": { baseline: "high", baseline_high_date: "202\
2-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "32", firefox_android: "4", safari: "10.1", safari_ios: "10.3" } }, "api.WorkerGlobalScope.languagechange_event": { baseline: false, support: { chrome: "4", chrome_android: "18", edge: "79", firefox: "74", firefox_android: "79" } }, "api.WorkerNavigator.language": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "10", safari_ios: "10" } }, "api.WorkerNavigator.languages": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "37", chrome_android: "37", edge: "16", firefox: "32", firefox_android: "32", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, languagedetector: {
    compat_features: ["api.LanguageDetector", "api.LanguageDetector.availability_static", "api.LanguageDetector.create_static", "api.LanguageDetector.destroy", "api.LanguageDetector.detect", "api.LanguageDetector.expectedInputLanguages", "api.LanguageDetector.inputQuota", "api.LanguageDetector.measureInputUsage"], description: "The LanguageDetector API identifies the likely natural language that some text is written in. You can use this API to supplement machine translation when the source source language is not known.", description_html: "The <code>LanguageDetector</code> API identifies the likely natural language that some text is written in. You can use this API to supplement machine translation when the source source language is not known.", kind: "feature", name: "Language detector", spec: ["https://webmachinelearning.github.io/translation-api/#language-detector-api"], status: { baseline: false, by_compat_key: { "api.LanguageDetector": { baseline: false, support: { chrome: "138" } },
    "api.LanguageDetector.availability_static": { baseline: false, support: { chrome: "138" } }, "api.LanguageDetector.create_static": { baseline: false, support: { chrome: "138" } }, "api.LanguageDetector.destroy": { baseline: false, support: { chrome: "138" } }, "api.LanguageDetector.detect": { baseline: false, support: { chrome: "138" } }, "api.LanguageDetector.expectedInputLanguages": { baseline: false, support: { chrome: "138" } }, "api.LanguageDetector.inputQuota": { baseline: false, support: { chrome: "138" } }, "api.LanguageDetector.measureInputUsage": { baseline: false, support: { chrome: "138" } } }, support: { chrome: "138" } } }, languagemodel: { compat_features: ["api.LanguageModel", "api.LanguageModel.append", "api.LanguageModel.availability_static", "api.LanguageModel.clone", "api.LanguageModel.contextUsage", "api.LanguageModel.contextWindow", "api.LanguageModel.create_static", "api.LanguageModel.measureContextUsage", "api.LanguageModel.prompt", "api.LanguageModel.prompt\
Streaming"], description: "The LanguageModel API prompts an on-device language model. Also known as the Prompt API.", description_html: "The <code>LanguageModel</code> API prompts an on-device language model. Also known as the Prompt API.", kind: "feature", name: "LanguageModel", spec: ["http://webmachinelearning.github.io/prompt-api/"], status: { baseline: false, by_compat_key: { "api.LanguageModel": { baseline: false, support: {} }, "api.LanguageModel.append": { baseline: false, support: {} }, "api.LanguageModel.availability_static": { baseline: false, support: {} }, "api.LanguageModel.clone": { baseline: false, support: {} }, "api.LanguageModel.contextUsage": { baseline: false, support: {} }, "api.LanguageModel.contextWindow": { baseline: false, support: {} }, "api.LanguageModel.create_static": { baseline: false, support: {} }, "api.LanguageModel.measureContextUsage": { baseline: false, support: {} }, "api.LanguageModel.prompt": { baseline: false, support: {} }, "api.LanguageModel.p\
romptStreaming": { baseline: false, support: {} } }, support: {} } }, "largest-contentful-paint": { compat_features: ["api.LargestContentfulPaint", "api.LargestContentfulPaint.element", "api.LargestContentfulPaint.id", "api.LargestContentfulPaint.loadTime", "api.LargestContentfulPaint.renderTime", "api.LargestContentfulPaint.size", "api.LargestContentfulPaint.toJSON", "api.LargestContentfulPaint.url"], description: "The largest-contentful-paint performance entry and the LargestContentfulPaint API measures  the time it takes for the largest image or text to appear. Largest contentful paint (LCP) is a common metric for perceived loading times.", description_html: "The <code>largest-contentful-paint</code> performance entry and the <code>LargestContentfulPaint</code> API measures  the time it takes for the largest image or text to appear. Largest contentful paint (LCP) is a common metric for perceived loading times.", group: ["performance"], kind: "feature", name: "Largest contentful pain\
t (LCP)", spec: ["https://w3c.github.io/largest-contentful-paint/"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "api.LargestContentfulPaint": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.element": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.id": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.loadTime": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "\
122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.renderTime": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.size": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.toJSON": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } }, "api.LargestContentfulPaint.url": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "77", chrome_android: "\
77", edge: "79", firefox: "122", firefox_android: "122", safari: "26.2", safari_ios: "26.2" } } }, "layout-direction-override": { compat_features: ["css.properties.direction", "css.properties.direction.ltr", "css.properties.direction.rtl", "css.properties.unicode-bidi", "css.properties.unicode-bidi.bidi-override", "css.properties.unicode-bidi.embed", "css.properties.unicode-bidi.isolate", "css.properties.unicode-bidi.isolate-override", "css.properties.unicode-bidi.normal", "css.properties.unicode-bidi.plaintext"], description: "The unicode-bidi and direction CSS properties override the Unicode layout algorithm. They are intended for Document Type Definition (DTD) designers. For HTML documents, you should use the dir global HTML attribute and <bdo> HTML element instead.", description_html: "The <code>unicode-bidi</code> and <code>direction</code> CSS properties override the Unicode layout algorithm. They are intended for Document Type Definition (DTD) designers. For HTML documents, you \
should use the <code>dir</code> global HTML attribute and <code>&#x3C;bdo></code> HTML element instead.", group: ["css"], kind: "feature", name: "Layout direction override", spec: ["https://drafts.csswg.org/css-writing-modes-4/#direction", "https://drafts.csswg.org/css-writing-modes-4/#unicode-bidi"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.direction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.direction.ltr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.direction.rtl": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.unicode-bidi": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.unicode-bidi.bidi-override": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.unicode-bidi.embed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.unicode-bidi.isolate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "css.properties.unicode-bidi.isolate-override": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "css.properties.unicode-bidi.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.unicode-bidi.plaintext": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } } }, support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "\
50", firefox_android: "50", safari: "11", safari_ios: "11" } } }, "layout-instability": { compat_features: ["api.LayoutShift", "api.LayoutShift.hadRecentInput", "api.LayoutShift.lastInputTime", "api.LayoutShift.sources", "api.LayoutShift.toJSON", "api.LayoutShift.value", "api.LayoutShiftAttribution", "api.LayoutShiftAttribution.currentRect", "api.LayoutShiftAttribution.node", "api.LayoutShiftAttribution.previousRect", "api.LayoutShiftAttribution.toJSON"], description: "The layout-shift performance entry and LayoutShift API measures the layout stability of web pages based on movements of the elements on the page. They're used to calculate Cumulative Layout Shift (CLS), a common metric for perceived stability.", description_html: "The <code>layout-shift</code> performance entry and <code>LayoutShift</code> API measures the layout stability of web pages based on movements of the elements on the page. They're used to calculate Cumulative Layout Shift (CLS), a common metric for perceived st\
ability.", group: ["performance"], kind: "feature", name: "Layout instability", spec: ["https://wicg.github.io/layout-instability/"], status: { baseline: false, by_compat_key: { "api.LayoutShift": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.LayoutShift.hadRecentInput": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.LayoutShift.lastInputTime": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.LayoutShift.sources": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.LayoutShift.toJSON": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.LayoutShift.value": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79" } }, "api.LayoutShiftAttribution": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.LayoutShiftAttribution.currentRect": { baseline: false,
    support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.LayoutShiftAttribution.node": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.LayoutShiftAttribution.previousRect": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.LayoutShiftAttribution.toJSON": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } } }, support: { chrome: "84", chrome_android: "84", edge: "84" } } }, "let-const": { caniuse: ["let", "const"], compat_features: ["javascript.statements.const", "javascript.statements.let"], description: "The let and const declarations define block-scoped variables.", description_html: "The <code>let</code> and <code>const</code> declarations define block-scoped variables.", group: ["javascript"], kind: "feature", name: "Let and const", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-let-\
and-const-declarations"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.statements.const": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "36", firefox_android: "36", safari: "5.1", safari_ios: "5" } }, "javascript.statements.let": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "44", firefox_android: "44", safari: "10", safari_ios: "10" } } }, support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "44", firefox_android: "44", safari: "10", safari_ios: "10" } } }, "letter-spacing": { caniuse: ["css-letter-spacing"], compat_features: ["css.properties.letter-spacing", "css.properties.letter-spacing.normal", "svg.global_attributes.letter-spacing"], description: "The letter-spacing CSS pro\
perty controls the amount of space between each letter in an element or block of text.", description_html: "The <code>letter-spacing</code> CSS property controls the amount of space between each letter in an element or block of text.", group: ["text"], kind: "feature", name: "letter-spacing", spec: ["https://drafts.csswg.org/css-text-4/#letter-spacing-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.letter-spacing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.letter-spacing.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attribu\
tes.letter-spacing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, lh: { compat_features: ["css.types.length.lh"], description: "The lh CSS length unit corresponds to the requested line height, the computed value of the line-height property. Some lines may be higher than this based on their content.", description_html: "The <code>lh</code> CSS length unit corresponds to the requested line height, the computed value of the <code>line-height</code> property. Some lines may be higher than this based on their content.", group: ["units"], kind: "feature", name: "lh unit", spec: ["https://drafts.csswg.org/css-values-4/#lh"], status: { baseline: "low", baseline_low_date: "2023-11-21", by_compat_key: {
    "css.types.length.lh": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } } }, "light-dark": { compat_features: ["css.types.color.light-dark"], description: "The light-dark() CSS function accepts two colors and uses one depending on the current color scheme.", description_html: "The <code>light-dark()</code> CSS function accepts two colors and uses one depending on the current color scheme.", group: ["css"], kind: "feature", name: "light-dark()", spec: ["https://drafts.csswg.org/css-color-5/#light-dark"], status: { baseline: "low", baseline_low_date: "2024-05-13", by_compat_key: { "css.types.color.light-dark": { baseline: "low", baseline_low_date: "2024-05-13", support: { chrome: "123", chrome_android: "\
123", edge: "123", firefox: "120", firefox_android: "120", safari: "17.5", safari_ios: "17.5" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "120", firefox_android: "120", safari: "17.5", safari_ios: "17.5" } } }, "light-dark-image": { compat_features: ["css.types.color.light-dark.image_value"], description: "The light-dark() CSS function accepts, in addition to colors, two <image> values, such as a gradient or URL, and uses one depending on the current color scheme.", description_html: "The <code>light-dark()</code> CSS function accepts, in addition to colors, two <code>&#x3C;image></code> values, such as a gradient or URL, and uses one depending on the current color scheme.", kind: "feature", name: "light-dark() image values", spec: ["https://drafts.csswg.org/css-color-5/#typedef-light-dark-image"], status: { baseline: false, by_compat_key: { "css.types.color.light-dark.image_value": { baseline: false, support: { firefox: "150", firefox_android: "150" } } },
    support: { firefox: "150", firefox_android: "150" } } }, "line-break": { compat_features: ["css.properties.line-break", "css.properties.line-break.anywhere", "css.properties.line-break.auto", "css.properties.line-break.loose", "css.properties.line-break.normal", "css.properties.line-break.strict"], description: "The line-break CSS property sets how strictly to apply rules for wrapping text to new lines, especially for symbols and punctuation.", description_html: "The <code>line-break</code> CSS property sets how strictly to apply rules for wrapping text to new lines, especially for symbols and punctuation.", group: ["text-wrap"], kind: "feature", name: "line-break", spec: ["https://drafts.csswg.org/css-text-4/#line-break-property"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "css.properties.line-break": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "58", chrome_android: "\
58", edge: "14", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "css.properties.line-break.anywhere": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "69", firefox_android: "79", safari: "13", safari_ios: "13" } }, "css.properties.line-break.auto": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "css.properties.line-break.loose": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "css.properties.line-break.normal": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "\
58", chrome_android: "58", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } }, "css.properties.line-break.strict": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "69", firefox_android: "79", safari: "11", safari_ios: "11" } } }, support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "69", firefox_android: "79", safari: "13", safari_ios: "13" } } }, "line-clamp": { caniuse: ["css-line-clamp"], compat_features: ["css.properties.line-clamp", "css.properties.line-clamp.none"], description: "The line-clamp CSS property limits the text in a block container to a certain number of lines. The prefixed -webkit-line-clamp is widely supported but only works with -webkit-box-orient: vertical in combination with display: -webkit-box or display: -webkit-inline-box.", description_html: "The <code>line-clamp</code> CSS property limits the text in a b\
lock container to a certain number of lines. The prefixed <code>-webkit-line-clamp</code> is widely supported but only works with <code>-webkit-box-orient: vertical</code> in combination with <code>display: -webkit-box</code> or <code>display: -webkit-inline-box</code>.", group: ["css"], kind: "feature", name: "line-clamp", spec: ["https://drafts.csswg.org/css-overflow-4/#line-clamp"], status: { baseline: false, by_compat_key: { "css.properties.line-clamp": { baseline: false, support: {} }, "css.properties.line-clamp.none": { baseline: false, support: {} } }, support: {} } }, "line-height": { compat_features: ["css.properties.line-height", "css.properties.line-height.normal"], description: "The line-height CSS property sets the spacing between text baselines, oriented to the horizontal or vertical writing mode.", description_html: "The <code>line-height</code> CSS property sets the spacing between text baselines, oriented to the horizontal or vertical writing mode.", group: ["text"], kind: "\
feature", name: "line-height", spec: ["https://drafts.csswg.org/css-inline-3/#line-height-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.line-height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.line-height.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "linear-easing": { compat_features: ["css.types.easing-function.linear-function"], description: "The linear() easing function for animations and transitions \
interpolates linearly between the control points, and can be used to approximate complex easing functions, such as a bounce effect.", description_html: "The <code>linear()</code> easing function for animations and transitions interpolates linearly between the control points, and can be used to approximate complex easing functions, such as a bounce effect.", group: ["css"], kind: "feature", name: "linear() easing", spec: ["https://drafts.csswg.org/css-easing-2/#the-linear-easing-function"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "css.types.easing-function.linear-function": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "112", firefox_android: "112", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "112", firefox_android: "112", safari: "17.2", safari_ios: "17.2" } } }, link: { compat_features: ["api.HTMLLinkElem\
ent", "api.HTMLLinkElement.as", "api.HTMLLinkElement.crossOrigin", "api.HTMLLinkElement.disabled", "api.HTMLLinkElement.href", "api.HTMLLinkElement.hreflang", "api.HTMLLinkElement.media", "api.HTMLLinkElement.rel", "api.HTMLLinkElement.relList", "api.HTMLLinkElement.sizes", "api.HTMLLinkElement.type", "html.elements.link", "html.elements.link.as", "html.elements.link.crossorigin", "html.elements.link.disabled", "html.elements.link.href", "html.elements.link.hreflang", "html.elements.link.media", "html.elements.link.rel", "html.elements.link.sizes", "html.elements.link.type"], description: "The <link> element creates a relationship between the current document and an external resource, such as a stylesheet or favicon.", description_html: "The <code>&#x3C;link></code> element creates a relationship between the current document and an external resource, such as a stylesheet or favicon.", group: ["html-elements"], kind: "feature", name: "<link>", spec: ["https://html.spec.whatwg.org/multip\
age/semantics.html#the-link-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLLinkElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLinkElement.as": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "56", firefox_android: "56", safari: "10", safari_ios: "10" } }, "api.HTMLLinkElement.crossOrigin": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "34", chrome_android: "34", edge: "17", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "api.HTMLLinkElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015\
-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLinkElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLinkElement.hreflang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLinkElement.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLinkElement.rel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLinkElement.relList": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "30", firefox_android: "30", safari: "9", safari_ios: "9" } }, "api.HTMLLinkElement.sizes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "15", chrome_android: "18", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLLinkElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.link": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.link.as": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "56", firefox_android: "56", safari: "10", safari_ios: "10" } }, "html.elements.link.crossorigin": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "34", chrome_android: "34", edge: "17", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "html.elements.link.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.link.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.link.hreflang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.link.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.link.rel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.link.sizes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "15", chrome_android: "\
18", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "html.elements.link.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "link-rel-dns-prefetch": { caniuse: ["link-rel-dns-prefetch"], compat_features: ["html.elements.link.rel.dns-prefetch"], description: `The rel="dns-prefetch" attribute for the <link> HTML element is a hint to the browser that the page or user is likely to request resources from another domain, so the browser should preemptively resolve DNS for the href value's domain.`, description_html: `The <code>rel="dns-prefetch"</code> attribute for the <code>&#x3C;link></code> HTML element is a hint to the browser that the pag\
e or user is likely to request resources from another domain, so the browser should preemptively resolve DNS for the <code>href</code> value's domain.`, group: ["resource-hints"], kind: "feature", name: '<link rel="dns-prefetch">', spec: ["https://html.spec.whatwg.org/multipage/links.html#link-type-dns-prefetch"], status: { baseline: "low", baseline_low_date: "2025-09-15", by_compat_key: { "html.elements.link.rel.dns-prefetch": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "127", firefox_android: "127", safari: "5", safari_ios: "26" } } }, support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "127", firefox_android: "127", safari: "5", safari_ios: "26" } } }, "link-rel-expect": { compat_features: ["html.elements.link.rel.expect"], description: 'The rel="expect" attribute for the <link> HTML element is a hint to the browser to block rendering until the element that the href value references is connec\
ted to the document and fully parsed.', description_html: 'The <code>rel="expect"</code> attribute for the <code>&#x3C;link></code> HTML element is a hint to the browser to block rendering until the element that the <code>href</code> value references is connected to the document and fully parsed.', kind: "feature", name: '<link rel="expect">', spec: ["https://html.spec.whatwg.org/multipage/links.html#link-type-expect"], status: { baseline: false, by_compat_key: { "html.elements.link.rel.expect": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } } }, support: { chrome: "124", chrome_android: "124", edge: "124" } } }, "link-rel-preconnect": { compat_features: ["html.elements.link.rel.preconnect"], description: `The rel="preconnect" attribute for the <link> HTML element is a hint to the browser that the page or user is likely to request resources from another origin, so the browser should preemptively start a connection to the href value's origin.`, description_html: `\
The <code>rel="preconnect"</code> attribute for the <code>&#x3C;link></code> HTML element is a hint to the browser that the page or user is likely to request resources from another origin, so the browser should preemptively start a connection to the <code>href</code> value's origin.`, group: ["resource-hints"], kind: "feature", name: '<link rel="preconnect">', spec: ["https://html.spec.whatwg.org/multipage/links.html#link-type-preconnect"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "html.elements.link.rel.preconnect": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } } }, "link-rel-prefetch": { caniuse: ["link-re\
l-prefetch"], compat_features: ["api.PerformanceResourceTiming.deliveryType.navigational-prefetch", "html.elements.link.rel.prefetch", "http.headers.Sec-Purpose", "http.headers.Sec-Purpose.prefetch"], description: 'The rel="prefetch" attribute for the <link> HTML element is a hint to the browser that the user is likely to navigate to a resource, so the browser should preemptively fetch and cache the resource.', description_html: 'The <code>rel="prefetch"</code> attribute for the <code>&#x3C;link></code> HTML element is a hint to the browser that the user is likely to navigate to a resource, so the browser should preemptively fetch and cache the resource.', group: ["resource-hints"], kind: "feature", name: '<link rel="prefetch">', spec: ["https://html.spec.whatwg.org/multipage/links.html#link-type-prefetch"], status: { baseline: false, by_compat_key: { "api.PerformanceResourceTiming.deliveryType.navigational-prefetch": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "\
117" } }, "html.elements.link.rel.prefetch": { baseline: false, support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4" } }, "http.headers.Sec-Purpose": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "115", firefox_android: "115" } }, "http.headers.Sec-Purpose.prefetch": { baseline: false, support: { firefox: "115", firefox_android: "115" } } }, support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4" } } }, "link-rel-preload": { caniuse: ["link-rel-preload"], compat_features: ["html.elements.link.rel.preload", "html.elements.link.rel.preload.as-fetch", "html.elements.link.rel.preload.as-font", "html.elements.link.rel.preload.as-image", "html.elements.link.rel.preload.as-script", "html.elements.link.rel.preload.as-style", "html.elements.link.rel.preload.as-track"], description: 'The rel="preload" attribute for the <link> HTML element requests resources, such as images or \
style sheets, that the page needs soon, so the browser may prioritize them for loading before rendering begins.', description_html: 'The <code>rel="preload"</code> attribute for the <code>&#x3C;link></code> HTML element requests resources, such as images or style sheets, that the page needs soon, so the browser may prioritize them for loading before rendering begins.', group: ["resource-hints"], kind: "feature", name: '<link rel="preload">', spec: ["https://html.spec.whatwg.org/multipage/links.html#link-type-preload"], status: { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", by_compat_key: { "html.elements.link.rel.preload": { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } }, "html.elements.link.rel.preload.as-fetch": { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "\
2021-01-26", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } }, "html.elements.link.rel.preload.as-font": { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } }, "html.elements.link.rel.preload.as-image": { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } }, "html.elements.link.rel.preload.as-script": { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } }, "html.elements.link.rel.preload.as-style": { baseline: "\
high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } }, "html.elements.link.rel.preload.as-track": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "85", firefox_android: "85", safari: "11.1", safari_ios: "11.3" } } }, "link-selectors": { caniuse: ["css-any-link"], compat_features: ["css.selectors.any-link", "css.selectors.any-link.not_match_link", "css.selectors.link", "css.selectors.link.not_match_link", "css.selectors.visited", "css.selectors.visited.not_match_link", "css.selectors.visited.privacy_measures"], description: "The :link CSS pseudo-class matches unvisited links, :visited matches visited links, and :any-link matches both.", description_html: "The <code>:link</code> CSS pseudo-class m\
atches unvisited links, <code>:visited</code> matches visited links, and <code>:any-link</code> matches both.", group: ["selectors"], kind: "feature", name: "Link selectors", spec: ["https://drafts.csswg.org/selectors-4/#location"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.any-link": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "50", firefox_android: "50", safari: "9", safari_ios: "9" } }, "css.selectors.any-link.not_match_link": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "87", firefox_android: "87", safari: "15", safari_ios: "15" } }, "css.selectors.link": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3.2" } }, "css.selectors.link.not_match_link": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "87", firefox_android: "87", safari: "15", safari_ios: "15" } }, "css.selectors.visited": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.visited.not_match_link": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "87", firefox_android: "87", safari: "15", safari_ios: "15" } }, "css.selectors.visited.privacy_measures": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "50", firefox_android: "50", safari: "9", safari_ios: "9" } } }, "list-elements": { compat_features: ["api.HTMLLIElement", "api.HTMLLIElement.value", "api.HTMLOListElement", "api.HTMLOListElement.reversed", "api.HTMLOListElement.start", "api.HTMLOListElement.type", "api.HTMLUListElement", "html.elements.li", "html.elements.li.value", "html.elements.ol", "html.elements.ol.reversed", "html.elements.ol.start", "html.elements.ol.type", "html.elements.ul"], description: "The <ol>, <ul>, and <li> HTML elements represent ordered and unordered lists.", description_html: "The <code>&#x3C;ol></code>, <code>&#x3C;ul></code>, and <code>&#x3C;li></code> HTML elements represent ordered and unordered lists.", group: ["html-elements", "lists"], kind: "feature", name: "<ol>, <ul>, and <li>", spec: ["https://html.spec.whatwg.org/multipage/grouping\
-content.html#the-ol-element", "https://html.spec.whatwg.org/multipage/grouping-content.html#the-ul-element", "https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLLIElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLLIElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLOListElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.HTMLOListElement.reversed": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "18", chrome_android: "18", edge: "79", firefox: "18", firefox_android: "18", safari: "6", safari_ios: "6" } }, "api.HTMLOListElement.start": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOListElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLUListElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.element\
s.li": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.li.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.ol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.ol.reversed": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "18", chrome_android: "18", edge: "79", firefox: "18", firefox_android: "18", safari: "6", safari_ios: "6" } }, "html.elements.ol.start": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.ol.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.ul": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "list-style": { compat_features: ["css.properties.list-style", "css.properties.list-style-image", "css.properties.list-style-image.none", "css.properties.list-\
style-position", "css.properties.list-style-position.inside", "css.properties.list-style-position.outside", "css.properties.list-style-type", "css.properties.list-style-type.arabic-indic", "css.properties.list-style-type.armenian", "css.properties.list-style-type.bengali", "css.properties.list-style-type.cambodian", "css.properties.list-style-type.circle", "css.properties.list-style-type.cjk-decimal", "css.properties.list-style-type.cjk-earthly-branch", "css.properties.list-style-type.cjk-heavenly-stem", "css.properties.list-style-type.cjk-ideographic", "css.properties.list-style-type.decimal", "css.properties.list-style-type.decimal-leading-zero", "css.properties.list-style-type.devanagari", "css.properties.list-style-type.disc", "css.properties.list-style-type.disclosure-closed", "css.properties.list-style-type.disclosure-open", "css.properties.list-style-type.ethiopic-numeric", "css.properties.list-style-type.georgian", "css.properties.list-style-type.gujarati", "css.properties.list\
-style-type.gurmukhi", "css.properties.list-style-type.hebrew", "css.properties.list-style-type.hiragana", "css.properties.list-style-type.hiragana-iroha", "css.properties.list-style-type.japanese-formal", "css.properties.list-style-type.japanese-informal", "css.properties.list-style-type.kannada", "css.properties.list-style-type.katakana", "css.properties.list-style-type.katakana-iroha", "css.properties.list-style-type.khmer", "css.properties.list-style-type.korean-hangul-formal", "css.properties.list-style-type.korean-hanja-formal", "css.properties.list-style-type.korean-hanja-informal", "css.properties.list-style-type.lao", "css.properties.list-style-type.lower-alpha", "css.properties.list-style-type.lower-armenian", "css.properties.list-style-type.lower-greek", "css.properties.list-style-type.lower-latin", "css.properties.list-style-type.lower-roman", "css.properties.list-style-type.malayalam", "css.properties.list-style-type.mongolian", "css.properties.list-style-type.myanmar", "c\
ss.properties.list-style-type.none", "css.properties.list-style-type.oriya", "css.properties.list-style-type.persian", "css.properties.list-style-type.simp-chinese-formal", "css.properties.list-style-type.simp-chinese-informal", "css.properties.list-style-type.square", "css.properties.list-style-type.string", "css.properties.list-style-type.symbols", "css.properties.list-style-type.tamil", "css.properties.list-style-type.telugu", "css.properties.list-style-type.thai", "css.properties.list-style-type.tibetan", "css.properties.list-style-type.trad-chinese-formal", "css.properties.list-style-type.trad-chinese-informal", "css.properties.list-style-type.upper-alpha", "css.properties.list-style-type.upper-armenian", "css.properties.list-style-type.upper-latin", "css.properties.list-style-type.upper-roman", "css.properties.list-style.inside", "css.properties.list-style.none", "css.properties.list-style.outside", "css.properties.list-style.symbols"], description: "The list-style shorthand CSS \
property and the list-style-image, list-style-position, and list-style-type longhand properties set the position and appearance of a list item's marker.", description_html: "The <code>list-style</code> shorthand CSS property and the <code>list-style-image</code>, <code>list-style-position</code>, and <code>list-style-type</code> longhand properties set the position and appearance of a list item's marker.", group: ["lists"], kind: "feature", name: "List style", spec: ["https://drafts.csswg.org/css-lists-3/#list-style-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.list-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2\
015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-image.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-position": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-position.inside": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-position.outside": { baseline: "high", baseline_high_date: "2018-\
01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.arabic-indic": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.armenian": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.bengali": { baseline: "hig\
h", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.cambodian": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.circle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.cjk-decimal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.propert\
ies.list-style-type.cjk-earthly-branch": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.cjk-heavenly-stem": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.cjk-ideographic": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.decimal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.decimal-leading-zero": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.devanagari": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.disc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.disclosure-closed": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "89", chrome_android: "\
89", edge: "89", firefox: "33", firefox_android: "33", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.disclosure-open": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "33", firefox_android: "33", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.ethiopic-numeric": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.georgian": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.gujarati": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.gurmukhi": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.hebrew": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.hiragana": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.hiragana-iroha": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.japanese-formal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.japanese-informal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.kannada": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-st\
yle-type.katakana": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.katakana-iroha": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.khmer": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.korean-hangul-formal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "\
15", safari_ios: "15" } }, "css.properties.list-style-type.korean-hanja-formal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.korean-hanja-informal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.lao": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.lower-alpha": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.lower-armenian": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5.1", safari_ios: "5" } }, "css.properties.list-style-type.lower-greek": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.lower-latin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.lower-roman": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.malayalam": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.mongolian": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.myanmar": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.none": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.oriya": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.persian": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.simp-chinese-formal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.\
simp-chinese-informal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.square": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.string": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "39", firefox_android: "39", safari: "14.1", safari_ios: "14.5" } }, "css.properties.list-style-type.symbols": { baseline: false, support: { firefox: "35", firefox_android: "35" } }, "css.properties.list-style-type.tamil": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09\
-20", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "33", firefox_android: "33", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.telugu": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.thai": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.tibetan": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5", safari_ios: "4.2" } }, "css.properties.list-style-type.trad-chinese-formal": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.trad-chinese-informal": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "28", firefox_android: "28", safari: "15", safari_ios: "15" } }, "css.properties.list-style-type.upper-alpha": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.upper-armenian": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "33", firefox_android: "33", safari: "5.1", safari_ios: "5" } }, "css.properties\
.list-style-type.upper-latin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style-type.upper-roman": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style.inside": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } },
    "css.properties.list-style.outside": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.list-style.symbols": { baseline: false, support: { firefox: "35", firefox_android: "35" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "loading-lazy": { caniuse: ["loading-lazy-attr"], compat_features: ["api.HTMLIFrameElement.loading", "api.HTMLImageElement.loading", "html.elements.iframe.loading", "html.elements.img.loading"], description: `The loading="lazy" attribute for <img> and <iframe> elements blocks loading the external resource until the user scrolls to that element's part of the page.`, description_html: `The <code>loading="lazy"</code> attribute for <code>&#x3C;img></code> and <code>&#x3C;iframe></code> elements blocks\
 loading the external resource until the user scrolls to that element's part of the page.`, kind: "feature", name: "Lazy-loading images and iframes", spec: ["https://html.spec.whatwg.org/multipage/urls-and-fetching.html#lazy-loading-attributes"], status: { baseline: "low", baseline_low_date: "2023-12-19", by_compat_key: { "api.HTMLIFrameElement.loading": { baseline: "low", baseline_low_date: "2023-12-19", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "121", firefox_android: "121", safari: "16.4", safari_ios: "16.4" } }, "api.HTMLImageElement.loading": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "html.elements.iframe.loading": { baseline: "low", baseline_low_date: "2023-12-19", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "121", firefox_android: "121", safari: "16.4",
    safari_ios: "16.4" } }, "html.elements.img.loading": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "121", firefox_android: "121", safari: "16.4", safari_ios: "16.4" } } }, "loading-lazy-media": { caniuse: ["loading-lazy-media"], compat_features: ["api.HTMLMediaElement.loading", "html.elements.audio.loading", "html.elements.video.loading"], description: 'The loading="lazy" attribute for <video> and <audio> elements defers loading the media resource until the element is near the viewport. This matches the lazy-loading behavior for <img> and <iframe> elements.', description_html: 'The <code>loading="lazy"</code> attribute for <code>&#x3C;video></code> and <code>&#x3C;audio></code> elements defers loading the media resource until the element \
is near the viewport. This matches the lazy-loading behavior for <code>&#x3C;img></code> and <code>&#x3C;iframe></code> elements.', group: ["media-elements"], kind: "feature", name: "Lazy-loading media", spec: ["https://github.com/whatwg/html/pull/11980"], status: { baseline: false, by_compat_key: { "api.HTMLMediaElement.loading": { baseline: false, support: {} }, "html.elements.audio.loading": { baseline: false, support: {} }, "html.elements.video.loading": { baseline: false, support: {} } }, support: {} } }, "local-fonts": { compat_features: ["api.FontData", "api.FontData.blob", "api.FontData.family", "api.FontData.fullName", "api.FontData.postscriptName", "api.FontData.style", "api.Permissions.permission_local-fonts", "api.Window.queryLocalFonts", "html.elements.iframe.allow.local-fonts", "http.headers.Permissions-Policy.local-fonts"], description: "The window.queryLocalFonts() method returns an array of locally-installed fonts, each represented by a FontData object.", description_html: "\
The <code>window.queryLocalFonts()</code> method returns an array of locally-installed fonts, each represented by a <code>FontData</code> object.", kind: "feature", name: "Local fonts", spec: ["https://wicg.github.io/local-font-access/"], status: { baseline: false, by_compat_key: { "api.FontData": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.FontData.blob": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.FontData.family": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.FontData.fullName": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.FontData.postscriptName": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.FontData.style": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.Permissions.permission_local-fonts": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.Window.queryLocalFonts": { baseline: false, support: { chrome: "103", edge: "103" } }, "html.eleme\
nts.iframe.allow.local-fonts": { baseline: false, support: { chrome: "103", edge: "103" } }, "http.headers.Permissions-Policy.local-fonts": { baseline: false, support: { chrome: "103", edge: "103" } } }, support: { chrome: "103", edge: "103" } } }, "local-network-access": { compat_features: ["api.Request.targetAddressSpace"], description: `The "local-network-access" user permission (and certain actions that imply this permission, such as a fetch() request with { targetAddressSpace: "local" }) allows a site to send requests to servers on a user's local network.`, description_html: `The <code>"local-network-access"</code> user permission (and certain actions that imply this permission, such as a <code>fetch()</code> request with <code>{ targetAddressSpace: "local" }</code>) allows a site to send requests to servers on a user's local network.`, kind: "feature", name: "Local network access", spec: ["https://wicg.github.io/local-network-access/"], status: { baseline: false, by_compat_key: {
    "api.Request.targetAddressSpace": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } } }, support: { chrome: "142", chrome_android: "142", edge: "142" } } }, localstorage: { caniuse: ["namevalue-storage"], compat_features: ["api.Storage", "api.Storage.clear", "api.Storage.getItem", "api.Storage.key", "api.Storage.length", "api.Storage.removeItem", "api.Storage.setItem", "api.StorageEvent", "api.StorageEvent.StorageEvent", "api.StorageEvent.key", "api.StorageEvent.newValue", "api.StorageEvent.oldValue", "api.StorageEvent.storageArea", "api.StorageEvent.url", "api.Window.localStorage", "api.Window.sessionStorage", "api.Window.storage_event"], description: "The localStorage and sessionStorage APIs store data as key-value pairs. While localStorage persists across sessions, sessionStorage data is discarded when the page is closed.", description_html: "The <code>localStorage</code> and <code>sessionStorage</code> APIs store data as key-value pairs. While <c\
ode>localStorage</code> persists across sessions, <code>sessionStorage</code> data is discarded when the page is closed.", group: ["storage"], kind: "feature", name: "localStorage and sessionStorage", spec: ["https://storage.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Storage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Storage.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Storage.getItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "\
3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Storage.key": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Storage.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Storage.removeItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Storage.setItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "\
4", safari_ios: "3.2" } }, "api.StorageEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "4", safari_ios: "3" } }, "api.StorageEvent.StorageEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "17", chrome_android: "18", edge: "17", firefox: "13", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.StorageEvent.key": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "4", safari_ios: "3" } }, "api.StorageEvent.newValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "4", safari_ios: "3" } },
    "api.StorageEvent.oldValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "4", safari_ios: "3" } }, "api.StorageEvent.storageArea": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "4", safari_ios: "3" } }, "api.StorageEvent.url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "5", safari_ios: "5" } }, "api.Window.localStorage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Window.se\
ssionStorage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Window.storage_event": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "15", firefox: "45", firefox_android: "45", safari: "4", safari_ios: "4" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "6", safari: "4", safari_ios: "3.2" } } }, location: { compat_features: ["api.Document.location", "api.Location", "api.Location.ancestorOrigins", "api.Location.assign", "api.Location.hash", "api.Location.host", "api.Location.hostname", "api.Location.href", "api.Location.origin", "api.Location.pathname", "api.Location.port", "api.Location.protocol", "api.Location.reload", "api.Location.replace", "api.Location.search", "api.Loca\
tion.toString", "api.Window.location"], description: "The location global object represents the current page's address. You can use it to get the parts of the address (such as location.hostname or location.pathname) or navigate to another URL.", description_html: "The <code>location</code> global object represents the current page's address. You can use it to get the parts of the address (such as <code>location.hostname</code> or <code>location.pathname</code>) or navigate to another URL.", kind: "feature", name: "Location", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-location-interface"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Document.location": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Location": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.ancestorOrigins": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "20", chrome_android: "25", edge: "79", firefox: "148", firefox_android: "148", safari: "6", safari_ios: "6" } }, "api.Location.assign": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Location.hash": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.host": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.hostname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.origin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "21", firefox_android: "21", safari: "5.1", safari_ios: "5" } }, "api.Location.pathname": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.port": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.protocol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.reload": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.replace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "api.Location.search": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Location.toString": { baseline: "high", baseline_high_date: "2019-01-27", baseline_low_date: "2016-07-27", support: { chrome: "52", chrome_android: "52", edge: "12", firefox: "22", firefox_android: "22", safari: "1", safari_ios: "1" } }, "api.Window.location": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "logical-assignments": { compat_features: ["javascript.operators.logical_and_assignment", "javascript.operators\
.logical_or_assignment"], description: "The logical AND assignment (&&=) and the logical OR assignment (||=) operators short-circuit the respective binary logical operators.", description_html: "The logical AND assignment (<code>&#x26;&#x26;=</code>) and the logical OR assignment (<code>||=</code>) operators short-circuit the respective binary logical operators.", group: ["javascript"], kind: "feature", name: "Logical assignments", spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-assignment-operators"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "javascript.operators.logical_and_assignment": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.operators.logical_or_assignment": { baseline: "high", baseline_high_date: "\
2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } } }, "logical-properties": { caniuse: ["css-logical-props"], compat_features: ["css.properties.block-size", "css.properties.block-size.fit-content", "css.properties.block-size.max-content", "css.properties.block-size.min-content", "css.properties.border-block", "css.properties.border-block-color", "css.properties.border-block-end", "css.properties.border-block-end-color", "css.properties.border-block-end-style", "css.properties.border-block-end-width", "css.properties.border-block-start", "css.properties.border-block-start-color", "css.properties.border-block-start-style", "css.properties.border-block-start-width", "css.properties.border-block-style", "css.properties.border-block-\
width", "css.properties.border-end-end-radius", "css.properties.border-end-start-radius", "css.properties.border-inline", "css.properties.border-inline-color", "css.properties.border-inline-end", "css.properties.border-inline-end-color", "css.properties.border-inline-end-style", "css.properties.border-inline-end-width", "css.properties.border-inline-start", "css.properties.border-inline-start-color", "css.properties.border-inline-start-style", "css.properties.border-inline-start-width", "css.properties.border-inline-style", "css.properties.border-inline-width", "css.properties.border-start-end-radius", "css.properties.border-start-start-radius", "css.properties.clear.inline-end", "css.properties.clear.inline-start", "css.properties.float.inline-end", "css.properties.float.inline-start", "css.properties.inline-size", "css.properties.inline-size.fit-content", "css.properties.inline-size.max-content", "css.properties.inline-size.min-content", "css.properties.inset", "css.properties.inset-\
block", "css.properties.inset-block-end", "css.properties.inset-block-end.auto", "css.properties.inset-block-start", "css.properties.inset-block-start.auto", "css.properties.inset-block.auto", "css.properties.inset-inline", "css.properties.inset-inline-end", "css.properties.inset-inline-end.auto", "css.properties.inset-inline-start", "css.properties.inset-inline-start.auto", "css.properties.inset-inline.auto", "css.properties.inset.auto", "css.properties.margin-block", "css.properties.margin-block-end", "css.properties.margin-block-start", "css.properties.margin-inline", "css.properties.margin-inline-end", "css.properties.margin-inline-start", "css.properties.max-block-size", "css.properties.max-block-size.fit-content", "css.properties.max-block-size.max-content", "css.properties.max-block-size.min-content", "css.properties.max-inline-size", "css.properties.max-inline-size.fit-content", "css.properties.max-inline-size.max-content", "css.properties.max-inline-size.min-content", "css.pro\
perties.min-block-size", "css.properties.min-block-size.fit-content", "css.properties.min-block-size.max-content", "css.properties.min-block-size.min-content", "css.properties.min-inline-size", "css.properties.min-inline-size.fit-content", "css.properties.min-inline-size.max-content", "css.properties.min-inline-size.min-content", "css.properties.overflow-block", "css.properties.overflow-block.overlay", "css.properties.overflow-inline", "css.properties.overflow-inline.overlay", "css.properties.padding-block", "css.properties.padding-block-end", "css.properties.padding-block-start", "css.properties.padding-inline", "css.properties.padding-inline-end", "css.properties.padding-inline-start"], description: "CSS logical properties control borders, size, margin, and padding with directions and dimensions relative to the writing mode. For example, in a left to right, top to bottom writing mode, block-end refers to the bottom. Also known as flow relative.", description_html: "CSS logical proper\
ties control borders, size, margin, and padding with directions and dimensions relative to the writing mode. For example, in a left to right, top to bottom writing mode, <code>block-end</code> refers to the bottom. Also known as flow relative.", group: ["css"], kind: "feature", name: "Logical properties", spec: ["https://drafts.csswg.org/css-logical-1/"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "css.properties.block-size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.block-size.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "94", firefox_android: "94", safari: "12.1", safari_ios: "12.2" } }, "css.propert\
ies.block-size.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.block-size.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-block-color": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "\
14.1", safari_ios: "14.5" } }, "css.properties.border-block-end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-end-color": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-end-style": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-end-width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "\
79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-start-color": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-start-style": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-start-width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-\
01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-block-style": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-block-width": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-end-end-radius": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "66", firefox_android: "66", safari: "15", safari_ios: "15" } }, "css.properties.border-end-start-radius": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "66", firefox_android: "66", safari: "15", safari_ios: "15" } }, "css.properties.border-inline": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-inline-color": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-inline-end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-end-color": {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-end-style": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-end-width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "\
12.2" } }, "css.properties.border-inline-start-color": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-start-style": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-start-width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.border-inline-style": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "\
66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-inline-width": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.border-start-end-radius": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "66", firefox_android: "66", safari: "15", safari_ios: "15" } }, "css.properties.border-start-start-radius": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "66", firefox_android: "66", safari: "15", safari_ios: "15" } }, "css.properties.clear.inline-end": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "11\
8", chrome_android: "118", edge: "118", firefox: "55", firefox_android: "55", safari: "15", safari_ios: "15" } }, "css.properties.clear.inline-start": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "55", firefox_android: "55", safari: "15", safari_ios: "15" } }, "css.properties.float.inline-end": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "55", firefox_android: "55", safari: "15", safari_ios: "15" } }, "css.properties.float.inline-start": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "55", firefox_android: "55", safari: "15", safari_ios: "15" } }, "css.properties.inline-size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020\
-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.inline-size.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "94", firefox_android: "94", safari: "12.1", safari_ios: "12.2" } }, "css.properties.inline-size.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.inline-size.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.inset": { baseline: "high", baseline_high_date: "\
2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-block": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-block-end": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-block-end.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-block-start": { baseline: "\
high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-block-start.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-block.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-inline": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.prope\
rties.inset-inline-end": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-inline-end.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-inline-start": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset-inline-start.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "\
14.1", safari_ios: "14.5" } }, "css.properties.inset-inline.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "63", firefox_android: "63", safari: "14.1", safari_ios: "14.5" } }, "css.properties.inset.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.margin-block": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.margin-block-end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "\
41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.margin-block-start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.margin-inline": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.margin-inline-end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.margin-inline-start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "\
79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-block-size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-block-size.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "94", firefox_android: "94", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-block-size.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-block-size.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "202\
0-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-inline-size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-inline-size.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "94", firefox_android: "94", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-inline-size.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.max-inline-size.min-content": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-block-size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-block-size.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "94", firefox_android: "94", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-block-size.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } },
    "css.properties.min-block-size.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-inline-size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-inline-size.fit-content": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "94", firefox_android: "94", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-inline-size.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "\
66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.min-inline-size.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "css.properties.overflow-block": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "69", firefox_android: "79", safari: "26", safari_ios: "26" } }, "css.properties.overflow-block.overlay": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "112", firefox_android: "112" } }, "css.properties.overflow-inline": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "69", firefox_android: "79", safari: "26", safari_ios: "26" } }, "css.properties.overflow-inline.overlay": { baseline: false,
    support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "112", firefox_android: "112" } }, "css.properties.padding-block": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.padding-block-end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.padding-block-start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.padding-inline": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-\
04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "css.properties.padding-inline-end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } }, "css.properties.padding-inline-start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "41", firefox_android: "41", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "66", firefox_android: "66", safari: "15", safari_ios: "15" } } }, "long-animation-frames": { compat_features: ["api.PerformanceLongAnimationFrameTiming", "api.PerformanceLongAnimationFrameTiming.blockingDuration", "api.PerformanceLongAnimationFrameTiming.first\
UIEventTimestamp", "api.PerformanceLongAnimationFrameTiming.renderStart", "api.PerformanceLongAnimationFrameTiming.scripts", "api.PerformanceLongAnimationFrameTiming.styleAndLayoutStart", "api.PerformanceLongAnimationFrameTiming.toJSON", "api.PerformanceScriptTiming", "api.PerformanceScriptTiming.executionStart", "api.PerformanceScriptTiming.forcedStyleAndLayoutDuration", "api.PerformanceScriptTiming.invoker", "api.PerformanceScriptTiming.invokerType", "api.PerformanceScriptTiming.pauseDuration", "api.PerformanceScriptTiming.sourceCharPosition", "api.PerformanceScriptTiming.sourceFunctionName", "api.PerformanceScriptTiming.sourceURL", "api.PerformanceScriptTiming.toJSON", "api.PerformanceScriptTiming.window", "api.PerformanceScriptTiming.windowAttribution"], description: "The long-animation-frame performance event type and the PerformanceLongAnimationFrameTiming API provide information about rendering updates that take longer than 50 milliseconds. Also known as LoAFs.", description_html: "\
The <code>long-animation-frame</code> performance event type and the <code>PerformanceLongAnimationFrameTiming</code> API provide information about rendering updates that take longer than 50 milliseconds. Also known as LoAFs.", group: ["performance"], kind: "feature", name: "Long animation frames", spec: ["https://w3c.github.io/long-animation-frames/"], status: { baseline: false, by_compat_key: { "api.PerformanceLongAnimationFrameTiming": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceLongAnimationFrameTiming.blockingDuration": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceLongAnimationFrameTiming.firstUIEventTimestamp": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceLongAnimationFrameTiming.renderStart": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceLongAnimationFrameTim\
ing.scripts": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceLongAnimationFrameTiming.styleAndLayoutStart": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceLongAnimationFrameTiming.toJSON": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.executionStart": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.forcedStyleAndLayoutDuration": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.invoker": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.invokerType": { baseline: false, support: { chrome: "123", chrome_android: "\
123", edge: "123" } }, "api.PerformanceScriptTiming.pauseDuration": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.sourceCharPosition": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.sourceFunctionName": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.sourceURL": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.toJSON": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.window": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "api.PerformanceScriptTiming.windowAttribution": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } } }, support: { chrome: "123", chrome_android: "123", edge: "123" } } }, longtasks: {
    compat_features: ["api.PerformanceLongTaskTiming", "api.PerformanceLongTaskTiming.attribution", "api.PerformanceLongTaskTiming.toJSON", "api.TaskAttributionTiming", "api.TaskAttributionTiming.containerId", "api.TaskAttributionTiming.containerName", "api.TaskAttributionTiming.containerSrc", "api.TaskAttributionTiming.containerType", "api.TaskAttributionTiming.toJSON"], description: 'The longtask performance event type and the PerformanceLongTaskTiming API provides information about tasks that occupy the UI thread for 50 milliseconds or more, a metric for input latency, delayed animations, and other sources of "jank."', description_html: 'The <code>longtask</code> performance event type and the <code>PerformanceLongTaskTiming</code> API provides information about tasks that occupy the UI thread for 50 milliseconds or more, a metric for input latency, delayed animations, and other sources of "jank."', group: ["performance"], kind: "feature", name: "Long tasks", spec: ["https://w3c.git\
hub.io/longtasks/"], status: { baseline: false, by_compat_key: { "api.PerformanceLongTaskTiming": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.PerformanceLongTaskTiming.attribution": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.PerformanceLongTaskTiming.toJSON": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.TaskAttributionTiming": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.TaskAttributionTiming.containerId": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.TaskAttributionTiming.containerName": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.TaskAttributionTiming.containerSrc": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.TaskAttributionTiming.containerType": { baseline: false, support: { chrome: "58", chrome_android: "\
58", edge: "79" } }, "api.TaskAttributionTiming.toJSON": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } } }, support: { chrome: "58", chrome_android: "58", edge: "79" } } }, magnetometer: { compat_features: ["api.Magnetometer", "api.Magnetometer.Magnetometer", "api.Magnetometer.x", "api.Magnetometer.y", "api.Magnetometer.z", "api.Permissions.permission_magnetometer", "html.elements.iframe.allow.magnetometer", "http.headers.Permissions-Policy.magnetometer"], description: "The Magnetometer API reads magnetic field sensor data from the device's magnetometer.", description_html: "The <code>Magnetometer</code> API reads magnetic field sensor data from the device's magnetometer.", group: ["sensors"], kind: "feature", name: "Magnetometer", spec: ["https://w3c.github.io/magnetometer/"], status: { baseline: false, by_compat_key: { "api.Magnetometer": { baseline: false, support: {} }, "api.Magnetometer.Magnetometer": { baseline: false, support: {} }, "api.Magnetom\
eter.x": { baseline: false, support: {} }, "api.Magnetometer.y": { baseline: false, support: {} }, "api.Magnetometer.z": { baseline: false, support: {} }, "api.Permissions.permission_magnetometer": { baseline: false, support: {} }, "html.elements.iframe.allow.magnetometer": { baseline: false, support: {} }, "http.headers.Permissions-Policy.magnetometer": { baseline: false, support: {} } }, support: {} } }, main: { compat_features: ["html.elements.main"], description: "The <main> element represents the dominant content of a document. It is commonly used together with <header> and <footer>.", description_html: "The <code>&#x3C;main></code> element represents the dominant content of a document. It is commonly used together with <code>&#x3C;header></code> and <code>&#x3C;footer></code>.", group: ["landmark-elements"], kind: "feature", name: "<main>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-main-element"], status: { baseline: "high", baseline_high_date: "201\
8-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.main": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "21", firefox_android: "21", safari: "7", safari_ios: "7" } } }, support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "21", firefox_android: "21", safari: "7", safari_ios: "7" } } }, "managed-media-source": { compat_features: ["api.ManagedMediaSource", "api.ManagedMediaSource.ManagedMediaSource", "api.ManagedMediaSource.endstreaming_event", "api.ManagedMediaSource.startstreaming_event", "api.ManagedMediaSource.streaming", "api.ManagedSourceBuffer", "api.ManagedSourceBuffer.bufferedchange_event"], description: "The ManagedMediaSource API is a MediaSource where the browser manages the memory of source buffers and may evict data if needed.", description_html: "The <code>ManagedMediaSource</code> API is a <code>MediaSource</code> where the br\
owser manages the memory of source buffers and may evict data if needed.", kind: "feature", name: "Managed media source", spec: ["https://w3c.github.io/media-source/#managedmediasource-interface"], status: { baseline: false, by_compat_key: { "api.ManagedMediaSource": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.ManagedMediaSource.ManagedMediaSource": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.ManagedMediaSource.endstreaming_event": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.ManagedMediaSource.startstreaming_event": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.ManagedMediaSource.streaming": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.ManagedSourceBuffer": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.ManagedSourceBuffer.bufferedchange_event": { baseline: false, support: { safari: "17", safari_ios: "17.1" } } }, support: {
    safari: "17", safari_ios: "17.1" } } }, manifest: { compat_features: ["html.elements.link.rel.manifest", "manifests.webapp.background_color", "manifests.webapp.description", "manifests.webapp.display", "manifests.webapp.icons", "manifests.webapp.id", "manifests.webapp.name", "manifests.webapp.orientation", "manifests.webapp.scope", "manifests.webapp.serviceworker", "manifests.webapp.serviceworker.scope", "manifests.webapp.serviceworker.src", "manifests.webapp.serviceworker.use_cache", "manifests.webapp.short_name", "manifests.webapp.start_url", "manifests.webapp.theme_color"], description: "A web app manifest file provides metadata about the site. The browser can use the metadata to install the site as a standalone application on the user's device. The metadata usually includes the app's name, icon, description, and ways in which the app wishes to integrate with the device.", description_html: "A web app manifest file provides metadata about the site. The browser can use the metada\
ta to install the site as a standalone application on the user's device. The metadata usually includes the app's name, icon, description, and ways in which the app wishes to integrate with the device.", group: ["progressive-web-app"], kind: "feature", name: "Web app manifest", spec: ["https://w3c.github.io/manifest/"], status: { baseline: false, by_compat_key: { "html.elements.link.rel.manifest": { baseline: false, support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "58", safari: "17", safari_ios: "11.3" } }, "manifests.webapp.background_color": { baseline: false, support: { chrome: "46", chrome_android: "46", edge: "79", firefox_android: "79" } }, "manifests.webapp.description": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } }, "manifests.webapp.display": { baseline: false, support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "47", safari: "17", safari_ios: "11.3" } }, "manifests.webapp.icons": { baseline: false,
    support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "79", safari: "17", safari_ios: "15.4" } }, "manifests.webapp.id": { baseline: false, support: { chrome: "96", chrome_android: "96", edge: "96", safari: "17", safari_ios: "16.4" } }, "manifests.webapp.name": { baseline: false, support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "79", safari: "17", safari_ios: "11.3" } }, "manifests.webapp.orientation": { baseline: false, support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "79" } }, "manifests.webapp.scope": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "79", firefox_android: "79", safari: "17", safari_ios: "11.3" } }, "manifests.webapp.serviceworker": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "manifests.webapp.serviceworker.scope": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "manifests.webapp.serviceworker.s\
rc": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "manifests.webapp.serviceworker.use_cache": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "manifests.webapp.short_name": { baseline: false, support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "79", safari: "17", safari_ios: "11.3" } }, "manifests.webapp.start_url": { baseline: false, support: { chrome: "39", chrome_android: "39", edge: "79", firefox_android: "79", safari: "17", safari_ios: "11.3" } }, "manifests.webapp.theme_color": { baseline: false, support: { chrome: "46", chrome_android: "46", edge: "79", firefox_android: "79", safari: "17", safari_ios: "15" } } }, support: { chrome: "53", chrome_android: "53", edge: "79", firefox_android: "79", safari: "17", safari_ios: "15.4" } } }, "manifest-localization": { description: "The _localized suffixed members of the web app manifest set translated names, descriptions, icons, and shortcuts. \
The browser automatically selects resources based on the user's language and region settings.", description_html: "The <code>_localized</code> suffixed members of the web app manifest set translated names, descriptions, icons, and shortcuts. The browser automatically selects resources based on the user's language and region settings.", group: ["progressive-web-app"], kind: "feature", name: "Web app manifest localization", spec: ["https://w3c.github.io/manifest/#localized-members"], status: { baseline: false, support: {} } }, map: { compat_features: ["javascript.builtins.Map", "javascript.builtins.Map.@@iterator", "javascript.builtins.Map.@@species", "javascript.builtins.Map.Map", "javascript.builtins.Map.Map.iterable_allowed", "javascript.builtins.Map.Map.null_allowed", "javascript.builtins.Map.clear", "javascript.builtins.Map.delete", "javascript.builtins.Map.entries", "javascript.builtins.Map.forEach", "javascript.builtins.Map.get", "javascript.builtins.Map.has", "javascript.builtins\
.Map.key_equality_for_zeros", "javascript.builtins.Map.keys", "javascript.builtins.Map.set", "javascript.builtins.Map.size", "javascript.builtins.Map.values"], description: "Map objects hold key-value pairs and remember the original insertion order of the keys.", description_html: "Map objects hold key-value pairs and remember the original insertion order of the keys.", group: ["maps"], kind: "feature", name: "Map (initial support)", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map-objects", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map-constructor", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.clear", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.delete", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.entries", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.foreach", "https://tc39.es/ecma262/mu\
ltipage/keyed-collections.html#sec-map.prototype.get", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.has", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.keys", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.set", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-get-map.prototype.size", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype.values", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map.prototype-@@iterator", "https://tc39.es/ecma262/multipage/keyed-collections.html#sec-get-map-@@species"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Map": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } },
    "javascript.builtins.Map.@@iterator": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "javascript.builtins.Map.@@species": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "51", chrome_android: "51", edge: "13", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "javascript.builtins.Map.Map": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.Map.iterable_allowed": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "\
9", safari_ios: "9" } }, "javascript.builtins.Map.Map.null_allowed": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "37", firefox_android: "37", safari: "9", safari_ios: "9" } }, "javascript.builtins.Map.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "19", firefox_android: "19", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.delete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.entries": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "20", firefox_android: "\
20", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.forEach": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.get": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.has": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.key_equality_for_zeros": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "29",
    firefox_android: "29", safari: "9", safari_ios: "9" } }, "javascript.builtins.Map.keys": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "20", firefox_android: "20", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "19", firefox_android: "19", safari: "8", safari_ios: "8" } }, "javascript.builtins.Map.values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "\
20", firefox_android: "20", safari: "8", safari_ios: "8" } } }, support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } } }, margin: { compat_features: ["css.properties.margin", "css.properties.margin-bottom", "css.properties.margin-bottom.auto", "css.properties.margin-left", "css.properties.margin-left.auto", "css.properties.margin-right", "css.properties.margin-right.auto", "css.properties.margin-top", "css.properties.margin-top.auto", "css.properties.margin.auto"], description: "The margin CSS property sets space around an element. It is a shorthand for margin-top, margin-right, margin-bottom, and margin-left.", description_html: "The <code>margin</code> CSS property sets space around an element. It is a shorthand for <code>margin-top</code>, <code>margin-right</code>, <code>margin-bottom</code>, and <code>margin-left</code>.", group: ["layout"], kind: "feature", name: "margin", spec: ["https://drafts.csswg.org/\
css-box-4/#margins"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.margin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-bottom": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-bottom.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-left": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-left.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-right": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-right.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin-top.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.margin.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "margin-trim": { compat_features: ["css.properties.margin-trim", "css.properties.margin-trim.block", "css.properties.margin-trim.block-end", "css.properties.margin-trim.block-start", "css.properties.margin-trim.inline", "css.properties.margin-trim.inline-end", "css.\
properties.margin-trim.inline-start", "css.properties.margin-trim.none"], description: "The margin-trim CSS property removes the margins of child elements when they meet the edges of the container.", description_html: "The <code>margin-trim</code> CSS property removes the margins of child elements when they meet the edges of the container.", group: ["css"], kind: "feature", name: "margin-trim", spec: ["https://drafts.csswg.org/css-box-4/#margin-trim"], status: { baseline: false, by_compat_key: { "css.properties.margin-trim": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.block": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.block-end": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.block-start": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.inline": { baseline: false, support: { safari: "\
16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.inline-end": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.inline-start": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } }, "css.properties.margin-trim.none": { baseline: false, support: { safari: "16.4", safari_ios: "16.4" } } }, support: { safari: "16.4", safari_ios: "16.4" } } }, mark: { compat_features: ["html.elements.mark"], description: "The <mark> element represents text which is marked or highlighted for reference or notation purposes.", description_html: "The <code>&#x3C;mark></code> element represents text which is marked or highlighted for reference or notation purposes.", group: ["html-elements"], kind: "feature", name: "<mark>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-mark-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.element\
s.mark": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, marker: { caniuse: ["css-marker-pseudo"], compat_features: ["css.selectors.marker", "css.selectors.marker.animation_and_transition_support"], description: "The ::marker CSS pseudo-element selects list item markers for styling numbers or bullets.", description_html: "The <code>::marker</code> CSS pseudo-element selects list item markers for styling numbers or bullets.", group: ["lists"], kind: "feature", name: "::marker", spec: ["https://drafts.csswg.org/css-pseudo-4/#marker-pseudo"], status: { baseline: false, by_compat_key: { "css.selectors.marker": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "\
68", firefox_android: "68" } }, "css.selectors.marker.animation_and_transition_support": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "80", firefox_android: "80" } } }, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "80", firefox_android: "80" } } }, "mask-border": { compat_features: ["css.properties.mask-border", "css.properties.mask-border-outset", "css.properties.mask-border-repeat", "css.properties.mask-border-slice", "css.properties.mask-border-source", "css.properties.mask-border-width"], description: "The mask-border CSS property sets how the edges of an element are masked. It is a shorthand for mask-border-outset, mask-border-repeat, mask-border-slice, mask-border-source, and mask-border-width.", description_html: "The <code>mask-border</code> CSS property sets how the edges of an element are masked. It is a shorthand for <code>mask-border-outset</code>, <code>mask-border-repeat</code>, <code>mask-border-slice</code\
>, <code>mask-border-source</code>, and <code>mask-border-width</code>.", group: ["clipping-shapes-masking"], kind: "feature", name: "mask-border", spec: ["https://drafts.csswg.org/css-masking-1/#mask-borders"], status: { baseline: false, by_compat_key: { "css.properties.mask-border": { baseline: false, support: { safari: "17.2", safari_ios: "17.2" } }, "css.properties.mask-border-outset": { baseline: false, support: { safari: "17.2", safari_ios: "17.2" } }, "css.properties.mask-border-repeat": { baseline: false, support: { safari: "17.2", safari_ios: "17.2" } }, "css.properties.mask-border-slice": { baseline: false, support: { safari: "17.2", safari_ios: "17.2" } }, "css.properties.mask-border-source": { baseline: false, support: { safari: "17.2", safari_ios: "17.2" } }, "css.properties.mask-border-width": { baseline: false, support: { safari: "17.2", safari_ios: "17.2" } } }, support: { safari: "17.2", safari_ios: "17.2" } } }, "mask-type": { compat_features: ["css.properties.mask-ty\
pe", "css.properties.mask-type.alpha", "css.properties.mask-type.luminance"], description: "The mask-type CSS property on an SVG <mask> element sets whether the mask is a luminance or alpha mask.", description_html: "The <code>mask-type</code> CSS property on an SVG <code>&#x3C;mask></code> element sets whether the mask is a <code>luminance</code> or <code>alpha</code> mask.", group: ["clipping-shapes-masking"], kind: "feature", name: "mask-type", spec: ["https://drafts.csswg.org/css-masking-1/#the-mask-type"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.mask-type": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "35", firefox_android: "35", safari: "7", safari_ios: "7" } }, "css.properties.mask-type.alpha": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "24", chrome_android: "25", edge: "79", firefox: "35", firefox_android: "35", safari: "7", safari_ios: "7" } }, "css.properties.mask-type.luminance": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "35", firefox_android: "35", safari: "7", safari_ios: "7" } } }, support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "35", firefox_android: "35", safari: "7", safari_ios: "7" } } }, masks: { caniuse: ["css-masks"], compat_features: ["css.properties.mask", "css.properties.mask-clip", "css.properties.mask-clip.border", "css.properties.mask-clip.content", "css.properties.mask-clip.padding", "css.properties.mask-clip.text", "css.properties.mask-composite", "css.properties.mask-composite.add", "css.properties.mask-composite.exclude", "css.properties.mask-composite.intersect", "css.properties.mask-composite.subtract", "css.properties.mask-image", "css.properties.ma\
sk-image.multiple_mask_images", "css.properties.mask-image.svg_masks", "css.properties.mask-mode", "css.properties.mask-mode.alpha", "css.properties.mask-mode.luminance", "css.properties.mask-mode.match-source", "css.properties.mask-origin", "css.properties.mask-origin.border", "css.properties.mask-origin.content", "css.properties.mask-origin.fill-box", "css.properties.mask-origin.padding", "css.properties.mask-origin.stroke-box", "css.properties.mask-origin.view-box", "css.properties.mask-position", "css.properties.mask-repeat", "css.properties.mask-size"], description: "The mask CSS property (and several longhand properties) partially or completely hides an element according to the shape and depth of an image.", description_html: "The <code>mask</code> CSS property (and several longhand properties) partially or completely hides an element according to the shape and depth of an image.", group: ["clipping-shapes-masking"], kind: "feature", name: "Masks", spec: ["https://drafts.csswg.or\
g/css-masking-1/#positioned-masks"], status: { baseline: "low", baseline_low_date: "2023-12-07", by_compat_key: { "css.properties.mask": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-clip": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-clip.border": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-clip.content": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-clip.padding": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-clip.text": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-composite": {
    baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-composite.add": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-composite.exclude": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-composite.intersect": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-composite.subtract": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "\
120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-image": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-image.multiple_mask_images": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-image.svg_masks": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-mode": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "\
15.4", safari_ios: "15.4" } }, "css.properties.mask-mode.alpha": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-mode.luminance": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-mode.match-source": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-origin": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-origin.border": { baseline: false, support: {
    safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-origin.content": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-origin.fill-box": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53" } }, "css.properties.mask-origin.padding": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-origin.stroke-box": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53" } }, "css.properties.mask-origin.view-box": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53" } }, "css.properties.mask-position": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-repeat": {
    baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } }, "css.properties.mask-size": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.4" } } }, masonry: { caniuse: ["css-grid-lanes"], compat_features: ["css.properties.grid-template-columns.masonry", "css.properties.grid-template-rows.masonry"], description: "The display: grid-lanes or display: inline-grid-lanes CSS declaration creates a layout where items are tightly packed, like brickwork, in parallel lanes. Items are placed one by one in the lane that has the most available space.", description_html: "The <code>display: grid-la\
nes</code> or <code>display: inline-grid-lanes</code> CSS declaration creates a layout where items are tightly packed, like brickwork, in parallel lanes. Items are placed one by one in the lane that has the most available space.", group: ["layout"], kind: "feature", name: "Masonry", spec: ["https://drafts.csswg.org/css-grid-3/"], status: { baseline: false, by_compat_key: { "css.properties.grid-template-columns.masonry": { baseline: false, support: {} }, "css.properties.grid-template-rows.masonry": { baseline: false, support: {} } }, support: {} } }, matchmedia: { caniuse: ["matchmedia"], compat_features: ["api.MediaQueryList", "api.MediaQueryList.EventTarget_inheritance", "api.MediaQueryList.change_event", "api.MediaQueryList.matches", "api.MediaQueryList.media", "api.MediaQueryListEvent", "api.MediaQueryListEvent.MediaQueryListEvent", "api.MediaQueryListEvent.matches", "api.MediaQueryListEvent.media", "api.Window.matchMedia"], description: "The window.matchMedia() method checks whethe\
r a media query applies to the document.", description_html: "The <code>window.matchMedia()</code> method checks whether a media query applies to the document.", kind: "feature", name: "matchMedia", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-window-matchmedia"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.MediaQueryList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.MediaQueryList.EventTarget_inheritance": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "39", chrome_android: "39", edge: "16", firefox: "55", firefox_android: "55", safari: "14", safari_ios: "14" } }, "api.MediaQueryList.change_event": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "202\
0-09-16", support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "55", firefox_android: "55", safari: "14", safari_ios: "14" } }, "api.MediaQueryList.matches": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.MediaQueryList.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.MediaQueryListEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "55", firefox_android: "55", safari: "14", safari_ios: "14" } }, "api.MediaQueryListEvent.MediaQueryListEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "\
2020-09-16", support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "55", firefox_android: "55", safari: "14", safari_ios: "14" } }, "api.MediaQueryListEvent.matches": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "55", firefox_android: "55", safari: "14", safari_ios: "14" } }, "api.MediaQueryListEvent.media": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "39", chrome_android: "39", edge: "79", firefox: "55", firefox_android: "55", safari: "14", safari_ios: "14" } }, "api.Window.matchMedia": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "\
5.1", safari_ios: "5" } } }, "math-sum-precise": { compat_features: ["javascript.builtins.Math.sumPrecise"], description: "The Math.sumPrecise() static method returns the sum of an iterable of numbers. It avoids the precision loss of intermediate partial sums, as found using reduce() or a loop to add together an array of values.", description_html: "The <code>Math.sumPrecise()</code> static method returns the sum of an iterable of numbers. It avoids the precision loss of intermediate partial sums, as found using <code>reduce()</code> or a loop to add together an array of values.", group: ["javascript"], kind: "feature", name: "Math.sumPrecise()", spec: ["https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.sumprecise"], status: { baseline: "low", baseline_low_date: "2026-04-10", by_compat_key: { "javascript.builtins.Math.sumPrecise": { baseline: "low", baseline_low_date: "2026-04-10", support: { chrome: "147", chrome_android: "147", edge: "147", firefox: "137", firefox_android: "\
137", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "147", chrome_android: "147", edge: "147", firefox: "137", firefox_android: "137", safari: "26.2", safari_ios: "26.2" } } }, mathml: { caniuse: ["mathml"], compat_features: ["api.MathMLElement", "api.MathMLElement.attributeStyleMap", "api.MathMLElement.blur", "api.MathMLElement.focus", "api.MathMLElement.nonce", "api.MathMLElement.style", "api.MathMLElement.tabIndex", "css.properties.display.math", "css.properties.font-size.math", "css.properties.math-depth", "css.properties.math-shift", "css.properties.math-style", "css.properties.text-transform.math-auto", "mathml.elements.annotation", "mathml.elements.annotation-xml", "mathml.elements.math", "mathml.elements.math.display", "mathml.elements.menclose", "mathml.elements.menclose.notation", "mathml.elements.menclose.notation.actuarial", "mathml.elements.menclose.notation.bottom", "mathml.elements.menclose.notation.box", "mathml.elements.menclose.notation.circle", "mathml\
.elements.menclose.notation.downdiagonalstrike", "mathml.elements.menclose.notation.horizontalstrike", "mathml.elements.menclose.notation.left", "mathml.elements.menclose.notation.longdiv", "mathml.elements.menclose.notation.madruwb", "mathml.elements.menclose.notation.phasorangle", "mathml.elements.menclose.notation.right", "mathml.elements.menclose.notation.roundedbox", "mathml.elements.menclose.notation.top", "mathml.elements.menclose.notation.updiagonalarrow", "mathml.elements.menclose.notation.updiagonalstrike", "mathml.elements.menclose.notation.verticalstrike", "mathml.elements.merror", "mathml.elements.mfrac", "mathml.elements.mfrac.linethickness", "mathml.elements.mi", "mathml.elements.mi.mathvariant", "mathml.elements.mmultiscripts", "mathml.elements.mn", "mathml.elements.mo", "mathml.elements.mo.accent", "mathml.elements.mo.form", "mathml.elements.mo.largeop", "mathml.elements.mo.lspace", "mathml.elements.mo.maxsize", "mathml.elements.mo.minsize", "mathml.elements.mo.movable\
limits", "mathml.elements.mo.rspace", "mathml.elements.mo.stretchy", "mathml.elements.mo.symmetric", "mathml.elements.mover", "mathml.elements.mover.accent", "mathml.elements.mpadded", "mathml.elements.mpadded.depth", "mathml.elements.mpadded.height", "mathml.elements.mpadded.lspace", "mathml.elements.mpadded.relative_values", "mathml.elements.mpadded.voffset", "mathml.elements.mpadded.width", "mathml.elements.mphantom", "mathml.elements.mprescripts", "mathml.elements.mroot", "mathml.elements.mrow", "mathml.elements.ms", "mathml.elements.mspace", "mathml.elements.mspace.depth", "mathml.elements.mspace.height", "mathml.elements.mspace.width", "mathml.elements.msqrt", "mathml.elements.mstyle", "mathml.elements.msub", "mathml.elements.msubsup", "mathml.elements.msup", "mathml.elements.mtable", "mathml.elements.mtable.align", "mathml.elements.mtable.columnalign", "mathml.elements.mtable.columnlines", "mathml.elements.mtable.columnspacing", "mathml.elements.mtable.frame", "mathml.elements.m\
table.framespacing", "mathml.elements.mtable.rowalign", "mathml.elements.mtable.rowlines", "mathml.elements.mtable.rowspacing", "mathml.elements.mtable.width", "mathml.elements.mtd", "mathml.elements.mtd.columnalign", "mathml.elements.mtd.columnspan", "mathml.elements.mtd.rowalign", "mathml.elements.mtd.rowspan", "mathml.elements.mtext", "mathml.elements.mtr", "mathml.elements.mtr.columnalign", "mathml.elements.mtr.rowalign", "mathml.elements.munder", "mathml.elements.munder.accentunder", "mathml.elements.munderover", "mathml.elements.munderover.accent", "mathml.elements.munderover.accentunder", "mathml.elements.semantics", "mathml.global_attributes.dir", "mathml.global_attributes.dir.rtl_operator_mirroring", "mathml.global_attributes.displaystyle", "mathml.global_attributes.href", "mathml.global_attributes.scriptlevel"], description: "MathML, or the Mathematical Markup Language, describes mathematical notation, such as expressions and formulas. Also known as MathML Core.", description_html: "\
MathML, or the Mathematical Markup Language, describes mathematical notation, such as expressions and formulas. Also known as MathML Core.", group: ["mathml"], kind: "feature", name: "MathML", spec: ["https://w3c.github.io/mathml-core/"], status: { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", by_compat_key: { "api.MathMLElement": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.MathMLElement.attributeStyleMap": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", safari: "16.4", safari_ios: "16.4" } }, "api.MathMLElement.blur": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "\
13.4" } }, "api.MathMLElement.focus": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.MathMLElement.nonce": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", safari: "15.4", safari_ios: "15.4" } }, "api.MathMLElement.style": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.MathMLElement.tabIndex": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "css.properties.display.math": { baseline: false, support: { chrome: "109", chrome_android: "\
109", edge: "109" } }, "css.properties.font-size.math": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "117", firefox_android: "117", safari: "26.4", safari_ios: "26.4" } }, "css.properties.math-depth": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "117", firefox_android: "117", safari: "26.4", safari_ios: "26.4" } }, "css.properties.math-shift": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "146", firefox_android: "146", safari: "26.2", safari_ios: "26.2" } }, "css.properties.math-style": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "117", firefox_android: "117", safari: "14.1", safari_ios: "14.5" } }, "css.properties.text-transform.math-auto": { baseline: false,
    support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "117", firefox_android: "117" } }, "mathml.elements.annotation": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "mathml.elements.annotation-xml": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "mathml.elements.math": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.math.display": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "\
109", chrome_android: "109", edge: "109", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.menclose": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.actuarial": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.bottom": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.box": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.circle": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.downdiagon\
alstrike": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.horizontalstrike": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.left": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.longdiv": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.madruwb": { baseline: false, support: { firefox: "2", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.phasorangle": { baseline: false, support: { firefox: "32", firefox_android: "32" } }, "mathml.elements.menclose.notation.right": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.roun\
dedbox": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.top": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.updiagonalarrow": { baseline: false, support: { firefox: "24", firefox_android: "24" } }, "mathml.elements.menclose.notation.updiagonalstrike": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.menclose.notation.verticalstrike": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.merror": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mfrac": { baseline: "high", baseline_high_date: "2025-07-\
12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mfrac.linethickness": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "9", safari_ios: "9" } }, "mathml.elements.mi": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mi.mathvariant": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "70", firefox_android: "79", safari: "10", safari_ios: "10" } }, "mathml.elements.mmultiscripts": { baseline: "high", baseline_high_date: "\
2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mn": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mo": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "mathml.elements.mo.accent": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mo.form": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "\
4", safari: "8", safari_ios: "8" } }, "mathml.elements.mo.largeop": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "8", safari_ios: "8" } }, "mathml.elements.mo.lspace": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "8", safari_ios: "8" } }, "mathml.elements.mo.maxsize": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "8", safari_ios: "8" } }, "mathml.elements.mo.minsize": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "\
8", safari_ios: "8" } }, "mathml.elements.mo.movablelimits": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mo.rspace": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "8", safari_ios: "8" } }, "mathml.elements.mo.stretchy": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "mathml.elements.mo.symmetric": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "\
8", safari_ios: "8" } }, "mathml.elements.mover": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mover.accent": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mpadded": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mpadded.depth": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "\
10" } }, "mathml.elements.mpadded.height": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mpadded.lspace": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mpadded.relative_values": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "mathml.elements.mpadded.voffset": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "7", firefox_android: "7", safari: "10", safari_ios: "10" } }, "mathml.elements.mpadded.width": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-\
01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mphantom": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mprescripts": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mroot": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mrow": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: {
    chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.ms": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "9", safari_ios: "9" } }, "mathml.elements.mspace": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.mspace.depth": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.mspace.height": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "\
109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.mspace.width": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "7", safari_ios: "7" } }, "mathml.elements.msqrt": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mstyle": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "mathml.elements.msub": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "\
109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.msubsup": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.msup": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mtable": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtable.align": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "mathml.elements.mtable.columnalign": { baseline: false, support: { firefox: "\
1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtable.columnlines": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtable.columnspacing": { baseline: false, support: { firefox: "33", firefox_android: "33" } }, "mathml.elements.mtable.frame": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtable.framespacing": { baseline: false, support: { firefox: "33", firefox_android: "33" } }, "mathml.elements.mtable.rowalign": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtable.rowlines": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtable.rowspacing": { baseline: false, support: { firefox: "33", firefox_android: "33" } }, "mathml.elements.mtable.width": { baseline: false, support: {
    firefox: "13", firefox_android: "14" } }, "mathml.elements.mtd": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtd.columnalign": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtd.columnspan": { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtd.rowalign": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtd.rowspan": { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "\
1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtext": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.mtr": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtr.columnalign": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.mtr.rowalign": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.munder": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "\
1", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "mathml.elements.munder.accentunder": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.munderover": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "mathml.elements.munderover.accent": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.munderover.accentunder": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "\
109", edge: "109", firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.semantics": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "mathml.global_attributes.dir": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "70", firefox_android: "79", safari: "8", safari_ios: "8" } }, "mathml.global_attributes.dir.rtl_operator_mirroring": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "146", firefox_android: "146" } }, "mathml.global_attributes.displaystyle": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "83", firefox_android: "83",
    safari: "14", safari_ios: "14" } }, "mathml.global_attributes.href": { baseline: false, support: { firefox: "7", firefox_android: "7", safari: "10", safari_ios: "10" } }, "mathml.global_attributes.scriptlevel": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "70", firefox_android: "79" } } }, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } } }, "mathml-full": { compat_features: ["mathml.attribute_values.named_space", "mathml.attribute_values.nonzero_unitless_values", "mathml.elements.maction", "mathml.elements.maction.actiontype", "mathml.elements.maction.actiontype.toggle", "mathml.elements.maction.selection", "mathml.elements.mfenced", "mathml.elements.mfrac.denomalign", "mathml.elements.mfrac.linethickness.named_spaces", "mathml.elements.mfrac.linethickness.nonzero_unitless_values", "mathml.elements.mfrac.linethickness.thin_medium_thick", "mathml.elements.\
mfrac.numalign", "mathml.elements.mmultiscripts.subscriptshift", "mathml.elements.mmultiscripts.superscriptshift", "mathml.elements.mo.named_spaces", "mathml.elements.mo.nonzero_unitless_values", "mathml.elements.mpadded.named_spaces", "mathml.elements.mpadded.nonzero_unitless_values", "mathml.elements.mpadded.pseudo_units", "mathml.elements.mpadded.scale_factor", "mathml.elements.mspace.named_spaces", "mathml.elements.mstyle.background", "mathml.elements.mstyle.color", "mathml.elements.mstyle.fontsize", "mathml.elements.mstyle.fontstyle", "mathml.elements.mstyle.fontweight", "mathml.elements.msub.subscriptshift", "mathml.elements.msubsup.subscriptshift", "mathml.elements.msubsup.superscriptshift", "mathml.elements.msup.superscriptshift", "mathml.elements.mtable.width.named_spaces", "mathml.elements.semantics.advanced_visible_child_selection", "mathml.global_attributes.mathbackground", "mathml.global_attributes.mathcolor", "mathml.global_attributes.mathsize", "mathml.global_attributes.\
mathsize.named_spaces", "mathml.global_attributes.mathsize.nonzero_unitless_values", "mathml.global_attributes.mathsize.small_normal_big"], description: "MathML specifies several elements and attributes that are not included in MathML Core. Math applications outside of browsers may implement these features, but they are discouraged for web use.", description_html: "MathML specifies several elements and attributes that are not included in MathML Core. Math applications outside of browsers may implement these features, but they are discouraged for web use.", discouraged: { according_to: ["https://w3c.github.io/mathml-core/#introduction"], alternatives: ["mathml"], reason: "Only MathML Core (a subset of MathML Full) is designed to work with web technologies, such as CSS.", reason_html: "Only MathML Core (a subset of MathML Full) is designed to work with web technologies, such as CSS." }, group: ["mathml"], kind: "feature", name: "MathML Full", spec: ["https://w3c.github.io/mathml/"], status: {
    baseline: false, by_compat_key: { "mathml.attribute_values.named_space": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.attribute_values.nonzero_unitless_values": { baseline: false, support: { safari: "10", safari_ios: "10" } }, "mathml.elements.maction": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "1", firefox_android: "4", safari: "8", safari_ios: "8" } }, "mathml.elements.maction.actiontype": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "mathml.elements.maction.actiontype.toggle": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "mathml.elements.maction.selection": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "mathml.elements.mfenced": { baseline: false, support: { safari: "6", safari_ios: "6" } }, "mathml.elements.mfrac.denomalign": { baseline: false, support: { safari: "5.1", safari_ios: "5" } }, "mathml.elements.mfra\
c.linethickness.named_spaces": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mfrac.linethickness.nonzero_unitless_values": { baseline: false, support: { safari: "10", safari_ios: "10" } }, "mathml.elements.mfrac.linethickness.thin_medium_thick": { baseline: false, support: { safari: "9", safari_ios: "9" } }, "mathml.elements.mfrac.numalign": { baseline: false, support: { safari: "5.1", safari_ios: "5" } }, "mathml.elements.mmultiscripts.subscriptshift": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "mathml.elements.mmultiscripts.superscriptshift": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "mathml.elements.mo.named_spaces": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mo.nonzero_unitless_values": { baseline: false, support: { safari: "10", safari_ios: "10" } }, "mathml.elements.mpadded.named_spaces": { baseline: false,
    support: { firefox: "1", firefox_android: "4" } }, "mathml.elements.mpadded.nonzero_unitless_values": { baseline: false, support: { safari: "10", safari_ios: "10" } }, "mathml.elements.mpadded.pseudo_units": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "mathml.elements.mpadded.scale_factor": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "mathml.elements.mspace.named_spaces": { baseline: false, support: { firefox: "1", firefox_android: "4", safari: "10", safari_ios: "10" } }, "mathml.elements.mstyle.background": { baseline: false, support: { safari: "5.1", safari_ios: "5" } }, "mathml.elements.mstyle.color": { baseline: false, support: { safari: "5.1", safari_ios: "5" } }, "mathml.elements.mstyle.fontsize": { baseline: false, support: { safari: "5.1", safari_ios: "5" } }, "mathml.elements.mstyle.fontstyle": { baseline: false, support: { safari: "5.1", safari_ios: "5" } }, "mathml.elements.mstyle.fontweight": { baseline: false, support: {
    safari: "5.1", safari_ios: "5" } }, "mathml.elements.msub.subscriptshift": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "mathml.elements.msubsup.subscriptshift": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "mathml.elements.msubsup.superscriptshift": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "mathml.elements.msup.superscriptshift": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "mathml.elements.mtable.width.named_spaces": { baseline: false, support: { firefox: "13", firefox_android: "14" } }, "mathml.elements.semantics.advanced_visible_child_selection": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "mathml.global_attributes.mathbackground": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "70", firefox_android: "79", safari: "5", safari_ios: "4" } }, "mathml.global_attributes.mathcolor": { baseline: false, support: { chrome: "109", chrome_android: "\
109", edge: "109", firefox: "70", firefox_android: "79", safari: "5", safari_ios: "4" } }, "mathml.global_attributes.mathsize": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "70", firefox_android: "79", safari: "5", safari_ios: "4.2" } }, "mathml.global_attributes.mathsize.named_spaces": { baseline: false, support: { firefox: "70", firefox_android: "79", safari: "10", safari_ios: "10" } }, "mathml.global_attributes.mathsize.nonzero_unitless_values": { baseline: false, support: { safari: "10", safari_ios: "10" } }, "mathml.global_attributes.mathsize.small_normal_big": { baseline: false, support: { safari: "5", safari_ios: "4.2" } } }, support: {} } }, "measure-memory": { compat_features: ["api.Performance.measureUserAgentSpecificMemory"], description: "The measureUserAgentSpecificMemory() method estimates the memory usage of a web application including all its iframes and workers.", description_html: "The <code>measureUserAgentSpecificMemory()\
</code> method estimates the memory usage of a web application including all its iframes and workers.", group: ["performance"], kind: "feature", name: "Memory measurement", spec: ["https://wicg.github.io/performance-measure-memory/"], status: { baseline: false, by_compat_key: { "api.Performance.measureUserAgentSpecificMemory": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } } }, support: { chrome: "89", chrome_android: "89", edge: "89" } } }, "media-capabilities": { compat_features: ["api.MediaCapabilities", "api.MediaCapabilities.decodingInfo", "api.MediaCapabilities.encodingInfo", "api.Navigator.mediaCapabilities", "api.WorkerNavigator.mediaCapabilities"], description: "The navigator.mediaCapabilities API queries the encoding and decoding abilities of the device, such as supported codecs, resolutions, and bitrates.", description_html: "The <code>navigator.mediaCapabilities</code> API queries the encoding and decoding abilities of the device, such as sup\
ported codecs, resolutions, and bitrates.", kind: "feature", name: "Media capabilities", spec: ["https://w3c.github.io/media-capabilities/"], status: { baseline: "high", baseline_high_date: "2024-10-28", baseline_low_date: "2022-04-28", by_compat_key: { "api.MediaCapabilities": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "63", firefox_android: "63", safari: "13", safari_ios: "13" } }, "api.MediaCapabilities.decodingInfo": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "63", firefox_android: "63", safari: "13", safari_ios: "13" } }, "api.MediaCapabilities.encodingInfo": { baseline: "high", baseline_high_date: "2024-10-28", baseline_low_date: "2022-04-28", support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "63", firefox_android: "63", safari: "15.4", safari_ios: "\
15.4" } }, "api.Navigator.mediaCapabilities": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "63", firefox_android: "63", safari: "13", safari_ios: "13" } }, "api.WorkerNavigator.mediaCapabilities": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "63", firefox_android: "63", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "63", firefox_android: "63", safari: "15.4", safari_ios: "15.4" } } }, "media-capture": { caniuse: ["stream"], compat_features: ["api.InputDeviceInfo", "api.InputDeviceInfo.getCapabilities", "api.MediaDeviceInfo", "api.MediaDeviceInfo.deviceId", "api.MediaDeviceInfo.groupId", "api.MediaDeviceInfo.kind", "api.MediaDeviceInfo.label", "api.MediaDeviceInfo.toJSON", "api.MediaDevices", "api.MediaDe\
vices.devicechange_event", "api.MediaDevices.enumerateDevices", "api.MediaDevices.getSupportedConstraints", "api.MediaDevices.getUserMedia", "api.MediaDevices.getUserMedia.secure_context_required", "api.MediaStream", "api.MediaStream.MediaStream", "api.MediaStream.active", "api.MediaStream.addTrack", "api.MediaStream.addtrack_event", "api.MediaStream.clone", "api.MediaStream.getAudioTracks", "api.MediaStream.getTrackById", "api.MediaStream.getTracks", "api.MediaStream.getVideoTracks", "api.MediaStream.id", "api.MediaStream.removeTrack", "api.MediaStream.removetrack_event", "api.MediaStreamTrack", "api.MediaStreamTrack.applyConstraints", "api.MediaStreamTrack.applyConstraints.aspectRatio_constraint", "api.MediaStreamTrack.applyConstraints.autoGainControl_constraint", "api.MediaStreamTrack.applyConstraints.channelCount_constraint", "api.MediaStreamTrack.applyConstraints.deviceId_constraint", "api.MediaStreamTrack.applyConstraints.echoCancellation_constraint", "api.MediaStreamTrack.applyC\
onstraints.facingMode_constraint", "api.MediaStreamTrack.applyConstraints.frameRate_constraint", "api.MediaStreamTrack.applyConstraints.groupId_constraint", "api.MediaStreamTrack.applyConstraints.height_constraint", "api.MediaStreamTrack.applyConstraints.latency_constraint", "api.MediaStreamTrack.applyConstraints.noiseSuppression_constraint", "api.MediaStreamTrack.applyConstraints.resizeMode_constraint", "api.MediaStreamTrack.applyConstraints.sampleRate_constraint", "api.MediaStreamTrack.applyConstraints.sampleSize_constraint", "api.MediaStreamTrack.applyConstraints.width_constraint", "api.MediaStreamTrack.clone", "api.MediaStreamTrack.enabled", "api.MediaStreamTrack.ended_event", "api.MediaStreamTrack.getCapabilities", "api.MediaStreamTrack.getConstraints", "api.MediaStreamTrack.getSettings", "api.MediaStreamTrack.id", "api.MediaStreamTrack.kind", "api.MediaStreamTrack.label", "api.MediaStreamTrack.mute_event", "api.MediaStreamTrack.muted", "api.MediaStreamTrack.readyState", "api.Medi\
aStreamTrack.stop", "api.MediaStreamTrack.unmute_event", "api.MediaStreamTrackEvent", "api.MediaStreamTrackEvent.MediaStreamTrackEvent", "api.MediaStreamTrackEvent.track", "api.Navigator.mediaDevices", "api.Navigator.mediaDevices.secure_context_required", "api.OverconstrainedError", "api.OverconstrainedError.OverconstrainedError", "api.OverconstrainedError.constraint", "api.Permissions.permission_camera", "api.Permissions.permission_microphone", "html.elements.iframe.allow.camera", "html.elements.iframe.allow.microphone", "http.headers.Permissions-Policy.camera", "http.headers.Permissions-Policy.microphone"], description: "The navigator.mediaDevices.getUserMedia() API requests access to devices that produce audio or video streams, such as microphones or video cameras.", description_html: "The <code>navigator.mediaDevices.getUserMedia()</code> API requests access to devices that produce audio or video streams, such as microphones or video cameras.", kind: "feature", name: "Media capture",
    spec: ["https://w3c.github.io/mediacapture-main/"], status: { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", by_compat_key: { "api.InputDeviceInfo": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79", safari: "11", safari_ios: "11" } }, "api.InputDeviceInfo.getCapabilities": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79", safari: "17", safari_ios: "17" } }, "api.MediaDeviceInfo": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "39", firefox_android: "39", safari: "11", safari_ios: "11" } }, "api.MediaDeviceInfo.deviceId": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "39", firefox_android: "39", safari: "11", safari_ios: "11" } }, "api.MediaDeviceInfo.groupId": { baseline: "hig\
h", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "39", firefox_android: "39", safari: "11", safari_ios: "11" } }, "api.MediaDeviceInfo.kind": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "39", firefox_android: "39", safari: "11", safari_ios: "11" } }, "api.MediaDeviceInfo.label": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "39", firefox_android: "39", safari: "11", safari_ios: "11" } }, "api.MediaDeviceInfo.toJSON": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "47", chrome_android: "47", edge: "18", firefox: "42", firefox_android: "42", safari: "11", safari_ios: "11" } }, "api.MediaDevices": { baseline: "high", baseline_high_date: "\
2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "33", firefox_android: "36", safari: "11", safari_ios: "11" } }, "api.MediaDevices.devicechange_event": { baseline: false, support: { chrome: "57", edge: "12", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "api.MediaDevices.enumerateDevices": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "116", firefox_android: "116", safari: "11", safari_ios: "11" } }, "api.MediaDevices.getSupportedConstraints": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "53", chrome_android: "52", edge: "12", firefox: "44", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaDevices.getUserMedia": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: {
    chrome: "53", chrome_android: "53", edge: "12", firefox: "36", firefox_android: "36", safari: "11", safari_ios: "11" } }, "api.MediaDevices.getUserMedia.secure_context_required": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "api.MediaStream": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "15", firefox_android: "15", safari: "11", safari_ios: "11" } }, "api.MediaStream.MediaStream": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "44", firefox_android: "42", safari: "11", safari_ios: "11" } }, "api.MediaStream.active": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09\
-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "api.MediaStream.addTrack": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.MediaStream.addtrack_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStream.clone": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "api.MediaStream.getAudioTracks": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-0\
9-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "22", firefox_android: "22", safari: "11", safari_ios: "11" } }, "api.MediaStream.getTrackById": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "49", firefox_android: "49", safari: "11", safari_ios: "11" } }, "api.MediaStream.getTracks": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.MediaStream.getVideoTracks": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "22", firefox_android: "22", safari: "11", safari_ios: "11" } }, "api.MediaStream.id": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-1\
9", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "41", firefox_android: "41", safari: "11", safari_ios: "11" } }, "api.MediaStream.removeTrack": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.MediaStream.removetrack_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "72", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "22", firefox_android: "22", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "\
2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "43", firefox_android: "43", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.aspectRatio_constraint": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "≤15", firefox_android: "43", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.autoGainControl_constraint": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "55", firefox_android: "55" } }, "api.MediaStreamTrack.applyConstraints.channelCount_constraint": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79" } }, "api.MediaStreamTrack.applyConstraints.deviceId_constraint": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "43", firefox_android: "43", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstra\
ints.echoCancellation_constraint": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.facingMode_constraint": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.frameRate_constraint": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.groupId_constraint": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "59", chrome_android: "\
59", edge: "12", firefox: "70", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.height_constraint": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.latency_constraint": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "50", firefox_android: "50" } }, "api.MediaStreamTrack.applyConstraints.noiseSuppression_constraint": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "55", firefox_android: "55" } }, "api.MediaStreamTrack.applyConstraints.resizeMode_constraint": { baseline: false, support: { chrome: "72", chrome_android: "72", edge: "79" } }, "api.MediaStreamTrack.applyConstraints.sampleRate_constraint": { baseline: false, support: { chrome: "59", chrome_android: "\
59", edge: "12", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.sampleSize_constraint": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "12", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.applyConstraints.width_constraint": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.clone": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.enabled": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "24", firefox_android: "24", safari: "11", safari_ios: "\
11" } }, "api.MediaStreamTrack.ended_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.getCapabilities": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "132", firefox_android: "132", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.getConstraints": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "53", chrome_android: "52", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.getSettings": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } },
    "api.MediaStreamTrack.id": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "22", firefox_android: "22", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.kind": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "22", firefox_android: "22", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.label": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "22", firefox_android: "22", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.mute_event": { baseline: "high", baseline_high_date: "2020-09-13", baseline_low_date: "2018-03-13", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } },
    "api.MediaStreamTrack.muted": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "12", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.readyState": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.stop": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrack.unmute_event": { baseline: "high", baseline_high_date: "2020-09-13", baseline_low_date: "2018-03-13", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrackEvent": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "\
2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrackEvent.MediaStreamTrackEvent": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrackEvent.track": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "50", firefox_android: "50", safari: "11", safari_ios: "11" } }, "api.Navigator.mediaDevices": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "36", firefox_android: "36", safari: "11", safari_ios: "11" } }, "api.Navigator.mediaDevices.secure_context_required": { baseline: false, support: {
    chrome: "74", chrome_android: "74", edge: "79", firefox: "69", safari: "11", safari_ios: "11" } }, "api.OverconstrainedError": { baseline: false, support: { chrome: "63", chrome_android: "63", edge: "79", safari: "11", safari_ios: "11" } }, "api.OverconstrainedError.OverconstrainedError": { baseline: false, support: { chrome: "63", chrome_android: "63", edge: "79", safari: "11", safari_ios: "11" } }, "api.OverconstrainedError.constraint": { baseline: false, support: { chrome: "63", chrome_android: "63", edge: "79", safari: "11.1", safari_ios: "11.3" } }, "api.Permissions.permission_camera": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "132", firefox_android: "132", safari: "16", safari_ios: "16" } }, "api.Permissions.permission_microphone": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "132", firefox_android: "132", safari: "16", safari_ios: "\
16" } }, "html.elements.iframe.allow.camera": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "html.elements.iframe.allow.microphone": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "http.headers.Permissions-Policy.camera": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } }, "http.headers.Permissions-Policy.microphone": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "53", chrome_android: "53", edge: "12", firefox: "36", firefox_android: "36", safari: "11", safari_ios: "11" } } }, "media-playback-quality": { compat_features: ["api.HTMLVideoElement.getVideo\
PlaybackQuality", "api.VideoPlaybackQuality", "api.VideoPlaybackQuality.creationTime", "api.VideoPlaybackQuality.droppedVideoFrames", "api.VideoPlaybackQuality.totalVideoFrames"], description: "The getVideoPlaybackQuality() method of HTMLVideoElement returns metrics that can be used to determine the playback quality of a video, such as how many frames were dropped.", description_html: "The <code>getVideoPlaybackQuality()</code> method of <code>HTMLVideoElement</code> returns metrics that can be used to determine the playback quality of a video, such as how many frames were dropped.", kind: "feature", name: "Media playback quality", spec: ["https://w3c.github.io/media-playback-quality/"], status: { baseline: "high", baseline_high_date: "2022-08-04", baseline_low_date: "2020-02-04", by_compat_key: { "api.HTMLVideoElement.getVideoPlaybackQuality": { baseline: "high", baseline_high_date: "2022-08-04", baseline_low_date: "2020-02-04", support: { chrome: "80", chrome_android: "80", edge: "12",
    firefox: "42", firefox_android: "42", safari: "8", safari_ios: "12.2" } }, "api.VideoPlaybackQuality": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "42", firefox_android: "42", safari: "8", safari_ios: "12.2" } }, "api.VideoPlaybackQuality.creationTime": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "42", firefox_android: "42", safari: "8", safari_ios: "12.2" } }, "api.VideoPlaybackQuality.droppedVideoFrames": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "42", firefox_android: "42", safari: "8", safari_ios: "12.2" } }, "api.VideoPlaybackQuality.totalVideoFrames": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: {
    chrome: "23", chrome_android: "25", edge: "12", firefox: "42", firefox_android: "42", safari: "8", safari_ios: "12.2" } } }, support: { chrome: "80", chrome_android: "80", edge: "12", firefox: "42", firefox_android: "42", safari: "8", safari_ios: "12.2" } } }, "media-pseudos": { compat_features: ["css.selectors.buffering", "css.selectors.muted", "css.selectors.paused", "css.selectors.playing", "css.selectors.seeking", "css.selectors.stalled", "css.selectors.volume-locked"], description: "The :playing, :paused, :seeking, :buffering, :stalled, :muted, and :volume-locked CSS pseudo-classes match <audio> and <video> elements based on their state.", description_html: "The <code>:playing</code>, <code>:paused</code>, <code>:seeking</code>, <code>:buffering</code>, <code>:stalled</code>, <code>:muted</code>, and <code>:volume-locked</code> CSS pseudo-classes match <code>&#x3C;audio></code> and <code>&#x3C;video></code> elements based on their state.", group: ["media-elements"], kind: "fea\
ture", name: "Media element pseudo-classes", spec: ["https://drafts.csswg.org/selectors-4/#resource-pseudos", "https://html.spec.whatwg.org/multipage/semantics-other.html#pseudo-classes"], status: { baseline: false, by_compat_key: { "css.selectors.buffering": { baseline: false, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.muted": { baseline: false, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.paused": { baseline: false, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.playing": { baseline: false, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.seeking": { baseline: false, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "css.selectors.stalled": { baseline: false, support: { firefox: "150", firefox_android: "150",
    safari: "15.4", safari_ios: "15.4" } }, "css.selectors.volume-locked": { baseline: false, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } } }, support: { firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } } }, "media-queries": { caniuse: ["css-mediaqueries"], compat_features: ["css.at-rules.media", "css.at-rules.media.aspect-ratio", "css.at-rules.media.calc", "css.at-rules.media.color", "css.at-rules.media.color-index", "css.at-rules.media.grid", "css.at-rules.media.height", "css.at-rules.media.media_features", "css.at-rules.media.media_query_values", "css.at-rules.media.monochrome", "css.at-rules.media.nested-queries", "css.at-rules.media.or_syntax", "css.at-rules.media.orientation", "css.at-rules.media.width", "css.types.ratio", "css.types.ratio.number_value"], description: "The @media CSS rule conditionally applies styles based on the output device type, its capabilities, and the user's preferences. Media queries \
are composed of an optional media type such as screen or print, and one or more mandatory media features, such as prefers-reduced-animations.", description_html: "The <code>@media</code> CSS rule conditionally applies styles based on the output device type, its capabilities, and the user's preferences. Media queries are composed of an optional media type such as <code>screen</code> or <code>print</code>, and one or more mandatory media features, such as <code>prefers-reduced-animations</code>.", group: ["media-queries"], kind: "feature", name: "Media queries", spec: ["https://drafts.csswg.org/mediaqueries-5/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.at-rules.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.aspect-ratio": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.at-rules.media.calc": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "59", firefox_android: "59", safari: "12", safari_ios: "12" } }, "css.at-rules.media.color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.color-index": { baseline: false, support: { chrome: "29", chrome_android: "29", edge: "79", safari: "8", safari_ios: "8" } }, "css.at-rules.media.grid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.media_features": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.media.media_query_values": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "59", firefox_android: "59" } }, "css.at-rules.media.monochrome": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-\
rules.media.nested-queries": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "11", firefox_android: "14", safari: "7", safari_ios: "7" } }, "css.at-rules.media.or_syntax": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "64", firefox_android: "64", safari: "16.4", safari_ios: "16.4" } }, "css.at-rules.media.orientation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.at-rules.media.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "\
css.types.ratio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "css.types.ratio.number_value": { baseline: false, support: { firefox: "78", firefox_android: "79" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "media-query-range-syntax": { caniuse: ["css-media-range-syntax"], compat_features: ["css.at-rules.media.range_syntax"], description: "The range syntax of CSS media queries allows you to use mathematical comparison operators such as <, >, <=, and >= to define a range of values for a media query. For example, (400px < width < 1000px) returns true if the viewport width is between 400px and 1000px.", description_html: "The range syntax of CSS media queries allows you to use mathematical comparison operators such as <code>&#x\
3C;</code>, <code>></code>, <code>&#x3C;=</code>, and <code>>=</code> to define a range of values for a media query. For example, <code>(400px &#x3C; width &#x3C; 1000px)</code> returns true if the viewport width is between 400px and 1000px.", group: ["media-queries"], kind: "feature", name: "Media query range syntax", spec: ["https://drafts.csswg.org/mediaqueries-4/#mq-range-context"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "css.at-rules.media.range_syntax": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "102", firefox_android: "102", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "102", firefox_android: "102", safari: "16.4", safari_ios: "16.4" } } }, "media-session": { compat_features: ["api.ChapterInformation", "api.ChapterInformation.a\
rtwork", "api.ChapterInformation.startTime", "api.ChapterInformation.title", "api.MediaMetadata", "api.MediaMetadata.MediaMetadata", "api.MediaMetadata.album", "api.MediaMetadata.artist", "api.MediaMetadata.artwork", "api.MediaMetadata.chapterInfo", "api.MediaMetadata.title", "api.MediaSession", "api.MediaSession.metadata", "api.MediaSession.playbackState", "api.MediaSession.setActionHandler", "api.MediaSession.setActionHandler.hangup_type", "api.MediaSession.setActionHandler.nextslide_type", "api.MediaSession.setActionHandler.nexttrack_type", "api.MediaSession.setActionHandler.pause_type", "api.MediaSession.setActionHandler.play_type", "api.MediaSession.setActionHandler.previousslide_type", "api.MediaSession.setActionHandler.previoustrack_type", "api.MediaSession.setActionHandler.seekbackward_type", "api.MediaSession.setActionHandler.seekforward_type", "api.MediaSession.setActionHandler.seekto_type", "api.MediaSession.setActionHandler.skipad_type", "api.MediaSession.setActionHandler.s\
top_type", "api.MediaSession.setActionHandler.togglecamera_type", "api.MediaSession.setActionHandler.togglemicrophone_type", "api.MediaSession.setCameraActive", "api.MediaSession.setMicrophoneActive", "api.MediaSession.setPositionState", "api.MediaSession.setScreenshareActive", "api.Navigator.mediaSession"], description: "The navigator.mediaSession API integrates with platform UI for media playback. It can be used to set metadata such as title and artwork, and to handle user actions like playing, pausing, or seeking.", description_html: "The <code>navigator.mediaSession</code> API integrates with platform UI for media playback. It can be used to set metadata such as title and artwork, and to handle user actions like playing, pausing, or seeking.", kind: "feature", name: "Media session", spec: ["https://w3c.github.io/mediasession/"], status: { baseline: false, by_compat_key: { "api.ChapterInformation": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127" } }, "\
api.ChapterInformation.artwork": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127" } }, "api.ChapterInformation.startTime": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127" } }, "api.ChapterInformation.title": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127" } }, "api.MediaMetadata": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "82", safari: "14", safari_ios: "14" } }, "api.MediaMetadata.MediaMetadata": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "82", safari: "14", safari_ios: "14" } }, "api.MediaMetadata.album": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "82", safari: "14", safari_ios: "14" } }, "api.MediaMetadata.artist": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "82", safari: "14", safari_ios: "14" } }, "api.MediaMetadat\
a.artwork": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "82", safari: "14", safari_ios: "14" } }, "api.MediaMetadata.chapterInfo": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127" } }, "api.MediaMetadata.title": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "82", safari: "14", safari_ios: "14" } }, "api.MediaSession": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.metadata": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.playbackState": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "\
82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.hangup_type": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "api.MediaSession.setActionHandler.nextslide_type": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.MediaSession.setActionHandler.nexttrack_type": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.pause_type": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.play_type": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.previousslide_type": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.MediaSessio\
n.setActionHandler.previoustrack_type": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.seekbackward_type": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.seekforward_type": { baseline: false, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.seekto_type": { baseline: false, support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.skipad_type": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.stop_type": { baseline: false, support: { chrome: "77", chrome_android: "\
77", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setActionHandler.togglecamera_type": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93", safari: "18.4", safari_ios: "18.4" } }, "api.MediaSession.setActionHandler.togglemicrophone_type": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93", safari: "18.4", safari_ios: "18.4" } }, "api.MediaSession.setCameraActive": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93", safari: "18.4", safari_ios: "18.4" } }, "api.MediaSession.setMicrophoneActive": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93", safari: "18.4", safari_ios: "18.4" } }, "api.MediaSession.setPositionState": { baseline: false, support: { chrome: "81", chrome_android: "57", edge: "81", firefox: "82", safari: "15", safari_ios: "15" } }, "api.MediaSession.setScreenshareActive": { baseline: false, support: { safari: "18.4", safari_ios: "18.4" } },
    "api.Navigator.mediaSession": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", firefox_android: "82", safari: "15", safari_ios: "15" } } }, support: { chrome: "73", chrome_android: "57", edge: "79", firefox: "82", safari: "15", safari_ios: "15" } } }, "media-source": { caniuse: ["mediasource"], compat_features: ["api.AudioTrack.sourceBuffer", "api.BufferedChangeEvent", "api.BufferedChangeEvent.BufferedChangeEvent", "api.BufferedChangeEvent.addedRanges", "api.BufferedChangeEvent.removedRanges", "api.HTMLMediaElement.srcObject", "api.MediaSource", "api.MediaSource.MediaSource", "api.MediaSource.activeSourceBuffers", "api.MediaSource.addSourceBuffer", "api.MediaSource.canConstructInDedicatedWorker_static", "api.MediaSource.clearLiveSeekableRange", "api.MediaSource.duration", "api.MediaSource.endOfStream", "api.MediaSource.handle", "api.MediaSource.isTypeSupported_static", "a\
pi.MediaSource.readyState", "api.MediaSource.removeSourceBuffer", "api.MediaSource.setLiveSeekableRange", "api.MediaSource.sourceBuffers", "api.MediaSource.sourceclose_event", "api.MediaSource.sourceended_event", "api.MediaSource.sourceopen_event", "api.MediaSource.worker_support", "api.MediaSourceHandle", "api.SourceBuffer", "api.SourceBuffer.abort", "api.SourceBuffer.abort.worker_support", "api.SourceBuffer.abort_event", "api.SourceBuffer.abort_event.worker_support", "api.SourceBuffer.appendBuffer", "api.SourceBuffer.appendBuffer.worker_support", "api.SourceBuffer.appendWindowEnd", "api.SourceBuffer.appendWindowEnd.worker_support", "api.SourceBuffer.appendWindowStart", "api.SourceBuffer.appendWindowStart.worker_support", "api.SourceBuffer.audioTracks", "api.SourceBuffer.audioTracks.worker_support", "api.SourceBuffer.buffered", "api.SourceBuffer.buffered.worker_support", "api.SourceBuffer.changeType", "api.SourceBuffer.changeType.worker_support", "api.SourceBuffer.error_event", "api.S\
ourceBuffer.error_event.worker_support", "api.SourceBuffer.mode", "api.SourceBuffer.mode.worker_support", "api.SourceBuffer.remove", "api.SourceBuffer.remove.worker_support", "api.SourceBuffer.textTracks", "api.SourceBuffer.timestampOffset", "api.SourceBuffer.timestampOffset.worker_support", "api.SourceBuffer.update_event", "api.SourceBuffer.update_event.worker_support", "api.SourceBuffer.updateend_event", "api.SourceBuffer.updateend_event.worker_support", "api.SourceBuffer.updatestart_event", "api.SourceBuffer.updatestart_event.worker_support", "api.SourceBuffer.updating", "api.SourceBuffer.updating.worker_support", "api.SourceBuffer.videoTracks", "api.SourceBuffer.videoTracks.worker_support", "api.SourceBufferList", "api.SourceBufferList.addsourcebuffer_event", "api.SourceBufferList.addsourcebuffer_event.worker_support", "api.SourceBufferList.length", "api.SourceBufferList.length.worker_support", "api.SourceBufferList.removesourcebuffer_event", "api.SourceBufferList.removesourcebuffe\
r_event.worker_support", "api.TextTrack.sourceBuffer", "api.VideoTrack.sourceBuffer"], description: "The MediaSource API is a custom data source for media elements commonly used for adaptive streaming. Also known as Media Source Extensions (MSE).", description_html: "The <code>MediaSource</code> API is a custom data source for media elements commonly used for adaptive streaming. Also known as Media Source Extensions (MSE).", kind: "feature", name: "Media source", spec: ["https://w3c.github.io/media-source/"], status: { baseline: false, by_compat_key: { "api.AudioTrack.sourceBuffer": { baseline: false, support: { safari: "8" } }, "api.BufferedChangeEvent": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.BufferedChangeEvent.BufferedChangeEvent": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.BufferedChangeEvent.addedRanges": { baseline: false, support: { safari: "17", safari_ios: "17.1" } }, "api.BufferedChangeEvent.removedRanges": { baseline: false,
    support: { safari: "17", safari_ios: "17.1" } }, "api.HTMLMediaElement.srcObject": { baseline: false, support: { safari: "11", safari_ios: "11" } }, "api.MediaSource": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.MediaSource": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.activeSourceBuffers": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.addSourceBuffer": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.canConstructInDedicatedWorker_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "18" } }, "api.MediaSource.clearLiveSeekableRa\
nge": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "17", firefox: "50", firefox_android: "50", safari: "10.1" } }, "api.MediaSource.duration": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.endOfStream": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.handle": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "18" } }, "api.MediaSource.isTypeSupported_static": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.readyState": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.removeSourceBuffer": { baseline: false, support: { chrome: "\
31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.setLiveSeekableRange": { baseline: false, support: { chrome: "62", chrome_android: "62", edge: "17", firefox: "50", firefox_android: "50", safari: "10.1" } }, "api.MediaSource.sourceBuffers": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.MediaSource.sourceclose_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "87", firefox_android: "87", safari: "10.1" } }, "api.MediaSource.sourceended_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "41", safari: "10.1" } }, "api.MediaSource.sourceopen_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "41", safari: "10.1" } }, "api.MediaSource.worker_support": { baseline: false,
    support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.MediaSourceHandle": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "18", safari_ios: "18" } }, "api.SourceBuffer": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.abort": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.abort.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.abort_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "42", safari: "10.1" } }, "api.SourceBuffer.abort_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.appendBuffer": { baseline: false,
    support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.appendBuffer.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.appendWindowEnd": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.appendWindowEnd.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.appendWindowStart": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.appendWindowStart.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.audioTracks": { baseline: false, support: { safari: "8" } }, "api.SourceBuffer.audioTracks.worker_support": { baseline: false,
    support: {} }, "api.SourceBuffer.buffered": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.buffered.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.changeType": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "63", firefox_android: "63", safari: "12.1" } }, "api.SourceBuffer.changeType.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.error_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "42", safari: "10.1" } }, "api.SourceBuffer.error_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.mode": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "\
12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.mode.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.remove": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.remove.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.textTracks": { baseline: false, support: { safari: "8" } }, "api.SourceBuffer.timestampOffset": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.timestampOffset.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.update_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "4\
2", safari: "10.1" } }, "api.SourceBuffer.update_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.updateend_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "42", safari: "10.1" } }, "api.SourceBuffer.updateend_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.updatestart_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "42", safari: "10.1" } }, "api.SourceBuffer.updatestart_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.updating": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "42", safari: "8" } }, "api.SourceBuffer.updating.worker_support": { baseline: false,
    support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBuffer.videoTracks": { baseline: false, support: { safari: "8" } }, "api.SourceBuffer.videoTracks.worker_support": { baseline: false, support: {} }, "api.SourceBufferList": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.SourceBufferList.addsourcebuffer_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "41", safari: "10.1" } }, "api.SourceBufferList.addsourcebuffer_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.SourceBufferList.length": { baseline: false, support: { chrome: "31", chrome_android: "33", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } }, "api.SourceBufferList.length.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "\
108" } }, "api.SourceBufferList.removesourcebuffer_event": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "42", firefox_android: "41", safari: "10.1" } }, "api.SourceBufferList.removesourcebuffer_event.worker_support": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.TextTrack.sourceBuffer": { baseline: false, support: { safari: "8" } }, "api.VideoTrack.sourceBuffer": { baseline: false, support: { safari: "7" } } }, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "42", firefox_android: "41", safari: "8" } } }, mediacontroller: { compat_features: ["api.HTMLMediaElement.controller", "api.MediaController", "api.MediaController.MediaController", "api.MediaController.buffered", "api.MediaController.currentTime", "api.MediaController.defaultPlaybackRate", "api.MediaController.duration", "api.MediaController.muted", "api.MediaController.pause", "api.MediaController.paused", "api.MediaControlle\
r.play", "api.MediaController.playbackRate", "api.MediaController.playbackState", "api.MediaController.played", "api.MediaController.seekable", "api.MediaController.unpause", "api.MediaController.volume"], description: "The playback of multiple <video> or <audio> elements can be coordinated by a MediaController instance, for example to synchronize a sign-language interpreter track with the main video track.", description_html: "The playback of multiple <code>&#x3C;video></code> or <code>&#x3C;audio></code> elements can be coordinated by a <code>MediaController</code> instance, for example to synchronize a sign-language interpreter track with the main video track.", discouraged: { according_to: ["https://github.com/w3c/html/issues/246"], reason: "The MediaController API was dropped from the specification due to lack of implementations.", reason_html: "The <code>MediaController</code> API was dropped from the specification due to lack of implementations." }, kind: "feature", name: "Media\
Controller", spec: ["https://www.w3.org/TR/2018/SPSD-html5-20180327/embedded-content-0.html#synchronising-multiple-media-elements"], status: { baseline: false, by_compat_key: { "api.HTMLMediaElement.controller": { baseline: false, support: { safari: "6", safari_ios: "6" } }, "api.MediaController": { baseline: false, support: { safari: "6", safari_ios: "6" } }, "api.MediaController.MediaController": { baseline: false, support: { safari: "6", safari_ios: "6" } }, "api.MediaController.buffered": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.currentTime": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.defaultPlaybackRate": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.duration": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.muted": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.pause": { baseline: false,
    support: { safari: "6", safari_ios: "6" } }, "api.MediaController.paused": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.play": { baseline: false, support: { safari: "6", safari_ios: "6" } }, "api.MediaController.playbackRate": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.playbackState": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.played": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.seekable": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.unpause": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.MediaController.volume": { baseline: false, support: { safari: "7", safari_ios: "7" } } }, support: { safari: "7", safari_ios: "7" } } }, "mediastream-recording": { compat_features: ["api.BlobEvent", "api.BlobEvent.BlobEvent", "api.BlobEvent.data", "api.BlobEvent.timecode",
    "api.MediaRecorder", "api.MediaRecorder.MediaRecorder", "api.MediaRecorder.MediaRecorder.options_parameter", "api.MediaRecorder.audioBitrateMode", "api.MediaRecorder.audioBitsPerSecond", "api.MediaRecorder.dataavailable_event", "api.MediaRecorder.error_event", "api.MediaRecorder.isTypeSupported_static", "api.MediaRecorder.mimeType", "api.MediaRecorder.pause", "api.MediaRecorder.pause_event", "api.MediaRecorder.requestData", "api.MediaRecorder.resume", "api.MediaRecorder.resume_event", "api.MediaRecorder.start", "api.MediaRecorder.start_event", "api.MediaRecorder.state", "api.MediaRecorder.stop", "api.MediaRecorder.stop_event", "api.MediaRecorder.stream", "api.MediaRecorder.videoBitsPerSecond"], description: "The MediaRecorder API captures data generated by MediaStream or HTMLMediaElement objects for analysis, processing, or saving to disk. Also known as the Media Recording API.", description_html: "The <code>MediaRecorder</code> API captures data generated by <code>MediaStream</cod\
e> or <code>HTMLMediaElement</code> objects for analysis, processing, or saving to disk. Also known as the Media Recording API.", kind: "feature", name: "MediaStream recording", spec: ["https://w3c.github.io/mediacapture-record/"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.BlobEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "21", firefox_android: "21", safari: "14", safari_ios: "14" } }, "api.BlobEvent.BlobEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "21", firefox_android: "21", safari: "14", safari_ios: "14" } }, "api.BlobEvent.data": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "\
21", firefox_android: "21", safari: "14", safari_ios: "14" } }, "api.BlobEvent.timecode": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.MediaRecorder": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.MediaRecorder": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.MediaRecorder.options_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "43", firefox_android: "43", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorde\
r.audioBitrateMode": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "api.MediaRecorder.audioBitsPerSecond": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "71", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.MediaRecorder.dataavailable_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.error_event": { baseline: false, support: { firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.isTypeSupported_static": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "25", firefox_android: "25", safari: "\
14.1", safari_ios: "14" } }, "api.MediaRecorder.mimeType": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.pause": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.MediaRecorder.pause_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "65", firefox_android: "65", safari: "14.1", safari_ios: "14.5" } }, "api.MediaRecorder.requestData": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "\
25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.resume": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.MediaRecorder.resume_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "65", firefox_android: "65", safari: "14.1", safari_ios: "14.5" } }, "api.MediaRecorder.start": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.start_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "\
25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.state": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.stop": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.stop_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.stream": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "\
25", safari: "14.1", safari_ios: "14" } }, "api.MediaRecorder.videoBitsPerSecond": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "71", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14" } } }, menu: { compat_features: ["api.HTMLMenuElement", "html.elements.menu"], description: "The <menu> element represents an unordered list of action items (<li>), such as a toolbar. It is a semantic alternative to the <ul> element.", description_html: "The <code>&#x3C;menu></code> element represents an unordered list of action items (<code>&#x3C;li></code>), such as a toolbar. It is a semantic alternative to the <code>&#x3C;ul></code> element.", group: ["html-elements"], kind: "feature", name: "<menu>", spec: ["https://html.spec.whatwg.org/multipage/gro\
uping-content.html#menus"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLMenuElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.menu": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, messageerror: { compat_features: ["api.DedicatedWorkerGlobalScope.messageerror_event", "api.MessagePort.messageerror_event", "api.ServiceWorkerContainer.messageerror_event", "api.ServiceWorkerGlobalScope.messageerror_event", "api.Window.messageerror_eve\
nt", "api.Worker.messageerror_event"], description: "The messageerror event fires on a target, such as a window or worker, when an incoming message cannot be deserialized. This event can fire for many types of messages, such as cross-document messages or broadcast channel messages.", description_html: "The <code>messageerror</code> event fires on a target, such as a window or worker, when an incoming message cannot be deserialized. This event can fire for many types of messages, such as cross-document messages or broadcast channel messages.", group: ["messaging"], kind: "feature", name: "messageerror", spec: ["https://html.spec.whatwg.org/multipage/indices.html#event-messageerror", "https://w3c.github.io/ServiceWorker/#eventdef-serviceworkerglobalscope-messageerror"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.DedicatedWorkerGlobalScope.messageerror_event": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "\
2023-03-27", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "57", firefox_android: "57", safari: "16.4", safari_ios: "16.4" } }, "api.MessagePort.messageerror_event": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "57", firefox_android: "57", safari: "16.4", safari_ios: "16.4" } }, "api.ServiceWorkerContainer.messageerror_event": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "65", firefox_android: "65", safari: "16.4", safari_ios: "16.4" } }, "api.ServiceWorkerGlobalScope.messageerror_event": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "65", firefox_android: "65" } }, "api.Window.messageerror_event": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "60",
    chrome_android: "60", edge: "18", firefox: "57", firefox_android: "57", safari: "16.4", safari_ios: "16.4" } }, "api.Worker.messageerror_event": { baseline: false, support: { firefox: "57", firefox_android: "57", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "57", firefox_android: "57", safari: "16.4", safari_ios: "16.4" } } }, meta: { compat_features: ["api.HTMLMetaElement", "api.HTMLMetaElement.content", "api.HTMLMetaElement.httpEquiv", "api.HTMLMetaElement.media", "api.HTMLMetaElement.name", "html.elements.meta", "html.elements.meta.charset", "html.elements.meta.content", "html.elements.meta.http-equiv", "html.elements.meta.http-equiv.content-type", "html.elements.meta.http-equiv.refresh", "html.elements.meta.name", "html.elements.meta.name.referrer"], description: "The <meta> element represents metadata about the page used by the browser or search engines, including description, keywords, and character sets.", description_html: "\
The <code>&#x3C;meta></code> element represents metadata about the page used by the browser or search engines, including description, keywords, and character sets.", group: ["html-elements"], kind: "feature", name: "<meta>", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#meta"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLMetaElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLMetaElement.content": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLMetaElement.httpEquiv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLMetaElement.media": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "106", firefox_android: "106", safari: "15", safari_ios: "15" } }, "api.HTMLMetaElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.meta": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.meta.charset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.meta.content": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.meta.http-equiv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.meta.http-equiv.content-type": { baseline: "high", baseline_high_date: "≤2019-12-06", baseline_low_date: "≤2017-06-06", support: { chrome: "≤59", chrome_android: "≤59", edge: "12", firefox: "1", firefox_android: "4", safari: "≤10.1", safari_ios: "≤10.3" } }, "html.elements.meta.http-equiv.refresh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.meta.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.meta.name.referrer": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "17", chrome_android: "18", edge: "79", firefox: "36", firefox_android: "36", safari: "11.1", safari_ios: "12" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "meta-application-title": { compat_features: ["html.elements.meta.name.application-title"], description: `The name="application-title" attribute for the <meta> HTML element sets an installed web application's ti\
tle bar text.`, description_html: `The <code>name="application-title"</code> attribute for the <code>&#x3C;meta></code> HTML element sets an installed web application's title bar text.`, group: ["progressive-web-app"], kind: "feature", name: '<meta name="application-title">', spec: ["https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/DocumentSubtitle/explainer.md"], status: { baseline: false, by_compat_key: { "html.elements.meta.name.application-title": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } } }, support: { chrome: "134", chrome_android: "134", edge: "134" } } }, "meta-text-scale": { compat_features: ["html.elements.meta.name.text-scale"], description: `The <meta name="text-scale" content="scale" /> HTML element allows the browser's initial font size to be affected by the operating system text scale settings. The <meta name="text-scale" content="legacy" /> element is the default behavior that respects only browser font-size settings.`,
    description_html: `The <code>&#x3C;meta name="text-scale" content="scale" /></code> HTML element allows the browser's initial font size to be affected by the operating system text scale settings. The <code>&#x3C;meta name="text-scale" content="legacy" /></code> element is the default behavior that respects only browser font-size settings.`, kind: "feature", name: '<meta name="text-scale">', spec: ["https://drafts.csswg.org/css-fonts-5/#text-scale-meta"], status: { baseline: false, by_compat_key: { "html.elements.meta.name.text-scale": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146" } } }, support: { chrome: "146", chrome_android: "146", edge: "146" } } }, "meta-theme-color": { caniuse: ["meta-theme-color"], compat_features: ["html.elements.meta.name.theme-color"], description: 'The name="theme-color" attribute for the <meta> HTML element suggests a color that the browser can use to customize the display of the page or the browser user interface.', description_html: '\
The <code>name="theme-color"</code> attribute for the <code>&#x3C;meta></code> HTML element suggests a color that the browser can use to customize the display of the page or the browser user interface.', group: ["html"], kind: "feature", name: '<meta name="theme-color">', spec: ["https://html.spec.whatwg.org/multipage/semantics.html#meta-theme-color"], status: { baseline: false, by_compat_key: { "html.elements.meta.name.theme-color": { baseline: false, support: { chrome_android: "92", safari: "15", safari_ios: "15" } } }, support: { chrome_android: "92", safari: "15", safari_ios: "15" } } }, meter: { caniuse: ["meter"], compat_features: ["api.HTMLMeterElement", "api.HTMLMeterElement.high", "api.HTMLMeterElement.labels", "api.HTMLMeterElement.low", "api.HTMLMeterElement.max", "api.HTMLMeterElement.min", "api.HTMLMeterElement.optimum", "api.HTMLMeterElement.value", "html.elements.meter", "html.elements.meter.high", "html.elements.meter.low", "html.elements.meter.max", "html.elements.mete\
r.min", "html.elements.meter.optimum", "html.elements.meter.value"], description: "The <meter> element represents a scalar value within a known range or a fractional value, typically shown as a progress bar.", description_html: "The <code>&#x3C;meter></code> element represents a scalar value within a known range or a fractional value, typically shown as a progress bar.", group: ["forms", "html-elements"], kind: "feature", name: "<meter>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-meter-element"], status: { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", by_compat_key: { "api.HTMLMeterElement": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.high": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: {
    chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.low": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.max": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.min": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "6", chrome_android: "\
18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.optimum": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "api.HTMLMeterElement.value": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "6" } }, "html.elements.meter": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "10.3" } }, "html.elements.meter.high": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13",
    firefox: "16", firefox_android: "16", safari: "6", safari_ios: "10.3" } }, "html.elements.meter.low": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "10.3" } }, "html.elements.meter.max": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "10.3" } }, "html.elements.meter.min": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "10.3" } }, "html.elements.meter.optimum": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "\
16", firefox_android: "16", safari: "6", safari_ios: "10.3" } }, "html.elements.meter.value": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "6", chrome_android: "18", edge: "13", firefox: "16", firefox_android: "16", safari: "6", safari_ios: "10.3" } } }, support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "6", safari_ios: "10.3" } } }, "min-max-clamp": { caniuse: ["css-math-functions"], compat_features: ["css.types.clamp", "css.types.max", "css.types.min"], description: "The min() and max() CSS functions return the minimum or maximum of the arguments, while clamp() clamps a value to a given range.", description_html: "The <code>min()</code> and <code>max()</code> CSS functions return the minimum or maximum of the arguments, while <code>clamp()</code> clamps a value to a given range.", group: ["css"], kind: "feature", name: "min(), max(), and clamp()", spec: ["https://drafts.\
csswg.org/css-values-4/#comp-func"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "css.types.clamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "css.types.max": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "75", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "css.types.min": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "75", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "\
13.4" } } }, "min-max-content": { compat_features: ["css.properties.height.max-content", "css.properties.height.min-content", "css.properties.max-height.max-content", "css.properties.max-height.min-content", "css.properties.max-width.max-content", "css.properties.max-width.min-content", "css.properties.min-height.max-content", "css.properties.min-height.min-content", "css.properties.min-width.max-content", "css.properties.min-width.min-content", "css.properties.width.max-content", "css.properties.width.min-content"], description: "The min-content and max-content CSS keywords represent the smallest and largest intrinsic sizes of an element.", description_html: "The <code>min-content</code> and <code>max-content</code> CSS keywords represent the smallest and largest intrinsic sizes of an element.", group: ["layout"], kind: "feature", name: "min-content and max-content", spec: ["https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content", "https://drafts.csswg.org/css-sizing-3/#valde\
f-width-min-content"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.height.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.height.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.max-height.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.max-height.min-content": { baseline: "high", baseline_high_date: "2022-07-\
15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.max-width.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.max-width.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.min-height.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.min-height.min-content": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.min-width.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.min-width.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.width.max-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } }, "css.properties.w\
idth.min-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } } }, support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "66", firefox_android: "66", safari: "11", safari_ios: "11" } } }, "min-max-width-height": { caniuse: ["minmaxwh"], compat_features: ["css.properties.max-height", "css.properties.max-height.none", "css.properties.max-width", "css.properties.max-width.none", "css.properties.min-height", "css.properties.min-height.auto", "css.properties.min-width", "css.properties.min-width.auto"], description: "The min-width, min-height, max-width, and max-height CSS properties set the minimum and maximum size of an element.", description_html: "The <code>min-width</code>, <code>min-height</code>, <code>max-width</code>, and <code>max-height</code> CSS properties set the minimum and maximum size of a\
n element.", kind: "feature", name: "Min and max width and height", spec: ["https://drafts.csswg.org/css-sizing-3/#min-size-properties", "https://drafts.csswg.org/css-sizing-3/#max-size-properties"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.max-height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.max-height.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.max-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "css.properties.max-width.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.min-height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.min-height.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "css.properties.min-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "css.properties.min-width.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "21", chrome_android: "25", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } } }, support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } } }, "mix-blend-mode": { caniuse: ["css-mixblendmode"], compat_features: ["css.properties.mix-blend-mode", "css.properties.mix-blend-mode.plus-darker", "css.properties.mix-blend-mode.plus-lighter", "css.properties.mix-blend-mode.svg_elements"], description: "The mix-blend-mode CSS property blends an element's content with its background or parent elements using blend modes like multiply, difference, or color.", description_html: "The <code>mix-blend-mode</code> CSS property blends an element's content with its background or parent elements using blend modes like <code>multiply</code>, <c\
ode>difference</code>, or <code>color</code>.", group: ["blend-mode"], kind: "feature", name: "mix-blend-mode", spec: ["https://drafts.csswg.org/compositing-2/#mix-blend-mode"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.mix-blend-mode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "32", firefox_android: "32", safari: "8", safari_ios: "8" } }, "css.properties.mix-blend-mode.plus-darker": { baseline: false, support: { safari: "9", safari_ios: "9" } }, "css.properties.mix-blend-mode.plus-lighter": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "99", firefox_android: "99", safari: "9.1", safari_ios: "9.3" } }, "css.properties.mix-blend-mode.svg_elements": { baseline: false, support: { chrome: "\
41", edge: "79", firefox: "32", firefox_android: "32" } } }, support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "32", firefox_android: "32", safari: "8", safari_ios: "8" } } }, "mixed-content": { compat_features: ["http.mixed-content", "http.mixed-content.allow_file_urls", "http.mixed-content.allow_localhost_url", "http.mixed-content.allow_loopback_url", "http.mixed-content.auto_upgrade_images", "http.mixed-content.auto_upgrade_video_audio", "http.mixed-content.block_mixed_downloads", "http.mixed-content.blockable_mixed_content"], description: "When a document is loaded over HTTPS, browsers ensure that none of the document's resources are loaded over an insecure protocol. Instead, resources that the document attempts to load over an insecure protocol are either loaded over HTTPS or are blocked.", description_html: "When a document is loaded over HTTPS, browsers ensure that none of the document's resources are loaded over an insecure protocol. Instead, resources that th\
e document attempts to load over an insecure protocol are either loaded over HTTPS or are blocked.", group: ["security"], kind: "feature", name: "Mixed content handling", spec: ["https://w3c.github.io/webappsec-mixed-content/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "http.mixed-content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "≤79", chrome_android: "≤79", edge: "79", firefox: "≤23", firefox_android: "≤23", safari: "≤9.1", safari_ios: "≤9.3" } }, "http.mixed-content.allow_file_urls": { baseline: false, support: { chrome: "≤79", chrome_android: "≤79", edge: "79", firefox: "≤23", firefox_android: "≤23" } }, "http.mixed-content.allow_localhost_url": { baseline: false, support: { chrome: "≤79", chrome_android: "≤79", edge: "79", firefox: "84", firefox_android: "84" } }, "http.mixed-content.allow_loopback_url": { baseline: false,
    support: { chrome: "≤79", chrome_android: "≤79", edge: "79", firefox: "55", firefox_android: "55" } }, "http.mixed-content.auto_upgrade_images": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "127", firefox_android: "127" } }, "http.mixed-content.auto_upgrade_video_audio": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "127", firefox_android: "127" } }, "http.mixed-content.block_mixed_downloads": { baseline: false, support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90" } }, "http.mixed-content.blockable_mixed_content": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "23", firefox_android: "23", safari: "≤9.1", safari_ios: "≤9.3" } } }, support: { chrome: "≤79", chrome_android: "≤79", edge: "79", firefox: "≤23", firefox_android: "≤23", safari: "\
≤9.1", safari_ios: "≤9.3" } } }, modal: { compat_features: ["css.selectors.modal"], description: "The :modal pseudo-class selects elements that put other elements into a non-interactive state, such as a fullscreen element or a <dialog> element used with showModal().", description_html: "The <code>:modal</code> pseudo-class selects elements that put other elements into a non-interactive state, such as a fullscreen element or a <code>&#x3C;dialog></code> element used with <code>showModal()</code>.", group: ["selectors"], kind: "feature", name: ":modal", spec: ["https://drafts.csswg.org/selectors-4/#modal-state"], status: { baseline: "high", baseline_high_date: "2025-03-02", baseline_low_date: "2022-09-02", by_compat_key: { "css.selectors.modal": { baseline: "high", baseline_high_date: "2025-03-02", baseline_low_date: "2022-09-02", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "103", firefox_android: "103", safari: "15.6", safari_ios: "15.6" } } }, support: { chrome: "\
105", chrome_android: "105", edge: "105", firefox: "103", firefox_android: "103", safari: "15.6", safari_ios: "15.6" } } }, modulepreload: { caniuse: ["link-rel-modulepreload"], compat_features: ["html.elements.link.rel.modulepreload"], description: 'The rel="modulepreload" attribute for the <link> HTML element indicates that a module script should be fetched, parsed, and compiled preemptively, and stored for later execution.', description_html: 'The <code>rel="modulepreload"</code> attribute for the <code>&#x3C;link></code> HTML element indicates that a module script should be fetched, parsed, and compiled preemptively, and stored for later execution.', kind: "feature", name: '<link rel="modulepreload">', spec: ["https://html.spec.whatwg.org/multipage/links.html#link-type-modulepreload"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "html.elements.link.rel.modulepreload": { baseline: "high", baseline_high_date: "2026-0\
3-18", baseline_low_date: "2023-09-18", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } } }, "motion-path": { caniuse: ["css-motion-paths"], compat_features: ["css.properties.offset", "css.properties.offset-anchor", "css.properties.offset-anchor.auto", "css.properties.offset-anchor.bottom", "css.properties.offset-anchor.center", "css.properties.offset-anchor.left", "css.properties.offset-anchor.right", "css.properties.offset-anchor.top", "css.properties.offset-distance", "css.properties.offset-path", "css.properties.offset-path.basic_shape", "css.properties.offset-path.border-box", "css.properties.offset-path.content-box", "css.properties.offset-path.fill-box", "css.properties.offset-path.margin-box", "css.properties.offset-path.none", "css.properties.offset-path.paddi\
ng-box", "css.properties.offset-path.path", "css.properties.offset-path.ray", "css.properties.offset-path.stroke-box", "css.properties.offset-path.url", "css.properties.offset-path.view-box", "css.properties.offset-position", "css.properties.offset-position.auto", "css.properties.offset-position.bottom", "css.properties.offset-position.center", "css.properties.offset-position.left", "css.properties.offset-position.normal", "css.properties.offset-position.right", "css.properties.offset-position.top", "css.properties.offset-rotate", "css.properties.offset-rotate.auto", "css.properties.offset-rotate.reverse", "css.types.ray", "css.types.ray.position", "css.types.ray.size"], description: "The offset CSS property animates an element along a defined motion path.", description_html: "The <code>offset</code> CSS property animates an element along a defined motion path.", group: ["css"], kind: "feature", name: "Motion path", spec: ["https://drafts.csswg.org/motion-1/"], status: { baseline: "hig\
h", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: { "css.properties.offset": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor.auto": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor.bottom": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "\
116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor.center": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor.left": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor.right": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-anchor.top": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: {
    chrome: "116", chrome_android: "116", edge: "116", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-distance": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-path": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "72", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "css.properties.offset-path.basic_shape": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.border-box": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116", chrome_android: "\
116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.content-box": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.fill-box": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.margin-box": { baseline: false, support: { safari: "18", safari_ios: "18" } }, "css.properties.offset-path.none": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.padding-box": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116",
    chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.path": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-path.ray": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-path.stroke-box": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-path.url": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "\
122", safari: "17", safari_ios: "17" } }, "css.properties.offset-path.view-box": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "18", safari_ios: "18" } }, "css.properties.offset-position": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-position.auto": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-position.bottom": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-position.center": { baseline: "\
low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-position.left": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-position.normal": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "17.2", safari_ios: "17.2" } }, "css.properties.offset-position.right": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-position.top": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "\
116", edge: "116", firefox: "122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.properties.offset-rotate": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-rotate.auto": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.offset-rotate.reverse": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.types.ray": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "\
122", firefox_android: "122", safari: "16", safari_ios: "16" } }, "css.types.ray.position": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "17.2", safari_ios: "17.2" } }, "css.types.ray.size": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "122", firefox_android: "122", safari: "17", safari_ios: "17" } } }, support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } } }, "mouse-events": { compat_features: ["api.Element.auxclick_event", "api.Element.click_event", "api.Element.contextmenu_event", "api.Element.dblclick_event", "api.Element.mousedown_event", "api.Element.mouseenter_event", "api.Element.mouseleave_event", "api.Element.mousemove_event", "api.Element.mouseout_event", "api.Element.mouseover_event", "api.Element.mouseup_e\
vent", "api.HTMLElement.click", "api.MouseEvent", "api.MouseEvent.MouseEvent", "api.MouseEvent.altKey", "api.MouseEvent.button", "api.MouseEvent.buttons", "api.MouseEvent.clientX", "api.MouseEvent.clientY", "api.MouseEvent.ctrlKey", "api.MouseEvent.getModifierState", "api.MouseEvent.metaKey", "api.MouseEvent.movementX", "api.MouseEvent.movementY", "api.MouseEvent.offsetX", "api.MouseEvent.offsetY", "api.MouseEvent.pageX", "api.MouseEvent.pageY", "api.MouseEvent.relatedTarget", "api.MouseEvent.screenX", "api.MouseEvent.screenY", "api.MouseEvent.shiftKey", "api.MouseEvent.x", "api.MouseEvent.y"], description: "Mouse events, such as click, mousedown, or mousemove, fire when users interact with an input or pointing device such as a mouse, trackpad, or touchscreen.", description_html: "Mouse events, such as <code>click</code>, <code>mousedown</code>, or <code>mousemove</code>, fire when users interact with an input or pointing device such as a mouse, trackpad, or touchscreen.", kind: "featu\
re", name: "Mouse events", spec: ["https://w3c.github.io/pointerevents/#mouse-event-types"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Element.auxclick_event": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "18.2", safari_ios: "18.2" } }, "api.Element.click_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3", safari_ios: "1" } }, "api.Element.contextmenu_event": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3" } }, "api.Element.dblclick_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "1\
2", firefox: "6", firefox_android: "6", safari: "3", safari_ios: "1" } }, "api.Element.mousedown_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Element.mouseenter_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "10", firefox_android: "10", safari: "7", safari_ios: "7" } }, "api.Element.mouseleave_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "10", firefox_android: "10", safari: "7", safari_ios: "7" } }, "api.Element.mousemove_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "\
6", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Element.mouseout_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1", safari_ios: "1" } }, "api.Element.mouseover_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.Element.mouseup_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "4", safari_ios: "3.2" } }, "api.HTMLElement.click": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "\
4", safari: "6", safari_ios: "6" } }, "api.MouseEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.MouseEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "11", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MouseEvent.altKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.button": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "\
api.MouseEvent.buttons": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "15", firefox_android: "15", safari: "11.1", safari_ios: "11.3" } }, "api.MouseEvent.clientX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.clientY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.ctrlKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.getModif\
ierState": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "15", firefox_android: "15", safari: "12.1", safari_ios: "12.2" } }, "api.MouseEvent.metaKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.movementX": { baseline: false, support: { chrome: "37", edge: "13", firefox: "41", firefox_android: "41", safari: "9", safari_ios: "17" } }, "api.MouseEvent.movementY": { baseline: false, support: { chrome: "37", edge: "13", firefox: "41", firefox_android: "41", safari: "9", safari_ios: "17" } }, "api.MouseEvent.offsetX": { baseline: "high", baseline_high_date: "2018-06-15", baseline_low_date: "2015-12-15", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "39", firefox_android: "43",
    safari: "1", safari_ios: "1" } }, "api.MouseEvent.offsetY": { baseline: "high", baseline_high_date: "2018-06-15", baseline_low_date: "2015-12-15", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "39", firefox_android: "43", safari: "1", safari_ios: "1" } }, "api.MouseEvent.pageX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.pageY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.relatedTarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "api.MouseEvent.screenX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.screenY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.shiftKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.MouseEvent.x": { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "53", firefox_android: "53", safari: "3.1", safari_ios: "2" } }, "api.MouseEvent.y": { baseline: "\
high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "53", firefox_android: "53", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "move-before": { compat_features: ["api.CustomElementRegistry.define.connectedMoveCallback_lifecycle_callback", "api.Document.moveBefore", "api.DocumentFragment.moveBefore", "api.Element.moveBefore"], description: "The moveBefore() DOM method relocates a node while preserving its state. For example, you can move the active element without losing focus, move an animated element without resetting the animation, or move an iframe without reloading its content.", description_html: "The <code>moveBefore()</code> DOM method relocates a node while preserving its state. For example, you can move the active element without losing focus, move an animated element w\
ithout resetting the animation, or move an iframe without reloading its content.", group: ["dom"], kind: "feature", name: "moveBefore()", spec: ["https://dom.spec.whatwg.org/#dom-parentnode-movebefore", "https://html.spec.whatwg.org/multipage/custom-elements.html#preserving-custom-element-state-when-moved"], status: { baseline: false, by_compat_key: { "api.CustomElementRegistry.define.connectedMoveCallback_lifecycle_callback": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "144", firefox_android: "144" } }, "api.Document.moveBefore": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "144", firefox_android: "144" } }, "api.DocumentFragment.moveBefore": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "144", firefox_android: "144" } }, "api.Element.moveBefore": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "144", firefox_android: "\
144" } } }, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "144", firefox_android: "144" } } }, "multi-column": { compat_features: ["css.properties.align-content.multicol_context", "css.properties.column-count", "css.properties.column-count.auto", "css.properties.column-gap", "css.properties.column-gap.multicol_context", "css.properties.column-gap.multicol_context.calc_values", "css.properties.column-gap.multicol_context.percentage_values", "css.properties.column-gap.normal", "css.properties.column-rule", "css.properties.column-rule-color", "css.properties.column-rule-color.transparent", "css.properties.column-rule-style", "css.properties.column-rule-style.dashed", "css.properties.column-rule-style.dotted", "css.properties.column-rule-style.double", "css.properties.column-rule-style.groove", "css.properties.column-rule-style.hidden", "css.properties.column-rule-style.inset", "css.properties.column-rule-style.none", "css.properties.column-rule-style.outset", "css\
.properties.column-rule-style.ridge", "css.properties.column-rule-style.solid", "css.properties.column-rule-width", "css.properties.column-rule-width.medium", "css.properties.column-rule-width.thick", "css.properties.column-rule-width.thin", "css.properties.column-rule.dashed", "css.properties.column-rule.dotted", "css.properties.column-rule.double", "css.properties.column-rule.groove", "css.properties.column-rule.hidden", "css.properties.column-rule.inset", "css.properties.column-rule.medium", "css.properties.column-rule.none", "css.properties.column-rule.outset", "css.properties.column-rule.ridge", "css.properties.column-rule.solid", "css.properties.column-rule.thick", "css.properties.column-rule.thin", "css.properties.column-rule.transparent", "css.properties.column-width", "css.properties.column-width.auto", "css.properties.columns", "css.properties.gap.multicol_context"], description: "Multi-column layout flows an element's content across one or more columns in a single row, witho\
ut affecting the display property of its children.", description_html: "Multi-column layout flows an element's content across one or more columns in a single row, without affecting the <code>display</code> property of its children.", group: ["multi-column"], kind: "feature", name: "Multi-column layout", spec: ["https://drafts.csswg.org/css-multicol-1/"], status: { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", by_compat_key: { "css.properties.align-content.multicol_context": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123", safari: "17.4", safari_ios: "17.4" } }, "css.properties.column-count": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-count.auto": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "20\
17-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-gap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.column-gap.multicol_context": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "css.properties.column-gap.multicol_context.calc_values": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12.1", safari_ios: "12.2" } }, "css.properties.column-gap.multicol_context.percentage_values": {
    baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "css.properties.column-gap.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.column-rule": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-color": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-\
rule-color.transparent": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.dashed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.dotted": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "\
9" } }, "css.properties.column-rule-style.double": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.groove": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.hidden": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.inset": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "\
52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.none": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.outset": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.ridge": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-style.solid": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "\
12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-width": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-width.medium": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-width.thick": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule-width.thin": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "\
50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.dashed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.dotted": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.double": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.groove": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: {
    chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.hidden": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.inset": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.medium": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.none": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "201\
7-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.outset": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.ridge": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.solid": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.thick": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "\
2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.thin": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-rule.transparent": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.column-width": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "50", firefox_android: "50", safari: "9", safari_ios: "9" } }, "css.properties.column-width.auto": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "\
2016-11-15", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "50", firefox_android: "50", safari: "9", safari_ios: "9" } }, "css.properties.columns": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } }, "css.properties.gap.multicol_context": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "16", firefox: "61", firefox_android: "61", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "52", firefox_android: "52", safari: "9", safari_ios: "9" } } }, "mutation-events": { compat_features: ["api.MutationEvent", "api.MutationEvent.attrChange", "api.MutationEvent.attrName", "api.MutationEvent.initMutationEvent", "api.MutationEvent.newValue", "api.MutationEvent.prev\
Value", "api.MutationEvent.relatedNode"], description: "Mutation events like DOMSubtreeModified, DOMNodeInserted, or DOMNodeRemoved fire when DOM changes occur.", description_html: "Mutation events like <code>DOMSubtreeModified</code>, <code>DOMNodeInserted</code>, or <code>DOMNodeRemoved</code> fire when DOM changes occur.", discouraged: { according_to: ["https://www.w3.org/TR/2024/WD-uievents-20240906/#legacy-mutationevent-events", "https://github.com/web-platform-tests/interop/issues/784"], alternatives: ["mutationobserver"], reason: "Mutation events negatively impact performance and they were selected for removal from the web as part of Interop 2025.", reason_html: "Mutation events negatively impact performance and they were selected for removal from the web as part of Interop 2025.", removal_date: "2025-09-15" }, group: ["dom"], kind: "feature", name: "Mutation events", spec: ["https://w3c.github.io/uievents/"], status: { baseline: false, by_compat_key: { "api.MutationEvent": { baseline: false,
    support: {} }, "api.MutationEvent.attrChange": { baseline: false, support: {} }, "api.MutationEvent.attrName": { baseline: false, support: {} }, "api.MutationEvent.initMutationEvent": { baseline: false, support: {} }, "api.MutationEvent.newValue": { baseline: false, support: {} }, "api.MutationEvent.prevValue": { baseline: false, support: {} }, "api.MutationEvent.relatedNode": { baseline: false, support: {} } }, support: {} } }, mutationobserver: { compat_features: ["api.MutationObserver", "api.MutationObserver.MutationObserver", "api.MutationObserver.disconnect", "api.MutationObserver.observe", "api.MutationObserver.takeRecords", "api.MutationRecord", "api.MutationRecord.addedNodes", "api.MutationRecord.attributeName", "api.MutationRecord.attributeNamespace", "api.MutationRecord.nextSibling", "api.MutationRecord.oldValue", "api.MutationRecord.previousSibling", "api.MutationRecord.removedNodes", "api.MutationRecord.target", "api.MutationRecord.type"], description: "The MutationObse\
rver API watches for changes to the DOM tree and calls a callback function when DOM changes occur.", description_html: "The <code>MutationObserver</code> API watches for changes to the DOM tree and calls a callback function when DOM changes occur.", group: ["dom"], kind: "feature", name: "MutationObserver", spec: ["https://dom.spec.whatwg.org/#interface-mutationobserver"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.MutationObserver": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationObserver.MutationObserver": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.Mutati\
onObserver.disconnect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationObserver.observe": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationObserver.takeRecords": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationR\
ecord.addedNodes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord.attributeName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord.attributeNamespace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord.nextSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } },
    "api.MutationRecord.oldValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord.previousSibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord.removedNodes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.MutationRecord.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "\
7" } }, "api.MutationRecord.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } } }, support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "14", firefox_android: "14", safari: "7", safari_ios: "7" } } }, "named-color": { caniuse: ["css-rebeccapurple"], compat_features: ["css.types.color.named-color", "css.types.color.named-color.rebeccapurple", "css.types.color.named-color.transparent"], description: "Some CSS color values can be referenced by name, such as red or limegreen. They stand in for specific RGB color values.", description_html: "Some CSS color values can be referenced by name, such as <code>red</code> or <code>limegreen</code>. They stand in for specific RGB color values.", group: ["color-types"], kind: "feature", name: "Named colors", spec: ["https://drafts.csswg.org/css-color-4/#named-colors"],
    status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.color.named-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.color.named-color.rebeccapurple": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "33", firefox_android: "33", safari: "9", safari_ios: "8" } }, "css.types.color.named-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } } }, namespace: { caniuse: ["css-namespaces"], compat_features: ["api.CSSNamespaceRule", "api.CSSNamespaceRule.namespaceURI", "api.CSSNamespaceRule.prefix", "css.at-rules.namespace", "css.selectors.namespace"], description: "The @namespace CSS rule sets a default namespace or namespace prefix. Namespace prefixes allow CSS selectors to distinguish elements with the same name but different document types, such as the HTML <a> element and the SVG <a> element.", description_html: "The <code>@namespace</code> CSS rule sets a default namespace or namespace prefix. Namespace prefixes allow CSS selectors to distinguish elements with the same name but different document types, such as the HTML <code>&#x3C;a></code> element and the SVG <code>&#x3C;a></code> element.", group: ["css", "selectors"], kind: "feature", name: "@namespace", spec: ["https://drafts.csswg.org/css-namespaces-3/#declaration"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    by_compat_key: { "api.CSSNamespaceRule": { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "53", firefox_android: "53", safari: "10.1", safari_ios: "10.3" } }, "api.CSSNamespaceRule.namespaceURI": { baseline: "high", baseline_high_date: "2020-09-13", baseline_low_date: "2018-03-13", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "59", firefox_android: "59", safari: "10.1", safari_ios: "10.3" } }, "api.CSSNamespaceRule.prefix": { baseline: "high", baseline_high_date: "2020-09-13", baseline_low_date: "2018-03-13", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "59", firefox_android: "59", safari: "10.1", safari_ios: "10.3" } }, "css.at-rules.namespace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } }, "css.selectors.namespace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, nav: { compat_features: ["html.elements.nav"], description: "The <nav> element represents a section of a page whose purpose is to provide navigation links, either within the current document or to other documents.", description_html: "The <code>&#x3C;nav></code> element represents a section of a page whose purpose is to provide navigation links, either within the current document or to other documents.", group: ["landmark-elements"], kind: "feature", name: "<nav>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-nav-element"], status: { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.nav": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, navigation: { compat_features: ["api.NavigateEvent", "api.NavigateEvent.NavigateEvent", "api.NavigateEvent.canIntercept", "api.NavigateEvent.destination", "api.NavigateEvent.downloadRequest", "api.NavigateEvent.formData", "api.NavigateEvent.hasUAVisualTransition", "api.NavigateEvent.hashChange", "api.NavigateEvent.info", "api.NavigateEvent.intercept", "api.NavigateEvent.navigationType", "api.NavigateEvent.scroll", "api.NavigateEvent.signal", "api.NavigateEvent.userInitiated", "api.Navigation", "api.Navigation.activation", "api.Navigation.back", "api.Navigation.\
canGoBack", "api.Navigation.canGoForward", "api.Navigation.currentEntry", "api.Navigation.currententrychange_event", "api.Navigation.entries", "api.Navigation.forward", "api.Navigation.navigate", "api.Navigation.navigate_event", "api.Navigation.navigateerror_event", "api.Navigation.navigatesuccess_event", "api.Navigation.reload", "api.Navigation.transition", "api.Navigation.traverseTo", "api.Navigation.updateCurrentEntry", "api.NavigationActivation", "api.NavigationActivation.entry", "api.NavigationActivation.from", "api.NavigationActivation.navigationType", "api.NavigationCurrentEntryChangeEvent", "api.NavigationCurrentEntryChangeEvent.NavigationCurrentEntryChangeEvent", "api.NavigationCurrentEntryChangeEvent.from", "api.NavigationCurrentEntryChangeEvent.navigationType", "api.NavigationDestination", "api.NavigationDestination.getState", "api.NavigationDestination.id", "api.NavigationDestination.index", "api.NavigationDestination.key", "api.NavigationDestination.sameDocument", "api.Nav\
igationDestination.url", "api.NavigationHistoryEntry", "api.NavigationHistoryEntry.dispose_event", "api.NavigationHistoryEntry.getState", "api.NavigationHistoryEntry.id", "api.NavigationHistoryEntry.index", "api.NavigationHistoryEntry.key", "api.NavigationHistoryEntry.sameDocument", "api.NavigationHistoryEntry.url", "api.NavigationTransition", "api.NavigationTransition.finished", "api.NavigationTransition.from", "api.NavigationTransition.navigationType", "api.Window.navigation"], description: "The navigation API initiates, intercepts, or modifies browser navigation actions. Not to be confused with the navigator API.", description_html: "The <code>navigation</code> API initiates, intercepts, or modifies browser navigation actions. Not to be confused with the <code>navigator</code> API.", kind: "feature", name: "Navigation API", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigation-api"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: {
    "api.NavigateEvent": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.NavigateEvent": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.canIntercept": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.destination": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.downloadRequest": { baseline: "low", baseline_low_date: "2026-01-13", support: {
    chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.formData": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.hasUAVisualTransition": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.hashChange": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.info": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147",
    safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.intercept": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.navigationType": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.scroll": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.signal": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigateEvent.userInitiated": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.activation": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.back": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.canGoBack": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26\
.2", safari_ios: "26.2" } }, "api.Navigation.canGoForward": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.currentEntry": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.currententrychange_event": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.entries": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.forward": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.navigate": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.navigate_event": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.navigateerror_event": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.navigatesuccess_event": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "1\
47", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.reload": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.transition": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.traverseTo": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Navigation.updateCurrentEntry": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationActivation": { baseline: "\
low", baseline_low_date: "2026-01-13", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationActivation.entry": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationActivation.from": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationActivation.navigationType": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationCurrentEntryChangeEvent": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "\
102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationCurrentEntryChangeEvent.NavigationCurrentEntryChangeEvent": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationCurrentEntryChangeEvent.from": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationCurrentEntryChangeEvent.navigationType": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationDestination": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102",
    firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationDestination.getState": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationDestination.id": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationDestination.index": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationDestination.key": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "a\
pi.NavigationDestination.sameDocument": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationDestination.url": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.dispose_event": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.getState": { baseline: "low", baseline_low_date: "\
2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.id": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.index": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.key": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.sameDocument": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "\
147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationHistoryEntry.url": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationTransition": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationTransition.finished": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationTransition.from": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.NavigationTransit\
ion.navigationType": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } }, "api.Window.navigation": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "147", firefox_android: "147", safari: "26.2", safari_ios: "26.2" } } }, "navigation-precommit-handlers": { compat_features: ["api.NavigateEvent.intercept.precommitHandler_option", "api.NavigationPrecommitController", "api.NavigationPrecommitController.addHandler", "api.NavigationPrecommitController.redirect"], description: "The precommitHandler callback option to NavigateEvent's intercept() method returns a promise that defers navigation until the promise resolves. You can use this to ch\
ange the navigation's URL, state, and history before navigation occurs.", description_html: "The <code>precommitHandler</code> callback option to <code>NavigateEvent</code>'s <code>intercept()</code> method returns a promise that defers navigation until the promise resolves. You can use this to change the navigation's URL, state, and history before navigation occurs.", kind: "feature", name: "Navigation precommit handlers", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-navigationinterceptoptions-precommithandler"], status: { baseline: false, by_compat_key: { "api.NavigateEvent.intercept.precommitHandler_option": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "147", firefox_android: "147" } }, "api.NavigationPrecommitController": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "147", firefox_android: "147" } }, "api.NavigationPrecommitController.addHandler": { baseline: false,
    support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.NavigationPrecommitController.redirect": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "147", firefox_android: "147" } } }, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } } }, "navigation-timing": { compat_features: ["api.PerformanceNavigationTiming", "api.PerformanceNavigationTiming.criticalCHRestart", "api.PerformanceNavigationTiming.domComplete", "api.PerformanceNavigationTiming.domContentLoadedEventEnd", "api.PerformanceNavigationTiming.domContentLoadedEventStart", "api.PerformanceNavigationTiming.domInteractive", "api.PerformanceNavigationTiming.loadEventEnd", "api.PerformanceNavigationTiming.loadEventStart", "api.PerformanceNavigationTiming.redirectCount", "api.PerformanceNavigationTiming.toJSON", "api.PerformanceNavigationTiming.type", "api.PerformanceNavigationTiming\
.unloadEventEnd", "api.PerformanceNavigationTiming.unloadEventStart"], description: "The navigation performance entry and the PerformanceNavigationTiming API measures navigation events, such as loading time or the number of redirects.", description_html: "The <code>navigation</code> performance entry and the <code>PerformanceNavigationTiming</code> API measures navigation events, such as loading time or the number of redirects.", group: ["performance"], kind: "feature", name: "Navigation timing", spec: ["https://w3c.github.io/navigation-timing/"], status: { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", by_compat_key: { "api.PerformanceNavigationTiming": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.criticalCHRestart": { baseline: false, support: {
    chrome: "116", chrome_android: "116", edge: "116" } }, "api.PerformanceNavigationTiming.domComplete": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.domContentLoadedEventEnd": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.domContentLoadedEventStart": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.domInteractive": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "\
2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.loadEventEnd": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.loadEventStart": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.redirectCount": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.toJSON": {
    baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.type": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.unloadEventEnd": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } }, "api.PerformanceNavigationTiming.unloadEventStart": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "\
15", safari_ios: "15.1" } } }, support: { chrome: "57", chrome_android: "57", edge: "12", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15.1" } } }, "navigation-timing-confidence": { compat_features: ["api.PerformanceNavigationTiming.confidence", "api.PerformanceTimingConfidence", "api.PerformanceTimingConfidence.randomizedTriggerRate", "api.PerformanceTimingConfidence.toJSON", "api.PerformanceTimingConfidence.value"], description: "The confidence property of a navigation timing entry describes whether the navigation metric is likely to be representative the page's performance (high confidence) or affected by transient conditions, such as browser startup (low confidence).", description_html: "The <code>confidence</code> property of a navigation timing entry describes whether the navigation metric is likely to be representative the page's performance (high confidence) or affected by transient conditions, such as browser startup (low confidence).", kind: "feature", name: "\
Navigation timing confidence", spec: ["https://w3c.github.io/navigation-timing/#sec-performance-timing-confidence"], status: { baseline: false, by_compat_key: { "api.PerformanceNavigationTiming.confidence": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.PerformanceTimingConfidence": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.PerformanceTimingConfidence.randomizedTriggerRate": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.PerformanceTimingConfidence.toJSON": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.PerformanceTimingConfidence.value": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } } }, support: { chrome: "145", chrome_android: "145", edge: "145" } } }, navigator: { compat_features: ["api.Navigator", "api.Window.navigator"], description: "The window.navigator API is a generi\
c global object, under which many other, more interesting APIs are located. It doesn't do anything interesting on its own.", description_html: "The <code>window.navigator</code> API is a generic global object, under which many other, more interesting APIs are located. It doesn't do anything interesting on its own.", kind: "feature", name: "Navigator", spec: ["https://html.spec.whatwg.org/multipage/system-state.html#the-navigator-object"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Navigator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.navigator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "navigator-install": { description: "The navigator.install() method triggers a request to install a progressive web app.", description_html: "The <code>navigator.install()</code> method triggers a request to install a progressive web app.", group: ["progressive-web-app"], kind: "feature", name: "navigator.install()", spec: ["https://github.com/w3c/manifest/pull/1175"], status: { baseline: false, support: {} } }, "navigator-modelcontext": { description: "The navigator.modelContext API registers page actions that can be called by in-browser AI agents or browser extensions. Also known as WebMCP.", description_html: "The <code>navigator.modelContext</code> API registers page actions that can be called by in-browser AI agents or browser extensions. Also known as WebMCP.", group: ["webmcp"], kind: "feature", name: "navigator.modelContext",
    spec: ["https://webmachinelearning.github.io/webmcp/"], status: { baseline: false, support: {} } }, nesting: { caniuse: ["css-nesting"], compat_features: ["api.CSSNestedDeclarations", "api.CSSNestedDeclarations.style", "api.CSSStyleRule.cssRules", "api.CSSStyleRule.deleteRule", "api.CSSStyleRule.insertRule", "css.selectors.nesting"], description: "CSS nesting allows for shorter selectors, easier reading, and more modularity by nesting rules inside others.", description_html: "CSS nesting allows for shorter selectors, easier reading, and more modularity by nesting rules inside others.", group: ["css"], kind: "feature", name: "Nesting", spec: ["https://drafts.csswg.org/css-nesting-1/"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "api.CSSNestedDeclarations": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "132", firefox_android: "132", safari: "18.2", safari_ios: "18.2" } }, "a\
pi.CSSNestedDeclarations.style": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "132", firefox_android: "132", safari: "18.2", safari_ios: "18.2" } }, "api.CSSStyleRule.cssRules": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "117", firefox_android: "117", safari: "16.5", safari_ios: "16.5" } }, "api.CSSStyleRule.deleteRule": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "117", firefox_android: "117", safari: "16.5", safari_ios: "16.5" } }, "api.CSSStyleRule.insertRule": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "117", firefox_android: "117", safari: "16.5", safari_ios: "16.5" } },
    "css.selectors.nesting": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "117", firefox_android: "117", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "117", firefox_android: "117", safari: "17.2", safari_ios: "17.2" } } }, "network-information": { compat_features: ["api.Navigator.connection", "api.NetworkInformation", "api.NetworkInformation.change_event", "api.NetworkInformation.downlink", "api.NetworkInformation.downlinkMax", "api.NetworkInformation.effectiveType", "api.NetworkInformation.rtt", "api.NetworkInformation.type", "api.NetworkInformation.worker_support", "api.WorkerNavigator.connection", "http.headers.Downlink", "http.headers.ECT", "http.headers.RTT"], description: "The navigator.connection API provides information about the network connection a device is using and fires events when the connection type changes.", description_html: "\
The <code>navigator.connection</code> API provides information about the network connection a device is using and fires events when the connection type changes.", kind: "feature", name: "Network Information", spec: ["https://wicg.github.io/netinfo/"], status: { baseline: false, by_compat_key: { "api.Navigator.connection": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.NetworkInformation": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.NetworkInformation.change_event": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.NetworkInformation.downlink": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.NetworkInformation.downlinkMax": { baseline: false, support: { chrome: "61", chrome_android: "38" } }, "api.NetworkInformation.effectiveType": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.NetworkInform\
ation.rtt": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.NetworkInformation.type": { baseline: false, support: { chrome: "61", chrome_android: "38" } }, "api.NetworkInformation.worker_support": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "api.WorkerNavigator.connection": { baseline: false, support: { chrome: "61", chrome_android: "38", edge: "79" } }, "http.headers.Downlink": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "http.headers.ECT": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "http.headers.RTT": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } } }, support: { chrome: "67", chrome_android: "67" } } }, "non-cookie-storage-access": { compat_features: ["api.Document.hasUnpartitionedCookieAccess", "api.Document.requestStorageAccess.types_parameter", "api.Document.requestStorageAccess.types_parameter.ty\
pes_BroadcastChannel_parameter", "api.Document.requestStorageAccess.types_parameter.types_SharedWorker_parameter", "api.Document.requestStorageAccess.types_parameter.types_all_parameter", "api.Document.requestStorageAccess.types_parameter.types_caches_parameter", "api.Document.requestStorageAccess.types_parameter.types_cookies_parameter", "api.Document.requestStorageAccess.types_parameter.types_createObjectURL_parameter", "api.Document.requestStorageAccess.types_parameter.types_estimate_parameter", "api.Document.requestStorageAccess.types_parameter.types_getDirectory_parameter", "api.Document.requestStorageAccess.types_parameter.types_indexedDB_parameter", "api.Document.requestStorageAccess.types_parameter.types_localStorage_parameter", "api.Document.requestStorageAccess.types_parameter.types_locks_parameter", "api.Document.requestStorageAccess.types_parameter.types_revokeObjectURL_parameter", "api.Document.requestStorageAccess.types_parameter.types_sessionStorage_parameter", "api.Shar\
edWorker.SharedWorker.options_sameSiteCookies_parameter", "api.StorageAccessHandle", "api.StorageAccessHandle.BroadcastChannel", "api.StorageAccessHandle.SharedWorker", "api.StorageAccessHandle.caches", "api.StorageAccessHandle.createObjectURL", "api.StorageAccessHandle.estimate", "api.StorageAccessHandle.getDirectory", "api.StorageAccessHandle.indexedDB", "api.StorageAccessHandle.localStorage", "api.StorageAccessHandle.locks", "api.StorageAccessHandle.revokeObjectURL", "api.StorageAccessHandle.sessionStorage"], description: "Non-cookie storage access extends the requestStorageAccess() API to let content in cross-site iframes request access to first-party data beyond cookies.", description_html: "Non-cookie storage access extends the <code>requestStorageAccess()</code> API to let content in cross-site iframes request access to first-party data beyond cookies.", group: ["storage"], kind: "feature", name: "Non-cookie storage access", spec: ["https://privacycg.github.io/saa-non-cookie-sto\
rage/"], status: { baseline: false, by_compat_key: { "api.Document.hasUnpartitionedCookieAccess": { baseline: false, support: { chrome: "125", chrome_android: "125", edge: "125" } }, "api.Document.requestStorageAccess.types_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_BroadcastChannel_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_SharedWorker_parameter": { baseline: false, support: { chrome: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_all_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_caches_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_cookies_parameter": { baseline: false, support: { chrome: "\
125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_createObjectURL_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_estimate_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_getDirectory_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_indexedDB_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_localStorage_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_locks_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.typ\
es_revokeObjectURL_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.Document.requestStorageAccess.types_parameter.types_sessionStorage_parameter": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.SharedWorker.SharedWorker.options_sameSiteCookies_parameter": { baseline: false, support: { chrome: "125" } }, "api.StorageAccessHandle": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.BroadcastChannel": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.SharedWorker": { baseline: false, support: { chrome: "125" } }, "api.StorageAccessHandle.caches": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.createObjectURL": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.estimate": { baseline: false, support: { chrome: "125", chrome_android: "12\
5" } }, "api.StorageAccessHandle.getDirectory": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.indexedDB": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.localStorage": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.locks": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.revokeObjectURL": { baseline: false, support: { chrome: "125", chrome_android: "125" } }, "api.StorageAccessHandle.sessionStorage": { baseline: false, support: { chrome: "125", chrome_android: "125" } } }, support: { chrome: "125" } } }, not: { caniuse: ["css-not-sel-list"], compat_features: ["css.selectors.not", "css.selectors.not.selector_list"], description: "The :not() functional pseudo-class matches elements that do not match the selectors in its argument.", description_html: "The <code>:not()</code> functional pseudo-\
class matches elements that do not match the selectors in its argument.", group: ["selectors"], kind: "feature", name: ":not()", spec: ["https://drafts.csswg.org/selectors-4/#negation"], status: { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", by_compat_key: { "css.selectors.not": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.not.selector_list": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "84", firefox_android: "84", safari: "9", safari_ios: "9" } } }, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "84", firefox_android: "84", safari: "9", safari_ios: "9" } } }, notifications: { compat_features: ["api.Notification", "api.Notification.No\
tification", "api.Notification.actions", "api.Notification.badge", "api.Notification.body", "api.Notification.click_event", "api.Notification.close", "api.Notification.close_event", "api.Notification.data", "api.Notification.dir", "api.Notification.error_event", "api.Notification.icon", "api.Notification.image", "api.Notification.lang", "api.Notification.maxActions_static", "api.Notification.permission_static", "api.Notification.renotify", "api.Notification.requestPermission_static", "api.Notification.requestPermission_static.returns_promise", "api.Notification.requireInteraction", "api.Notification.secure_context_required", "api.Notification.show_event", "api.Notification.silent", "api.Notification.tag", "api.Notification.timestamp", "api.Notification.title", "api.Notification.vibrate", "api.Notification.worker_support", "api.NotificationEvent", "api.NotificationEvent.NotificationEvent", "api.NotificationEvent.action", "api.NotificationEvent.notification", "api.Permissions.permission_\
notifications", "api.ServiceWorkerGlobalScope.notificationclick_event", "api.ServiceWorkerGlobalScope.notificationclose_event", "api.ServiceWorkerRegistration.getNotifications", "api.ServiceWorkerRegistration.showNotification", "api.ServiceWorkerRegistration.showNotification.options_actions_parameter", "api.ServiceWorkerRegistration.showNotification.options_badge_parameter", "api.ServiceWorkerRegistration.showNotification.options_data_parameter", "api.ServiceWorkerRegistration.showNotification.options_image_parameter", "api.ServiceWorkerRegistration.showNotification.options_renotify_parameter", "api.ServiceWorkerRegistration.showNotification.options_requireInteraction_parameter", "api.ServiceWorkerRegistration.showNotification.options_vibrate_parameter"], description: "The Notification() constructor shows a message to the user, typically using the notification system of the host operating system.", description_html: "The <code>Notification()</code> constructor shows a message to the us\
er, typically using the notification system of the host operating system.", kind: "feature", name: "Notifications", spec: ["https://notifications.spec.whatwg.org/"], status: { baseline: false, by_compat_key: { "api.Notification": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.Notification": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.actions": { baseline: false, support: { chrome: "53", edge: "18" } }, "api.Notification.badge": { baseline: false, support: { chrome: "53", edge: "18" } }, "api.Notification.body": { baseline: false, support: { chrome: "33", edge: "14", firefox: "26", firefox_android: "26", safari: "11" } }, "api.Notification.click_event": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.close": { baseline: false, support: { chrome: "\
20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.close_event": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.data": { baseline: false, support: { chrome: "44", edge: "16", firefox: "34", firefox_android: "34", safari: "16" } }, "api.Notification.dir": { baseline: false, support: { chrome: "20", edge: "14", firefox: "26", firefox_android: "26", safari: "7" } }, "api.Notification.error_event": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.icon": { baseline: false, support: { chrome: "33", edge: "14", firefox: "26", firefox_android: "26" } }, "api.Notification.image": { baseline: false, support: { chrome: "56", edge: "18" } }, "api.Notification.lang": { baseline: false, support: { chrome: "33", edge: "14", firefox: "26", firefox_android: "26", safari: "11" } }, "api.Notification.maxAct\
ions_static": { baseline: false, support: { chrome: "48", edge: "18" } }, "api.Notification.permission_static": { baseline: false, support: { chrome: "32", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } }, "api.Notification.renotify": { baseline: false, support: { chrome: "50", edge: "79" } }, "api.Notification.requestPermission_static": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "15" } }, "api.Notification.requestPermission_static.returns_promise": { baseline: false, support: { chrome: "47", edge: "79", firefox: "46", firefox_android: "46", safari: "15" } }, "api.Notification.requireInteraction": { baseline: false, support: { chrome: "47", edge: "17" } }, "api.Notification.secure_context_required": { baseline: false, support: { chrome: "62", edge: "79", firefox: "67", firefox_android: "67" } }, "api.Notification.show_event": { baseline: false, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "\
22", safari: "7" } }, "api.Notification.silent": { baseline: false, support: { chrome: "43", edge: "17", firefox: "132", firefox_android: "132", safari: "16.6" } }, "api.Notification.tag": { baseline: false, support: { chrome: "20", edge: "14", firefox: "26", firefox_android: "26" } }, "api.Notification.timestamp": { baseline: false, support: { chrome: "50", edge: "17" } }, "api.Notification.title": { baseline: false, support: { chrome: "33", edge: "14", firefox: "26", firefox_android: "26", safari: "11" } }, "api.Notification.vibrate": { baseline: false, support: { chrome: "53", edge: "79" } }, "api.Notification.worker_support": { baseline: false, support: { chrome: "42", edge: "15", firefox: "41", firefox_android: "41" } }, "api.NotificationEvent": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "16", safari_ios: "16.4" } }, "api.Notification\
Event.NotificationEvent": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "16", safari_ios: "16.4" } }, "api.NotificationEvent.action": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "17", firefox: "44", firefox_android: "44" } }, "api.NotificationEvent.notification": { baseline: false, support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44" } }, "api.Permissions.permission_notifications": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "16.4", safari_ios: "16.4" } }, "api.ServiceWorkerGlobalScope.notificationclick_event": { baseline: false, support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "\
16" } }, "api.ServiceWorkerGlobalScope.notificationclose_event": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "44", safari: "16" } }, "api.ServiceWorkerRegistration.getNotifications": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "16", safari_ios: "16.4" } }, "api.ServiceWorkerRegistration.showNotification": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "16", safari_ios: "16.4" } }, "api.ServiceWorkerRegistration.showNotification.options_actions_parameter": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "18" } }, "api.ServiceWorkerRegistration.showNotification.options_badge_parameter": { baseline: false, support: {
    chrome: "53", chrome_android: "53", edge: "79" } }, "api.ServiceWorkerRegistration.showNotification.options_data_parameter": { baseline: false, support: { chrome: "44", chrome_android: "44", edge: "79" } }, "api.ServiceWorkerRegistration.showNotification.options_image_parameter": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79" } }, "api.ServiceWorkerRegistration.showNotification.options_renotify_parameter": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.ServiceWorkerRegistration.showNotification.options_requireInteraction_parameter": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.ServiceWorkerRegistration.showNotification.options_vibrate_parameter": { baseline: false, support: { chrome: "45", edge: "79" } } }, support: { chrome: "20", edge: "14", firefox: "22", firefox_android: "22", safari: "7" } } }, "notifications-apps": { caniuse: ["notifications"], description: "Notific\
ations via service worker registration's showNotification() method, sent from installed web applications (for example, saved to the Home Screen on Safari for iOS), show a message to the user, typically using the notification system of the host operating system.", description_html: "Notifications via service worker registration's <code>showNotification()</code> method, sent from installed web applications (for example, saved to the Home Screen on Safari for iOS), show a message to the user, typically using the notification system of the host operating system.", kind: "feature", name: "Notifications from service workers and installed apps", spec: ["https://notifications.spec.whatwg.org/#service-worker-api"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "20", chrome_android: "42", edge: "14", firefox: "22", firefox_android: "22", safari: "7", safari_ios: "16.4" } } }, "nth-child": { compat_features: ["css.selectors.first\
-child", "css.selectors.first-child.no_parent_required", "css.selectors.last-child", "css.selectors.last-child.no_parent_required", "css.selectors.nth-child", "css.selectors.nth-child.no_parent_required", "css.selectors.nth-last-child", "css.selectors.nth-last-child.no_parent_required", "css.selectors.only-child", "css.selectors.only-child.no_parent_required"], description: "The :nth-child() and :nth-last-child() CSS functional pseudo-classes match elements based on their index within a list of elements. The :first-child and :last-child pseudo-classes match the first and last element in a list, and the :only-child pseudo-class matches an element with no siblings.", description_html: "The <code>:nth-child()</code> and <code>:nth-last-child()</code> CSS functional pseudo-classes match elements based on their index within a list of elements. The <code>:first-child</code> and <code>:last-child</code> pseudo-classes match the first and last element in a list, and the <code>:only-child</code\
> pseudo-class matches an element with no siblings.", group: ["selectors"], kind: "feature", name: ":nth-child()", spec: ["https://drafts.csswg.org/selectors-3/#nth-child-pseudo", "https://drafts.csswg.org/selectors-3/#nth-last-child-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.first-child": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "4" } }, "css.selectors.first-child.no_parent_required": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52" } }, "css.selectors.last-child": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "\
2" } }, "css.selectors.last-child.no_parent_required": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52" } }, "css.selectors.nth-child": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.nth-child.no_parent_required": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52" } }, "css.selectors.nth-last-child": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.nth-last-child.no_parent_required": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "\
52" } }, "css.selectors.only-child": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.only-child.no_parent_required": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "52", firefox_android: "52", safari: "17", safari_ios: "17" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "nth-child-of": { caniuse: ["css-nth-child-of"], compat_features: ["css.selectors.nth-child.of_syntax", "css.selectors.nth-last-child.of_syntax"], description: "The of syntax for the :nth-child() and :nth-last-child() CSS functional pseudo-classes match elements by the relative position of elements, counted from the first or last sibling m\
atching a selector list.", description_html: "The <code>of</code> syntax for the <code>:nth-child()</code> and <code>:nth-last-child()</code> CSS functional pseudo-classes match elements by the relative position of elements, counted from the first or last sibling matching a selector list.", group: ["selectors"], kind: "feature", name: ":nth-child() of <selector>", spec: ["https://drafts.csswg.org/selectors-4/#the-nth-child-pseudo", "https://drafts.csswg.org/selectors-4/#the-nth-last-child-pseudo"], status: { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", by_compat_key: { "css.selectors.nth-child.of_syntax": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "9", safari_ios: "9" } }, "css.selectors.nth-last-child.of_syntax": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-\
09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "9", safari_ios: "9" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "9", safari_ios: "9" } } }, "nth-of-type": { compat_features: ["css.selectors.first-of-type", "css.selectors.last-of-type", "css.selectors.nth-last-of-type", "css.selectors.nth-of-type", "css.selectors.only-of-type"], description: "The :nth-of-type() and :nth-last-of-type() CSS functional pseudo-classes match elements based on their position among siblings of the same type. The :first-of-type, :last-of-type, and :only-of-type pseudo-classes match the first, last, and only elements of its type.", description_html: "The <code>:nth-of-type()</code> and <code>:nth-last-of-type()</code> CSS functional pseudo-classes match elements based on their position among siblings of the same type. The <code>:first-of-type</code>, <code>:last-of-type</co\
de>, and <code>:only-of-type</code> pseudo-classes match the first, last, and only elements of its type.", group: ["selectors"], kind: "feature", name: ":nth-of-type() pseudo-classes", spec: ["https://drafts.csswg.org/selectors-4/#typed-child-index"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.first-of-type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.last-of-type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.nth-last-of-type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.nth-of-type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "css.selectors.only-of-type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "nullish-coalescing": { compat_features: ["javascript.operators.nullish_coalescing", "javascript.operators.nullish_coalescing_assignment"], description: "The nullish coalescing (??) and nullish coalescing assignment (??=) operators return (or assign) its \
right-hand side operand when its left-hand side operand is null or undefined, and otherwise returns its left-hand side operand.", description_html: "The nullish coalescing (<code>??</code>) and nullish coalescing assignment (<code>??=</code>) operators return (or assign) its right-hand side operand when its left-hand side operand is null or undefined, and otherwise returns its left-hand side operand.", group: ["javascript"], kind: "feature", name: "Nullish coalescing", snapshot: ["ecmascript-2020"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#prod-CoalesceExpression"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "javascript.operators.nullish_coalescing": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "javascrip\
t.operators.nullish_coalescing_assignment": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } } }, number: { compat_features: ["javascript.builtins.Infinity", "javascript.builtins.Math", "javascript.builtins.Math.E", "javascript.builtins.Math.LN10", "javascript.builtins.Math.LN2", "javascript.builtins.Math.LOG10E", "javascript.builtins.Math.LOG2E", "javascript.builtins.Math.PI", "javascript.builtins.Math.SQRT1_2", "javascript.builtins.Math.SQRT2", "javascript.builtins.Math.abs", "javascript.builtins.Math.acos", "javascript.builtins.Math.acosh", "javascript.builtins.Math.asin", "javascript.builtins.Math.asinh", "javascript.builtins.Math.atan", "javascript.builtins.Math.atan2", "javascript.b\
uiltins.Math.atanh", "javascript.builtins.Math.cbrt", "javascript.builtins.Math.ceil", "javascript.builtins.Math.clz32", "javascript.builtins.Math.cos", "javascript.builtins.Math.cosh", "javascript.builtins.Math.exp", "javascript.builtins.Math.expm1", "javascript.builtins.Math.floor", "javascript.builtins.Math.fround", "javascript.builtins.Math.hypot", "javascript.builtins.Math.imul", "javascript.builtins.Math.log", "javascript.builtins.Math.log10", "javascript.builtins.Math.log1p", "javascript.builtins.Math.log2", "javascript.builtins.Math.max", "javascript.builtins.Math.min", "javascript.builtins.Math.pow", "javascript.builtins.Math.random", "javascript.builtins.Math.round", "javascript.builtins.Math.sign", "javascript.builtins.Math.sin", "javascript.builtins.Math.sinh", "javascript.builtins.Math.sqrt", "javascript.builtins.Math.tan", "javascript.builtins.Math.tanh", "javascript.builtins.Math.trunc", "javascript.builtins.NaN", "javascript.builtins.Number", "javascript.builtins.Number\
.EPSILON", "javascript.builtins.Number.MAX_SAFE_INTEGER", "javascript.builtins.Number.MAX_VALUE", "javascript.builtins.Number.MIN_SAFE_INTEGER", "javascript.builtins.Number.MIN_VALUE", "javascript.builtins.Number.NEGATIVE_INFINITY", "javascript.builtins.Number.NaN", "javascript.builtins.Number.Number", "javascript.builtins.Number.POSITIVE_INFINITY", "javascript.builtins.Number.isFinite", "javascript.builtins.Number.isInteger", "javascript.builtins.Number.isNaN", "javascript.builtins.Number.isSafeInteger", "javascript.builtins.Number.parseFloat", "javascript.builtins.Number.parseInt", "javascript.builtins.Number.toExponential", "javascript.builtins.Number.toFixed", "javascript.builtins.Number.toPrecision", "javascript.builtins.Number.toString", "javascript.builtins.Number.valueOf", "javascript.builtins.isNaN", "javascript.builtins.parseInt", "javascript.builtins.parseInt.leading_zero_strings_as_decimal", "javascript.grammar.binary_numeric_literals", "javascript.grammar.decimal_numeric_l\
iterals", "javascript.grammar.hexadecimal_numeric_literals", "javascript.grammar.octal_numeric_literals"], description: "The number type (and Number object) represents floating-point numbers, such as 42 or -4.201, while the Math API contains mathematical functions and constants. JavaScript can also represent boundless negative and positive values as Infinity or not-a-number as NaN (as in 0 * Infinity).", description_html: "The number type (and <code>Number</code> object) represents floating-point numbers, such as 42 or -4.201, while the <code>Math</code> API contains mathematical functions and constants. JavaScript can also represent boundless negative and positive values as <code>Infinity</code> or not-a-number as <code>NaN</code> (as in <code>0 * Infinity</code>).", group: ["primitive-types"], kind: "feature", name: "Math and numbers", spec: ["https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", by_compat_key: { "javascript.builtins.Infinity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.E": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.LN10": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "javascript.builtins.Math.LN2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.LOG10E": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.LOG2E": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.PI": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "\
javascript.builtins.Math.SQRT1_2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.SQRT2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.abs": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.acos": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javas\
cript.builtins.Math.acosh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.asin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.asinh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.atan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javas\
cript.builtins.Math.atan2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.atanh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.cbrt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.ceil": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javas\
cript.builtins.Math.clz32": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "javascript.builtins.Math.cos": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.cosh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.exp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascri\
pt.builtins.Math.expm1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.floor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.fround": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "26", firefox_android: "26", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.hypot": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "27", firefox_android: "27", safari: "8", safari_ios: "8" } }, "ja\
vascript.builtins.Math.imul": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "javascript.builtins.Math.log": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.log10": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.log1p": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "\
javascript.builtins.Math.log2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.max": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.min": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.pow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascri\
pt.builtins.Math.random": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.round": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.sign": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "javascript.builtins.Math.sin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.\
builtins.Math.sinh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Math.sqrt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.tan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Math.tanh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.bui\
ltins.Math.trunc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.NaN": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.EPSILON": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "javascript.builtins\
.Number.MAX_SAFE_INTEGER": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "31", firefox_android: "31", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.MAX_VALUE": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.MIN_SAFE_INTEGER": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "31", firefox_android: "31", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.MIN_VALUE": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "javascript.builtins.Number.NEGATIVE_INFINITY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.NaN": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.Number": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.POSITIVE_INFINITY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4",
    safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.isFinite": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.isInteger": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.isNaN": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "15", firefox_android: "15", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.isSafeInteger": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "\
32", firefox_android: "32", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.parseFloat": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.parseInt": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "javascript.builtins.Number.toExponential": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } }, "javascript.builtins.Number.toFixed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } }, "javascript.builtins.Number.toPrecision": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } }, "javascript.builtins.Number.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Number.valueOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.isNaN": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.parseInt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.parseInt.leading_zero_strings_as_decimal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "21", firefox_android: "21", safari: "6", safari_ios: "6" } }, "javascript.grammar.binary_numeric_literals": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } }, "javascript.grammar.decimal_numeric_literals": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.hexadecimal_numeric_literals": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.octal_numeric_literals": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "25", firefox_android: "25", safari: "9", safari_ios: "9" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "numeric-factory-functions": { compat_features: ["api.CSS.Hz_static", "api.CSS.Q_static", "api.CSS.cap_static", "api.CSS.ch_static", "api.CSS.cm_static", "api.CSS.cqb_static", "api.CSS.cqh_static", "\
api.CSS.cqi_static", "api.CSS.cqmax_static", "api.CSS.cqmin_static", "api.CSS.cqw_static", "api.CSS.deg_static", "api.CSS.dpcm_static", "api.CSS.dpi_static", "api.CSS.dppx_static", "api.CSS.dvb_static", "api.CSS.dvh_static", "api.CSS.dvi_static", "api.CSS.dvmax_static", "api.CSS.dvmin_static", "api.CSS.dvw_static", "api.CSS.em_static", "api.CSS.ex_static", "api.CSS.fr_static", "api.CSS.grad_static", "api.CSS.ic_static", "api.CSS.in_static", "api.CSS.kHz_static", "api.CSS.lh_static", "api.CSS.lvb_static", "api.CSS.lvh_static", "api.CSS.lvi_static", "api.CSS.lvmax_static", "api.CSS.lvmin_static", "api.CSS.lvw_static", "api.CSS.mm_static", "api.CSS.ms_static", "api.CSS.number_static", "api.CSS.pc_static", "api.CSS.percent_static", "api.CSS.pt_static", "api.CSS.px_static", "api.CSS.rad_static", "api.CSS.rcap_static", "api.CSS.rch_static", "api.CSS.rem_static", "api.CSS.rex_static", "api.CSS.ric_static", "api.CSS.rlh_static", "api.CSS.s_static", "api.CSS.svb_static", "api.CSS.svh_static", "\
api.CSS.svi_static", "api.CSS.svmax_static", "api.CSS.svmin_static", "api.CSS.svw_static", "api.CSS.turn_static", "api.CSS.vb_static", "api.CSS.vh_static", "api.CSS.vi_static", "api.CSS.vmax_static", "api.CSS.vmin_static", "api.CSS.vw_static"], description: "The numeric factory functions, such as CSS.px() or CSS.kHz(), return a CSSUnitValue representing a CSS number value (as in 12px or 440kHz).", description_html: "The numeric factory functions, such as <code>CSS.px()</code> or <code>CSS.kHz()</code>, return a <code>CSSUnitValue</code> representing a CSS number value (as in <code>12px</code> or <code>440kHz</code>).", group: ["cssom"], kind: "feature", name: "Numeric factory functions", spec: ["https://drafts.css-houdini.org/css-typed-om-1/#numeric-factory"], status: { baseline: false, by_compat_key: { "api.CSS.Hz_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.Q_static": { baseline: false, support: {
    chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cap_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "17.2", safari_ios: "17.2" } }, "api.CSS.ch_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cm_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cqb_static": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cqh_static": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cqi_static": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cqmax_static": { baseline: false, support: { chrome: "\
105", chrome_android: "105", edge: "105", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cqmin_static": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.cqw_static": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.deg_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dpcm_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dpi_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dppx_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dvb_static": { baseline: false, support: { chrome: "108", chrome_android: "\
108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dvh_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dvi_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dvmax_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dvmin_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.dvw_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.em_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.ex_static": { baseline: false, support: { chrome: "66", chrome_android: "6\
6", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.fr_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.grad_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.ic_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.in_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.kHz_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lh_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lvb_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108",
    safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lvh_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lvi_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lvmax_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lvmin_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.lvw_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.mm_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.ms_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79",
    safari: "16.4", safari_ios: "16.4" } }, "api.CSS.number_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.pc_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.percent_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.pt_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.px_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.rad_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.rcap_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "\
17.2", safari_ios: "17.2" } }, "api.CSS.rch_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "17.2", safari_ios: "17.2" } }, "api.CSS.rem_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.rex_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "17.2", safari_ios: "17.2" } }, "api.CSS.ric_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "17.2", safari_ios: "17.2" } }, "api.CSS.rlh_static": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.s_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.svb_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "\
16.4" } }, "api.CSS.svh_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.svi_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.svmax_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.svmin_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.svw_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.turn_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.vb_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "\
16.4" } }, "api.CSS.vh_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.vi_static": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.vmax_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.vmin_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.CSS.vw_static": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } } }, "numeric-separators": { compat_features: ["javascript.grammar.numeric_separators"], description: "To improve readability for numeric literals, underscores (_) can be used as separators\
. For example, 1_050.95 is equivalent to 1050.95.", description_html: "To improve readability for numeric literals, underscores (<code>_</code>) can be used as separators. For example, <code>1_050.95</code> is equivalent to <code>1050.95</code>.", group: ["javascript"], kind: "feature", name: "Numeric separators", spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html#prod-NumericLiteralSeparator"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "javascript.grammar.numeric_separators": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "70", firefox_android: "79", safari: "13", safari_ios: "13" } } }, support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "70", firefox_android: "79", safari: "13", safari_ios: "13" } } }, "numeric-seperators": { kind: "moved", redirect_target: "nu\
meric-separators" }, object: { compat_features: ["api.HTMLObjectElement", "api.HTMLObjectElement.contentDocument", "api.HTMLObjectElement.contentWindow", "api.HTMLObjectElement.data", "api.HTMLObjectElement.form", "api.HTMLObjectElement.getSVGDocument", "api.HTMLObjectElement.height", "api.HTMLObjectElement.name", "api.HTMLObjectElement.type", "api.HTMLObjectElement.width", "html.elements.object", "html.elements.object.data", "html.elements.object.form", "html.elements.object.height", "html.elements.object.name", "html.elements.object.type", "html.elements.object.width"], description: "The <object> element represents an external resource such as a PDF or SVG document. It was historically used for plugins such as Shockwave Flash.", description_html: "The <code>&#x3C;object></code> element represents an external resource such as a PDF or SVG document. It was historically used for plugins such as Shockwave Flash.", group: ["html-elements"], kind: "feature", name: "<object>", spec: ["https\
://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLObjectElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.contentDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.contentWindow": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "53", chrome_android: "53", edge: "17", firefox: "22", firefox_android: "22", safari: "13", safari_ios: "13" } }, "api.HTMLObjectElement.data": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.getSVGDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.name": { baseline: "high", baseline_high_date: "2018-0\
1-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLObjectElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.object": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.object.data": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.object.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.object.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.object.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.object.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.object.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, "object-fit": { caniuse: ["object-fit"], compat_features: ["css.properties.object-fit", "css.properties.object-fit.contain", "css.properties.object-fit.cover", "css.properties.object-fit.fill", "css.properties.object-fit.none", "css.properties.object-fit.scale-down"], description: "The object-fit CSS property sets how images, videos, and other replaced elements are scaled within their container.", description_html: "The <code>object-fit</code> CSS property sets how images, videos, and other replac\
ed elements are scaled within their container.", kind: "feature", name: "object-fit", spec: ["https://drafts.csswg.org/css-images-4/#the-object-fit"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.object-fit": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "css.properties.object-fit.contain": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "css.properties.object-fit.cover": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10",
    safari_ios: "10" } }, "css.properties.object-fit.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "css.properties.object-fit.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "css.properties.object-fit.scale-down": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } } }, support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } } }, "object-hasown": { compat_features: ["javascript.builtins.Object.hasO\
wn"], description: "The Object.hasOwn() static method checks whether an object has a given property. It's a more robust alternative to the Object.prototype.hasOwnProperty() method.", description_html: "The <code>Object.hasOwn()</code> static method checks whether an object has a given property. It's a more robust alternative to the <code>Object.prototype.hasOwnProperty()</code> method.", group: ["javascript"], kind: "feature", name: "Object.hasOwn()", spec: ["https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.hasown"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "javascript.builtins.Object.hasOwn": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "92", firefox_android: "92", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "92", firefox_android: "\
92", safari: "15.4", safari_ios: "15.4" } } }, "object-object": { compat_features: ["javascript.builtins.Object", "javascript.builtins.Object.Object", "javascript.builtins.Object.assign", "javascript.builtins.Object.constructor", "javascript.builtins.Object.create", "javascript.builtins.Object.defineProperties", "javascript.builtins.Object.defineProperty", "javascript.builtins.Object.entries", "javascript.builtins.Object.freeze", "javascript.builtins.Object.fromEntries", "javascript.builtins.Object.getOwnPropertyDescriptor", "javascript.builtins.Object.getOwnPropertyDescriptors", "javascript.builtins.Object.getOwnPropertyNames", "javascript.builtins.Object.getOwnPropertySymbols", "javascript.builtins.Object.getPrototypeOf", "javascript.builtins.Object.hasOwnProperty", "javascript.builtins.Object.is", "javascript.builtins.Object.isExtensible", "javascript.builtins.Object.isFrozen", "javascript.builtins.Object.isPrototypeOf", "javascript.builtins.Object.isSealed", "javascript.builtins.Ob\
ject.keys", "javascript.builtins.Object.preventExtensions", "javascript.builtins.Object.preventExtensions.ES2015_behavior", "javascript.builtins.Object.propertyIsEnumerable", "javascript.builtins.Object.seal", "javascript.builtins.Object.setPrototypeOf", "javascript.builtins.Object.toString", "javascript.builtins.Object.valueOf", "javascript.builtins.Object.values", "javascript.grammar.shorthand_object_literals", "javascript.operators.object_initializer", "javascript.operators.object_initializer.computed_property_names", "javascript.operators.object_initializer.shorthand_method_names", "javascript.operators.object_initializer.shorthand_property_names", "javascript.operators.object_initializer.spread_properties", "javascript.operators.optional_chaining"], description: "Objects in JavaScript are collections of key-value pairs.", description_html: "Objects in JavaScript are collections of key-value pairs.", group: ["javascript"], kind: "feature", name: "Object", spec: ["https://tc39.es/ec\
ma262/multipage/fundamental-objects.html#sec-object-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Object": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Object.Object": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Object.assign": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.Object.constructor": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Object.create": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "javascript.builtins.Object.defineProperties": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "javascript.builtins.Object.defineProperty": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "6" } }, "javascript.builtins.Object.entries": { baseline: "\
high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "54", chrome_android: "54", edge: "14", firefox: "47", firefox_android: "47", safari: "10.1", safari_ios: "10.3" } }, "javascript.builtins.Object.freeze": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Object.fromEntries": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "63", firefox_android: "63", safari: "12.1", safari_ios: "12.2" } }, "javascript.builtins.Object.getOwnPropertyDescriptor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } },
    "javascript.builtins.Object.getOwnPropertyDescriptors": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "54", chrome_android: "54", edge: "15", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "javascript.builtins.Object.getOwnPropertyNames": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "javascript.builtins.Object.getOwnPropertySymbols": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Object.getPrototypeOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "\
12", firefox: "3.5", firefox_android: "4", safari: "5", safari_ios: "5" } }, "javascript.builtins.Object.hasOwnProperty": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Object.is": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "javascript.builtins.Object.isExtensible": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Object.isFrozen": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Object.isPrototypeOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Object.isSealed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Object.keys": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "javascript.builtins.Object.preventExtensions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Object.preventExtensions.ES2015_behavior": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "35", firefox_android: "35", safari: "9", safari_ios: "9" } }, "javascript.builtins.Object.propertyIsEnumerable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.Object.seal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Object.setPrototypeOf": { baseline: "high", baseline_high_date: "2018\
-03-30", baseline_low_date: "2015-09-30", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "31", firefox_android: "31", safari: "9", safari_ios: "9" } }, "javascript.builtins.Object.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Object.valueOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.Object.values": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "54", chrome_android: "54", edge: "14", firefox: "47", firefox_android: "47", safari: "10.1", safari_ios: "10.3" } }, "javascript.grammar.shorthand_object_literals": { baseline: "\
high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "33", firefox_android: "33", safari: "9", safari_ios: "9" } }, "javascript.operators.object_initializer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.operators.object_initializer.computed_property_names": { baseline: "high", baseline_high_date: "2018-06-02", baseline_low_date: "2015-12-02", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "34", firefox_android: "34", safari: "8", safari_ios: "8" } }, "javascript.operators.object_initializer.shorthand_method_names": { baseline: "high", baseline_high_date: "2018-06-02", baseline_low_date: "2015-12-02", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "34", firefox_android: "34", safari: "\
9", safari_ios: "9" } }, "javascript.operators.object_initializer.shorthand_property_names": { baseline: "high", baseline_high_date: "2018-06-02", baseline_low_date: "2015-12-02", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "33", firefox_android: "33", safari: "9", safari_ios: "9" } }, "javascript.operators.object_initializer.spread_properties": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "55", firefox_android: "55", safari: "11.1", safari_ios: "11.3" } }, "javascript.operators.optional_chaining": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "74", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "objec\
t-position": { compat_features: ["css.properties.object-position"], description: "The object-position CSS property places images, videos, and other replaced elements within their boxes.", description_html: "The <code>object-position</code> CSS property places images, videos, and other replaced elements within their boxes.", kind: "feature", name: "object-position", spec: ["https://drafts.csswg.org/css-images-3/#the-object-position"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.object-position": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } } }, support: { chrome: "32", chrome_android: "32", edge: "79", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } } }, "object-view-box": { compat_features: ["css.properties.obje\
ct-view-box", "css.properties.object-view-box.none"], description: "The object-view-box CSS property crops and zooms to an inset area of an image.", description_html: "The <code>object-view-box</code> CSS property crops and zooms to an inset area of an image.", group: ["css"], kind: "feature", name: "object-view-box", spec: ["https://drafts.csswg.org/css-images-5/#the-object-view-box"], status: { baseline: false, by_compat_key: { "css.properties.object-view-box": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104" } }, "css.properties.object-view-box.none": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104" } } }, support: { chrome: "104", chrome_android: "104", edge: "104" } } }, observable: { compat_features: ["api.EventTarget.when", "api.Observable", "api.Observable.Observable", "api.Observable.catch", "api.Observable.drop", "api.Observable.every", "api.Observable.filter", "api.Observable.finally", "api.Observable.find", "api.\
Observable.first", "api.Observable.flatMap", "api.Observable.forEach", "api.Observable.from_static", "api.Observable.inspect", "api.Observable.last", "api.Observable.map", "api.Observable.reduce", "api.Observable.some", "api.Observable.subscribe", "api.Observable.switchMap", "api.Observable.take", "api.Observable.takeUntil", "api.Observable.toArray", "api.Subscriber", "api.Subscriber.active", "api.Subscriber.addTeardown", "api.Subscriber.complete", "api.Subscriber.error", "api.Subscriber.next", "api.Subscriber.signal"], description: "The when() method on a event target returns an Observable object, which provides a declarative API for subscribing to and operating on events. It's an alternative to addEventListener() callbacks.", description_html: "The <code>when()</code> method on a event target returns an <code>Observable</code> object, which provides a declarative API for subscribing to and operating on events. It's an alternative to <code>addEventListener()</code> callbacks.", kind: "\
feature", name: "Observable", spec: ["https://wicg.github.io/observable/"], status: { baseline: false, by_compat_key: { "api.EventTarget.when": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.Observable": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.catch": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.drop": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.every": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.filter": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.finally": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Ob\
servable.find": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.first": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.flatMap": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.forEach": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.from_static": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.inspect": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.last": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.map": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.reduce": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.s\
ome": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.subscribe": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.switchMap": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.take": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.takeUntil": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Observable.toArray": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber.active": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber.addTeardown": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber.complet\
e": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber.error": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber.next": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "api.Subscriber.signal": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, "oes-element-index-uint": { compat_features: ["api.OES_element_index_uint"], description: "The OES_element_index_uint extension for WebGL 1.0 contexts adds support for gl.UNSIGNED_INT types to WebGLRenderingContext.drawElements().", description_html: "The <code>OES_element_index_uint</code> extension for WebGL 1.0 contexts adds support for <code>gl.UNSIGNED_INT</code> types to <code>WebGLRenderingContext.drawElements()</code>.", group: ["webgl-extensions"], kind: "feature", name: "OES_element_index_uint WebGL\
 extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_element_index_uint/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.OES_element_index_uint": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } } }, support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } } }, "oes-fbo-render-mipmap": { compat_features: ["api.OES_fbo_render_mipmap"], description: "The OES_fbo_render_mipmap extension for WebGL 1.0 contexts attaches any level of a texture to a framebuffer object.", description_html: "The <code>OES_fbo_render_mipmap</code> extension for WebGL 1.0 contexts attaches any level of a texture to a framebuffer object.", group: ["webgl-extensions"], kind: "feature", name: "O\
ES_fbo_render_mipmap WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_fbo_render_mipmap/"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.OES_fbo_render_mipmap": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "71", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "71", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, "oes-standard-derivatives": { compat_features: ["api.OES_standard_derivatives"], description: "The OES_standard_derivatives extension for WebGL 1.0 contexts adds the GLSL derivative functions dFdx, dFdy, and fwidth.", description_html: "The <code>OES_standard_derivatives</code> extension for WebGL 1.0 contexts adds the GLSL derivative functions <code>dFdx</code>, <code>dFd\
y</code>, and <code>fwidth</code>.", group: ["webgl-extensions"], kind: "feature", name: "OES_standard_derivatives WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_standard_derivatives/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.OES_standard_derivatives": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "8", safari_ios: "8" } } }, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "8", safari_ios: "8" } } }, "oes-texture-float": { compat_features: ["api.OES_texture_float"], description: "The OES_texture_float extension for WebGL 1.0 contexts adds floating-point pixel types for textures.", description_html: "The <code>OES_texture_float</code> extension for WebGL 1.0 contexts adds floating-po\
int pixel types for textures.", group: ["webgl-extensions"], kind: "feature", name: "OES_texture_float WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_texture_float/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.OES_texture_float": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } } }, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } } }, "oes-texture-float-linear": { compat_features: ["api.OES_texture_float_linear"], description: "The OES_texture_float_linear extension for WebGL 1.0 and 2.0 contexts adds linear filtering with floating-point pixel types for textures.", description_html: "The <code>OES_texture_float_linear</code> extension for WebGL 1\
.0 and 2.0 contexts adds linear filtering with floating-point pixel types for textures.", group: ["webgl-extensions"], kind: "feature", name: "OES_texture_float_linear WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_texture_float_linear/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.OES_texture_float_linear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } } }, support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } } }, "oes-texture-half-float": { compat_features: ["api.OES_texture_half_float"], description: "The OES_texture_half_float extension for WebGL 1.0 contexts adds texture formats with 16-bit (also known as half float) and 32-bit floating-poi\
nt components.", description_html: "The <code>OES_texture_half_float</code> extension for WebGL 1.0 contexts adds texture formats with 16-bit (also known as half float) and 32-bit floating-point components.", group: ["webgl-extensions"], kind: "feature", name: "OES_texture_half_float WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_texture_half_float/"], status: { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", by_compat_key: { "api.OES_texture_half_float": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "27", chrome_android: "27", edge: "14", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } } }, support: { chrome: "27", chrome_android: "27", edge: "14", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } } }, "oes-texture-half-float-linear": { compat_features: ["api.OES_texture_half_float_linear"], description: "The OES_texture_\
half_float_linear extension for WebGL 1.0 contexts adds linear filtering with half floating-point pixel types for textures.", description_html: "The <code>OES_texture_half_float_linear</code> extension for WebGL 1.0 contexts adds linear filtering with half floating-point pixel types for textures.", group: ["webgl-extensions"], kind: "feature", name: "OES_texture_half_float_linear WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_texture_half_float_linear/"], status: { baseline: false, by_compat_key: { "api.OES_texture_half_float_linear": { baseline: false, support: { chrome: "29", chrome_android: "29", edge: "14", firefox: "30", safari: "8", safari_ios: "8" } } }, support: { chrome: "29", chrome_android: "29", edge: "14", firefox: "30", safari: "8", safari_ios: "8" } } }, "oes-vertex-array-object": { compat_features: ["api.OES_vertex_array_object", "api.OES_vertex_array_object.bindVertexArrayOES", "api.OES_vertex_array_object.createVertexArrayOES", "api.OES_ve\
rtex_array_object.deleteVertexArrayOES", "api.OES_vertex_array_object.isVertexArrayOES", "api.WebGLVertexArrayObjectOES"], description: "The OES_vertex_array_object extension for WebGL 1.0 contexts adds vertex array objects (VAOs) which encapsulate vertex array states. These objects keep pointers to vertex data and names for different sets of vertex data.", description_html: "The <code>OES_vertex_array_object</code> extension for WebGL 1.0 contexts adds vertex array objects (VAOs) which encapsulate vertex array states. These objects keep pointers to vertex data and names for different sets of vertex data.", group: ["webgl-extensions"], kind: "feature", name: "OES_vertex_array_object WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_vertex_array_object/"], status: { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", by_compat_key: { "api.OES_vertex_array_object": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "\
2018-04-30", support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "api.OES_vertex_array_object.bindVertexArrayOES": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "api.OES_vertex_array_object.createVertexArrayOES": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "api.OES_vertex_array_object.deleteVertexArrayOES": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "api.OES_vertex_array_object.isVertexArrayOES": {
    baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "api.WebGLVertexArrayObjectOES": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "5.1", safari_ios: "9" } } }, support: { chrome: "24", chrome_android: "25", edge: "17", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "9" } } }, "offline-audio-context": { compat_features: ["api.OfflineAudioCompletionEvent", "api.OfflineAudioCompletionEvent.OfflineAudioCompletionEvent", "api.OfflineAudioCompletionEvent.renderedBuffer", "api.OfflineAudioContext", "api.OfflineAudioContext.OfflineAudioContext", "api.OfflineAudioContext.OfflineAudioContext.options_parameter", "api.OfflineAudioContext.complete_event", "api.OfflineAudioC\
ontext.length", "api.OfflineAudioContext.resume", "api.OfflineAudioContext.startRendering", "api.OfflineAudioContext.startRendering.returns_promise", "api.OfflineAudioContext.suspend"], description: "The OfflineAudioContext API represents an audio processing graph that writes to an AudioBuffer instead of an output device.", description_html: "The <code>OfflineAudioContext</code> API represents an audio processing graph that writes to an <code>AudioBuffer</code> instead of an output device.", group: ["web-audio"], kind: "feature", name: "OfflineAudioContext", spec: ["https://webaudio.github.io/web-audio-api/#OfflineAudioContext"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.OfflineAudioCompletionEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } },
    "api.OfflineAudioCompletionEvent.OfflineAudioCompletionEvent": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "14", safari_ios: "14" } }, "api.OfflineAudioCompletionEvent.renderedBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.OfflineAudioContext": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.OfflineAudioContext": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "\
25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.OfflineAudioContext.options_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "57", firefox_android: "57", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.complete_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.length": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "51", chrome_android: "51", edge: "14", firefox: "49", firefox_android: "49", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.resume": { baseline: false, support: { chrome: "41", chrome_android: "41", edge: "14", safari: "\
14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.startRendering": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.startRendering.returns_promise": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "42", chrome_android: "42", edge: "≤18", firefox: "37", firefox_android: "37", safari: "14.1", safari_ios: "14.5" } }, "api.OfflineAudioContext.suspend": { baseline: false, support: { chrome: "41", chrome_android: "41", edge: "14", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } } }, "offscreen-canvas": { caniuse: ["offscreencanvas"], compat_features: ["api.HTMLCanvasElement.transferControlToOffscreen", "a\
pi.OffscreenCanvas", "api.OffscreenCanvas.OffscreenCanvas", "api.OffscreenCanvas.convertToBlob", "api.OffscreenCanvas.convertToBlob.option_type_parameter_webp", "api.OffscreenCanvas.getContext", "api.OffscreenCanvas.getContext.2d_context", "api.OffscreenCanvas.getContext.bitmaprenderer_context", "api.OffscreenCanvas.getContext.webgl2_context", "api.OffscreenCanvas.getContext.webgl_context", "api.OffscreenCanvas.height", "api.OffscreenCanvas.transferToImageBitmap", "api.OffscreenCanvas.width", "api.OffscreenCanvasRenderingContext2D", "api.OffscreenCanvasRenderingContext2D.arc", "api.OffscreenCanvasRenderingContext2D.arcTo", "api.OffscreenCanvasRenderingContext2D.beginPath", "api.OffscreenCanvasRenderingContext2D.bezierCurveTo", "api.OffscreenCanvasRenderingContext2D.canvas", "api.OffscreenCanvasRenderingContext2D.clearRect", "api.OffscreenCanvasRenderingContext2D.clip", "api.OffscreenCanvasRenderingContext2D.closePath", "api.OffscreenCanvasRenderingContext2D.createImageData", "api.Offsc\
reenCanvasRenderingContext2D.createLinearGradient", "api.OffscreenCanvasRenderingContext2D.createPattern", "api.OffscreenCanvasRenderingContext2D.createRadialGradient", "api.OffscreenCanvasRenderingContext2D.direction", "api.OffscreenCanvasRenderingContext2D.drawImage", "api.OffscreenCanvasRenderingContext2D.ellipse", "api.OffscreenCanvasRenderingContext2D.fill", "api.OffscreenCanvasRenderingContext2D.fillRect", "api.OffscreenCanvasRenderingContext2D.fillStyle", "api.OffscreenCanvasRenderingContext2D.fillText", "api.OffscreenCanvasRenderingContext2D.filter", "api.OffscreenCanvasRenderingContext2D.font", "api.OffscreenCanvasRenderingContext2D.fontKerning", "api.OffscreenCanvasRenderingContext2D.fontStretch", "api.OffscreenCanvasRenderingContext2D.fontVariantCaps", "api.OffscreenCanvasRenderingContext2D.getImageData", "api.OffscreenCanvasRenderingContext2D.getLineDash", "api.OffscreenCanvasRenderingContext2D.getTransform", "api.OffscreenCanvasRenderingContext2D.globalAlpha", "api.Offscre\
enCanvasRenderingContext2D.globalCompositeOperation", "api.OffscreenCanvasRenderingContext2D.imageSmoothingEnabled", "api.OffscreenCanvasRenderingContext2D.imageSmoothingQuality", "api.OffscreenCanvasRenderingContext2D.isPointInPath", "api.OffscreenCanvasRenderingContext2D.isPointInStroke", "api.OffscreenCanvasRenderingContext2D.letterSpacing", "api.OffscreenCanvasRenderingContext2D.lineCap", "api.OffscreenCanvasRenderingContext2D.lineDashOffset", "api.OffscreenCanvasRenderingContext2D.lineJoin", "api.OffscreenCanvasRenderingContext2D.lineTo", "api.OffscreenCanvasRenderingContext2D.lineWidth", "api.OffscreenCanvasRenderingContext2D.measureText", "api.OffscreenCanvasRenderingContext2D.miterLimit", "api.OffscreenCanvasRenderingContext2D.moveTo", "api.OffscreenCanvasRenderingContext2D.putImageData", "api.OffscreenCanvasRenderingContext2D.quadraticCurveTo", "api.OffscreenCanvasRenderingContext2D.rect", "api.OffscreenCanvasRenderingContext2D.resetTransform", "api.OffscreenCanvasRenderingCon\
text2D.restore", "api.OffscreenCanvasRenderingContext2D.rotate", "api.OffscreenCanvasRenderingContext2D.save", "api.OffscreenCanvasRenderingContext2D.scale", "api.OffscreenCanvasRenderingContext2D.setLineDash", "api.OffscreenCanvasRenderingContext2D.setTransform", "api.OffscreenCanvasRenderingContext2D.shadowBlur", "api.OffscreenCanvasRenderingContext2D.shadowColor", "api.OffscreenCanvasRenderingContext2D.shadowOffsetX", "api.OffscreenCanvasRenderingContext2D.shadowOffsetY", "api.OffscreenCanvasRenderingContext2D.stroke", "api.OffscreenCanvasRenderingContext2D.strokeRect", "api.OffscreenCanvasRenderingContext2D.strokeStyle", "api.OffscreenCanvasRenderingContext2D.strokeText", "api.OffscreenCanvasRenderingContext2D.textAlign", "api.OffscreenCanvasRenderingContext2D.textBaseline", "api.OffscreenCanvasRenderingContext2D.textRendering", "api.OffscreenCanvasRenderingContext2D.transform", "api.OffscreenCanvasRenderingContext2D.translate", "api.OffscreenCanvasRenderingContext2D.wordSpacing"],
    description: "The OffscreenCanvas API provides a canvas that can be drawn to off screen, with no dependencies on the DOM, which can be used to run heavy rendering operations inside a worker context.", description_html: "The <code>OffscreenCanvas</code> API provides a canvas that can be drawn to off screen, with no dependencies on the DOM, which can be used to run heavy rendering operations inside a worker context.", group: ["canvas"], kind: "feature", name: "Offscreen canvas", spec: ["https://html.spec.whatwg.org/multipage/canvas.html#the-offscreencanvas-interface"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.HTMLCanvasElement.transferControlToOffscreen": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas": { baseline: "\
high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.OffscreenCanvas": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.convertToBlob": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.convertToBlob.option_type_parameter_webp": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105" } }, "api.OffscreenCanvas.getContext": { baseline: "high", baseline_high_date: "\
2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.getContext.2d_context": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.getContext.bitmaprenderer_context": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.getContext.webgl2_context": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "17", safari_ios: "\
17" } }, "api.OffscreenCanvas.getContext.webgl_context": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "17", safari_ios: "17" } }, "api.OffscreenCanvas.height": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.transferToImageBitmap": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvas.width": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "\
105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.arc": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.arcTo": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.beginPath": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: {
    chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.bezierCurveTo": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.canvas": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.clearRect": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext\
2D.clip": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.closePath": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.createImageData": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.createLinearGradient": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "7\
9", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.createPattern": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.createRadialGradient": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.direction": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.drawImage": { baseline: "high",
    baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.ellipse": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.fill": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.fillRect": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "\
16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.fillStyle": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.fillText": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.filter": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "116", firefox_android: "116" } }, "api.OffscreenCanvasRenderingContext2D.font": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "18.4", safari_ios: "18.4" } }, "api.Offs\
creenCanvasRenderingContext2D.fontKerning": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "105", firefox_android: "105" } }, "api.OffscreenCanvasRenderingContext2D.fontStretch": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "117", firefox_android: "117" } }, "api.OffscreenCanvasRenderingContext2D.fontVariantCaps": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "117", firefox_android: "117" } }, "api.OffscreenCanvasRenderingContext2D.getImageData": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.getLineDash": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "\
105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.getTransform": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.globalAlpha": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.globalCompositeOperation": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.imageSmoothingEnabled": { baseline: "hig\
h", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.imageSmoothingQuality": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.isPointInPath": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.isPointInStroke": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.letter\
Spacing": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "115", firefox_android: "115", safari: "18.4", safari_ios: "18.4" } }, "api.OffscreenCanvasRenderingContext2D.lineCap": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.lineDashOffset": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.lineJoin": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "\
16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.lineTo": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.lineWidth": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.measureText": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.miterLimit": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: {
    chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.moveTo": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.putImageData": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.quadraticCurveTo": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingC\
ontext2D.rect": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.resetTransform": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.restore": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.rotate": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "\
105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.save": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.scale": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.setLineDash": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.setTransform": { baseline: "high", baseline_high_date: "2025-09-27",
    baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.shadowBlur": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.shadowColor": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.shadowOffsetX": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "\
16.4" } }, "api.OffscreenCanvasRenderingContext2D.shadowOffsetY": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.stroke": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.strokeRect": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.strokeStyle": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "\
69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.strokeText": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.textAlign": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.textBaseline": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.textRen\
dering": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "116", firefox_android: "116" } }, "api.OffscreenCanvasRenderingContext2D.transform": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.translate": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } }, "api.OffscreenCanvasRenderingContext2D.wordSpacing": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "115", firefox_android: "115", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "\
105", firefox_android: "105", safari: "16.4", safari_ios: "16.4" } } }, oklab: { compat_features: ["css.types.color.oklab", "css.types.color.oklab.mixed_type_parameters", "css.types.color.oklch", "css.types.color.oklch.mixed_type_parameters"], description: "The Oklab color space expresses colors in terms of lightness and how red/green and blue/yellow a color is, aiming to match how humans perceive colors. OkLCh is a variant of Oklab with polar coordinates. These color spaces can be used with the CSS oklab() and oklch() functions.", description_html: "The Oklab color space expresses colors in terms of lightness and how red/green and blue/yellow a color is, aiming to match how humans perceive colors. OkLCh is a variant of Oklab with polar coordinates. These color spaces can be used with the CSS <code>oklab()</code> and <code>oklch()</code> functions.", group: ["color-types"], kind: "feature", name: "Oklab and OkLCh", spec: ["https://drafts.csswg.org/css-color-4/#ok-lab"], status: { baseline: "\
high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", by_compat_key: { "css.types.color.oklab": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "css.types.color.oklab.mixed_type_parameters": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "113", firefox_android: "113", safari: "16.2", safari_ios: "16.2" } }, "css.types.color.oklch": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "css.types.color.oklch.mixed_type_parameters": { baseline: "high", baseline_high_date: "2026-02-21", baseline_low_date: "2023\
-08-21", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "113", firefox_android: "113", safari: "16.2", safari_ios: "16.2" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } } }, online: { caniuse: ["online-status"], compat_features: ["api.Navigator.onLine", "api.Window.offline_event", "api.Window.online_event", "api.WorkerGlobalScope.offline_event", "api.WorkerGlobalScope.online_event", "api.WorkerNavigator.onLine"], description: "The navigator.onLine property is a boolean for whether the browser is connected to some network (though not necessarily the internet). The online and offline events fire when the connection state changes.", description_html: "The <code>navigator.onLine</code> property is a boolean for whether the browser is connected to some network (though not necessarily the internet). The <code>online</code> and <code>offline</code> events fire when the co\
nnection state changes.", kind: "feature", name: "Online status", spec: ["https://html.spec.whatwg.org/multipage/system-state.html#navigator.online", "https://html.spec.whatwg.org/multipage/indices.html#event-online"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Navigator.onLine": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Window.offline_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "4", safari_ios: "3" } }, "api.Window.online_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "9",
    firefox_android: "9", safari: "4", safari_ios: "3" } }, "api.WorkerGlobalScope.offline_event": { baseline: false, support: { firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "api.WorkerGlobalScope.online_event": { baseline: false, support: { firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "api.WorkerNavigator.onLine": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, opacity: { caniuse: ["css-opacity"], compat_features: ["css.properties.opacity", "css.properties.opacity.percentages", "css.types.number", "css.types.number.scientific_notation", "svg.global_attributes.opacity"], description: "The opacity CSS property sets the transparency of\
 an element.", description_html: "The <code>opacity</code> CSS property sets the transparency of an element.", group: ["css"], kind: "feature", name: "opacity", spec: ["https://drafts.csswg.org/css-color-3/#transparency"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.opacity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } }, "css.properties.opacity.percentages": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "70", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "css.types.number": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.number.scientific_notation": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "svg.global_attributes.opacity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } } }, "opacity-svg": { compat_features: ["css.properties.fill-opacity", "css.properties.stroke-opacity", "svg.global_attributes.fill-opacity", "svg.global_attributes.stroke-opacity"], description: "The fill-opacity, and stroke-opacity SVG attributes and CSS properties control the transpa\
rency of a stroke or fill of an SVG element.", description_html: "The <code>fill-opacity</code>, and <code>stroke-opacity</code> SVG attributes and CSS properties control the transparency of a stroke or fill of an SVG element.", group: ["svg"], kind: "feature", name: "Opacity (SVG)", spec: ["https://w3c.github.io/svgwg/svg2-draft/render.html#ObjectAndGroupOpacityProperties"], status: { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", by_compat_key: { "css.properties.fill-opacity": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-opacity": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "\
3.2" } }, "svg.global_attributes.fill-opacity": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-opacity": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } } }, support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1.5", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } } }, "open-closed": { kind: "moved", redirect_target: "open-pseudo" }, "open-pseudo": { compat_features: ["css.selectors.open"], description: "The :open CSS pseudo-class matches elements that have open states, like <details>, <dialog>, or <select>, based on their state.", description_html: "\
The <code>:open</code> CSS pseudo-class matches elements that have open states, like <code>&#x3C;details></code>, <code>&#x3C;dialog></code>, or <code>&#x3C;select></code>, based on their state.", group: ["selectors"], kind: "feature", name: ":open", spec: ["https://drafts.csswg.org/selectors-4/#open-state"], status: { baseline: false, by_compat_key: { "css.selectors.open": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "136", firefox_android: "136" } } }, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "136", firefox_android: "136" } } }, "optional-catch-binding": { compat_features: ["javascript.statements.try_catch.optional_catch_binding"], description: "Omit the binding parameter of a catch clause when you don't need information about the exception in a try ... catch statement.", description_html: "Omit the binding parameter of a <code>catch</code> clause when you don't need information about the exception in a <code>\
try ... catch</code> statement.", group: ["javascript"], kind: "feature", name: "Optional catch binding", snapshot: ["ecmascript-2019"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-try-statement"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.statements.try_catch.optional_catch_binding": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "58", firefox_android: "58", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "58", firefox_android: "58", safari: "11.1", safari_ios: "11.3" } } }, "orientation-sensor": { compat_features: ["api.AbsoluteOrientationSensor", "api.AbsoluteOrientationSensor.AbsoluteOrientationSensor", "api.OrientationSensor", "api.OrientationSensor.populateMatrix", "api.Orientat\
ionSensor.quaternion", "api.RelativeOrientationSensor", "api.RelativeOrientationSensor.RelativeOrientationSensor", "api.Sensor", "api.Sensor.activate_event", "api.Sensor.activated", "api.Sensor.error_event", "api.Sensor.hasReading", "api.Sensor.reading_event", "api.Sensor.start", "api.Sensor.stop", "api.Sensor.timestamp", "api.SensorErrorEvent", "api.SensorErrorEvent.SensorErrorEvent", "api.SensorErrorEvent.error"], description: "The AbsoluteOrientationSensor and RelativeOrientationSensor APIs describe the physical orientation of a device in three-dimensional space, either in relation to the Earth's coordinate system or in relation to the device's own orientation, respectively.", description_html: "The <code>AbsoluteOrientationSensor</code> and <code>RelativeOrientationSensor</code> APIs describe the physical orientation of a device in three-dimensional space, either in relation to the Earth's coordinate system or in relation to the device's own orientation, respectively.", group: ["se\
nsors"], kind: "feature", name: "Orientation Sensor", spec: ["https://w3c.github.io/orientation-sensor/#absoluteorientationsensor-interface", "https://w3c.github.io/orientation-sensor/#relativeorientationsensor-interface"], status: { baseline: false, by_compat_key: { "api.AbsoluteOrientationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.AbsoluteOrientationSensor.AbsoluteOrientationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.OrientationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.OrientationSensor.populateMatrix": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.OrientationSensor.quaternion": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.RelativeOrientationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.RelativeO\
rientationSensor.RelativeOrientationSensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.activate_event": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.activated": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.error_event": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.hasReading": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.reading_event": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.start": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.stop": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.Sensor.timestamp": { baseline: false,
    support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.SensorErrorEvent": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.SensorErrorEvent.SensorErrorEvent": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } }, "api.SensorErrorEvent.error": { baseline: false, support: { chrome: "67", chrome_android: "67", edge: "79" } } }, support: { chrome: "67", chrome_android: "67", edge: "79" } } }, origin: { compat_features: ["api.Origin", "api.Origin.Origin", "api.Origin.from_static", "api.Origin.isSameOrigin", "api.Origin.isSameSite", "api.Origin.opaque"], description: "An Origin object represents an origin, as in a scheme, hostname, and port. You can use it to make same-site and same-origin comparisons.", description_html: "An <code>Origin</code> object represents an origin, as in a scheme, hostname, and port. You can use it to make same-site and same-origin comparisons.", kind: "feature", name: "Origin", spec: [
    "https://html.spec.whatwg.org/multipage/browsers.html#the-origin-interface"], status: { baseline: false, by_compat_key: { "api.Origin": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.Origin.Origin": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.Origin.from_static": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.Origin.isSameOrigin": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.Origin.isSameSite": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } }, "api.Origin.opaque": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145" } } }, support: { chrome: "145", chrome_android: "145", edge: "145" } } }, "origin-private-file-system": { compat_features: ["api.FileSystemDirectoryHandle", "api.FileSystemDirectoryHandle.entries", "api.FileSystemDirectoryHandle.getDi\
rectoryHandle", "api.FileSystemDirectoryHandle.getFileHandle", "api.FileSystemDirectoryHandle.keys", "api.FileSystemDirectoryHandle.removeEntry", "api.FileSystemDirectoryHandle.resolve", "api.FileSystemDirectoryHandle.values", "api.FileSystemFileHandle", "api.FileSystemFileHandle.createSyncAccessHandle", "api.FileSystemFileHandle.getFile", "api.FileSystemHandle", "api.FileSystemHandle.isSameEntry", "api.FileSystemHandle.kind", "api.FileSystemHandle.name", "api.FileSystemSyncAccessHandle", "api.FileSystemSyncAccessHandle.close", "api.FileSystemSyncAccessHandle.close.sync_version", "api.FileSystemSyncAccessHandle.flush", "api.FileSystemSyncAccessHandle.flush.sync_version", "api.FileSystemSyncAccessHandle.getSize", "api.FileSystemSyncAccessHandle.getSize.sync_version", "api.FileSystemSyncAccessHandle.read", "api.FileSystemSyncAccessHandle.truncate", "api.FileSystemSyncAccessHandle.truncate.sync_version", "api.FileSystemSyncAccessHandle.write", "api.StorageManager.getDirectory"], description: "\
The navigator.storage.getDirectory() method returns a FileSystemDirectoryHandle that is restricted to a specific origin and invisible to the user's actual file system for faster file-based applications, such as SQLite databases.", description_html: "The <code>navigator.storage.getDirectory()</code> method returns a <code>FileSystemDirectoryHandle</code> that is restricted to a specific origin and invisible to the user's actual file system for faster file-based applications, such as SQLite databases.", group: ["file-system"], kind: "feature", name: "Origin private file system", spec: ["https://fs.spec.whatwg.org/#origin-private-file-system"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.FileSystemDirectoryHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "\
15.2" } }, "api.FileSystemDirectoryHandle.entries": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemDirectoryHandle.getDirectoryHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemDirectoryHandle.getFileHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemDirectoryHandle.keys": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "1\
09", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemDirectoryHandle.removeEntry": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemDirectoryHandle.resolve": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemDirectoryHandle.values": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemFileHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "\
2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemFileHandle.createSyncAccessHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemFileHandle.getFile": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemHandle.isSameEntry": { baseline: "high",
    baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemHandle.kind": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemHandle.name": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemSyncAccessHandle": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSyste\
mSyncAccessHandle.close": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemSyncAccessHandle.close.sync_version": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "108", chrome_android: "109", edge: "108", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.FileSystemSyncAccessHandle.flush": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemSyncAccessHandle.flush.sync_version": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "108", chrome_android: "109", edge: "\
108", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.FileSystemSyncAccessHandle.getSize": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemSyncAccessHandle.getSize.sync_version": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "108", chrome_android: "109", edge: "108", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.FileSystemSyncAccessHandle.read": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemSyncAccessHandle.truncate": { baseline: "high", baseline_high_date: "2025-09\
-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.FileSystemSyncAccessHandle.truncate.sync_version": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "108", chrome_android: "109", edge: "108", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.FileSystemSyncAccessHandle.write": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "102", chrome_android: "109", edge: "102", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } }, "api.StorageManager.getDirectory": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "86", chrome_android: "109", edge: "86", firefox: "111", firefox_android: "111", safari: "15.2", safari_ios: "15.2" } } }, support: {
    chrome: "108", chrome_android: "109", edge: "108", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } } }, outline: { compat_features: ["css.properties.outline", "css.properties.outline.dashed", "css.properties.outline.dotted", "css.properties.outline.double", "css.properties.outline.groove", "css.properties.outline.inset", "css.properties.outline.medium", "css.properties.outline.none", "css.properties.outline.outset", "css.properties.outline.ridge", "css.properties.outline.solid", "css.properties.outline.thick", "css.properties.outline.thin", "css.properties.outline.transparent"], description: "The outline CSS shorthand sets the color, style, and width of a line around an element, outside of the border.", description_html: "The <code>outline</code> CSS shorthand sets the color, style, and width of a line around an element, outside of the border.", kind: "feature", name: "outline", spec: ["https://drafts.csswg.org/css-ui-4/#outline"], status: { baseline: "\
high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "css.properties.outline": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.dashed": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.dotted": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.double": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "\
94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.groove": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.inset": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.medium": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.none": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "\
94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.outset": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.ridge": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.solid": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.thick": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-\
27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.thin": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } }, "css.properties.outline.transparent": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "88", firefox_android: "88", safari: "16.4", safari_ios: "16.4" } } }, outlines: { compat_features: ["css.properties.outline-color", "css.properties.outline-color.transparent", "css.properties.outline-offset", "css.properties.outline-style", "css.properties.outline-style\
.auto", "css.properties.outline-style.dashed", "css.properties.outline-style.dotted", "css.properties.outline-style.double", "css.properties.outline-style.groove", "css.properties.outline-style.inset", "css.properties.outline-style.none", "css.properties.outline-style.outset", "css.properties.outline-style.ridge", "css.properties.outline-style.solid", "css.properties.outline-width", "css.properties.outline-width.medium", "css.properties.outline-width.thick", "css.properties.outline-width.thin"], description: "The outline-color, outline-style, and outline-width and outline-offset CSS properties style a line around an element, outside of the border.", description_html: "The <code>outline-color</code>, <code>outline-style</code>, and <code>outline-width</code> and <code>outline-offset</code> CSS properties style a line around an element, outside of the border.", kind: "feature", name: "Outlines", spec: ["https://drafts.csswg.org/css-ui-4/#outline"], status: { baseline: "high", baseline_high_date: "\
2019-10-05", baseline_low_date: "2017-04-05", by_compat_key: { "css.properties.outline-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-offset": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "15", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.dashed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.dotted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.double": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.groove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.inset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.outset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015\
-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.ridge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-style.solid": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-width.medium": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-width.thick": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.outline-width.thin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "15", firefox: "1.5", firefox_android: "4", safari: "1.2", safari_ios: "1" } } }, output: { compat_features: ["api.HTMLOutputElement", "api.HTMLOutputElement.HTMLOutputElement", "api.HTMLOutputElement.defaultValue", "api.HTMLOutputElement.form", "api.HTMLOutputElement.htmlFor", "api.HTML\
OutputElement.labels", "api.HTMLOutputElement.name", "api.HTMLOutputElement.type", "api.HTMLOutputElement.value", "html.elements.output", "html.elements.output.for", "html.elements.output.form", "html.elements.output.name"], description: "The <output> element represents the result of a calculation, user action, or form entry.", description_html: "The <code>&#x3C;output></code> element represents the result of a calculation, user action, or form entry.", group: ["forms", "html-elements"], kind: "feature", name: "<output>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-output-element"], status: { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", by_compat_key: { "api.HTMLOutputElement": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.H\
TMLOutputElement": { baseline: false, support: { safari: "15", safari_ios: "15" } }, "api.HTMLOutputElement.defaultValue": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.form": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.htmlFor": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "9", chrome_android: "18",
    edge: "18", firefox: "56", firefox_android: "56", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.name": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.type": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLOutputElement.value": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "9", chrome_android: "18", edge: "14", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.output": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "10", chrome_android: "18", edge: "\
≤18", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "html.elements.output.for": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "10", chrome_android: "18", edge: "≤18", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "html.elements.output.form": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "10", chrome_android: "18", edge: "≤18", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "html.elements.output.name": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "10", chrome_android: "18", edge: "≤18", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } } }, support: { chrome: "10", chrome_android: "18", edge: "≤18", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } } }, overflow: { compat_features: [
    "css.at-rules.media.overflow-block", "css.at-rules.media.overflow-inline"], description: "The overflow-block and overflow-inline CSS media queries set styles based on the way a device displays content that's larger than the viewport or page area. For example, a laptop lets users scroll to reveal content, while a printer displays overflowing content on additional pages.", description_html: "The <code>overflow-block</code> and <code>overflow-inline</code> CSS media queries set styles based on the way a device displays content that's larger than the viewport or page area. For example, a laptop lets users scroll to reveal content, while a printer displays overflowing content on additional pages.", group: ["media-queries"], kind: "feature", name: "Overflow media queries", spec: ["https://drafts.csswg.org/mediaqueries-5/#mf-overflow-block", "https://drafts.csswg.org/mediaqueries-5/#mf-overflow-inline"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "202\
3-09-18", by_compat_key: { "css.at-rules.media.overflow-block": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "66", firefox_android: "66", safari: "17", safari_ios: "17" } }, "css.at-rules.media.overflow-inline": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "66", firefox_android: "66", safari: "17", safari_ios: "17" } } }, support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "66", firefox_android: "66", safari: "17", safari_ios: "17" } } }, "overflow-anchor": { caniuse: ["css-overflow-anchor"], compat_features: ["css.properties.overflow-anchor", "css.properties.overflow-anchor.auto", "css.properties.overflow-anchor.none"], description: "The overflow-anchor CSS property sets an element as a possible scroll anchor, reducing unintended scrolling when\
 document changes occur above the current scrollport. This is enabled by default where supported.", description_html: "The <code>overflow-anchor</code> CSS property sets an element as a possible scroll anchor, reducing unintended scrolling when document changes occur above the current scrollport. This is enabled by default where supported.", group: ["scrolling"], kind: "feature", name: "overflow-anchor", spec: ["https://drafts.csswg.org/css-scroll-anchoring-1/#exclusion-api"], status: { baseline: false, by_compat_key: { "css.properties.overflow-anchor": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "66", firefox_android: "66" } }, "css.properties.overflow-anchor.auto": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "66", firefox_android: "66" } }, "css.properties.overflow-anchor.none": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "66", firefox_android: "66" } } }, support: {
    chrome: "56", chrome_android: "56", edge: "79", firefox: "66", firefox_android: "66" } } }, "overflow-clip": { compat_features: ["css.properties.overflow-x.clip", "css.properties.overflow-y.clip", "css.properties.overflow.clip", "css.types.overflow.clip"], description: "The overflow: clip CSS declaration clips an element's overflowing content to the box that's defined by the overflow-clip-margin property. Unlike overflow: hidden, it allows you to hide overflow on one axis while keeping overflow on the other axis visible.", description_html: "The <code>overflow: clip</code> CSS declaration clips an element's overflowing content to the box that's defined by the <code>overflow-clip-margin</code> property. Unlike <code>overflow: hidden</code>, it allows you to hide overflow on one axis while keeping overflow on the other axis visible.", group: ["css"], kind: "feature", name: "overflow: clip", spec: ["https://drafts.csswg.org/css-overflow-3/#propdef-overflow"], status: { baseline: "high",
    baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: { "css.properties.overflow-x.clip": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } }, "css.properties.overflow-y.clip": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } }, "css.properties.overflow.clip": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } }, "css.types.overflow.clip": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "90", chrome_android: "\
90", edge: "90", firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } } }, support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } } }, "overflow-clip-margin": { compat_features: ["css.properties.overflow-clip-margin", "css.properties.overflow-clip-margin.border-box", "css.properties.overflow-clip-margin.content-box", "css.properties.overflow-clip-margin.padding-box"], description: "The overflow-clip-margin CSS property sets how far overflow content may appear outside the bounds of an element before it's clipped by effects such as overflow: clip.", description_html: "The <code>overflow-clip-margin</code> CSS property sets how far overflow content may appear outside the bounds of an element before it's clipped by effects such as <code>overflow: clip</code>.", group: ["css"], kind: "feature", name: "overflow-clip-margin", spec: ["https://drafts.csswg.org/css-overflow-4/#overflow-clip-margin"], status: {
    baseline: false, by_compat_key: { "css.properties.overflow-clip-margin": { baseline: false, support: { firefox: "102", firefox_android: "102" } }, "css.properties.overflow-clip-margin.border-box": { baseline: false, support: { firefox: "148", firefox_android: "148" } }, "css.properties.overflow-clip-margin.content-box": { baseline: false, support: { firefox: "148", firefox_android: "148" } }, "css.properties.overflow-clip-margin.padding-box": { baseline: false, support: { firefox: "148", firefox_android: "148" } } }, support: { firefox: "148", firefox_android: "148" } } }, "overflow-overlay": { caniuse: ["css-overflow-overlay"], compat_features: ["css.types.overflow.overlay"], description: "The overflow: overlay CSS declaration is an alias to overflow: auto. Historically, it caused non-standard behavior, allowing scrollbars to overlay content without taking up layout space.", description_html: "The <code>overflow: overlay</code> CSS declaration is an alias to <code>overflow: auto</\
code>. Historically, it caused non-standard behavior, allowing scrollbars to overlay content without taking up layout space.", discouraged: { according_to: ["https://drafts.csswg.org/css-overflow-3/#valdef-overflow-overlay"], alternatives: ["overflow-shorthand"], reason: "Some old browsers may implement non-standard behavior for overflow: overlay.", reason_html: "Some old browsers may implement non-standard behavior for <code>overflow: overlay</code>." }, group: ["css"], kind: "feature", name: "overflow: overlay", spec: ["https://drafts.csswg.org/css-overflow-3/#propdef-overflow"], status: { baseline: false, by_compat_key: { "css.types.overflow.overlay": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "112", firefox_android: "112", safari: "12", safari_ios: "12" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "112", firefox_android: "112", safari: "12", safari_ios: "12" } } }, "overflow-shorthand": { caniuse: ["css\
-overflow"], compat_features: ["css.properties.overflow", "css.properties.overflow-x", "css.properties.overflow-x.auto", "css.properties.overflow-x.hidden", "css.properties.overflow-x.scroll", "css.properties.overflow-x.visible", "css.properties.overflow-y", "css.properties.overflow-y.auto", "css.properties.overflow-y.hidden", "css.properties.overflow-y.scroll", "css.properties.overflow-y.visible", "css.properties.overflow.auto", "css.properties.overflow.hidden", "css.properties.overflow.multiple_keywords", "css.properties.overflow.scroll", "css.properties.overflow.visible", "css.types.overflow"], description: "The overflow CSS property sets the behavior for when content doesn't fit in an element.", description_html: "The <code>overflow</code> CSS property sets the behavior for when content doesn't fit in an element.", group: ["css"], kind: "feature", name: "overflow", spec: ["https://drafts.csswg.org/css-overflow-3/#propdef-overflow"], status: { baseline: "high", baseline_high_date: "\
2022-09-24", baseline_low_date: "2020-03-24", by_compat_key: { "css.properties.overflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.overflow-x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.overflow-x.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-x.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-x.scroll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-x.visible": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.overflow-y.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-y.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-y.scroll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow-y.visible": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "css.properties.overflow.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow.multiple_keywords": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "61", firefox_android: "61", safari: "13.1", safari_ios: "13.4" } }, "css.properties.overflow.scroll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.overflow.visible": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "css.types.overflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "61", firefox_android: "61", safari: "13.1", safari_ios: "13.4" } } }, "overflow-wrap": { caniuse: ["wordwrap"], compat_features: ["css.properties.overflow-wrap", "css.properties.overflow-wrap.anywhere", "css.properties.overflow-wrap.break-word", "css.properties.overflow-wrap.normal"], description: "The overflow-wrap CSS property breaks a line of text onto multiple lines inside the targeted element in an otherwise unbreakable place to prevent overflow. The legacy property is word-wrap.", description_html: "The <code>overflow-wrap</code> CSS property breaks a line of text onto multiple lines inside the targeted element in an otherwise unbreakable p\
lace to prevent overflow. The legacy property is <code>word-wrap</code>.", group: ["text-wrap"], kind: "feature", name: "overflow-wrap", spec: ["https://drafts.csswg.org/css-text-4/#overflow-wrap-property"], status: { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", by_compat_key: { "css.properties.overflow-wrap": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "23", chrome_android: "25", edge: "18", firefox: "49", firefox_android: "49", safari: "7", safari_ios: "7" } }, "css.properties.overflow-wrap.anywhere": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "65", firefox_android: "65", safari: "15.4", safari_ios: "15.4" } }, "css.properties.overflow-wrap.break-word": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "23", chrome_android: "\
25", edge: "18", firefox: "49", firefox_android: "49", safari: "7", safari_ios: "7" } }, "css.properties.overflow-wrap.normal": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "23", chrome_android: "25", edge: "18", firefox: "49", firefox_android: "49", safari: "7", safari_ios: "7" } } }, support: { chrome: "23", chrome_android: "25", edge: "18", firefox: "49", firefox_android: "49", safari: "7", safari_ios: "7" } } }, overlay: { compat_features: ["css.properties.overlay", "css.properties.overlay.auto", "css.properties.overlay.none"], description: "The overlay CSS property, used as an allow-discrete CSS transition, prevents a top layer element, such as a popover or a <dialog>, from being removed from the top layer before it has finished animating. You can't set the value of the overlay property; only use it as transition property.", description_html: "The <code>overlay</code> CSS property, used as an <code>allow-discrete</code> \
CSS transition, prevents a top layer element, such as a popover or a <code>&#x3C;dialog></code>, from being removed from the top layer before it has finished animating. You can't set the value of the <code>overlay</code> property; only use it as transition property.", group: ["css"], kind: "feature", name: "overlay", spec: ["https://drafts.csswg.org/css-position-4/#overlay"], status: { baseline: false, by_compat_key: { "css.properties.overlay": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "css.properties.overlay.auto": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "css.properties.overlay.none": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } } }, support: { chrome: "117", chrome_android: "117", edge: "117" } } }, "overscroll-behavior": { caniuse: ["css-overscroll-behavior"], compat_features: ["css.properties.overscroll-behavior", "css.properties.overscroll-behavior-block", "\
css.properties.overscroll-behavior-block.auto", "css.properties.overscroll-behavior-block.contain", "css.properties.overscroll-behavior-block.none", "css.properties.overscroll-behavior-inline", "css.properties.overscroll-behavior-inline.auto", "css.properties.overscroll-behavior-inline.contain", "css.properties.overscroll-behavior-inline.none", "css.properties.overscroll-behavior-x", "css.properties.overscroll-behavior-x.auto", "css.properties.overscroll-behavior-x.contain", "css.properties.overscroll-behavior-x.none", "css.properties.overscroll-behavior-y", "css.properties.overscroll-behavior-y.auto", "css.properties.overscroll-behavior-y.contain", "css.properties.overscroll-behavior-y.none", "css.properties.overscroll-behavior.auto", "css.properties.overscroll-behavior.contain", "css.properties.overscroll-behavior.none"], description: "The overscroll-behavior CSS property disables default scrolling behaviors when the edges of a scrolling area are reached.", description_html: "The <co\
de>overscroll-behavior</code> CSS property disables default scrolling behaviors when the edges of a scrolling area are reached.", group: ["scrolling"], kind: "feature", name: "overscroll-behavior", spec: ["https://drafts.csswg.org/css-overscroll-1/"], status: { baseline: false, by_compat_key: { "css.properties.overscroll-behavior": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-block": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-block.auto": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-block.contain": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.oversc\
roll-behavior-block.none": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-inline": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-inline.auto": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-inline.contain": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-inline.none": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-x": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "\
150" } }, "css.properties.overscroll-behavior-x.auto": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-x.contain": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-x.none": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "79", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-y": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-y.auto": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior-y.contain": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "18", firefox: "150", firefox_android: "\
150" } }, "css.properties.overscroll-behavior-y.none": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "79", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior.auto": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "79", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior.contain": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "79", firefox: "150", firefox_android: "150" } }, "css.properties.overscroll-behavior.none": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "79", firefox: "150", firefox_android: "150" } } }, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "150", firefox_android: "150" } } }, "ovr-multiview2": { compat_features: ["api.OVR_multiview2", "api.OVR_multiview2.framebufferTextureMultiviewOVR"], description: "The OVR_multiview2 extension for WebGL 2.0 contexts renders into multiple views\
 simultaneously. This especially useful for virtual reality (VR) and WebXR.", description_html: "The <code>OVR_multiview2</code> extension for WebGL 2.0 contexts renders into multiple views simultaneously. This especially useful for virtual reality (VR) and WebXR.", group: ["webgl-extensions"], kind: "feature", name: "OVR_multiview2 WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OVR_multiview2/"], status: { baseline: false, by_compat_key: { "api.OVR_multiview2": { baseline: false, support: { chrome_android: "93" } }, "api.OVR_multiview2.framebufferTextureMultiviewOVR": { baseline: false, support: { chrome_android: "93" } } }, support: { chrome_android: "93" } } }, p: { compat_features: ["api.HTMLParagraphElement", "html.elements.p"], description: "The <p> element represents a paragraph of text.", description_html: "The <code>&#x3C;p></code> element represents a paragraph of text.", group: ["html-elements"], kind: "feature", name: "<p>", spec: ["https://html.spe\
c.whatwg.org/multipage/grouping-content.html#the-p-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLParagraphElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.p": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, padding: { compat_features: ["css.properties.padding", "css.properties.padding-bottom", "css.properties.padding-left", "css.properties.padding-right", "css.properties.padding-top"], description: "The padding CSS prope\
rty sets space between an element's edge and its contents. It is a shorthand for padding-top, padding-right, padding-bottom, and padding-left.", description_html: "The <code>padding</code> CSS property sets space between an element's edge and its contents. It is a shorthand for <code>padding-top</code>, <code>padding-right</code>, <code>padding-bottom</code>, and <code>padding-left</code>.", group: ["layout"], kind: "feature", name: "padding", spec: ["https://drafts.csswg.org/css-box-4/#paddings"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.padding": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.padding-bottom": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.padding-left": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.padding-right": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.padding-top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "page-break-aliases": {
    compat_features: ["css.properties.page-break-after", "css.properties.page-break-after.always", "css.properties.page-break-after.auto", "css.properties.page-break-after.avoid", "css.properties.page-break-after.left", "css.properties.page-break-after.right", "css.properties.page-break-before", "css.properties.page-break-before.always", "css.properties.page-break-before.auto", "css.properties.page-break-before.avoid", "css.properties.page-break-before.left", "css.properties.page-break-before.right", "css.properties.page-break-inside", "css.properties.page-break-inside.auto", "css.properties.page-break-inside.avoid"], description: "The page-break-before, page-break-inside, and page-break-after CSS properties are aliases to the break-before, break-inside, and break-after properties.", description_html: "The <code>page-break-before</code>, <code>page-break-inside</code>, and <code>page-break-after</code> CSS properties are aliases to the <code>break-before</code>, <code>break-inside</cod\
e>, and <code>break-after</code> properties.", discouraged: { according_to: ["https://drafts.csswg.org/css-break-4/#page-break-properties"], alternatives: ["page-breaks"], reason: "The page-break- alias properties exist only for backwards compatibility with pages that predate the break- properties.", reason_html: "The <code>page-break-</code> alias properties exist only for backwards compatibility with pages that predate the <code>break-</code> properties." }, group: ["layout"], kind: "feature", name: "Page break aliases", spec: ["https://drafts.csswg.org/css-break-4/#page-break-properties"], status: { baseline: false, by_compat_key: { "css.properties.page-break-after": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-after.always": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "\
1" } }, "css.properties.page-break-after.auto": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-after.avoid": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12" } }, "css.properties.page-break-after.left": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-after.right": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-before": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-before.always": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-before.auto": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-before.avoid": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12" } }, "css.properties.page-break-before.left": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-before.right": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.page-break-inside": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "1.3", safari_ios: "1" } }, "css.properties.page-break-inside.auto": { baseline: false,
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "1.3", safari_ios: "1" } }, "css.properties.page-break-inside.avoid": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "1.3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12" } } }, "page-breaks": { compat_features: ["css.properties.break-after", "css.properties.break-after.always", "css.properties.break-after.auto", "css.properties.break-after.avoid", "css.properties.break-after.avoid-page", "css.properties.break-after.left", "css.properties.break-after.page", "css.properties.break-after.paged_context", "css.properties.break-after.paged_context.avoid-page", "css.properties.break-after.paged_context.page", "css.properties.break-after.paged_context.recto", "css.properties.break-after.recto", "css.properties.break-after.right", "css.properties.break-after.verso", "css.properties\
.break-before", "css.properties.break-before.always", "css.properties.break-before.auto", "css.properties.break-before.avoid", "css.properties.break-before.avoid-page", "css.properties.break-before.left", "css.properties.break-before.page", "css.properties.break-before.paged_context", "css.properties.break-before.paged_context.page", "css.properties.break-before.paged_context.recto", "css.properties.break-before.recto", "css.properties.break-before.right", "css.properties.break-before.verso", "css.properties.break-inside", "css.properties.break-inside.auto", "css.properties.break-inside.avoid", "css.properties.break-inside.avoid-page", "css.properties.break-inside.paged_context", "css.properties.break-inside.paged_context.avoid-page"], description: "In printed page layouts, the break-after, break-before, break-inside CSS properties control where printed pages start and end. Also known as pagination or page breaking.", description_html: "In printed page layouts, the <code>break-after</c\
ode>, <code>break-before</code>, <code>break-inside</code> CSS properties control where printed pages start and end. Also known as pagination or page breaking.", group: ["layout"], kind: "feature", name: "Page breaks", spec: ["https://drafts.csswg.org/css-break-4/#breaking-controls"], status: { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", by_compat_key: { "css.properties.break-after": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-after.always": { baseline: false, support: { firefox: "65", firefox_android: "65" } }, "css.properties.break-after.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "\
10" } }, "css.properties.break-after.avoid": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "css.properties.break-after.avoid-page": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-after.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-after.page": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-after.paged_context": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "\
65", safari: "10", safari_ios: "10" } }, "css.properties.break-after.paged_context.avoid-page": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "12", safari: "10", safari_ios: "10" } }, "css.properties.break-after.paged_context.page": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-after.paged_context.recto": { baseline: false, support: {} }, "css.properties.break-after.recto": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-after.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-after.ver\
so": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-before": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.always": { baseline: false, support: { firefox: "65", firefox_android: "65" } }, "css.properties.break-before.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.avoid": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "css.properties.break-before.avoid-page": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "\
10" } }, "css.properties.break-before.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.page": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.paged_context": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.paged_context.page": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "\
65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.paged_context.recto": { baseline: false, support: {} }, "css.properties.break-before.recto": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-before.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-before.verso": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79", safari: "10", safari_ios: "10" } }, "css.properties.break-inside": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.auto": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.avoid": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.avoid-page": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "92", firefox_android: "92", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.paged_context": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "css.properties.break-inside.paged_co\
ntext.avoid-page": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "12", firefox: "92", firefox_android: "92" } } }, support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } } }, "page-lifecycle": { compat_features: ["api.Document.freeze_event", "api.Document.resume_event", "api.Document.wasDiscarded"], description: "The page lifecycle API helps you safely handle page suspensions or discards from memory. The freeze and resume events fire when the browser suspends or resumes a page from memory while the document.wasDiscarded property reports whether the page was reloaded after being dropped.", description_html: "The page lifecycle API helps you safely handle page suspensions or discards from memory. The <code>freeze</code> and <code>resume</code> events fire when the browser suspends or resumes a page from memory while the <code>document.wasDiscarded</code> property reports whether the page \
was reloaded after being dropped.", kind: "feature", name: "Page lifecycle", spec: ["https://wicg.github.io/page-lifecycle/"], status: { baseline: false, by_compat_key: { "api.Document.freeze_event": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } }, "api.Document.resume_event": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } }, "api.Document.wasDiscarded": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } } }, support: { chrome: "68", chrome_android: "68", edge: "79" } } }, "page-orientation": { compat_features: ["css.at-rules.page.page-orientation"], description: "The page-orientation CSS property sets the rotation of a page after pagination. This allows pages with the same size declaration to display with different orientations.", description_html: "The <code>page-orientation</code> CSS property sets the rotation of a page after pagination. This allows pages with the same <code>size</code> dec\
laration to display with different orientations.", group: ["layout", "print"], kind: "feature", name: "page-orientation", spec: ["https://drafts.csswg.org/css-page-3/#page-orientation-prop"], status: { baseline: false, by_compat_key: { "css.at-rules.page.page-orientation": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "122", firefox_android: "122" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "122", firefox_android: "122" } } }, "page-selectors": { compat_features: ["css.selectors.first", "css.selectors.left", "css.selectors.right"], description: "The :first, :left, and :right pseudo-classes select pages based on their position in sequence after pagination.", description_html: "The <code>:first</code>, <code>:left</code>, and <code>:right</code> pseudo-classes select pages based on their position in sequence after pagination.", group: ["selectors", "print"], kind: "feature", name: "Page selectors", spec: ["https://dr\
afts.csswg.org/css-page-3/#page-selectors"], status: { baseline: false, by_compat_key: { "css.selectors.first": { baseline: "high", baseline_high_date: "2026-02-01", baseline_low_date: "2023-08-01", support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "116", firefox_android: "116", safari: "6", safari_ios: "6" } }, "css.selectors.left": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", safari: "5", safari_ios: "4.2" } }, "css.selectors.right": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "18", chrome_android: "18", edge: "12", safari: "6", safari_ios: "6" } } }, "page-setup": { caniuse: ["css-paged-media"], compat_features: ["css.at-rules.page", "css.at-rules.page.bottom-center", "css.at-rules.page.bottom-left", "css.at-rules.page.bottom-left-corner", "css.at-rules.page.bottom-right", "css.at-rules.page.bottom-right-corner", "css.at-rules.page.left-bottom",
    "css.at-rules.page.left-middle", "css.at-rules.page.left-top", "css.at-rules.page.right-bottom", "css.at-rules.page.right-middle", "css.at-rules.page.right-top", "css.at-rules.page.size", "css.at-rules.page.size.jis-b4", "css.at-rules.page.size.jis-b5", "css.at-rules.page.top-center", "css.at-rules.page.top-left", "css.at-rules.page.top-left-corner", "css.at-rules.page.top-right", "css.at-rules.page.top-right-corner", "css.properties.page"], description: "The @page CSS at-rule sets the page-specific dimensions and margins for content such as printed documents, ebooks, or slides.", description_html: "The <code>@page</code> CSS at-rule sets the page-specific dimensions and margins for content such as printed documents, ebooks, or slides.", group: ["layout", "print"], kind: "feature", name: "Page setup", spec: ["https://drafts.csswg.org/css-page-3/#at-page-rule"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "css.at-rules.page": { baseline: "low", baseline_low_date: "\
2024-12-11", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "19", firefox_android: "19", safari: "18.2", safari_ios: "18.2" } }, "css.at-rules.page.bottom-center": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.bottom-left": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.bottom-left-corner": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.bottom-right": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.bottom-right-corner": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.left-bottom": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.left-middle": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at\
-rules.page.left-top": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.right-bottom": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.right-middle": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.right-top": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.size": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "15", chrome_android: "18", edge: "79", firefox: "95", firefox_android: "95", safari: "18.2", safari_ios: "18.2" } }, "css.at-rules.page.size.jis-b4": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "95", firefox_android: "95", safari: "18.2", safari_ios: "18.2" } }, "css.at-rules.page.size.jis-b5": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "\
83", chrome_android: "83", edge: "83", firefox: "95", firefox_android: "95", safari: "18.2", safari_ios: "18.2" } }, "css.at-rules.page.top-center": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.top-left": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.top-left-corner": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.top-right": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.at-rules.page.top-right-corner": { baseline: false, support: { chrome: "131", chrome_android: "131", edge: "131" } }, "css.properties.page": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "110", firefox_android: "110", safari: "1", safari_ios: "1" } } }, support: { chrome: "15", chrome_android: "18",
    edge: "79", firefox: "95", firefox_android: "95", safari: "18.2", safari_ios: "18.2" } } }, "page-transition-events": { caniuse: ["page-transition-events"], compat_features: ["api.PageTransitionEvent", "api.PageTransitionEvent.PageTransitionEvent", "api.PageTransitionEvent.persisted", "api.Window.pagehide_event", "api.Window.pageshow_event"], description: "The pageshow and pagehide transition events fire when a document loads or unloads due to a navigation, such as clicking on a link on a page or the back button in a browser.", description_html: "The <code>pageshow</code> and <code>pagehide</code> transition events fire when a document loads or unloads due to a navigation, such as clicking on a link on a page or the back button in a browser.", kind: "feature", name: "Page transition events", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-pagetransitionevent-interface"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-\
07-29", by_compat_key: { "api.PageTransitionEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.PageTransitionEvent.PageTransitionEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "16", chrome_android: "18", edge: "79", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.PageTransitionEvent.persisted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4" } }, "api.Window.pagehide_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "\
5", safari_ios: "4.2" } }, "api.Window.pageshow_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5", safari_ios: "4" } } }, "page-visibility": { caniuse: ["pagevisibility"], compat_features: ["api.Document.hidden", "api.Document.visibilityState", "api.Document.visibilitychange_event"], description: "The document.visibilityState and document.hidden properties tell you whether the page is visible to the user (for example, it's not minimized or in a background tab).", description_html: "The <code>document.visibilityState</code> and <code>document.hidden</code> properties tell you whether the page is visible to the user (for example, it's not minimized or in a background tab).", kind: "feature", name: "Page visi\
bility", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#page-visibility"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Document.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "33", chrome_android: "33", edge: "12", firefox: "18", firefox_android: "18", safari: "7", safari_ios: "7" } }, "api.Document.visibilityState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "33", chrome_android: "33", edge: "12", firefox: "18", firefox_android: "18", safari: "7", safari_ios: "7" } }, "api.Document.visibilitychange_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "62", chrome_android: "62", edge: "18", firefox: "56", firefox_android: "56", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "33", chrome_android: "\
33", edge: "12", firefox: "18", firefox_android: "18", safari: "7", safari_ios: "7" } } }, "page-visibility-state": { compat_features: ["api.VisibilityStateEntry", "api.VisibilityStateEntry.duration", "api.VisibilityStateEntry.entryType", "api.VisibilityStateEntry.name", "api.VisibilityStateEntry.startTime"], description: "The visibility-state performance entry and the VisibilityStateEntry API measure the timing of page visibility state changes, such as when a tab is no longer visible or the user has switched to another app.", description_html: "The <code>visibility-state</code> performance entry and the <code>VisibilityStateEntry</code> API measure the timing of page visibility state changes, such as when a tab is no longer visible or the user has switched to another app.", group: ["performance"], kind: "feature", name: "Page visibility state", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#the-visibilitystateentry-interface"], status: { baseline: false, by_compat_key: {
    "api.VisibilityStateEntry": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "api.VisibilityStateEntry.duration": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "api.VisibilityStateEntry.entryType": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "api.VisibilityStateEntry.name": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "api.VisibilityStateEntry.startTime": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } } }, support: { chrome: "115", chrome_android: "115", edge: "115" } } }, paint: { caniuse: ["css-paint-api"], compat_features: ["api.CSS.paintWorklet_static", "api.PaintRenderingContext2D", "api.PaintRenderingContext2D.beginPath", "api.PaintRenderingContext2D.clearRect", "api.PaintRenderingContext2D.clip", "api.PaintRenderingContext2D.createLinearGradient", "api.PaintRenderingContext2D.createPatte\
rn", "api.PaintRenderingContext2D.createRadialGradient", "api.PaintRenderingContext2D.drawImage", "api.PaintRenderingContext2D.fill", "api.PaintRenderingContext2D.fillRect", "api.PaintRenderingContext2D.fillStyle", "api.PaintRenderingContext2D.filter", "api.PaintRenderingContext2D.getLineDash", "api.PaintRenderingContext2D.getTransform", "api.PaintRenderingContext2D.globalAlpha", "api.PaintRenderingContext2D.globalCompositeOperation", "api.PaintRenderingContext2D.imageSmoothingEnabled", "api.PaintRenderingContext2D.imageSmoothingQuality", "api.PaintRenderingContext2D.isPointInPath", "api.PaintRenderingContext2D.isPointInStroke", "api.PaintRenderingContext2D.lineCap", "api.PaintRenderingContext2D.lineDashOffset", "api.PaintRenderingContext2D.lineJoin", "api.PaintRenderingContext2D.lineWidth", "api.PaintRenderingContext2D.miterLimit", "api.PaintRenderingContext2D.resetTransform", "api.PaintRenderingContext2D.restore", "api.PaintRenderingContext2D.rotate", "api.PaintRenderingContext2D.sav\
e", "api.PaintRenderingContext2D.scale", "api.PaintRenderingContext2D.setLineDash", "api.PaintRenderingContext2D.setTransform", "api.PaintRenderingContext2D.shadowBlur", "api.PaintRenderingContext2D.shadowColor", "api.PaintRenderingContext2D.shadowOffsetX", "api.PaintRenderingContext2D.shadowOffsetY", "api.PaintRenderingContext2D.stroke", "api.PaintRenderingContext2D.strokeRect", "api.PaintRenderingContext2D.strokeStyle", "api.PaintRenderingContext2D.transform", "api.PaintRenderingContext2D.translate", "api.PaintSize", "api.PaintSize.height", "api.PaintSize.width", "api.PaintWorkletGlobalScope", "api.PaintWorkletGlobalScope.devicePixelRatio", "api.PaintWorkletGlobalScope.registerPaint", "css.types.image.paint", "css.types.image.paint.additional_parameters"], description: "The paint() CSS function creates a custom image, drawn using a paint worklet, for an element's background or border.", description_html: "The <code>paint()</code> CSS function creates a custom image, drawn using a pai\
nt worklet, for an element's background or border.", group: ["css", "worklets"], kind: "feature", name: "paint()", spec: ["https://drafts.css-houdini.org/css-paint-api-1/"], status: { baseline: false, by_compat_key: { "api.CSS.paintWorklet_static": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.beginPath": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.clearRect": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.clip": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.createLinearGradient": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.createPattern": { baseline: false,
    support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.createRadialGradient": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.drawImage": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.fill": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.fillRect": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.fillStyle": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.filter": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.getLineDash": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.getTransform": { baseline: false, support: {
    chrome: "68", chrome_android: "68", edge: "79" } }, "api.PaintRenderingContext2D.globalAlpha": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.globalCompositeOperation": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.imageSmoothingEnabled": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.imageSmoothingQuality": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.PaintRenderingContext2D.isPointInPath": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.isPointInStroke": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.lineCap": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.li\
neDashOffset": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.lineJoin": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.lineWidth": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.miterLimit": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.resetTransform": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.restore": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.rotate": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.save": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.scale": { baseline: false,
    support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.setLineDash": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.setTransform": { baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79" } }, "api.PaintRenderingContext2D.shadowBlur": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.shadowColor": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.shadowOffsetX": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.shadowOffsetY": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.stroke": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.strokeRect": { baseline: false,
    support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.strokeStyle": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.transform": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintRenderingContext2D.translate": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintSize": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintSize.height": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintSize.width": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintWorkletGlobalScope": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.PaintWorkletGlobalScope.devicePixelRatio": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "api.Pain\
tWorkletGlobalScope.registerPaint": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "css.types.image.paint": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "css.types.image.paint.additional_parameters": { baseline: false, support: {} } }, support: { chrome: "65", chrome_android: "65", edge: "79" } } }, "paint-order": { compat_features: ["css.properties.paint-order", "svg.global_attributes.paint-order"], description: "The paint-order CSS property sets the z-order of strokes, fills, and (in SVG content) markers. For example, paint-order: markers stroke fill; draws the markers, then stroke on top of markers, then fill on top of both markers and stroke.", description_html: "The <code>paint-order</code> CSS property sets the z-order of strokes, fills, and (in SVG content) markers. For example, <code>paint-order: markers stroke fill;</code> draws the markers, then stroke on top of markers, then fill on top of both markers a\
nd stroke.", group: ["css"], kind: "feature", name: "paint-order", spec: ["https://w3c.github.io/svgwg/svg2-draft/painting.html#PaintOrder"], status: { baseline: "low", baseline_low_date: "2024-03-22", by_compat_key: { "css.properties.paint-order": { baseline: "low", baseline_low_date: "2024-03-22", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "60", firefox_android: "60", safari: "11", safari_ios: "11" } }, "svg.global_attributes.paint-order": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "≤73", chrome_android: "≤73", edge: "79", firefox: "≤66", firefox_android: "≤66", safari: "≤12", safari_ios: "≤12" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "≤66", firefox_android: "≤66", safari: "≤12", safari_ios: "≤12" } } }, "paint-timing": { compat_features: ["api.PerformancePaintTiming", "api.PerformancePaintTiming.first-contentful-paint", "api.PerformanceP\
aintTiming.first-paint", "api.PerformancePaintTiming.toJSON"], description: 'The paint performance entry and the PerformancePaintTiming API measures the duration of "paint" (also called "render") operations as a page loads. The API measures the time to First Paint (FP) and First Contentful Paint (FCP), common metrics for perceived loading times.', description_html: 'The <code>paint</code> performance entry and the <code>PerformancePaintTiming</code> API measures the duration of "paint" (also called "render") operations as a page loads. The API measures the time to First Paint (FP) and First Contentful Paint (FCP), common metrics for perceived loading times.', group: ["performance"], kind: "feature", name: "Paint timing", spec: ["https://w3c.github.io/paint-timing/"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.PerformancePaintTiming": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-0\
4-26", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "84", firefox_android: "84", safari: "14.1", safari_ios: "14.5" } }, "api.PerformancePaintTiming.first-contentful-paint": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "84", firefox_android: "84", safari: "14.1", safari_ios: "14.5" } }, "api.PerformancePaintTiming.first-paint": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79" } }, "api.PerformancePaintTiming.toJSON": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "84", firefox_android: "84", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "84", firefox_android: "84", safari: "14.1", safari_ios: "14.5" } } }, "parse-html-unsafe": { compat_features: ["api.Documen\
t.parseHTMLUnsafe_static", "api.Element.setHTMLUnsafe", "api.ShadowRoot.setHTMLUnsafe"], description: "The Document.parseHTMLUnsafe() static method parses HTML into a DOM tree, while the setHTMLUnsafe() method of Element and ShadowRoot parses and inserts HTML into an existing tree. No sanitization applies to these methods, so never call them with user-provided HTML strings.", description_html: "The <code>Document.parseHTMLUnsafe()</code> static method parses HTML into a DOM tree, while the <code>setHTMLUnsafe()</code> method of <code>Element</code> and <code>ShadowRoot</code> parses and inserts HTML into an existing tree. No sanitization applies to these methods, so never call them with user-provided HTML strings.", kind: "feature", name: "Unsanitized HTML parsing methods", spec: ["https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#unsafe-html-parsing-methods"], status: { baseline: "low", baseline_low_date: "2025-09-15", by_compat_key: { "api.Document.parseHTMLUnsafe_\
static": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "128", firefox_android: "128", safari: "26", safari_ios: "26" } }, "api.Element.setHTMLUnsafe": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "123", firefox_android: "123", safari: "26", safari_ios: "26" } }, "api.ShadowRoot.setHTMLUnsafe": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "123", firefox_android: "123", safari: "26", safari_ios: "26" } } }, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "128", firefox_android: "128", safari: "26", safari_ios: "26" } } }, "partitioned-cookies": { compat_features: ["api.CookieStore.delete.partitioned_option", "api.CookieStore.get.partitioned_return_property", "api.CookieStore.set.partitioned_option", "api.ExtendableCookieChangeEvent.chan\
ged.partitioned_property", "api.ExtendableCookieChangeEvent.deleted.partitioned_property", "http.headers.Set-Cookie.Partitioned"], description: "Partitioned cookies allow you to opt a cookie into partitioned storage, with a separate cookie jar per top-level site. Also known as Cookies Having Independent Partitioned State or CHIPS.", description_html: "Partitioned cookies allow you to opt a cookie into partitioned storage, with a separate cookie jar per top-level site. Also known as Cookies Having Independent Partitioned State or CHIPS.", group: ["cookies"], kind: "feature", name: "Partitioned cookies", spec: ["https://cookiestore.spec.whatwg.org/"], status: { baseline: false, by_compat_key: { "api.CookieStore.delete.partitioned_option": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "140", firefox_android: "140" } }, "api.CookieStore.get.partitioned_return_property": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "11\
4" } }, "api.CookieStore.set.partitioned_option": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "140", firefox_android: "140" } }, "api.ExtendableCookieChangeEvent.changed.partitioned_property": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "114" } }, "api.ExtendableCookieChangeEvent.deleted.partitioned_property": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "114" } }, "http.headers.Set-Cookie.Partitioned": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "141", firefox_android: "141", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "114", chrome_android: "114", edge: "114" } } }, "password-credentials": { compat_features: ["api.PasswordCredential", "api.PasswordCredential.PasswordCredential", "api.PasswordCredential.iconURL", "api.PasswordCredential.name", "api.PasswordCredential.password"], description: "\
The PasswordCredential API represents a username and password.", description_html: "The <code>PasswordCredential</code> API represents a username and password.", group: ["credential-management"], kind: "feature", name: "Password credentials", spec: ["https://w3c.github.io/webappsec-credential-management/#passwords"], status: { baseline: false, by_compat_key: { "api.PasswordCredential": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "api.PasswordCredential.PasswordCredential": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "api.PasswordCredential.iconURL": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "api.PasswordCredential.name": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "api.PasswordCredential.password": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79" } } }, support: { chrome: "60", chrome_android: "60", edge: "\
79" } } }, "path-shape": { compat_features: ["css.types.basic-shape.path", "css.types.basic-shape.path.clip-path", "css.types.basic-shape.path.d", "css.types.basic-shape.path.offset-path", "css.types.basic-shape.path.shape-outside"], description: "The path() CSS shape function creates a shape for clip-path, shape-outside, and the SVG attribute d.", description_html: "The <code>path()</code> CSS shape function creates a shape for <code>clip-path</code>, <code>shape-outside</code>, and the SVG attribute <code>d</code>.", kind: "feature", name: "path()", spec: ["https://drafts.csswg.org/css-shapes-1/#supported-basic-shapes"], status: { baseline: false, by_compat_key: { "css.types.basic-shape.path": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13" } }, "css.types.basic-shape.path.clip-path": { baseline: "high", baseline_high_date: "\
2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13" } }, "css.types.basic-shape.path.d": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "97", firefox_android: "97" } }, "css.types.basic-shape.path.offset-path": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "72", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.types.basic-shape.path.shape-outside": { baseline: false, support: {} } }, support: {} } }, "payment-handler": { compat_features: ["api.CanMakePaymentEvent", "api.CanMakePaymentEvent.CanMakePaymentEvent", "api.CanMakePaymentEvent.respondWith", "api.PaymentManager", "api.PaymentManager.enableDelegations", "api.PaymentManager.secure_context_required", "api.PaymentManager.userHint", "api.PaymentReque\
stEvent", "api.PaymentRequestEvent.PaymentRequestEvent", "api.PaymentRequestEvent.changePaymentMethod", "api.PaymentRequestEvent.changeShippingAddress", "api.PaymentRequestEvent.changeShippingOption", "api.PaymentRequestEvent.methodData", "api.PaymentRequestEvent.modifiers", "api.PaymentRequestEvent.openWindow", "api.PaymentRequestEvent.paymentOptions", "api.PaymentRequestEvent.paymentRequestId", "api.PaymentRequestEvent.paymentRequestOrigin", "api.PaymentRequestEvent.respondWith", "api.PaymentRequestEvent.shippingOptions", "api.PaymentRequestEvent.topOrigin", "api.PaymentRequestEvent.total", "api.Permissions.permission_payment-handler", "api.ServiceWorkerGlobalScope.canmakepayment_event", "api.ServiceWorkerGlobalScope.paymentrequest_event", "api.ServiceWorkerRegistration.paymentManager"], description: "The payment handler API registers a web application as a payment handler and responds to payment requests in the browser's user interface, rather than redirecting users to a separate si\
te to complete a payment.", description_html: "The payment handler API registers a web application as a payment handler and responds to payment requests in the browser's user interface, rather than redirecting users to a separate site to complete a payment.", group: ["payments"], kind: "feature", name: "Payment handler", spec: ["https://w3c.github.io/web-based-payment-handler/"], status: { baseline: false, by_compat_key: { "api.CanMakePaymentEvent": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.CanMakePaymentEvent.CanMakePaymentEvent": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.CanMakePaymentEvent.respondWith": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentManager": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentManager.enableDelegations": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "\
80" } }, "api.PaymentManager.secure_context_required": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.PaymentManager.userHint": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.PaymentRequestEvent": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.changePaymentMethod": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79" } }, "api.PaymentRequestEvent.changeShippingAddress": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PaymentRequestEvent.changeShippingOption": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PaymentRequestEvent.methodData": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } },
    "api.PaymentRequestEvent.modifiers": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.openWindow": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.paymentOptions": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PaymentRequestEvent.paymentRequestId": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.paymentRequestOrigin": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.respondWith": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.PaymentRequestEvent.shippingOptions": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PaymentRequestEvent.topOrigin": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.Payment\
RequestEvent.total": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.Permissions.permission_payment-handler": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79" } }, "api.ServiceWorkerGlobalScope.canmakepayment_event": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.ServiceWorkerGlobalScope.paymentrequest_event": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "api.ServiceWorkerRegistration.paymentManager": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } } }, support: { chrome: "70", chrome_android: "70", edge: "79" } } }, "payment-request": { compat_features: ["api.PaymentMethodChangeEvent", "api.PaymentMethodChangeEvent.PaymentMethodChangeEvent", "api.PaymentMethodChangeEvent.methodDetails", "api.PaymentMethodChangeEvent.methodName", "api.PaymentRequest", "api.PaymentRequest.PaymentRequest", "api.PaymentRequest.Paymen\
tRequest.secure_payment_confirmation_method", "api.PaymentRequest.abort", "api.PaymentRequest.canMakePayment", "api.PaymentRequest.id", "api.PaymentRequest.paymentmethodchange_event", "api.PaymentRequest.show", "api.PaymentRequestUpdateEvent", "api.PaymentRequestUpdateEvent.PaymentRequestUpdateEvent", "api.PaymentRequestUpdateEvent.secure_context_required", "api.PaymentRequestUpdateEvent.updateWith", "api.PaymentResponse", "api.PaymentResponse.complete", "api.PaymentResponse.details", "api.PaymentResponse.methodName", "api.PaymentResponse.payerEmail", "api.PaymentResponse.payerName", "api.PaymentResponse.payerPhone", "api.PaymentResponse.payerdetailchange_event", "api.PaymentResponse.requestId", "api.PaymentResponse.retry", "api.PaymentResponse.shippingAddress", "api.PaymentResponse.shippingOption", "api.PaymentResponse.toJSON", "html.elements.iframe.allow.payment", "http.headers.Permissions-Policy.payment"], description: "The PaymentRequest API prompts the user to make a payment throu\
gh the browser's user interface.", description_html: "The <code>PaymentRequest</code> API prompts the user to make a payment through the browser's user interface.", group: ["payments"], kind: "feature", name: "Payment request", spec: ["https://w3c.github.io/payment-request/"], status: { baseline: false, by_compat_key: { "api.PaymentMethodChangeEvent": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "api.PaymentMethodChangeEvent.PaymentMethodChangeEvent": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "api.PaymentMethodChangeEvent.methodDetails": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "api.PaymentMethodChangeEvent.methodName": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "api.PaymentRequest": { baseline: false,
    support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequest.PaymentRequest": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequest.PaymentRequest.secure_payment_confirmation_method": { baseline: false, support: { chrome: "95", chrome_android: "95", edge: "95" } }, "api.PaymentRequest.abort": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequest.canMakePayment": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "16", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequest.id": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "16", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequest.paymentmethodchange_event": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", safari: "12.1", safari_ios: "\
12.2" } }, "api.PaymentRequest.show": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequestUpdateEvent": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequestUpdateEvent.PaymentRequestUpdateEvent": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentRequestUpdateEvent.secure_context_required": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.PaymentRequestUpdateEvent.updateWith": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.complete": { baseline: false, support: { chrome: "\
60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.details": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.methodName": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.payerEmail": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.payerName": { baseline: false, support: { chrome: "60", chrome_android: "56", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.payerPhone": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.payerdetailchange_event": { baseline: false, support: { chrome: "78", chrome_android: "78", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "\
api.PaymentResponse.requestId": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "16", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.retry": { baseline: false, support: { chrome: "78", chrome_android: "78", edge: "79", safari: "12.1", safari_ios: "11.3" } }, "api.PaymentResponse.shippingAddress": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.shippingOption": { baseline: false, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "api.PaymentResponse.toJSON": { baseline: false, support: { chrome: "60", chrome_android: "55", edge: "15", safari: "11.1", safari_ios: "11.3" } }, "html.elements.iframe.allow.payment": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "74", firefox_android: "79" } }, "http.headers.Permissions-Policy.payment": { baseline: false, support: { chrome: "88",
    chrome_android: "88", edge: "88" } } }, support: { chrome: "60", chrome_android: "53", edge: "15", safari: "11.1", safari_ios: "11.3" } } }, "pdf-viewer": { compat_features: ["api.Navigator.mimeTypes", "api.Navigator.pdfViewerEnabled"], description: "The navigator.pdfViewerEnabled property is a boolean for whether the browser navigates to and shows a PDF in the browser window or downloads the PDF.", description_html: "The <code>navigator.pdfViewerEnabled</code> property is a boolean for whether the browser navigates to and shows a PDF in the browser window or downloads the PDF.", kind: "feature", name: "pdfViewerEnabled", spec: ["https://html.spec.whatwg.org/multipage/system-state.html#pdf-viewing-support"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.Navigator.mimeTypes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.pdfViewerEnabled": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "99", firefox_android: "99", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "99", firefox_android: "99", safari: "16.4", safari_ios: "16.4" } } }, performance: { caniuse: ["user-timing", "high-resolution-time"], compat_features: ["api.Performance", "api.Performance.clearMarks", "api.Performance.clearMeasures", "api.Performance.getEntries", "api.Performance.getEntriesByName", "api.Performance.getEntriesByType", "api.Performance.mark", "api.Performance.mark.markOptions_parameter", "api.Performance.mark.returns_performancemark", "api.Performance.measure", "api.Performance.measure.measureOptions_parameter", "api.Performance.measure.returns_performancemeasure", "api.Per\
formance.now", "api.Performance.timeOrigin", "api.Performance.toJSON", "api.PerformanceEntry", "api.PerformanceEntry.duration", "api.PerformanceEntry.entryType", "api.PerformanceEntry.name", "api.PerformanceEntry.startTime", "api.PerformanceEntry.toJSON", "api.PerformanceEntry.worker_support", "api.PerformanceMark", "api.PerformanceMark.PerformanceMark", "api.PerformanceMark.detail", "api.PerformanceMeasure", "api.PerformanceMeasure.detail", "api.PerformanceObserver", "api.PerformanceObserver.PerformanceObserver", "api.PerformanceObserver.PerformanceObserver.droppedEntriesCount", "api.PerformanceObserver.disconnect", "api.PerformanceObserver.observe", "api.PerformanceObserver.supportedEntryTypes_static", "api.PerformanceObserver.takeRecords", "api.PerformanceObserver.worker_support", "api.PerformanceObserverEntryList", "api.PerformanceObserverEntryList.getEntries", "api.PerformanceObserverEntryList.getEntriesByName", "api.PerformanceObserverEntryList.getEntriesByType", "api.performance",
    "api.performance.worker_support", "http.headers.Timing-Allow-Origin"], description: "The performance global object and the PerformanceObserver API provide access to performance-related information for the current execution context.", description_html: "The <code>performance</code> global object and the <code>PerformanceObserver</code> API provide access to performance-related information for the current execution context.", group: ["performance"], kind: "feature", name: "Performance", spec: ["https://w3c.github.io/hr-time/", "https://w3c.github.io/performance-timeline/", "https://w3c.github.io/user-timing/#extensions-performance-interface"], status: { baseline: "high", baseline_high_date: "2018-03-16", baseline_low_date: "2015-09-16", by_compat_key: { "api.Performance": { baseline: "high", baseline_high_date: "2018-03-16", baseline_low_date: "2015-09-16", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "\
api.Performance.clearMarks": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "38", firefox_android: "42", safari: "11", safari_ios: "11" } }, "api.Performance.clearMeasures": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "38", firefox_android: "42", safari: "11", safari_ios: "11" } }, "api.Performance.getEntries": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.Performance.getEntriesByName": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "1\
1" } }, "api.Performance.getEntriesByType": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.Performance.mark": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "38", firefox_android: "42", safari: "11", safari_ios: "11" } }, "api.Performance.mark.markOptions_parameter": { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "101", firefox_android: "101", safari: "14.1", safari_ios: "14.5" } }, "api.Performance.mark.returns_performancemark": { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "101", firefox_android: "\
101", safari: "14.1", safari_ios: "14.5" } }, "api.Performance.measure": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "38", firefox_android: "42", safari: "11", safari_ios: "11" } }, "api.Performance.measure.measureOptions_parameter": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103", safari: "14.1", safari_ios: "14.5" } }, "api.Performance.measure.returns_performancemeasure": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "103", firefox_android: "103", safari: "14.1", safari_ios: "14.5" } }, "api.Performance.now": { baseline: "high", baseline_high_date: "2018-03-16", baseline_low_date: "2015-09-16", support: { chrome: "24", chrome_android: "\
25", edge: "12", firefox: "15", firefox_android: "15", safari: "8", safari_ios: "9" } }, "api.Performance.timeOrigin": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "62", chrome_android: "62", edge: "16", firefox: "53", firefox_android: "53", safari: "15", safari_ios: "15" } }, "api.Performance.toJSON": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.PerformanceEntry": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceEntry.duration": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "\
12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceEntry.entryType": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceEntry.name": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceEntry.startTime": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceEntry.toJSON": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "46", chrome_android: "46",
    edge: "16", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceEntry.worker_support": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "62", chrome_android: "62", edge: "15", firefox: "60", firefox_android: "60", safari: "11", safari_ios: "11" } }, "api.PerformanceMark": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "38", firefox_android: "38", safari: "11", safari_ios: "11" } }, "api.PerformanceMark.PerformanceMark": { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "101", firefox_android: "101", safari: "14.1", safari_ios: "14.5" } }, "api.PerformanceMark.detail": { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", support: { chrome: "78", chrome_android: "\
78", edge: "79", firefox: "101", firefox_android: "101", safari: "14.1", safari_ios: "14.5" } }, "api.PerformanceMeasure": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "38", firefox_android: "38", safari: "11", safari_ios: "11" } }, "api.PerformanceMeasure.detail": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "103", firefox_android: "103", safari: "14.1", safari_ios: "14.5" } }, "api.PerformanceObserver": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserver.PerformanceObserver": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserver.PerformanceObserver.droppedEntriesCount": { baseline: false, support: { chrome: "95", chrome_android: "95", edge: "95" } }, "api.PerformanceObserver.disconnect": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserver.observe": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserver.supportedEntryTypes_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "68", firefox_android: "\
68", safari: "13", safari_ios: "13" } }, "api.PerformanceObserver.takeRecords": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "60", firefox_android: "60", safari: "15", safari_ios: "15" } }, "api.PerformanceObserver.worker_support": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserverEntryList": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserverEntryList.getEntries": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "\
79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserverEntryList.getEntriesByName": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.PerformanceObserverEntryList.getEntriesByType": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.performance": { baseline: "high", baseline_high_date: "2018-03-16", baseline_low_date: "2015-09-16", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.performance.worker_support": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "\
30", chrome_android: "30", edge: "14", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "http.headers.Timing-Allow-Origin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } } }, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } } }, performancetiming: { compat_features: ["api.Performance.navigation", "api.Performance.timing", "api.PerformanceNavigation", "api.PerformanceNavigation.redirectCount", "api.PerformanceNavigation.toJSON", "api.PerformanceNavigation.type", "api.PerformanceTiming", "api.PerformanceTiming.connectEnd", "api.PerformanceTiming.connectStart", "api.PerformanceTiming.domComplete", "api.PerformanceTiming.domContentLoadedEventEnd", "api.PerformanceTiming.domContentLoadedEventStart", "api.PerformanceTiming.d\
omInteractive", "api.PerformanceTiming.domLoading", "api.PerformanceTiming.domainLookupEnd", "api.PerformanceTiming.domainLookupStart", "api.PerformanceTiming.fetchStart", "api.PerformanceTiming.loadEventEnd", "api.PerformanceTiming.loadEventStart", "api.PerformanceTiming.navigationStart", "api.PerformanceTiming.redirectEnd", "api.PerformanceTiming.redirectStart", "api.PerformanceTiming.requestStart", "api.PerformanceTiming.responseEnd", "api.PerformanceTiming.responseStart", "api.PerformanceTiming.secureConnectionStart", "api.PerformanceTiming.toJSON", "api.PerformanceTiming.unloadEventEnd", "api.PerformanceTiming.unloadEventStart"], description: "The window.performance.timing and window.performance.navigation APIs report performance timing information for events that occur during the loading and use of the current page.", description_html: "The <code>window.performance.timing</code> and <code>window.performance.navigation</code> APIs report performance timing information for events t\
hat occur during the loading and use of the current page.", discouraged: { according_to: ["https://w3c.github.io/navigation-timing/#obsolete"], alternatives: ["performance", "navigation-timing"], reason: "This feature is supserseded by the PerformanceNavigationTiming API.", reason_html: "This feature is supserseded by the <code>PerformanceNavigationTiming</code> API." }, group: ["performance"], kind: "feature", name: "PerformanceTiming and PerformanceNavigation", spec: ["https://w3c.github.io/navigation-timing/#obsolete"], status: { baseline: false, by_compat_key: { "api.Performance.navigation": { baseline: false, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.Performance.timing": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceNavigation": { baseline: false, support: { chrome: "10", chrome_android: "\
18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceNavigation.redirectCount": { baseline: false, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceNavigation.toJSON": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.PerformanceNavigation.type": { baseline: false, support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.connectEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } },
    "api.PerformanceTiming.connectStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domComplete": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domContentLoadedEventEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domContentLoadedEventStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domInteractive": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domLoading": { baseline: false,
    support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domainLookupEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.domainLookupStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.fetchStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.loadEventEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.loadEventStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "\
7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.navigationStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.redirectEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.redirectStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.requestStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.responseEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.Performa\
nceTiming.responseStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.secureConnectionStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.toJSON": { baseline: false, support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "25", firefox_android: "25", safari: "10.1", safari_ios: "10.3" } }, "api.PerformanceTiming.unloadEventEnd": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } }, "api.PerformanceTiming.unloadEventStart": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "8", safari_ios: "9" } } }, support: { chrome: "56", chrome_android: "56", edge: "18", firefox: "\
56", firefox_android: "56", safari: "14.1", safari_ios: "14.5" } } }, "periodic-background-sync": { compat_features: ["api.PeriodicSyncEvent", "api.PeriodicSyncEvent.PeriodicSyncEvent", "api.PeriodicSyncEvent.tag", "api.PeriodicSyncManager", "api.PeriodicSyncManager.getTags", "api.PeriodicSyncManager.register", "api.PeriodicSyncManager.unregister", "api.ServiceWorkerGlobalScope.periodicsync_event", "api.ServiceWorkerRegistration.periodicSync"], description: "The periodic background synchronization API fires a recurring periodicsync event in a service worker. You can use this to update data in the background at regular intervals.", description_html: "The periodic background synchronization API fires a recurring <code>periodicsync</code> event in a service worker. You can use this to update data in the background at regular intervals.", kind: "feature", name: "Periodic background sync", spec: ["https://wicg.github.io/periodic-background-sync/"], status: { baseline: false, by_compat_key: {
    "api.PeriodicSyncEvent": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PeriodicSyncEvent.PeriodicSyncEvent": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PeriodicSyncEvent.tag": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PeriodicSyncManager": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PeriodicSyncManager.getTags": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PeriodicSyncManager.register": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.PeriodicSyncManager.unregister": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.ServiceWorkerGlobalScope.periodicsync_event": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.ServiceWorkerRegistration.periodicSync": { baseline: false,
    support: { chrome: "80", chrome_android: "80", edge: "80" } } }, support: { chrome: "80", chrome_android: "80", edge: "80" } } }, permissions: { caniuse: ["permissions-api"], compat_features: ["api.Navigator.permissions", "api.PermissionStatus", "api.PermissionStatus.change_event", "api.PermissionStatus.name", "api.PermissionStatus.state", "api.Permissions", "api.Permissions.query", "api.Permissions.request", "api.WorkerNavigator.permissions"], description: "The navigator.permissions API checks whether a permission, such as access to geolocation data, has been granted.", description_html: "The <code>navigator.permissions</code> API checks whether a permission, such as access to geolocation data, has been granted.", group: ["security"], kind: "feature", name: "Permissions", spec: ["https://w3c.github.io/permissions/", "https://wicg.github.io/permissions-request/#dom-permissions-request"], status: { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: {
    "api.Navigator.permissions": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "16", safari_ios: "16" } }, "api.PermissionStatus": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "16", safari_ios: "16" } }, "api.PermissionStatus.change_event": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46" } }, "api.PermissionStatus.name": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "93", firefox_android: "93", safari: "16", safari_ios: "16" } }, "api.PermissionStatus.state": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "\
2022-09-12", support: { chrome: "44", chrome_android: "44", edge: "79", firefox: "46", firefox_android: "46", safari: "16", safari_ios: "16" } }, "api.Permissions": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "16", safari_ios: "16" } }, "api.Permissions.query": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "16", safari_ios: "16" } }, "api.Permissions.request": { baseline: false, support: {} }, "api.WorkerNavigator.permissions": { baseline: "low", baseline_low_date: "2024-11-26", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "133", firefox_android: "133", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "44", chrome_android: "44", edge: "79", firefox: "46", firefox_android: "\
46", safari: "16", safari_ios: "16" } } }, "permissions-policy": { caniuse: ["permissions-policy"], compat_features: ["api.HTMLIFrameElement.allow", "html.elements.iframe.allow", "http.headers.Permissions-Policy", "http.headers.Permissions-Policy.wildcards"], description: "The Permissions-Policy response header and the allow attribute for <iframe> elements sets whether a policy-controlled feature, such as an API, may be used in a document.", description_html: "The <code>Permissions-Policy</code> response header and the <code>allow</code> attribute for <code>&#x3C;iframe></code> elements sets whether a policy-controlled feature, such as an API, may be used in a document.", kind: "feature", name: "Permissions policy", spec: ["https://w3c.github.io/webappsec-permissions-policy/"], status: { baseline: false, by_compat_key: { "api.HTMLIFrameElement.allow": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "\
79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "html.elements.iframe.allow": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "74", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "http.headers.Permissions-Policy": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } }, "http.headers.Permissions-Policy.wildcards": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } } }, support: { chrome: "108", chrome_android: "108", edge: "108" } } }, "physical-properties": { compat_features: ["css.properties.bottom", "css.properties.bottom.auto", "css.properties.left", "css.properties.left.auto", "css.properties.right", "css.properties.right.auto", "css.properties.top", "css.properties.top.auto"], description: "The physical CSS properties, top, right, bottom, and left, set the inset positio\
n of an element relative to the corresponding side of a container determined by the element's position property.", description_html: "The physical CSS properties, <code>top</code>, <code>right</code>, <code>bottom</code>, and <code>left</code>, set the inset position of an element relative to the corresponding side of a container determined by the element's <code>position</code> property.", group: ["css"], kind: "feature", name: "Physical properties", spec: ["https://drafts.csswg.org/css-position-3/#insets"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.bottom": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.bottom.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.left": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.left.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.right": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.right.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.top.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, picture: { caniuse: ["picture"], compat_features: ["api.HTMLPictureElement", "html.elements.picture"], description: "The <picture> element is used for art direction in responsive images, where a different image is displayed based on the <source> element.", description_html: "The <code>&#x3C;picture></code> element\
 is used for art direction in responsive images, where a different image is displayed based on the <code>&#x3C;source></code> element.", group: ["html-elements"], kind: "feature", name: "<picture>", spec: ["https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element"], status: { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", by_compat_key: { "api.HTMLPictureElement": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "9.1", safari_ios: "9.3" } }, "html.elements.picture": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "\
9.1", safari_ios: "9.3" } } }, "picture-in-picture": { caniuse: ["picture-in-picture"], compat_features: ["api.Document.exitPictureInPicture", "api.Document.pictureInPictureElement", "api.Document.pictureInPictureEnabled", "api.HTMLVideoElement.disablePictureInPicture", "api.HTMLVideoElement.enterpictureinpicture_event", "api.HTMLVideoElement.leavepictureinpicture_event", "api.HTMLVideoElement.requestPictureInPicture", "api.PictureInPictureEvent", "api.PictureInPictureEvent.PictureInPictureEvent", "api.PictureInPictureEvent.pictureInPictureWindow", "api.PictureInPictureWindow", "api.PictureInPictureWindow.height", "api.PictureInPictureWindow.resize_event", "api.PictureInPictureWindow.width", "api.ShadowRoot.pictureInPictureElement", "css.at-rules.media.display-mode.picture-in-picture", "css.selectors.picture-in-picture", "html.elements.iframe.allow.picture-in-picture", "html.elements.video.disablepictureinpicture", "http.headers.Permissions-Policy.picture-in-picture"], description: "Th\
e picture-in-picture API allow websites to create a floating, always-on-top video window. Also known as PiP or pop-out video.", description_html: "The picture-in-picture API allow websites to create a floating, always-on-top video window. Also known as PiP or pop-out video.", kind: "feature", name: "Picture-in-picture (video)", spec: ["https://w3c.github.io/picture-in-picture/"], status: { baseline: false, by_compat_key: { "api.Document.exitPictureInPicture": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Document.pictureInPictureElement": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Document.pictureInPictureEnabled": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.HTMLVideoElement.disablePictureInPicture": { baseline: false, support: { chrome: "69", chrome_android: "\
105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.HTMLVideoElement.enterpictureinpicture_event": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.HTMLVideoElement.leavepictureinpicture_event": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.HTMLVideoElement.requestPictureInPicture": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.PictureInPictureEvent": { baseline: false, support: { chrome: "85", chrome_android: "105", edge: "85", safari: "16", safari_ios: "16" } }, "api.PictureInPictureEvent.PictureInPictureEvent": { baseline: false, support: { chrome: "85", chrome_android: "105", edge: "85", safari: "16", safari_ios: "16" } }, "api.PictureInPictureEvent.pictureInPictureWindow": { baseline: false, support: { chrome: "85", chrome_android: "105", edge: "\
85", safari: "16", safari_ios: "16" } }, "api.PictureInPictureWindow": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.PictureInPictureWindow.height": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.PictureInPictureWindow.resize_event": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.PictureInPictureWindow.width": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ShadowRoot.pictureInPictureElement": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "css.at-rules.media.display-mode.picture-in-picture": { baseline: false, support: { chrome: "123", edge: "123" } }, "css.selectors.picture-in-picture": { baseline: false, support: {
    chrome: "110", chrome_android: "110", edge: "110", safari: "13.1", safari_ios: "13.4" } }, "html.elements.iframe.allow.picture-in-picture": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79" } }, "html.elements.video.disablepictureinpicture": { baseline: false, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } }, "http.headers.Permissions-Policy.picture-in-picture": { baseline: false, support: { chrome: "88", chrome_android: "105", edge: "88" } } }, support: { chrome: "69", chrome_android: "105", edge: "79", safari: "13.1", safari_ios: "13.4" } } }, ping: { caniuse: ["ping"], compat_features: ["api.HTMLAnchorElement.ping", "api.HTMLAreaElement.ping", "api.SVGAElement.ping", "html.elements.a.ping", "html.elements.area.ping", "svg.elements.a.ping"], description: "The ping attribute for <a> elements sets a URL to send a POST request to when the <a> is clicked. This is typically used for outbound link reporting.",
    description_html: "The <code>ping</code> attribute for <code>&#x3C;a></code> elements sets a URL to send a POST request to when the <code>&#x3C;a></code> is clicked. This is typically used for outbound link reporting.", kind: "feature", name: "ping", spec: ["https://html.spec.whatwg.org/multipage/links.html#ping"], status: { baseline: false, by_compat_key: { "api.HTMLAnchorElement.ping": { baseline: false, support: { chrome: "12", chrome_android: "18", edge: "17", safari: "5.1", safari_ios: "5" } }, "api.HTMLAreaElement.ping": { baseline: false, support: { chrome: "12", chrome_android: "18", edge: "17", safari: "5.1", safari_ios: "5" } }, "api.SVGAElement.ping": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "html.elements.a.ping": { baseline: false, support: { chrome: "12", chrome_android: "18", edge: "17", safari: "6", safari_ios: "6" } }, "html.elements.area.ping": { baseline: false, support: { chrome: "12", chrome_android: "18", edge: "17",
    safari: "6", safari_ios: "6" } }, "svg.elements.a.ping": { baseline: false, support: {} } }, support: { chrome: "12", chrome_android: "18", edge: "17", safari: "6", safari_ios: "6" } } }, placeholder: { caniuse: ["css-placeholder"], compat_features: ["css.selectors.placeholder"], description: "The ::placeholder CSS pseudo-element selects help text in <input> and <textarea> elements when no value is set.", description_html: "The <code>::placeholder</code> CSS pseudo-element selects help text in <code>&#x3C;input></code> and <code>&#x3C;textarea></code> elements when no value is set.", group: ["selectors"], kind: "feature", name: "::placeholder", spec: ["https://drafts.csswg.org/css-pseudo-4/#placeholder-pseudo"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.placeholder": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57",
    edge: "79", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } } }, "placeholder-shown": { caniuse: ["css-placeholder-shown"], compat_features: ["css.selectors.placeholder-shown", "css.selectors.placeholder-shown.non_text_types"], description: "The :placeholder-shown CSS pseudo-element selects <input> and <textarea> elements when no value is set and the element's placeholder attribute is not empty. Not to be confused with ::placeholder, which selects the placeholder text itself.", description_html: "The <code>:placeholder-shown</code> CSS pseudo-element selects <code>&#x3C;input></code> and <code>&#x3C;textarea></code> elements when no value is set and the element's <code>placeholder</code> attribute is not empty. Not to be confused with <code>::placeholder</code>, which selects the placeholder text itself.", group: ["sel\
ectors"], kind: "feature", name: ":placeholder-shown", spec: ["https://drafts.csswg.org/selectors-4/#placeholder"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.placeholder-shown": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "51", firefox_android: "51", safari: "9", safari_ios: "9" } }, "css.selectors.placeholder-shown.non_text_types": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "59", firefox_android: "59", safari: "9", safari_ios: "9" } } }, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "51", firefox_android: "51", safari: "9", safari_ios: "9" } } }, png: { caniuse: ["png-alpha", "link-icon-png", "apng"], compat_features: ["mediatypes.image.png", "mediatypes.image.\
png.animation"], description: "The PNG (Portable Network Graphics) image format is a raster graphics file format with animation, alpha transparency, and lossless compression.", description_html: "The PNG (Portable Network Graphics) image format is a raster graphics file format with animation, alpha transparency, and lossless compression.", group: ["image-formats"], kind: "feature", name: "PNG", spec: ["https://w3c.github.io/png/#Introduction"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "mediatypes.image.png": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "mediatypes.image.png.animation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "3", firefox_android: "\
4", safari: "8", safari_ios: "8" } } }, support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "3", firefox_android: "4", safari: "8", safari_ios: "8" } } }, "pointer-events": { caniuse: ["pointer-events"], compat_features: ["css.properties.pointer-events", "css.properties.pointer-events.html_elements"], description: "The pointer-events CSS property sets whether a user can interact with an element using a mouse, touch, or other pointing input device.", description_html: "The <code>pointer-events</code> CSS property sets whether a user can interact with an element using a mouse, touch, or other pointing input device.", group: ["css"], kind: "feature", name: "pointer-events", spec: ["https://drafts.csswg.org/css-ui-4/#pointer-events-control"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.pointer-events": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.pointer-events.html_elements": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "pointer-events-api": { caniuse: ["pointer"], compat_features: ["api.Element.auxclick_event.type_pointerevent", "api.Element.click_event.type_pointerevent", "api.Element.contextmenu_event.type_pointerevent", "api.Element.gotpointercapture_event", "api.Element.hasPointerCapture", "api.Element.lostpointercapture_event", "api.Element.pointercancel_event", "api.Element.pointerdown_event", "api.Element.pointerenter_event", "api.Element.pointerleave_event", "api.Element.poin\
termove_event", "api.Element.pointerout_event", "api.Element.pointerover_event", "api.Element.pointerrawupdate_event", "api.Element.pointerup_event", "api.Element.releasePointerCapture", "api.Element.setPointerCapture", "api.Navigator.maxTouchPoints", "api.PointerEvent", "api.PointerEvent.PointerEvent", "api.PointerEvent.PointerEvent.options_altitudeAngle_parameter", "api.PointerEvent.PointerEvent.options_azimuthAngle_parameter", "api.PointerEvent.altitudeAngle", "api.PointerEvent.azimuthAngle", "api.PointerEvent.getCoalescedEvents", "api.PointerEvent.getPredictedEvents", "api.PointerEvent.height", "api.PointerEvent.isPrimary", "api.PointerEvent.persistentDeviceId", "api.PointerEvent.pointerId", "api.PointerEvent.pointerType", "api.PointerEvent.pointerType.fractional_coordinates", "api.PointerEvent.pressure", "api.PointerEvent.tangentialPressure", "api.PointerEvent.tiltX", "api.PointerEvent.tiltY", "api.PointerEvent.twist", "api.PointerEvent.width"], description: "Pointer events, such \
as pointerdown, and the PointerEvent API, represent general pointing inputs, from a wide range of devices, such as a mouse, pen or stylus, or touch with one or more fingers. Not to be confused with the pointer-events CSS property.", description_html: "Pointer events, such as <code>pointerdown</code>, and the <code>PointerEvent</code> API, represent general pointing inputs, from a wide range of devices, such as a mouse, pen or stylus, or touch with one or more fingers. Not to be confused with the <code>pointer-events</code> CSS property.", kind: "feature", name: "Pointer Events", spec: ["https://w3c.github.io/pointerevents/"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "api.Element.auxclick_event.type_pointerevent": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } }, "api.Element.cl\
ick_event.type_pointerevent": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "129", firefox_android: "129", safari: "18.2", safari_ios: "18.2" } }, "api.Element.contextmenu_event.type_pointerevent": { baseline: false, support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "129", firefox_android: "129", safari: "18.2" } }, "api.Element.gotpointercapture_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "17", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.hasPointerCapture": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.lostpointercapture_event": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "17", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointercancel_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointerdown_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointerenter_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointerleave_event": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointermove_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointerout_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointerover_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.pointerrawupdate_event": { baseline: false, support: {
    chrome: "77", chrome_android: "77", edge: "79", firefox: "148", firefox_android: "148" } }, "api.Element.pointerup_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.releasePointerCapture": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Element.setPointerCapture": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.Navigator.maxTouchPoints": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "35",
    chrome_android: "35", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.PointerEvent": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.PointerEvent.options_altitudeAngle_parameter": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "131", firefox_android: "131", safari: "18.2", safari_ios: "18.2" } }, "api.PointerEvent.PointerEvent.options_azimuthAngle_parameter": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "86",
    chrome_android: "86", edge: "86", firefox: "131", firefox_android: "131", safari: "18.2", safari_ios: "18.2" } }, "api.PointerEvent.altitudeAngle": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "131", firefox_android: "131", safari: "18.2", safari_ios: "18.2" } }, "api.PointerEvent.azimuthAngle": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "131", firefox_android: "131", safari: "18.2", safari_ios: "18.2" } }, "api.PointerEvent.getCoalescedEvents": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "59", safari: "18.2", safari_ios: "18.2" } }, "api.PointerEvent.getPredictedEvents": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "89", firefox_android: "89", safari: "18.2", safari_ios: "18.2" } }, "api.PointerEvent.height": { baseline: "\
high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.isPrimary": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.persistentDeviceId": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "141", firefox_android: "141" } }, "api.PointerEvent.pointerId": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.pointerType": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: {
    chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.pointerType.fractional_coordinates": { baseline: false, support: { firefox: "135", firefox_android: "135", safari: "26.2", safari_ios: "26.2" } }, "api.PointerEvent.pressure": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.tangentialPressure": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.tiltX": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "\
79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.tiltY": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.twist": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "57", chrome_android: "57", edge: "18", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } }, "api.PointerEvent.width": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } } }, support: { chrome: "55", chrome_android: "55", edge: "12", firefox: "59", firefox_android: "79", safari: "13", safari_ios: "13" } } }, "pointer-lock": { caniuse: ["pointerlock"], compat_features: ["api.Document.exitPoin\
terLock", "api.Document.pointerLockElement", "api.Document.pointerlockchange_event", "api.Document.pointerlockerror_event", "api.Element.requestPointerLock"], description: "Provides access to raw mouse movement by locking the target of mouse events to a single element and hiding the mouse cursor.", description_html: "Provides access to raw mouse movement by locking the target of mouse events to a single element and hiding the mouse cursor.", kind: "feature", name: "Pointer lock", spec: ["https://w3c.github.io/pointerlock/"], status: { baseline: false, by_compat_key: { "api.Document.exitPointerLock": { baseline: false, support: { chrome: "37", edge: "13", firefox: "50", firefox_android: "50", safari: "10.1" } }, "api.Document.pointerLockElement": { baseline: false, support: { chrome: "37", edge: "13", firefox: "50", firefox_android: "50", safari: "10.1" } }, "api.Document.pointerlockchange_event": { baseline: false, support: { chrome: "36", edge: "13", firefox: "50", firefox_android: "5\
0", safari: "10.1" } }, "api.Document.pointerlockerror_event": { baseline: false, support: { chrome: "36", edge: "13", firefox: "50", firefox_android: "50", safari: "10.1" } }, "api.Element.requestPointerLock": { baseline: false, support: { chrome: "37", edge: "13", firefox: "50", firefox_android: "50", safari: "10.1" } } }, support: { chrome: "37", edge: "13", firefox: "50", firefox_android: "50", safari: "10.1" } } }, popover: { compat_features: ["api.HTMLButtonElement.popoverTargetAction", "api.HTMLButtonElement.popoverTargetElement", "api.HTMLElement.beforetoggle_event", "api.HTMLElement.beforetoggle_event.popover_elements", "api.HTMLElement.hidePopover", "api.HTMLElement.popover", "api.HTMLElement.showPopover", "api.HTMLElement.showPopover.options_source_parameter", "api.HTMLElement.togglePopover", "api.HTMLElement.togglePopover.options_source_parameter", "api.HTMLElement.togglePopover.returns_boolean", "api.HTMLElement.toggle_event.popover_elements", "api.HTMLInputElement.popover\
TargetAction", "api.HTMLInputElement.popoverTargetElement", "api.ToggleEvent", "api.ToggleEvent.ToggleEvent", "api.ToggleEvent.newState", "api.ToggleEvent.oldState", "css.selectors.backdrop.popover", "css.selectors.popover-open", "html.elements.button.popovertarget", "html.elements.button.popovertargetaction", "html.elements.input.popovertarget", "html.elements.input.popovertargetaction", "html.global_attributes.popover"], description: "The popover HTML attribute creates an overlay to display content on top of other page content. Popovers can be shown declaratively using HTML, or using the showPopover() method.", description_html: "The <code>popover</code> HTML attribute creates an overlay to display content on top of other page content. Popovers can be shown declaratively using HTML, or using the <code>showPopover()</code> method.", group: ["html"], kind: "feature", name: "Popover", spec: ["https://html.spec.whatwg.org/multipage/popover.html"], status: { baseline: "low", baseline_low_date: "\
2025-01-27", by_compat_key: { "api.HTMLButtonElement.popoverTargetAction": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLButtonElement.popoverTargetElement": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.beforetoggle_event": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.beforetoggle_event.popover_elements": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.hidePopov\
er": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.popover": { baseline: "low", baseline_low_date: "2025-01-27", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "18.3" } }, "api.HTMLElement.showPopover": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.showPopover.options_source_parameter": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "144", firefox_android: "144", safari: "26", safari_ios: "26" } }, "api.HTMLElement.togglePopover": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "\
114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.togglePopover.options_source_parameter": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "144", firefox_android: "144", safari: "26", safari_ios: "26" } }, "api.HTMLElement.togglePopover.returns_boolean": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLElement.toggle_event.popover_elements": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.HTMLInputElement.popoverTargetAction": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "\
125", safari: "17", safari_ios: "17" } }, "api.HTMLInputElement.popoverTargetElement": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "api.ToggleEvent": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "120", firefox_android: "120", safari: "17", safari_ios: "17" } }, "api.ToggleEvent.ToggleEvent": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "120", firefox_android: "120", safari: "17", safari_ios: "17" } }, "api.ToggleEvent.newState": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "120", firefox_android: "120", safari: "17", safari_ios: "17" } }, "api.ToggleEvent.oldState": { baseline: "low", baseline_low_date: "2023-11-\
21", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "120", firefox_android: "120", safari: "17", safari_ios: "17" } }, "css.selectors.backdrop.popover": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "css.selectors.popover-open": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "html.elements.button.popovertarget": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "html.elements.button.popovertargetaction": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "\
125", safari: "17", safari_ios: "17" } }, "html.elements.input.popovertarget": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "html.elements.input.popovertargetaction": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } }, "html.global_attributes.popover": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "17" } } }, support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "125", firefox_android: "125", safari: "17", safari_ios: "18.3" } } }, "popover-hint": { compat_features: ["api.HTMLElement.popover.hint", "html.global_attributes.popover.hint"], description: `The popo\
ver="hint" global HTML attribute creates a popover that is subordinate to popovers with a popover="auto" attribute. You can use this to create tooltips that don't dismiss auto popovers.`, description_html: `The <code>popover="hint"</code> global HTML attribute creates a popover that is subordinate to popovers with a <code>popover="auto"</code> attribute. You can use this to create tooltips that don't dismiss <code>auto</code> popovers.`, group: ["html"], kind: "feature", name: 'popover="hint"', spec: ["https://html.spec.whatwg.org/multipage/popover.html#attr-popover-hint"], status: { baseline: false, by_compat_key: { "api.HTMLElement.popover.hint": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "149", firefox_android: "149" } }, "html.global_attributes.popover.hint": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "149", firefox_android: "149" } } }, support: { chrome: "133", chrome_android: "133", edge: "\
133", firefox: "149", firefox_android: "149" } } }, portal: { caniuse: ["portals"], description: "The <portal> HTML element embeds another page into the current page as a non-interactive preview.", description_html: "The <code>&#x3C;portal></code> HTML element embeds another page into the current page as a non-interactive preview.", discouraged: { according_to: ["https://github.com/WICG/portals/blob/421e74f5bb3e12d6d439ad19654a1463a5cb9b0a/README.md?plain=1#L1"], alternatives: ["fencedframe", "link-rel-prefetch", "speculation-rules", "view-transitions"], reason: "The <portal> element was removed from browsers in favor of other proposals.", reason_html: "The <code>&#x3C;portal></code> element was removed from browsers in favor of other proposals.", removal_date: "2023-07-23" }, kind: "feature", name: "Portals", spec: ["https://wicg.github.io/portals/"], status: { baseline: false, support: {} } }, position: { compat_features: ["css.properties.position"], description: "The position CSS pr\
operty sets the origin position of an element to an element, the element's scrollport, or the viewport.", description_html: "The <code>position</code> CSS property sets the origin position of an element to an element, the element's scrollport, or the viewport.", group: ["positioning"], kind: "feature", name: "Position", spec: ["https://drafts.csswg.org/css-position-3/#position-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.position": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, postmessage: { caniuse: ["x-doc-messaging"], compat_features: ["api.DedicatedWorkerGlobalScope.message_event", "api.Dedica\
tedWorkerGlobalScope.postMessage", "api.MessageEvent", "api.MessageEvent.MessageEvent", "api.MessageEvent.data", "api.MessageEvent.lastEventId", "api.MessageEvent.origin", "api.MessageEvent.source", "api.Window.message_event", "api.Window.postMessage", "api.Worker.message_event", "api.Worker.postMessage"], description: "The postMessage() global method sends cross-origin messages to windows and workers, including popups and iframes. Also known as cross-document messaging.", description_html: "The <code>postMessage()</code> global method sends cross-origin messages to windows and workers, including popups and iframes. Also known as cross-document messaging.", group: ["messaging"], kind: "feature", name: "postMessage", spec: ["https://html.spec.whatwg.org/multipage/web-messaging.html#web-messaging"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.DedicatedWorkerGlobalScope.message_event": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.DedicatedWorkerGlobalScope.postMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.MessageEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.MessageEvent.MessageEvent": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "16", chrome_android: "18", edge: "14", firefox: "26", firefox_android: "26", safari: "6", safari_ios: "6" } }, "api.MessageEvent.data": { baseline: "high", baseline_high_date: "2018-01\
-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.MessageEvent.lastEventId": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "2", chrome_android: "18", edge: "17", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.MessageEvent.origin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.MessageEvent.source": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Window.message_event": { baseline: "high", baseline_high_date: "2020-02-01", baseline_low_date: "\
2017-08-01", support: { chrome: "60", chrome_android: "60", edge: "12", firefox: "9", firefox_android: "9", safari: "4", safari_ios: "4" } }, "api.Window.postMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.Worker.message_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.Worker.postMessage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } } },
    pre: { compat_features: ["api.HTMLPreElement", "html.elements.pre"], description: "The <pre> element represents a block element of preformatted text that is presented exactly as written, including all white space.", description_html: "The <code>&#x3C;pre></code> element represents a block element of preformatted text that is presented exactly as written, including all white space.", group: ["html-elements"], kind: "feature", name: "<pre>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLPreElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.pre": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "prefers-color-scheme": { compat_features: ["css.at-rules.media.prefers-color-scheme", "css.at-rules.media.prefers-color-scheme.respects-inherited-scheme", "http.headers.Sec-CH-Prefers-Color-Scheme"], description: "The prefers-color-scheme CSS media query sets styles based on the requested color scheme, light or dark.", description_html: "The <code>prefers-color-scheme</code> CSS media query sets styles based on the requested color scheme, light or dark.", group: ["media-queries"], kind: "feature", name: "prefers-color-scheme media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#prefers-color-scheme"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "\
css.at-rules.media.prefers-color-scheme": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "67", firefox_android: "67", safari: "12.1", safari_ios: "13" } }, "css.at-rules.media.prefers-color-scheme.respects-inherited-scheme": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "105", firefox_android: "105" } }, "http.headers.Sec-CH-Prefers-Color-Scheme": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } } }, support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "67", firefox_android: "67", safari: "12.1", safari_ios: "13" } } }, "prefers-contrast": { compat_features: ["css.at-rules.media.prefers-contrast"], description: "The prefers-contrast CSS media query sets styles based on whether the user prefers more or less contrast, the difference between foreground and background colors.", description_html: "\
The <code>prefers-contrast</code> CSS media query sets styles based on whether the user prefers more or less contrast, the difference between foreground and background colors.", group: ["media-queries"], kind: "feature", name: "prefers-contrast media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#prefers-contrast"], status: { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", by_compat_key: { "css.at-rules.media.prefers-contrast": { baseline: "high", baseline_high_date: "2024-11-30", baseline_low_date: "2022-05-31", support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "101", firefox_android: "101", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "101", firefox_android: "101", safari: "14.1", safari_ios: "14.5" } } }, "prefers-reduced-data": { compat_features: ["css.at-rules.media.prefers-reduced-data"], description: "The prefers-reduced-data CSS media query detects w\
hether the user has a preference for using less network traffic. For example, you can use this media query to avoid loading large font files and use a system font instead.", description_html: "The <code>prefers-reduced-data</code> CSS media query detects whether the user has a preference for using less network traffic. For example, you can use this media query to avoid loading large font files and use a system font instead.", group: ["media-queries"], kind: "feature", name: "prefers-reduced-data media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#prefers-reduced-data"], status: { baseline: false, by_compat_key: { "css.at-rules.media.prefers-reduced-data": { baseline: false, support: {} } }, support: {} } }, "prefers-reduced-motion": { caniuse: ["prefers-reduced-motion"], compat_features: ["css.at-rules.media.prefers-reduced-motion", "http.headers.Sec-CH-Prefers-Reduced-Motion"], description: "The prefers-reduced-motion CSS media query sets styles based on whether the user pr\
efers to minimize the amount of non-essential animations on the device, such as scrolling, panning, zooming, and strobing.", description_html: "The <code>prefers-reduced-motion</code> CSS media query sets styles based on whether the user prefers to minimize the amount of non-essential animations on the device, such as scrolling, panning, zooming, and strobing.", group: ["media-queries"], kind: "feature", name: "prefers-reduced-motion media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#prefers-reduced-motion"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.at-rules.media.prefers-reduced-motion": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "63", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } }, "http.headers.Sec-CH-Prefers-Reduced-Motion": { baseline: false, support: { chrome: "108", chrome_android: "\
108", edge: "108" } } }, support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "63", firefox_android: "64", safari: "10.1", safari_ios: "10.3" } } }, "prefers-reduced-transparency": { compat_features: ["css.at-rules.media.prefers-reduced-transparency", "http.headers.Sec-CH-Prefers-Reduced-Transparency"], description: "The prefers-reduced-transparency CSS media query sets styles based on whether the user prefers to reduce the amount of transparent effects on their device, for example to improve contrast and legibility.", description_html: "The <code>prefers-reduced-transparency</code> CSS media query sets styles based on whether the user prefers to reduce the amount of transparent effects on their device, for example to improve contrast and legibility.", group: ["media-queries"], kind: "feature", name: "prefers-reduced-transparency media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#prefers-reduced-transparency"], status: { baseline: false, by_compat_key: { "css\
.at-rules.media.prefers-reduced-transparency": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118" } }, "http.headers.Sec-CH-Prefers-Reduced-Transparency": { baseline: false, support: { chrome: "119", chrome_android: "119", edge: "119" } } }, support: { chrome: "119", chrome_android: "119", edge: "119" } } }, "preloading-responsive-images": { compat_features: ["api.HTMLLinkElement.imageSizes", "api.HTMLLinkElement.imageSrcset", "html.elements.link.imagesizes", "html.elements.link.imagesrcset"], description: `The imagesrcset and imagesizes attributes with the rel="preload" attribute for the <link> HTML element starts fetching responsive images before they're found in the body of the document.`, description_html: `The <code>imagesrcset</code> and <code>imagesizes</code> attributes with the <code>rel="preload"</code> attribute for the <code>&#x3C;link></code> HTML element starts fetching responsive images before they're found in the body of the document.`, kind: "\
feature", name: "Preloading responsive images", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#attr-link-imagesrcset"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "api.HTMLLinkElement.imageSizes": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "78", firefox_android: "79", safari: "17.2", safari_ios: "17.2" } }, "api.HTMLLinkElement.imageSrcset": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "78", firefox_android: "79", safari: "17.2", safari_ios: "17.2" } }, "html.elements.link.imagesizes": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "78", firefox_android: "79", safari: "17.2", safari_ios: "17.2" } }, "html.elements.link.imagesrcset": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "73", chrome_android: "\
73", edge: "79", firefox: "78", firefox_android: "79", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "78", firefox_android: "79", safari: "17.2", safari_ios: "17.2" } } }, "presentation-api": { compat_features: ["api.Navigator.presentation", "api.Presentation", "api.Presentation.defaultRequest", "api.Presentation.receiver", "api.PresentationAvailability", "api.PresentationAvailability.change_event", "api.PresentationAvailability.value", "api.PresentationConnection", "api.PresentationConnection.binaryType", "api.PresentationConnection.close", "api.PresentationConnection.close_event", "api.PresentationConnection.connect_event", "api.PresentationConnection.id", "api.PresentationConnection.message_event", "api.PresentationConnection.send", "api.PresentationConnection.state", "api.PresentationConnection.terminate", "api.PresentationConnection.terminate_event", "api.PresentationConnection.url", "api.PresentationConnectionAvailab\
leEvent", "api.PresentationConnectionAvailableEvent.PresentationConnectionAvailableEvent", "api.PresentationConnectionAvailableEvent.connection", "api.PresentationConnectionCloseEvent", "api.PresentationConnectionCloseEvent.PresentationConnectionCloseEvent", "api.PresentationConnectionCloseEvent.message", "api.PresentationConnectionCloseEvent.reason", "api.PresentationConnectionList", "api.PresentationConnectionList.connectionavailable_event", "api.PresentationConnectionList.connections", "api.PresentationReceiver", "api.PresentationReceiver.connectionList", "api.PresentationRequest", "api.PresentationRequest.PresentationRequest", "api.PresentationRequest.connectionavailable_event", "api.PresentationRequest.getAvailability", "api.PresentationRequest.reconnect", "api.PresentationRequest.secure_context_required", "api.PresentationRequest.start", "html.elements.iframe.sandbox.allow-presentation"], description: "The Presentation API shows or controls content on another display, such as a n\
etwork-connected TV or projector.", description_html: "The Presentation API shows or controls content on another display, such as a network-connected TV or projector.", kind: "feature", name: "Presentation API", spec: ["https://w3c.github.io/presentation-api/"], status: { baseline: false, by_compat_key: { "api.Navigator.presentation": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.Presentation": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.Presentation.defaultRequest": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.Presentation.receiver": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79" } }, "api.PresentationAvailability": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationAvailability.change_event": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.Prese\
ntationAvailability.value": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection.binaryType": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection.close": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79" } }, "api.PresentationConnection.close_event": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnection.connect_event": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnection.id": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection.message_event": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection.send": { baseline: false,
    support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection.state": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnection.terminate": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79" } }, "api.PresentationConnection.terminate_event": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnection.url": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79" } }, "api.PresentationConnectionAvailableEvent": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnectionAvailableEvent.PresentationConnectionAvailableEvent": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnectionAvailableEvent.connection": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationConnec\
tionCloseEvent": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnectionCloseEvent.PresentationConnectionCloseEvent": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnectionCloseEvent.message": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnectionCloseEvent.reason": { baseline: false, support: { chrome: "50", chrome_android: "50", edge: "79" } }, "api.PresentationConnectionList": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79" } }, "api.PresentationConnectionList.connectionavailable_event": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79" } }, "api.PresentationConnectionList.connections": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79" } }, "api.PresentationReceiver": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "\
79" } }, "api.PresentationReceiver.connectionList": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79" } }, "api.PresentationRequest": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationRequest.PresentationRequest": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationRequest.connectionavailable_event": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationRequest.getAvailability": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationRequest.reconnect": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "api.PresentationRequest.secure_context_required": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.PresentationRequest.start": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79" } }, "\
html.elements.iframe.sandbox.allow-presentation": { baseline: false, support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "50", firefox_android: "50" } } }, support: { chrome: "47", chrome_android: "47", edge: "79" } } }, "preserves-pitch": { compat_features: ["api.HTMLMediaElement.preservesPitch"], description: "The preservesPitch property for <audio> or <video> adjusts the pitch of audio to sound more natural when the playback rate is faster or slower than the default.", description_html: "The <code>preservesPitch</code> property for <code>&#x3C;audio></code> or <code>&#x3C;video></code> adjusts the pitch of audio to sound more natural when the playback rate is faster or slower than the default.", group: ["media-elements"], kind: "feature", name: "preservesPitch", spec: ["https://html.spec.whatwg.org/multipage/media.html#dom-media-preservespitch-dev"], status: { baseline: "low", baseline_low_date: "2023-12-11", by_compat_key: { "api.HTMLMediaElement.preservesPitch": { baseline: "\
low", baseline_low_date: "2023-12-11", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "101", firefox_android: "101", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "101", firefox_android: "101", safari: "17.2", safari_ios: "17.2" } } }, print: { compat_features: ["api.Window.print"], description: "The window.print() method opens the browser's print dialog.", description_html: "The <code>window.print()</code> method opens the browser's print dialog.", group: ["print"], kind: "feature", name: "window.print()", spec: ["https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#printing"], status: { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", by_compat_key: { "api.Window.print": { baseline: "high", baseline_high_date: "2025-12-06", baseline_low_date: "2023-06-06", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "114",
    safari: "1.1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "114", safari: "1.1", safari_ios: "1" } } }, "print-color-adjust": { compat_features: ["css.properties.print-color-adjust", "css.properties.print-color-adjust.economy", "css.properties.print-color-adjust.exact"], description: "The print-color-adjust CSS property sets whether styles of printed pages should be adjusted to use less ink, in cases such as light text on a dark background.", description_html: "The <code>print-color-adjust</code> CSS property sets whether styles of printed pages should be adjusted to use less ink, in cases such as light text on a dark background.", group: ["print"], kind: "feature", name: "print-color-adjust", spec: ["https://drafts.csswg.org/css-color-adjust-1/#propdef-print-color-adjust"], status: { baseline: "low", baseline_low_date: "2025-05-01", by_compat_key: { "css.properties.print-color-adjust": { baseline: "low", baseline_low_date: "\
2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "css.properties.print-color-adjust.economy": { baseline: "low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } }, "css.properties.print-color-adjust.exact": { baseline: "low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "97", firefox_android: "97", safari: "15.4", safari_ios: "15.4" } } }, "print-events": { caniuse: ["beforeafterprint"], compat_features: ["api.Window.afterprint_event", "api.Window.beforeprint_event"], description: "An alternative to @media print queries, the beforeprint and afterprint events allow yo\
u to change the page for printing and restore the page after printing.", description_html: "An alternative to <code>@media print</code> queries, the <code>beforeprint</code> and <code>afterprint</code> events allow you to change the page for printing and restore the page after printing.", group: ["print"], kind: "feature", name: "Print events", spec: ["https://html.spec.whatwg.org/multipage/indices.html#event-afterprint", "https://html.spec.whatwg.org/multipage/indices.html#event-beforeprint"], status: { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", by_compat_key: { "api.Window.afterprint_event": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "63", chrome_android: "63", edge: "12", firefox: "6", firefox_android: "6", safari: "13", safari_ios: "13" } }, "api.Window.beforeprint_event": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "\
63", chrome_android: "63", edge: "12", firefox: "6", firefox_android: "6", safari: "13", safari_ios: "13" } } }, support: { chrome: "63", chrome_android: "63", edge: "12", firefox: "6", firefox_android: "6", safari: "13", safari_ios: "13" } } }, "private-click-measurement": { compat_features: ["api.HTMLAnchorElement.attributionSourceId", "html.elements.a.attributionsourceid"], description: "The attributionsourceid and attributiondestination attributes for <a> elements measure clicks across websites without associating a click to a specific session. Not to be confused with attribution reporting. Also known as PCM.", description_html: "The <code>attributionsourceid</code> and <code>attributiondestination</code> attributes for <code>&#x3C;a></code> elements measure clicks across websites without associating a click to a specific session. Not to be confused with attribution reporting. Also known as PCM.", kind: "feature", name: "Private click measurement", spec: ["https://privacycg.github.\
io/private-click-measurement/"], status: { baseline: false, by_compat_key: { "api.HTMLAnchorElement.attributionSourceId": { baseline: false, support: { safari: "15.4", safari_ios: "15.4" } }, "html.elements.a.attributionsourceid": { baseline: false, support: { safari: "14.1", safari_ios: "14.5" } } }, support: { safari: "15.4", safari_ios: "15.4" } } }, "private-network-access": { compat_features: ["http.mixed-content.private_network_access"], description: "The Access-Control-Request-Private-Network: true and Access-Control-Allow-Private-Network: true HTTP request and response headers establish permission for websites to make requests to internal networks, such as to routers.", description_html: "The <code>Access-Control-Request-Private-Network: true</code> and <code>Access-Control-Allow-Private-Network: true</code> HTTP request and response headers establish permission for websites to make requests to internal networks, such as to routers.", discouraged: { according_to: ["https://gith\
ub.com/WICG/local-network-access?tab=readme-ov-file#local-network-access", "https://developer.chrome.com/blog/pna-on-hold"], alternatives: ["local-network-access"], reason: "Private network access caused compatibility problems and is superseded by local network access.", reason_html: "Private network access caused compatibility problems and is superseded by local network access.", removal_date: "2025-06-26" }, kind: "feature", name: "Private network access", spec: ["https://wicg.github.io/private-network-access/"], status: { baseline: false, by_compat_key: { "http.mixed-content.private_network_access": { baseline: false, support: {} } }, support: {} } }, profiler: { compat_features: ["api.Profiler", "api.Profiler.Profiler", "api.Profiler.sampleInterval", "api.Profiler.stop", "api.Profiler.stopped"], description: "The Profiler API records data about the execution of a page, which you can send to a server for later analysis. Also known as self-profiling.", description_html: "The <code>Pr\
ofiler</code> API records data about the execution of a page, which you can send to a server for later analysis. Also known as self-profiling.", kind: "feature", name: "Profiler", spec: ["https://wicg.github.io/js-self-profiling/"], status: { baseline: false, by_compat_key: { "api.Profiler": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.Profiler.Profiler": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.Profiler.sampleInterval": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.Profiler.stop": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.Profiler.stopped": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } } }, support: { chrome: "94", chrome_android: "94", edge: "94" } } }, progress: { caniuse: ["progress"], compat_features: ["api.HTMLProgressElement", "api.HTMLProgressElement.labels", "api.HTMLProgre\
ssElement.max", "api.HTMLProgressElement.position", "api.HTMLProgressElement.value", "html.elements.progress", "html.elements.progress.max", "html.elements.progress.value"], description: "The <progress> element displays an indicator showing the completion progress of a task, typically displayed as a progress bar.", description_html: "The <code>&#x3C;progress></code> element displays an indicator showing the completion progress of a task, typically displayed as a progress bar.", group: ["forms", "html-elements"], kind: "feature", name: "<progress>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-progress-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLProgressElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "6" } }, "\
api.HTMLProgressElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "6", safari_ios: "6" } }, "api.HTMLProgressElement.max": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "6" } }, "api.HTMLProgressElement.position": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "6" } }, "api.HTMLProgressElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "6" } }, "html\
.elements.progress": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "7" } }, "html.elements.progress.max": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "7" } }, "html.elements.progress.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "7" } } }, support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "6", safari_ios: "7" } } }, "progress-function": { compat_features: ["css.types.progress"], description: "The progress() CSS function returns a ratio for the relative p\
osition of one value between two other values, clamped between 0 and 1. You can use it to interpolate a value for other calculations.", description_html: "The <code>progress()</code> CSS function returns a ratio for the relative position of one value between two other values, clamped between 0 and 1. You can use it to interpolate a value for other calculations.", group: ["css"], kind: "feature", name: "progress()", spec: ["https://drafts.csswg.org/css-values-5/#progress"], status: { baseline: false, by_compat_key: { "css.types.progress": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138", safari: "26", safari_ios: "26" } } }, support: { chrome: "138", chrome_android: "138", edge: "138", safari: "26", safari_ios: "26" } } }, promise: { caniuse: ["promises"], compat_features: ["javascript.builtins.Promise", "javascript.builtins.Promise.@@species", "javascript.builtins.Promise.Promise", "javascript.builtins.Promise.all", "javascript.builtins.Promise.catch", "j\
avascript.builtins.Promise.incumbent_settings_object_tracking", "javascript.builtins.Promise.race", "javascript.builtins.Promise.reject", "javascript.builtins.Promise.resolve", "javascript.builtins.Promise.then"], description: "A promise represents an asynchronous operation which eventually succeeds or fails.", description_html: "A promise represents an asynchronous operation which eventually succeeds or fails.", group: ["promises"], kind: "feature", name: "Promise (initial support)", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise-objects", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-get-promise-@@species", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise-constructor", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.all", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.prototype.catch", "https:/\
/tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.race", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.reject", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.resolve", "https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.prototype.then"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Promise": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.@@species": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } }, "javascript.builtins.P\
romise.Promise": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.all": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.catch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.incumbent_settings_object_tracking": { baseline: false, support: { firefox: "50", firefox_android: "50" } }, "javascript.builtins.Promise.race": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-2\
9", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.reject": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.resolve": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } }, "javascript.builtins.Promise.then": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "8", safari_ios: "8" } } }, support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29",
    safari: "8", safari_ios: "8" } } }, "promise-allsettled": { compat_features: ["javascript.builtins.Promise.allSettled"], description: "The Promise.allSettled() static method waits for an array of promises to settle (resolve or reject).", description_html: "The <code>Promise.allSettled()</code> static method waits for an array of promises to settle (resolve or reject).", group: ["promises"], kind: "feature", name: "Promise.allSettled()", snapshot: ["ecmascript-2020"], spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.allsettled"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "javascript.builtins.Promise.allSettled": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "71", firefox_android: "79", safari: "13", safari_ios: "13" } } }, support: { chrome: "76", chrome_android: "76", edge: "\
79", firefox: "71", firefox_android: "79", safari: "13", safari_ios: "13" } } }, "promise-any": { compat_features: ["javascript.builtins.AggregateError", "javascript.builtins.AggregateError.AggregateError", "javascript.builtins.AggregateError.errors", "javascript.builtins.AggregateError.serializable_object", "javascript.builtins.Promise.any"], description: "The Promise.any() static method returns a promise that fulfills as soon as the first of an iterable of promises fulfills, with that promise's value. Otherwise, it rejects with an AggregateError when all of the promises have rejected.", description_html: "The <code>Promise.any()</code> static method returns a promise that fulfills as soon as the first of an iterable of promises fulfills, with that promise's value. Otherwise, it rejects with an <code>AggregateError</code> when all of the promises have rejected.", group: ["promises"], kind: "feature", name: "Promise.any()", snapshot: ["ecmascript-2021"], spec: ["https://tc39.es/ecma262\
/multipage/control-abstraction-objects.html#sec-promise.any"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "javascript.builtins.AggregateError": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.AggregateError.AggregateError": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.AggregateError.errors": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Aggregat\
eError.serializable_object": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "103", firefox_android: "103", safari: "17", safari_ios: "17" } }, "javascript.builtins.Promise.any": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79", firefox_android: "79", safari: "14", safari_ios: "14" } } }, "promise-finally": { caniuse: ["promise-finally"], compat_features: ["javascript.builtins.Promise.finally"], description: "The promise finally() method executes a function when the promise settles (resolves or rejects).", description_html: "The promise <code>finally()</code> method executes a function when the promise settles (resolves or rejects).", group: [
    "promises"], kind: "feature", name: "Promise finally()", snapshot: ["ecmascript-2018"], spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.prototype.finally"], status: { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", by_compat_key: { "javascript.builtins.Promise.finally": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "63", chrome_android: "63", edge: "18", firefox: "58", firefox_android: "58", safari: "11.1", safari_ios: "11.3" } } }, "promise-try": { compat_features: ["javascript.builtins.Promise.try"], description: "The Promise.try() static method returns a promise that takes a callback of any kind (returns or throws, synchronously or asynchronously) and wraps its result in a Promise.", description_html: "The <c\
ode>Promise.try()</code> static method returns a promise that takes a callback of any kind (returns or throws, synchronously or asynchronously) and wraps its result in a <code>Promise</code>.", group: ["promises"], kind: "feature", name: "Promise.try()", spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.try"], status: { baseline: "low", baseline_low_date: "2025-01-07", by_compat_key: { "javascript.builtins.Promise.try": { baseline: "low", baseline_low_date: "2025-01-07", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "134", firefox_android: "134", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "134", firefox_android: "134", safari: "18.2", safari_ios: "18.2" } } }, "promise-withresolvers": { compat_features: ["javascript.builtins.Promise.withResolvers"], description: "The Promise.withResolvers() static method is an alternative to the Promise() constructor that \
returns both the promise and resolution functions. You can use this to access resolve and reject outside the scope of the executor function.", description_html: "The <code>Promise.withResolvers()</code> static method is an alternative to the <code>Promise()</code> constructor that returns both the promise and resolution functions. You can use this to access <code>resolve</code> and <code>reject</code> outside the scope of the executor function.", group: ["promises"], kind: "feature", name: "Promise.withResolvers()", spec: ["https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise.withResolvers"], status: { baseline: "low", baseline_low_date: "2024-03-05", by_compat_key: { "javascript.builtins.Promise.withResolvers": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "121", firefox_android: "121", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "119", chrome_android: "119", edge: "\
119", firefox: "121", firefox_android: "121", safari: "17.4", safari_ios: "17.4" } } }, proto: { compat_features: ["javascript.builtins.Object.proto"], description: "The __proto__ property of objects partially exposes the prototype of an object.", description_html: "The <code>__proto__</code> property of objects partially exposes the prototype of an object.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers"], reason: "Changing __proto__ is slow and can cause surprising bugs.", reason_html: "Changing <code>__proto__</code> is slow and can cause surprising bugs." }, group: ["javascript"], kind: "feature", name: "__proto__", spec: ["https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.prototype.__proto__"], status: { baseline: false, by_compat_key: { "javascript.builtins.Object.proto": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "proxy-reflect": { caniuse: ["proxy"], compat_features: ["javascript.builtins.Proxy", "javascript.builtins.Proxy.Proxy", "javascript.builtins.Proxy.handler.apply", "javascript.builtins.Proxy.handler.construct", "javascript.builtins.Proxy.handler.defineProperty", "javascript.builtins.Proxy.handler.deleteProperty", "javascript.builtins.Proxy.handler.get", "javascript.builtins.Proxy.handler.getOwnPropertyDescriptor", "javascript.builtins.Proxy.handler.getPrototypeOf", "javascript.builtins.Proxy.handler.has", "javascript.builtins.Proxy.handler.isExtensible", "javascript.builtins.Proxy.handler.ownKeys", "javascript.builtins.Proxy.handler.preventExtensions", "javascript.builtins.Proxy.handler.set", "javascript.builtins.Proxy.handler.setPrototypeOf", "javascript.builtins.Proxy.revocable", "\
javascript.builtins.Reflect", "javascript.builtins.Reflect.apply", "javascript.builtins.Reflect.construct", "javascript.builtins.Reflect.defineProperty", "javascript.builtins.Reflect.deleteProperty", "javascript.builtins.Reflect.get", "javascript.builtins.Reflect.getOwnPropertyDescriptor", "javascript.builtins.Reflect.getPrototypeOf", "javascript.builtins.Reflect.has", "javascript.builtins.Reflect.isExtensible", "javascript.builtins.Reflect.ownKeys", "javascript.builtins.Reflect.preventExtensions", "javascript.builtins.Reflect.set", "javascript.builtins.Reflect.setPrototypeOf"], description: "The Proxy and Reflect JavaScript built-ins intercept and define custom behavior for fundamental language operations (such as property lookup, assignment, enumeration, or function invocation).", description_html: "The <code>Proxy</code> and <code>Reflect</code> JavaScript built-ins intercept and define custom behavior for fundamental language operations (such as property lookup, assignment, enumera\
tion, or function invocation).", group: ["javascript"], kind: "feature", name: "Proxy and Reflect", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/reflection.html#sec-reflection"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.Proxy": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.Proxy": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.apply": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "\
12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.construct": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.defineProperty": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.deleteProperty": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.get": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "\
2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.getOwnPropertyDescriptor": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.getPrototypeOf": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.has": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.isEx\
tensible": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "31", firefox_android: "31", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.ownKeys": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.preventExtensions": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.set": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "\
10", safari_ios: "10" } }, "javascript.builtins.Proxy.handler.setPrototypeOf": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.Proxy.revocable": { baseline: "high", baseline_high_date: "2020-06-06", baseline_low_date: "2017-12-06", support: { chrome: "63", chrome_android: "63", edge: "12", firefox: "34", firefox_android: "34", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.apply": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "\
42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.construct": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.defineProperty": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.deleteProperty": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.get": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "4\
9", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.getOwnPropertyDescriptor": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.getPrototypeOf": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.has": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.isExtensible": { baseline: "high", baseline_high_date: "2019-0\
3-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.ownKeys": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.preventExtensions": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.set": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } }, "javascript.builtins.Reflect.setPrototypeOf": {
    baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "42", firefox_android: "42", safari: "10", safari_ios: "10" } } }, support: { chrome: "49", chrome_android: "49", edge: "12", firefox: "18", firefox_android: "18", safari: "10", safari_ios: "10" } } }, push: { caniuse: ["push-api"], compat_features: ["api.Permissions.permission_push", "api.PushEvent", "api.PushEvent.PushEvent", "api.PushEvent.data", "api.PushManager", "api.PushManager.getSubscription", "api.PushManager.permissionState", "api.PushManager.subscribe", "api.PushManager.supportedContentEncodings_static", "api.PushMessageData", "api.PushMessageData.arrayBuffer", "api.PushMessageData.blob", "api.PushMessageData.bytes", "api.PushMessageData.json", "api.PushMessageData.text", "api.PushSubscription", "api.PushSubscription.endpoint", "api.PushSubscription.expirationTime", "api.PushSubscription.getKey", "api.PushSubscription.o\
ptions", "api.PushSubscription.toJSON", "api.PushSubscription.unsubscribe", "api.PushSubscriptionChangeEvent", "api.PushSubscriptionChangeEvent.PushSubscriptionChangeEvent", "api.PushSubscriptionChangeEvent.newSubscription", "api.PushSubscriptionChangeEvent.oldSubscription", "api.PushSubscriptionOptions", "api.PushSubscriptionOptions.applicationServerKey", "api.PushSubscriptionOptions.userVisibleOnly", "api.ServiceWorkerGlobalScope.push_event", "api.ServiceWorkerGlobalScope.pushsubscriptionchange_event", "api.ServiceWorkerRegistration", "api.ServiceWorkerRegistration.pushManager"], description: "The Push API subscribes to and receives server-initiated messages. Subscribers receive pushed messages in the background, even after periods inactive or offline.", description_html: "The Push API subscribes to and receives server-initiated messages. Subscribers receive pushed messages in the background, even after periods inactive or offline.", kind: "feature", name: "Push messages", spec: ["ht\
tps://w3c.github.io/push-api/"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.Permissions.permission_push": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "46", firefox_android: "46", safari: "17", safari_ios: "17" } }, "api.PushEvent": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushEvent.PushEvent": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushEvent.data": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: {
    chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushManager": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushManager.getSubscription": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushManager.permissionState": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "44", chrome_android: "44", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushManager.subscribe": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: {
    chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushManager.supportedContentEncodings_static": { baseline: "low", baseline_low_date: "2025-01-07", support: { chrome: "60", chrome_android: "60", edge: "17", firefox: "134", firefox_android: "134", safari: "16", safari_ios: "16.4" } }, "api.PushMessageData": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushMessageData.arrayBuffer": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushMessageData.blob": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "\
50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushMessageData.bytes": { baseline: "low", baseline_low_date: "2025-01-17", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.PushMessageData.json": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushMessageData.text": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "1\
7", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription.endpoint": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription.expirationTime": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "60", chrome_android: "60", edge: "17", firefox: "96", firefox_android: "96", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription.getKey": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription.options": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "54", chrome_android: "\
54", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription.toJSON": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscription.unsubscribe": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "42", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscriptionChangeEvent": { baseline: false, support: { chrome: "138", chrome_android: "138", firefox: "137", firefox_android: "137", safari: "16", safari_ios: "16.4" } }, "api.PushSubscriptionChangeEvent.PushSubscriptionChangeEvent": { baseline: false, support: { chrome: "138", chrome_android: "138", firefox: "137", firefox_android: "137", safari: "16.1", safari_ios: "16.4" } }, "api\
.PushSubscriptionChangeEvent.newSubscription": { baseline: false, support: { chrome: "138", chrome_android: "138", firefox: "137", firefox_android: "137", safari: "16", safari_ios: "16.4" } }, "api.PushSubscriptionChangeEvent.oldSubscription": { baseline: false, support: { chrome: "138", chrome_android: "138", firefox: "137", firefox_android: "137", safari: "16", safari_ios: "16.4" } }, "api.PushSubscriptionOptions": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscriptionOptions.applicationServerKey": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.PushSubscriptionOptions.userVisibleOnly": { baseline: false, support: { chrome: "\
54", chrome_android: "54", edge: "17", safari: "16", safari_ios: "16.4" } }, "api.ServiceWorkerGlobalScope.push_event": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } }, "api.ServiceWorkerGlobalScope.pushsubscriptionchange_event": { baseline: false, support: { chrome: "138", chrome_android: "138", safari: "16" } }, "api.ServiceWorkerRegistration": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.pushManager": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "\
16.4" } } }, support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "44", firefox_android: "48", safari: "16", safari_ios: "16.4" } } }, q: { compat_features: ["api.HTMLQuoteElement", "api.HTMLQuoteElement.cite", "html.elements.q", "html.elements.q.cite"], description: "The <q> element represents a short inline quotation.", description_html: "The <code>&#x3C;q></code> element represents a short inline quotation.", group: ["html-elements"], kind: "feature", name: "<q>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-q-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLQuoteElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLQuoteElement.cite": { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.q": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.q.cite": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, "q-unit": { compat_features: ["css.types.length.Q"], description: "The Q CSS length unit is an absolute length anchored to the physical measurement of quarter-millimeters. 1Q is equivalent to 1/40 of 1 centimeter.", description_html: "\
The <code>Q</code> CSS length unit is an absolute length anchored to the physical measurement of quarter-millimeters. <code>1Q</code> is equivalent to 1/40 of 1 centimeter.", group: ["units"], kind: "feature", name: "Q unit", spec: ["https://drafts.csswg.org/css-values-4/#absolute-lengths"], status: { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", by_compat_key: { "css.types.length.Q": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "49", firefox_android: "49", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "49", firefox_android: "49", safari: "13.1", safari_ios: "13.4" } } }, queuemicrotask: { compat_features: ["api.queueMicrotask"], description: "The queueMicrotask() method schedules a function to run after the currently running synchronous JavaScript finishes but before returnin\
g to the event loop.", description_html: "The <code>queueMicrotask()</code> method schedules a function to run after the currently running synchronous JavaScript finishes but before returning to the event loop.", kind: "feature", name: "queueMicrotask()", spec: ["https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#microtask-queuing"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "api.queueMicrotask": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "69", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "69", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, quotes: { compat_features: ["css.properties.quotes", "css.properties.quotes.auto", "css.properties.quotes.none"], description: "The quotes CSS prope\
rty sets the quotation marks inserted via the content CSS property or <q> element.", description_html: "The <code>quotes</code> CSS property sets the quotation marks inserted via the <code>content</code> CSS property or <code>&#x3C;q></code> element.", group: ["css"], kind: "feature", name: "Quotes", spec: ["https://drafts.csswg.org/css-content-3/#quotes"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "css.properties.quotes": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "9", safari_ios: "9" } }, "css.properties.quotes.auto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "70", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "css.properties.quotes.none": {
    baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "9", safari_ios: "9" } } }, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "70", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, "random-function": { compat_features: ["css.types.random"], description: "The random() CSS function chooses a random numeric value within a specified range. This allows for dynamic, randomized styling using CSS.", description_html: "The <code>random()</code> CSS function chooses a random numeric value within a specified range. This allows for dynamic, randomized styling using CSS.", group: ["css"], kind: "feature", name: "random()", spec: ["https://drafts.csswg.org/css-values-5/#random"], status: { baseline: false, by_compat_key: { "css.types.random": { baseline: false, support: { safari: "26.2", safari_ios: "26.2" } } }, support: {
    safari: "26.2", safari_ios: "26.2" } } }, rcap: { compat_features: ["css.types.length.rcap"], description: "The rcap CSS length unit is a font-relative length equal to the value of the cap unit on the root element. Cap-height is approximately equal to the height of a capital Latin letter.", description_html: "The <code>rcap</code> CSS length unit is a font-relative length equal to the value of the <code>cap</code> unit on the root element. Cap-height is approximately equal to the height of a capital Latin letter.", group: ["units"], kind: "feature", name: "rcap unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: { "css.types.length.rcap": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "118", chrome_android: "118", edge: "\
118", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, rch: { compat_features: ["css.types.length.rch"], description: "The rch CSS length unit is a font-relative length equal to the value of the ch unit on the root element. ch length is based on the width of the zero (0) character.", description_html: "The <code>rch</code> CSS length unit is a font-relative length equal to the value of the <code>ch</code> unit on the root element. <code>ch</code> length is based on the width of the zero (0) character.", group: ["units"], kind: "feature", name: "rch unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: { "css.types.length.rch": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "111", chrome_android: "\
111", edge: "111", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, "read-write-pseudos": { caniuse: ["css-read-only-write"], compat_features: ["css.selectors.read-only", "css.selectors.read-write"], description: "The :read-only and :read-write CSS pseudo-classes match elements that are read-only or read-write, respectively. For example, :read-only matches <input> and <textarea> elements with the readonly attribute.", description_html: "The <code>:read-only</code> and <code>:read-write</code> CSS pseudo-classes match elements that are read-only or read-write, respectively. For example, <code>:read-only</code> matches <code>&#x3C;input></code> and <code>&#x3C;textarea></code> elements with the <code>readonly</code> attribute.", group: ["forms"], kind: "feature", name: ":read-only and :read-write", spec: ["https://html.spec.whatwg.org/multipage/semantics-other.html#selector-read-only", "https://drafts.csswg.org/selectors-4/#rw-pseudos"], status: { baseline: "\
high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "css.selectors.read-only": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "1", chrome_android: "18", edge: "13", firefox: "78", firefox_android: "79", safari: "4", safari_ios: "3.2" } }, "css.selectors.read-write": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "1", chrome_android: "18", edge: "13", firefox: "78", firefox_android: "79", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "13", firefox: "78", firefox_android: "79", safari: "4", safari_ios: "3.2" } } }, "readable-byte-streams": { caniuse: ["streams"], compat_features: ["api.ReadableByteStreamController", "api.ReadableByteStreamController.byobRequest", "api.ReadableByteStreamController.close", "api.ReadableByteStreamController.desiredSize", "api.ReadableByteStreamController.enque\
ue", "api.ReadableByteStreamController.error", "api.ReadableStreamBYOBReader", "api.ReadableStreamBYOBReader.ReadableStreamBYOBReader", "api.ReadableStreamBYOBReader.cancel", "api.ReadableStreamBYOBReader.closed", "api.ReadableStreamBYOBReader.read", "api.ReadableStreamBYOBReader.read.options_min_parameter", "api.ReadableStreamBYOBReader.releaseLock", "api.ReadableStreamBYOBReader.releaseLock.reject_pending_read_request", "api.ReadableStreamBYOBRequest", "api.ReadableStreamBYOBRequest.respond", "api.ReadableStreamBYOBRequest.respondWithNewView", "api.ReadableStreamBYOBRequest.view"], description: 'A ReadableStream constructed with { type: "bytes" } reads bytes from a stream without making extra copies, improving efficiency for streams of large chunks. Also known as BYOB or bring your own buffer.', description_html: 'A <code>ReadableStream</code> constructed with <code>{ type: "bytes" }</code> reads bytes from a stream without making extra copies, improving efficiency for streams of lar\
ge chunks. Also known as BYOB or bring your own buffer.', group: ["streams"], kind: "feature", name: "Readable byte streams", spec: ["https://streams.spec.whatwg.org/"], status: { baseline: "low", baseline_low_date: "2026-03-24", by_compat_key: { "api.ReadableByteStreamController": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableByteStreamController.byobRequest": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableByteStreamController.close": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableByteStreamController.desiredSize": { baseline: "\
low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableByteStreamController.enqueue": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableByteStreamController.error": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader.ReadableStreamBYOBReader": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89",
    chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader.cancel": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader.closed": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader.read": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader.read.options_min_parameter": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "134", firefox_android: "134" } }, "api.Reada\
bleStreamBYOBReader.releaseLock": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBReader.releaseLock.reject_pending_read_request": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "102", firefox_android: "102" } }, "api.ReadableStreamBYOBRequest": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBRequest.respond": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBRequest.respondWithNewView": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "\
89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } }, "api.ReadableStreamBYOBRequest.view": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } } }, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "102", firefox_android: "102", safari: "26.4", safari_ios: "26.4" } } }, "readablestream-from": { compat_features: ["api.ReadableStream.from_static"], description: "The ReadableStream.from() static method converts an iterable or async iterable object, such as an array or async generator function, into a readable stream.", description_html: "The <code>ReadableStream.from()</code> static method converts an iterable or async iterable object, such as an array or async generator function, into a readable stream.", group: ["streams"], kind: "feature", name: "ReadableStream.from()",
    spec: ["https://streams.spec.whatwg.org/#rs-from"], status: { baseline: false, by_compat_key: { "api.ReadableStream.from_static": { baseline: false, support: { firefox: "117", firefox_android: "117" } } }, support: { firefox: "117", firefox_android: "117" } } }, "reading-flow": { compat_features: ["css.properties.reading-flow", "css.properties.reading-flow.flex-flow", "css.properties.reading-flow.flex-visual", "css.properties.reading-flow.grid-columns", "css.properties.reading-flow.grid-order", "css.properties.reading-flow.grid-rows", "css.properties.reading-flow.normal", "css.properties.reading-flow.source-order", "css.properties.reading-order"], description: "The reading-flow CSS property sets the order in which flex or grid elements are rendered to speech or reached via focus navigation. The reading-order property overrides this order.", description_html: "The <code>reading-flow</code> CSS property sets the order in which flex or grid elements are rendered to speech or reached v\
ia focus navigation. The <code>reading-order</code> property overrides this order.", group: ["css", "reading-order"], kind: "feature", name: "reading-flow", spec: ["https://drafts.csswg.org/css-display-4/#reading-flow"], status: { baseline: false, by_compat_key: { "css.properties.reading-flow": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-flow.flex-flow": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-flow.flex-visual": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-flow.grid-columns": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-flow.grid-order": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-flow.grid-rows": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "\
137" } }, "css.properties.reading-flow.normal": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-flow.source-order": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } }, "css.properties.reading-order": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137" } } }, support: { chrome: "137", chrome_android: "137", edge: "137" } } }, "rect-xywh": { compat_features: ["css.types.basic-shape.rect", "css.types.basic-shape.xywh"], description: "The rect() CSS function creates a rectangle shape with insets from the edges of an element. The xywh() CSS function creates a rectangle shifted by an x and y distance. They can be used with clip-path and shape-outside.", description_html: "The <code>rect()</code> CSS function creates a rectangle shape with insets from the edges of an element. The <code>xywh()</code> CSS function creates a rectangle shifted by an <code>x</code> and <code>y<\
/code> distance. They can be used with <code>clip-path</code> and <code>shape-outside</code>.", group: ["clipping-shapes-masking"], kind: "feature", name: "rect() and xywh()", spec: ["https://drafts.csswg.org/css-shapes-1/#funcdef-basic-shape-xywh", "https://drafts.csswg.org/css-shapes-1/#funcdef-basic-shape-rect"], status: { baseline: "low", baseline_low_date: "2024-01-23", by_compat_key: { "css.types.basic-shape.rect": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "122", firefox_android: "122", safari: "17.2", safari_ios: "17.2" } }, "css.types.basic-shape.xywh": { baseline: "low", baseline_low_date: "2024-01-23", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "122", firefox_android: "122", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "122", firefox_android: "122", safari: "17.2", safari_ios: "17.2" } } }, "rect-xywx": {
    kind: "moved", redirect_target: "rect-xywh" }, referencetarget: { compat_features: ["api.Element.attachShadow.options_referenceTarget_parameter", "api.HTMLTemplateElement.shadowRootReferenceTarget", "api.ShadowRoot.referenceTarget", "html.elements.template.shadowrootreferencetarget"], description: "The referenceTarget property of a ShadowRoot object forwards attributes such as for and aria-labelledby to elements inside a shadow DOM. You can use this to, for example, link a <label> to its <input> even if the <input> is in the shadow DOM of a web component.", description_html: "The <code>referenceTarget</code> property of a <code>ShadowRoot</code> object forwards attributes such as <code>for</code> and <code>aria-labelledby</code> to elements inside a shadow DOM. You can use this to, for example, link a <code>&#x3C;label></code> to its <code>&#x3C;input></code> even if the <code>&#x3C;input></code> is in the shadow DOM of a web component.", group: ["web-components"], kind: "feature",
    name: "Reference target", spec: ["https://github.com/whatwg/dom/pull/1353", "https://github.com/whatwg/html/pull/10995"], status: { baseline: false, by_compat_key: { "api.Element.attachShadow.options_referenceTarget_parameter": { baseline: false, support: {} }, "api.HTMLTemplateElement.shadowRootReferenceTarget": { baseline: false, support: {} }, "api.ShadowRoot.referenceTarget": { baseline: false, support: {} }, "html.elements.template.shadowrootreferencetarget": { baseline: false, support: {} } }, support: {} } }, "referrer-policy": { caniuse: ["referrer-policy"], compat_features: ["api.HTMLAnchorElement.referrerPolicy", "api.HTMLAnchorElement.referrerPolicy.no-referrer-when-downgrade", "api.HTMLAnchorElement.referrerPolicy.origin-when-cross-origin", "api.HTMLAnchorElement.referrerPolicy.unsafe-url", "api.HTMLAreaElement.referrerPolicy", "api.HTMLAreaElement.referrerPolicy.no-referrer-when-downgrade", "api.HTMLAreaElement.referrerPolicy.origin-when-cross-origin", "api.HTMLAreaEle\
ment.referrerPolicy.unsafe-url", "api.HTMLIFrameElement.referrerPolicy", "api.HTMLIFrameElement.referrerPolicy.no-referrer-when-downgrade", "api.HTMLIFrameElement.referrerPolicy.origin-when-cross-origin", "api.HTMLIFrameElement.referrerPolicy.unsafe-url", "api.HTMLImageElement.referrerPolicy", "api.HTMLImageElement.referrerPolicy.no-referrer-when-downgrade", "api.HTMLImageElement.referrerPolicy.origin-when-cross-origin", "api.HTMLImageElement.referrerPolicy.unsafe-url", "api.HTMLLinkElement.referrerPolicy", "api.HTMLLinkElement.referrerPolicy.no-referrer-when-downgrade", "api.HTMLLinkElement.referrerPolicy.origin-when-cross-origin", "api.HTMLLinkElement.referrerPolicy.unsafe-url", "api.HTMLScriptElement.referrerPolicy", "api.HTMLScriptElement.referrerPolicy.no-referrer-when-downgrade", "api.HTMLScriptElement.referrerPolicy.origin-when-cross-origin", "api.HTMLScriptElement.referrerPolicy.unsafe-url", "html.elements.a.referrerpolicy", "html.elements.a.referrerpolicy.no-referrer-when-down\
grade", "html.elements.a.referrerpolicy.origin-when-cross-origin", "html.elements.a.referrerpolicy.unsafe-url", "html.elements.area.referrerpolicy", "html.elements.area.referrerpolicy.no-referrer-when-downgrade", "html.elements.area.referrerpolicy.origin-when-cross-origin", "html.elements.area.referrerpolicy.unsafe-url", "html.elements.iframe.referrerpolicy", "html.elements.iframe.referrerpolicy.no-referrer-when-downgrade", "html.elements.iframe.referrerpolicy.origin-when-cross-origin", "html.elements.iframe.referrerpolicy.unsafe-url", "html.elements.img.referrerpolicy", "html.elements.img.referrerpolicy.no-referrer-when-downgrade", "html.elements.img.referrerpolicy.origin-when-cross-origin", "html.elements.img.referrerpolicy.unsafe-url", "html.elements.link.referrerpolicy", "html.elements.link.referrerpolicy.no-referrer-when-downgrade", "html.elements.link.referrerpolicy.origin-when-cross-origin", "html.elements.link.referrerpolicy.unsafe-url", "html.elements.script.referrerpolicy", "\
html.elements.script.referrerpolicy.no-referrer-when-downgrade", "html.elements.script.referrerpolicy.origin-when-cross-origin", "html.elements.script.referrerpolicy.unsafe-url", "http.headers.Referrer-Policy", "http.headers.Referrer-Policy.default_strict-origin-when-cross-origin", "http.headers.Referrer-Policy.no-referrer-when-downgrade", "http.headers.Referrer-Policy.origin-when-cross-origin", "http.headers.Referrer-Policy.same-origin", "http.headers.Referrer-Policy.strict-origin", "http.headers.Referrer-Policy.strict-origin-when-cross-origin", "http.headers.Referrer-Policy.unsafe-url"], description: "The Referrer-Policy HTTP header and referrerpolicy HTML attributes control whether requests have the Referer header and what information the header contains.", description_html: "The <code>Referrer-Policy</code> HTTP header and <code>referrerpolicy</code> HTML attributes control whether requests have the <code>Referer</code> header and what information the header contains.", kind: "feat\
ure", name: "Referrer policy", spec: ["https://w3c.github.io/webappsec-referrer-policy/"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "api.HTMLAnchorElement.referrerPolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "api.HTMLAnchorElement.referrerPolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLAnchorElement.referrerPolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLAnchorElement.referrerPolicy.unsafe-url": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLAre\
aElement.referrerPolicy": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLAreaElement.referrerPolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLAreaElement.referrerPolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLAreaElement.referrerPolicy.unsafe-url": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLIFrameElement.referrerPolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "\
50", safari: "14", safari_ios: "14" } }, "api.HTMLIFrameElement.referrerPolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLIFrameElement.referrerPolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLIFrameElement.referrerPolicy.unsafe-url": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLImageElement.referrerPolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "api.HTMLImageElement.referrerPolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } },
    "api.HTMLImageElement.referrerPolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLImageElement.referrerPolicy.unsafe-url": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLLinkElement.referrerPolicy": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLLinkElement.referrerPolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLLinkElement.referrerPolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLLinkElement.referre\
rPolicy.unsafe-url": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.HTMLScriptElement.referrerPolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "api.HTMLScriptElement.referrerPolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLScriptElement.referrerPolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79", safari: "14", safari_ios: "14" } }, "api.HTMLScriptElement.referrerPolicy.unsafe-url": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79", safari: "14", safari_ios: "14" } }, "html.elements.a.referrerpolicy": { baseline: "high", baseline_high_date: "2\
023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "html.elements.a.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.a.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.a.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.area.referrerpolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "html.elements.area.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.el\
ements.area.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.area.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.iframe.referrerpolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "html.elements.iframe.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.iframe.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.iframe.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.img.referrerpolicy": { baseline: "\
high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "html.elements.img.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.img.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.img.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.link.referrerpolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "50", firefox_android: "50", safari: "14", safari_ios: "14" } }, "html.elements.link.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "51", chrome_android: "\
51", edge: "79" } }, "html.elements.link.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.link.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "html.elements.script.referrerpolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "html.elements.script.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "html.elements.script.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "html.elements.script.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "70", chrome_android: "70", edge: "79" } }, "http.headers.Referr\
er-Policy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "50", firefox_android: "50", safari: "11.1", safari_ios: "12" } }, "http.headers.Referrer-Policy.default_strict-origin-when-cross-origin": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "87", firefox_android: "87", safari: "15", safari_ios: "15" } }, "http.headers.Referrer-Policy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79" } }, "http.headers.Referrer-Policy.origin-when-cross-origin": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79" } }, "http.headers.Referrer-Policy.same-origin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "\
52", firefox_android: "52", safari: "11.1", safari_ios: "12" } }, "http.headers.Referrer-Policy.strict-origin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "52", firefox_android: "52", safari: "11.1", safari_ios: "12" } }, "http.headers.Referrer-Policy.strict-origin-when-cross-origin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "52", firefox_android: "52", safari: "11.1", safari_ios: "12" } }, "http.headers.Referrer-Policy.unsafe-url": { baseline: false, support: { chrome: "56", chrome_android: "56", edge: "79" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "87", firefox_android: "87", safari: "15", safari_ios: "15" } } }, regexp: { compat_features: ["javascript.builtins.RegExp", "javascript.builtins.RegExp.@@match", "javascript.builtins.R\
egExp.@@matchAll", "javascript.builtins.RegExp.@@replace", "javascript.builtins.RegExp.@@search", "javascript.builtins.RegExp.@@species", "javascript.builtins.RegExp.@@split", "javascript.builtins.RegExp.RegExp", "javascript.builtins.RegExp.dotAll", "javascript.builtins.RegExp.exec", "javascript.builtins.RegExp.flags", "javascript.builtins.RegExp.global", "javascript.builtins.RegExp.global.prototype_accessor", "javascript.builtins.RegExp.hasIndices", "javascript.builtins.RegExp.ignoreCase", "javascript.builtins.RegExp.ignoreCase.prototype_accessor", "javascript.builtins.RegExp.lastIndex", "javascript.builtins.RegExp.multiline", "javascript.builtins.RegExp.multiline.prototype_accessor", "javascript.builtins.RegExp.source", "javascript.builtins.RegExp.source.empty_regex_string", "javascript.builtins.RegExp.source.escaping", "javascript.builtins.RegExp.source.prototype_accessor", "javascript.builtins.RegExp.sticky", "javascript.builtins.RegExp.sticky.anchored_sticky_flag", "javascript.bui\
ltins.RegExp.sticky.prototype_accessor", "javascript.builtins.RegExp.test", "javascript.builtins.RegExp.toString", "javascript.builtins.RegExp.toString.escaping", "javascript.builtins.RegExp.unicode", "javascript.builtins.RegExp.unicodeSets", "javascript.grammar.regular_expression_literals", "javascript.regular_expressions.backreference", "javascript.regular_expressions.capturing_group", "javascript.regular_expressions.character_class", "javascript.regular_expressions.character_class_escape", "javascript.regular_expressions.character_escape", "javascript.regular_expressions.character_escape.unicode", "javascript.regular_expressions.disjunction", "javascript.regular_expressions.input_boundary_assertion", "javascript.regular_expressions.literal_character", "javascript.regular_expressions.lookahead_assertion", "javascript.regular_expressions.lookbehind_assertion", "javascript.regular_expressions.modifier", "javascript.regular_expressions.named_backreference", "javascript.regular_expressio\
ns.named_capturing_group", "javascript.regular_expressions.named_capturing_group.duplicate_named_capturing_groups", "javascript.regular_expressions.non_capturing_group", "javascript.regular_expressions.quantifier", "javascript.regular_expressions.unicode_character_class_escape", "javascript.regular_expressions.wildcard", "javascript.regular_expressions.word_boundary_assertion"], description: "The RegExp object represents a regular expression, a notation for matching text patterns.", description_html: "The <code>RegExp</code> object represents a regular expression, a notation for matching text patterns.", group: ["regexps"], kind: "feature", name: "Regular expressions", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp-regular-expression-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.RegExp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.@@match": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "50", chrome_android: "50", edge: "13", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.@@matchAll": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "67", firefox_android: "67", safari: "13", safari_ios: "13" } }, "javascript.builtins.RegExp.@@replace": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.@@search": { baseline: "high", baseline_high_date: "20\
19-03-20", baseline_low_date: "2016-09-20", support: { chrome: "50", chrome_android: "50", edge: "13", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.@@species": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "51", chrome_android: "51", edge: "13", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.@@split": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.RegExp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.dotAll": { baseline: "hig\
h", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "78", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "javascript.builtins.RegExp.exec": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.flags": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "37", firefox_android: "37", safari: "9", safari_ios: "9" } }, "javascript.builtins.RegExp.global": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.global.p\
rototype_accessor": { baseline: "high", baseline_high_date: "2018-07-26", baseline_low_date: "2016-01-26", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "38", firefox_android: "38", safari: "1.3", safari_ios: "1" } }, "javascript.builtins.RegExp.hasIndices": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "88", firefox_android: "88", safari: "15", safari_ios: "15" } }, "javascript.builtins.RegExp.ignoreCase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.ignoreCase.prototype_accessor": { baseline: "high", baseline_high_date: "2018-07-26", baseline_low_date: "2016-01-26", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "38", firefox_android: "38",
    safari: "1.3", safari_ios: "1" } }, "javascript.builtins.RegExp.lastIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.multiline": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.multiline.prototype_accessor": { baseline: "high", baseline_high_date: "2018-07-26", baseline_low_date: "2016-01-26", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "38", firefox_android: "38", safari: "1.3", safari_ios: "1" } }, "javascript.builtins.RegExp.source": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.source.empty_regex_string": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "38", firefox_android: "38", safari: "5", safari_ios: "4.2" } }, "javascript.builtins.RegExp.source.escaping": { baseline: "high", baseline_high_date: "2021-09-12", baseline_low_date: "2019-03-12", support: { chrome: "73", chrome_android: "73", edge: "12", firefox: "38", firefox_android: "38", safari: "6", safari_ios: "6" } }, "javascript.builtins.RegExp.source.prototype_accessor": { baseline: "high", baseline_high_date: "2018-07-26", baseline_low_date: "2016-01-26", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "41", firefox_android: "41", safari: "1.3", safari_ios: "1" } }, "javascript.builtins.RegExp.sticky": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "\
2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "13", firefox: "3", firefox_android: "4", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.sticky.anchored_sticky_flag": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "13", firefox: "44", firefox_android: "44", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.sticky.prototype_accessor": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "49", chrome_android: "49", edge: "13", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.test": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.toString": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.toString.escaping": { baseline: "high", baseline_high_date: "2021-09-12", baseline_low_date: "2019-03-12", support: { chrome: "73", chrome_android: "73", edge: "12", firefox: "38", firefox_android: "38", safari: "6", safari_ios: "6" } }, "javascript.builtins.RegExp.unicode": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "46", firefox_android: "46", safari: "10", safari_ios: "10" } }, "javascript.builtins.RegExp.unicodeSets": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "116", firefox_android: "116", safari: "17", safari_ios: "17" } }, "javasc\
ript.grammar.regular_expression_literals": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.backreference": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.capturing_group": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.character_class": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.character_class_escape": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.character_escape": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.character_escape.unicode": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "46", firefox_android: "46", safari: "10", safari_ios: "10" } }, "javascript.regular_expressions.disjunction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.input_boundary_assertion": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.literal_character": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.lookahead_assertion": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.lookbehind_assertion": { baseline: "high", baseline_high_date: "\
2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "78", firefox_android: "79", safari: "16.4", safari_ios: "16.4" } }, "javascript.regular_expressions.modifier": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "132", firefox_android: "132", safari: "26", safari_ios: "26" } }, "javascript.regular_expressions.named_backreference": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "78", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "javascript.regular_expressions.named_capturing_group": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "78", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "javascript.regular_expres\
sions.named_capturing_group.duplicate_named_capturing_groups": { baseline: "low", baseline_low_date: "2024-08-06", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "129", firefox_android: "129", safari: "17", safari_ios: "17" } }, "javascript.regular_expressions.non_capturing_group": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.quantifier": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.unicode_character_class_escape": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "\
78", firefox_android: "79", safari: "11.1", safari_ios: "11.3" } }, "javascript.regular_expressions.wildcard": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.regular_expressions.word_boundary_assertion": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "regexp-compile": { compat_features: ["javascript.builtins.RegExp.compile"], description: "The compile() method of RegExp objects recompiles an existing regular expression object using a new pattern and flags.", description_html: "The <code>compile()</code> method of <\
code>RegExp</code> objects recompiles an existing regular expression object using a new pattern and flags.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-additional-ecmascript-features-for-web-browsers"], reason: "The compile() method duplicates behavior of the RegExp() constructor and it exists only for backwards compatibility.", reason_html: "The <code>compile()</code> method duplicates behavior of the <code>RegExp()</code> constructor and it exists only for backwards compatibility." }, group: ["regexps"], kind: "feature", name: "RegExp compile()", spec: ["https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-regexp.prototype.compile"], status: { baseline: false, by_compat_key: { "javascript.builtins.RegExp.compile": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "regexp-escape": { compat_features: ["javascript.builtins.RegExp.escape"], description: 'The RegExp.escape() static method takes a string and replaces any characters that are potentially special characters of a regular expression with equivalent escape sequences. For example, RegExp.escape("[abc]") returns "\\\\[abc\\\\]".', description_html: 'The <code>RegExp.escape()</code> static method takes a string and replaces any characters that are potentially special characters of a regular expression with equivalent escape sequences. For example, <code>RegExp.escape("[abc]")</code> returns <code>"\\\\[abc\\\\]"</code>.', group: ["regexps"], kind: "feature", name: "RegExp.escape()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp.escape"], status: { baseline: "low", baseline_low_date: "2025-05-01", by_compat_key: { "javascript.builtins.RegExp.e\
scape": { baseline: "low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "134", firefox_android: "134", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "134", firefox_android: "134", safari: "18.2", safari_ios: "18.2" } } }, "regexp-static-properties": { compat_features: ["javascript.builtins.RegExp.input", "javascript.builtins.RegExp.lastMatch", "javascript.builtins.RegExp.lastParen", "javascript.builtins.RegExp.leftContext", "javascript.builtins.RegExp.n", "javascript.builtins.RegExp.rightContext"], description: "The RegExp object has several static properties to access the input and results of the most-recent regular expression match.", description_html: "The <code>RegExp</code> object has several static properties to access the input and results of the most-recent regular expression match.", discouraged: { according_to: ["https://github.com/tc39/proposal-regexp\
-legacy-features"], reason: "The RegExp static properties may have unintended side effects.", reason_html: "The <code>RegExp</code> static properties may have unintended side effects." }, group: ["regexps"], kind: "feature", name: "RegExp static properties", spec: ["https://github.com/tc39/proposal-regexp-legacy-features"], status: { baseline: false, by_compat_key: { "javascript.builtins.RegExp.input": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.RegExp.lastMatch": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.RegExp.lastParen": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.RegExp.leftContext": { baseline: false, support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "javascript.builtins.RegExp.n": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.RegExp.rightContext": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "region-capture": { compat_features: ["api.BrowserCaptureMediaStreamTrack", "api.BrowserCaptureMediaStreamTrack.clone", "api.BrowserCaptureMediaStreamTrack.cropTo", "api.CropTarget", "api.CropTarget.fromElement_static"], description: "When using navigator.mediaDevices.getDisplayMedia() to capture a browser tab as a video stream, the region capture API allows you to crop the video to the b\
ounding box of a given element. In contrast to the element capture API, any content that overlays that element is also captured.", description_html: "When using <code>navigator.mediaDevices.getDisplayMedia()</code> to capture a browser tab as a video stream, the region capture API allows you to crop the video to the bounding box of a given element. In contrast to the element capture API, any content that overlays that element is also captured.", kind: "feature", name: "Region capture", spec: ["https://w3c.github.io/mediacapture-region/"], status: { baseline: false, by_compat_key: { "api.BrowserCaptureMediaStreamTrack": { baseline: false, support: { chrome: "104", edge: "104" } }, "api.BrowserCaptureMediaStreamTrack.clone": { baseline: false, support: { chrome: "104", edge: "104" } }, "api.BrowserCaptureMediaStreamTrack.cropTo": { baseline: false, support: { chrome: "104", edge: "104" } }, "api.CropTarget": { baseline: false, support: { chrome: "104", edge: "104" } }, "api.CropTarget.fr\
omElement_static": { baseline: false, support: { chrome: "104", edge: "104" } } }, support: { chrome: "104", edge: "104" } } }, "registered-custom-properties": { compat_features: ["api.CSS.registerProperty_static", "api.CSSPropertyRule", "api.CSSPropertyRule.inherits", "api.CSSPropertyRule.initialValue", "api.CSSPropertyRule.name", "api.CSSPropertyRule.syntax", "css.at-rules.property", "css.at-rules.property.inherits", "css.at-rules.property.initial-value", "css.at-rules.property.syntax"], description: "The CSS.registerProperty() static method and the @property CSS at-rule register custom properties for which types and behaviors can be defined.", description_html: "The <code>CSS.registerProperty()</code> static method and the <code>@property</code> CSS at-rule register custom properties for which types and behaviors can be defined.", kind: "feature", name: "Registered custom properties", spec: ["https://drafts.css-houdini.org/css-properties-values-api-1/"], status: { baseline: "low", baseline_low_date: "\
2024-07-09", by_compat_key: { "api.CSS.registerProperty_static": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPropertyRule": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPropertyRule.inherits": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPropertyRule.initialValue": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPropertyRule.name": { baseline: "low", baseline_low_date: "2024-07-09", support: {
    chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "api.CSSPropertyRule.syntax": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "css.at-rules.property": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "css.at-rules.property.inherits": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "css.at-rules.property.initial-value": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "\
16.4" } }, "css.at-rules.property.syntax": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } } }, registerprotocolhandler: { compat_features: ["api.Navigator.registerProtocolHandler", "api.Navigator.registerProtocolHandler.scheme_parameter_bitcoin", "api.Navigator.registerProtocolHandler.scheme_parameter_ftp", "api.Navigator.registerProtocolHandler.scheme_parameter_ftps", "api.Navigator.registerProtocolHandler.scheme_parameter_geo", "api.Navigator.registerProtocolHandler.scheme_parameter_im", "api.Navigator.registerProtocolHandler.scheme_parameter_irc", "api.Navigator.registerProtocolHandler.scheme_parameter_ircs", "api.Navigator.registerProtocolHandler.scheme_parameter_magnet", "api.Navigator.registerProtocolHa\
ndler.scheme_parameter_mailto", "api.Navigator.registerProtocolHandler.scheme_parameter_matrix", "api.Navigator.registerProtocolHandler.scheme_parameter_mms", "api.Navigator.registerProtocolHandler.scheme_parameter_news", "api.Navigator.registerProtocolHandler.scheme_parameter_nntp", "api.Navigator.registerProtocolHandler.scheme_parameter_openpgp4fpr", "api.Navigator.registerProtocolHandler.scheme_parameter_sftp", "api.Navigator.registerProtocolHandler.scheme_parameter_sip", "api.Navigator.registerProtocolHandler.scheme_parameter_sms", "api.Navigator.registerProtocolHandler.scheme_parameter_smsto", "api.Navigator.registerProtocolHandler.scheme_parameter_ssh", "api.Navigator.registerProtocolHandler.scheme_parameter_tel", "api.Navigator.registerProtocolHandler.scheme_parameter_urn", "api.Navigator.registerProtocolHandler.scheme_parameter_webcal", "api.Navigator.registerProtocolHandler.scheme_parameter_wtai", "api.Navigator.registerProtocolHandler.scheme_parameter_xmpp", "api.Navigator.re\
gisterProtocolHandler.secure_context_required", "api.Navigator.unregisterProtocolHandler"], description: "The navigator.registerProtocolHandler() method declares a site's ability to handle an address scheme (also known as a protocol). For example, an email site can register to open mailto: URLs or a VoIP site to open tel: URLs.", description_html: "The <code>navigator.registerProtocolHandler()</code> method declares a site's ability to handle an address scheme (also known as a protocol). For example, an email site can register to open <code>mailto:</code> URLs or a VoIP site to open <code>tel:</code> URLs.", kind: "feature", name: "registerProtocolHandler", spec: ["https://html.spec.whatwg.org/multipage/system-state.html#custom-handlers"], status: { baseline: false, by_compat_key: { "api.Navigator.registerProtocolHandler": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_bitcoin": { baseline: false,
    support: { chrome: "28", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_ftp": { baseline: false, support: { firefox: "98", firefox_android: "98" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_ftps": { baseline: false, support: { firefox: "98", firefox_android: "98" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_geo": { baseline: false, support: { chrome: "30", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_im": { baseline: false, support: { chrome: "30", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_irc": { baseline: false, support: { chrome: "15", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_ircs": { baseline: false, support: { chrome: "30", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.reg\
isterProtocolHandler.scheme_parameter_magnet": { baseline: false, support: { chrome: "30", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_mailto": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_matrix": { baseline: false, support: { chrome: "92", edge: "92", firefox: "90", firefox_android: "90" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_mms": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_news": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_nntp": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_o\
penpgp4fpr": { baseline: false, support: { chrome: "42", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_sftp": { baseline: false, support: { firefox: "98", firefox_android: "98" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_sip": { baseline: false, support: { chrome: "30", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_sms": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_smsto": { baseline: false, support: { chrome: "26", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_ssh": { baseline: false, support: { chrome: "41", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_tel": { baseline: false, support: { chrome: "13", edge: "79", firefox: "\
2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_urn": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_webcal": { baseline: false, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_wtai": { baseline: false, support: { chrome: "31", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.scheme_parameter_xmpp": { baseline: false, support: { chrome: "30", edge: "79", firefox: "2", firefox_android: "4" } }, "api.Navigator.registerProtocolHandler.secure_context_required": { baseline: false, support: { chrome: "80", edge: "79", firefox: "62" } }, "api.Navigator.unregisterProtocolHandler": { baseline: false, support: { chrome: "38", edge: "79" } } }, support: { chrome: "13", edge: "79", firefox: "2", firefox_android: "4" } } }, "related-\
apps": { compat_features: ["api.Navigator.getInstalledRelatedApps", "manifests.webapp.prefer_related_applications", "manifests.webapp.related_applications"], description: "The related_applications web app manifest member lists operating system-specific applications that are related to the current web app, such as an Android app that provides similar functionality. The getInstalledRelatedApps() method lists which of those are installed on the current device.", description_html: "The <code>related_applications</code> web app manifest member lists operating system-specific applications that are related to the current web app, such as an Android app that provides similar functionality. The <code>getInstalledRelatedApps()</code> method lists which of those are installed on the current device.", group: ["progressive-web-app"], kind: "feature", name: "Related apps", spec: ["https://wicg.github.io/get-installed-related-apps/spec/"], status: { baseline: false, by_compat_key: { "api.Navigator.ge\
tInstalledRelatedApps": { baseline: false, support: { chrome: "85", chrome_android: "84", edge: "85" } }, "manifests.webapp.prefer_related_applications": { baseline: false, support: { chrome_android: "44", edge: "17" } }, "manifests.webapp.related_applications": { baseline: false, support: { chrome_android: "44", edge: "17" } } }, support: { chrome_android: "84", edge: "85" } } }, "related-website-sets": { compat_features: ["api.Document.requestStorageAccessFor", "api.Permissions.permission_top-level-storage-access"], description: "Related website sets declares relationships between sites so the browser allows cookie and storage access between them through methods such as document.requestStorageAccessFor().", description_html: "Related website sets declares relationships between sites so the browser allows cookie and storage access between them through methods such as <code>document.requestStorageAccessFor()</code>.", discouraged: { according_to: ["https://groups.google.com/a/chromium.\
org/g/blink-dev/c/V-wPXyoruac", "https://chromestatus.com/feature/5162221567082496", "https://chromestatus.com/feature/5194473869017088"], reason: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the related website sets.", reason_html: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the related website sets.", removal_date: "2026-06-01" }, kind: "feature", name: "Related website sets", spec: ["https://wicg.github.io/first-party-sets/", "https://privacycg.github.io/requestStorageAccessFor/"], status: { baseline: false, by_compat_key: { "api.Document.requestStorageAccessFor": { baseline: false, support: { chrome: "119", chrome_android: "119", edge: "119" } }, "api.Permissions.permission_top-level-storage-access": { baseline: false, support: { chrome: "\
113", chrome_android: "120", edge: "113" } } }, support: { chrome: "119", chrome_android: "120", edge: "119" } } }, "relative-color": { caniuse: ["css-relative-colors"], compat_features: ["css.types.calc.color_component", "css.types.color.color.relative_syntax", "css.types.color.hsl.relative_syntax", "css.types.color.hwb.relative_syntax", "css.types.color.lab.relative_syntax", "css.types.color.lch.relative_syntax", "css.types.color.oklab.relative_syntax", "css.types.color.oklch.relative_syntax", "css.types.color.rgb.relative_syntax"], description: "The from keyword for color functions (color(), hsl(), oklch(), etc.) creates a new color based on a given color by modifying the values of the input color. Also known as relative color syntax (RCS).", description_html: "The <code>from</code> keyword for color functions (<code>color()</code>, <code>hsl()</code>, <code>oklch()</code>, etc.) creates a new color based on a given color by modifying the values of the input color. Also known as rel\
ative color syntax (RCS).", group: ["css"], kind: "feature", name: "Relative colors", spec: ["https://drafts.csswg.org/css-color-5/#relative-colors"], status: { baseline: "low", baseline_low_date: "2024-09-16", by_compat_key: { "css.types.calc.color_component": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "css.types.color.color.relative_syntax": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "css.types.color.hsl.relative_syntax": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "css.types.color.hwb.relative_syntax": { baseline: "low", baseline_low_date: "2024-0\
9-16", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "css.types.color.lab.relative_syntax": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "css.types.color.lch.relative_syntax": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "css.types.color.oklab.relative_syntax": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "css.types.color.oklch.relative_syntax": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "\
128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "css.types.color.rgb.relative_syntax": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } } }, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } } }, "relative-positioning": { compat_features: ["css.properties.position.relative"], description: "The position: relative CSS declaration offsets the position of an element relative to its position in the normal flow.", description_html: "The <code>position: relative</code> CSS declaration offsets the position of an element relative to its position in the normal flow.", group: ["positioning"], kind: "feature", name: "Relative positioning", spec: ["https://drafts.csswg.org/css-position-3/#relpos-insets"], status: { baseline: "high", baseline_high_date: "2018-01-\
29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.position.relative": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, rem: { caniuse: ["rem"], compat_features: ["css.types.length.rem"], description: "The rem CSS length unit is a font-relative length that is equal to the font size of the root HTML element which for most browsers is 16px.", description_html: "The <code>rem</code> CSS length unit is a font-relative length that is equal to the font size of the root HTML element which for most browsers is <code>16px</code>.", group: ["units"], kind: "feature", name: "rem", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.length.rem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5", safari_ios: "4" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5", safari_ios: "4" } } }, "remote-playback": { compat_features: ["api.HTMLMediaElement.disableRemotePlayback", "api.HTMLMediaElement.remote", "api.RemotePlayback", "api.RemotePlayback.cancelWatchAvailability", "api.RemotePlayback.connect_event", "api.RemotePlayback.connecting_event", "api.RemotePlayback.disconnect_event", "api.RemotePlayback.prompt", "api.RemotePlayback.state", "api.RemotePlayback.watchAvailability", "html.elements.audio.disableremoteplayback", "html.elements.video.disableremoteplayback"], description: "The Remote Playback API initiates and controls playback of med\
ia on connected remote devices, such as smart TVs with AirPlay or Chromecast capabilities.", description_html: "The Remote Playback API initiates and controls playback of media on connected remote devices, such as smart TVs with AirPlay or Chromecast capabilities.", kind: "feature", name: "Remote playback", spec: ["https://w3c.github.io/remote-playback/"], status: { baseline: false, by_compat_key: { "api.HTMLMediaElement.disableRemotePlayback": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13" } }, "api.HTMLMediaElement.remote": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback.cancelWatchAvailability": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1",
    safari_ios: "13.4" } }, "api.RemotePlayback.connect_event": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback.connecting_event": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback.disconnect_event": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback.prompt": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback.state": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "api.RemotePlayback.watchAvailability": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } }, "html.elements.audio.disableremoteplaybac\
k": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13" } }, "html.elements.video.disableremoteplayback": { baseline: false, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13" } } }, support: { chrome: "121", chrome_android: "56", edge: "121", safari: "13.1", safari_ios: "13.4" } } }, reporting: { compat_features: ["api.ReportingObserver", "api.ReportingObserver.ReportingObserver", "api.ReportingObserver.ReportingObserver.options_parameter", "api.ReportingObserver.ReportingObserver.options_parameter.types_property", "api.ReportingObserver.ReportingObserver.options_parameter.types_property.coep", "api.ReportingObserver.ReportingObserver.options_parameter.types_property.csp-violation", "api.ReportingObserver.ReportingObserver.options_parameter.types_property.deprecation", "api.ReportingObserver.ReportingObserver.options_parameter.types_property.integrity-violation", "api.ReportingObser\
ver.ReportingObserver.options_parameter.types_property.intervention", "api.ReportingObserver.disconnect", "api.ReportingObserver.observe", "api.ReportingObserver.takeRecords", "api.ReportingObserver.worker_support", "http.headers.Reporting-Endpoints"], description: "The Reporting-Endpoints HTTP header and ReportingObserver() API send reports of Content Security Policy (CSP) violations, Permissions-Policy violations, deprecated feature usage, browser interventions, and crashes to a nominated URL or callback function.", description_html: "The <code>Reporting-Endpoints</code> HTTP header and <code>ReportingObserver()</code> API send reports of Content Security Policy (CSP) violations, Permissions-Policy violations, deprecated feature usage, browser interventions, and crashes to a nominated URL or callback function.", kind: "feature", name: "Reporting API", spec: ["https://w3c.github.io/reporting/", "https://wicg.github.io/intervention-reporting/", "https://wicg.github.io/deprecation-repor\
ting/", "https://w3c.github.io/webappsec-csp/#reporting"], status: { baseline: "low", baseline_low_date: "2026-03-24", by_compat_key: { "api.ReportingObserver": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.ReportingObserver": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.ReportingObserver.options_parameter": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.ReportingObserver.options_parameter.types_property": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "\
69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.ReportingObserver.options_parameter.types_property.coep": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.ReportingObserver.ReportingObserver.options_parameter.types_property.csp-violation": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "149", firefox_android: "149", safari: "18.4", safari_ios: "18.4" } }, "api.ReportingObserver.ReportingObserver.options_parameter.types_property.deprecation": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.ReportingObserver.ReportingObserver.options_parameter.types_property.integrity-violation": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138", firefox: "149", firefox_android: "149" } }, "api.ReportingObserver.ReportingObserver.options_parameter.types_pro\
perty.intervention": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79" } }, "api.ReportingObserver.disconnect": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.observe": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.takeRecords": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } }, "api.ReportingObserver.worker_support": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "149", firefox_android: "149" } }, "http.headers.Reporting-Endpoints": { baseline: "low", baseline_low_date: "\
2024-09-03", support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "149", firefox_android: "149", safari: "16.4", safari_ios: "16.4" } } }, "request-animation-frame": { caniuse: ["requestanimationframe"], compat_features: ["api.Window.cancelAnimationFrame", "api.Window.requestAnimationFrame"], description: "The requestAnimationFrame() method schedules a function that runs before the next repaint. You can use it to animate content with JavaScript.", description_html: "The <code>requestAnimationFrame()</code> method schedules a function that runs before the next repaint. You can use it to animate content with JavaScript.", kind: "feature", name: "requestAnimationFrame()", spec: ["https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", by_compat_key: { "api.Window.cancelAnimationFrame": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "api.Window.requestAnimationFrame": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } } }, support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } } }, "request-animation-frame-workers": { compat_features: ["api.DedicatedWorkerGlobalScope.cancelAnimationFrame", "api.DedicatedWorkerGlobalScope.requestAnimationFrame"], description: "The requestAnimationFrame() method in workers schedules a function that runs before the next repaint. Together with offscreen canvas, you can anima\
te content from a worker.", description_html: "The <code>requestAnimationFrame()</code> method in workers schedules a function that runs before the next repaint. Together with offscreen canvas, you can animate content from a worker.", group: ["workers"], kind: "feature", name: "requestAnimationFrame() in workers", spec: ["https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.DedicatedWorkerGlobalScope.cancelAnimationFrame": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "99", safari: "16.4", safari_ios: "16.4" } }, "api.DedicatedWorkerGlobalScope.requestAnimationFrame": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "69", chrome_android: "69", edge: "\
79", firefox: "99", firefox_android: "99", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "99", safari: "16.4", safari_ios: "16.4" } } }, "request-video-frame-callback": { compat_features: ["api.HTMLVideoElement.cancelVideoFrameCallback", "api.HTMLVideoElement.requestVideoFrameCallback"], description: "The requestVideoFrameCallback() method for <video> schedules a function that runs with the next video frame. It is similar to requestAnimationFrame(), but for video.", description_html: "The <code>requestVideoFrameCallback()</code> method for <code>&#x3C;video></code> schedules a function that runs with the next video frame. It is similar to <code>requestAnimationFrame()</code>, but for video.", group: ["media-elements"], kind: "feature", name: "requestVideoFrameCallback()", spec: ["https://wicg.github.io/video-rvfc/"], status: { baseline: "low", baseline_low_date: "2024-10-29", by_compat_key: { "api.HT\
MLVideoElement.cancelVideoFrameCallback": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "132", firefox_android: "132", safari: "15.4", safari_ios: "15.4" } }, "api.HTMLVideoElement.requestVideoFrameCallback": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "132", firefox_android: "132", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "132", firefox_android: "132", safari: "15.4", safari_ios: "15.4" } } }, requestclose: { compat_features: ["api.HTMLDialogElement.requestClose"], description: "The requestClose() method of a <dialog> HTML element closes the dialog, firing a cancel event first, which listeners can use to prevent the dialog from closing. This differs from the close() method, which only fires the non-cancelable close event.", description_html: "The <code>requestClose()</c\
ode> method of a <code>&#x3C;dialog></code> HTML element closes the dialog, firing a <code>cancel</code> event first, which listeners can use to prevent the dialog from closing. This differs from the <code>close()</code> method, which only fires the non-cancelable <code>close</code> event.", group: ["html-elements"], kind: "feature", name: "dialog.requestClose()", spec: ["https://html.spec.whatwg.org/multipage/interactive-elements.html#dom-dialog-requestclose"], status: { baseline: "low", baseline_low_date: "2025-05-27", by_compat_key: { "api.HTMLDialogElement.requestClose": { baseline: "low", baseline_low_date: "2025-05-27", support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "139", firefox_android: "139", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "134", chrome_android: "134", edge: "134", firefox: "139", firefox_android: "139", safari: "18.4", safari_ios: "18.4" } } }, requestidlecallback: { caniuse: ["requestidlecallback"], compat_features: ["ap\
i.IdleDeadline", "api.IdleDeadline.didTimeout", "api.IdleDeadline.timeRemaining", "api.Window.cancelIdleCallback", "api.Window.requestIdleCallback"], description: "The requestIdleCallback() API queues a function that runs in idle browser time, either at the end of a frame or when the user is inactive. Also known as the background tasks API.", description_html: "The <code>requestIdleCallback()</code> API queues a function that runs in idle browser time, either at the end of a frame or when the user is inactive. Also known as the background tasks API.", kind: "feature", name: "requestIdleCallback()", spec: ["https://w3c.github.io/requestidlecallback/"], status: { baseline: false, by_compat_key: { "api.IdleDeadline": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55" } }, "api.IdleDeadline.didTimeout": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55" } }, "api.\
IdleDeadline.timeRemaining": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55" } }, "api.Window.cancelIdleCallback": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55" } }, "api.Window.requestIdleCallback": { baseline: false, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55" } } }, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "55", firefox_android: "55" } } }, "resizable-buffers": { compat_features: ["javascript.builtins.ArrayBuffer.ArrayBuffer.maxByteLength_option", "javascript.builtins.ArrayBuffer.maxByteLength", "javascript.builtins.ArrayBuffer.resizable", "javascript.builtins.ArrayBuffer.resize", "javascript.builtins.SharedArrayBuffer.SharedArrayBuffer.maxByteLength_option", "javascript.builtins.SharedArrayBuffer.grow", "javascript.builtins.SharedArrayBuffer.growable", "javascript.builti\
ns.SharedArrayBuffer.maxByteLength"], description: "The resize() method of an ArrayBuffer and the grow() method of a SharedArrayBuffer, constructed with the maxByteLength option, changes the size of the buffer in place.", description_html: "The <code>resize()</code> method of an <code>ArrayBuffer</code> and the <code>grow()</code> method of a <code>SharedArrayBuffer</code>, constructed with the <code>maxByteLength</code> option, changes the size of the buffer in place.", group: ["javascript"], kind: "feature", name: "Resizable buffers", spec: ["https://tc39.es/ecma262/multipage/structured-data.html#sec-get-arraybuffer.prototype.resizable", "https://tc39.es/ecma262/multipage/structured-data.html#sec-get-sharedarraybuffer.prototype.growable"], status: { baseline: "low", baseline_low_date: "2024-07-09", by_compat_key: { "javascript.builtins.ArrayBuffer.ArrayBuffer.maxByteLength_option": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "\
111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.ArrayBuffer.maxByteLength": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.ArrayBuffer.resizable": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.ArrayBuffer.resize": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.SharedArrayBuffer.SharedArrayBuffer.maxByteLength_option": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "\
128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.SharedArrayBuffer.grow": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.SharedArrayBuffer.growable": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.SharedArrayBuffer.maxByteLength": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "128", firefox_android: "128", safari: "16.4", safari_ios: "16.4" } } }, resize: { caniuse: ["css-resize"], compat_features: [
    "css.properties.resize", "css.properties.resize.block", "css.properties.resize.block_level_support", "css.properties.resize.inline"], description: "The resize CSS property sets whether an element can be resized by the user, and on which axes.", description_html: "The <code>resize</code> CSS property sets whether an element can be resized by the user, and on which axes.", group: ["css"], kind: "feature", name: "resize (CSS property)", spec: ["https://drafts.csswg.org/css-ui-4/#resize"], status: { baseline: false, by_compat_key: { "css.properties.resize": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "4", safari: "3" } }, "css.properties.resize.block": { baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "63", safari: "16" } }, "css.properties.resize.block_level_support": { baseline: false, support: { chrome: "4", chrome_android: "18", edge: "79", firefox: "5", safari: "4" } }, "css.properties.resize.inline": {
    baseline: false, support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "63", safari: "16" } } }, support: { chrome: "4", chrome_android: "18", edge: "79", firefox: "5", safari: "4" } } }, "resize-observer": { caniuse: ["resizeobserver"], compat_features: ["api.ResizeObserver", "api.ResizeObserver.ResizeObserver", "api.ResizeObserver.disconnect", "api.ResizeObserver.observe", "api.ResizeObserver.observe.options_box_parameter", "api.ResizeObserver.unobserve", "api.ResizeObserverEntry", "api.ResizeObserverEntry.borderBoxSize", "api.ResizeObserverEntry.contentBoxSize", "api.ResizeObserverEntry.contentRect", "api.ResizeObserverEntry.devicePixelContentBoxSize", "api.ResizeObserverEntry.target", "api.ResizeObserverSize", "api.ResizeObserverSize.blockSize", "api.ResizeObserverSize.inlineSize"], description: "The ResizeObserver API observes and reacts to changes in the size of DOM elements.", description_html: "The <code>ResizeObserver</code> API observes and reacts to chan\
ges in the size of DOM elements.", kind: "feature", name: "Resize observer", spec: ["https://drafts.csswg.org/resize-observer-1/"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "api.ResizeObserver": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserver.ResizeObserver": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserver.disconnect": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.\
4" } }, "api.ResizeObserver.observe": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserver.observe.options_box_parameter": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "api.ResizeObserver.unobserve": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserverEntry": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "\
79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserverEntry.borderBoxSize": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "92", firefox_android: "92", safari: "15.4", safari_ios: "15.4" } }, "api.ResizeObserverEntry.contentBoxSize": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "92", firefox_android: "92", safari: "15.4", safari_ios: "15.4" } }, "api.ResizeObserverEntry.contentRect": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserverEntry.devicePixelContentBoxSize": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "93", firefox_android: "\
93" } }, "api.ResizeObserverEntry.target": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.ResizeObserverSize": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "api.ResizeObserverSize.blockSize": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "69", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "api.ResizeObserverSize.inlineSize": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "69", firefox_android: "79", safari: "\
15.4", safari_ios: "15.4" } } }, support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, resolution: { caniuse: ["css-media-resolution"], compat_features: ["css.at-rules.media.resolution", "css.types.resolution", "css.types.resolution.dpcm", "css.types.resolution.dpi", "css.types.resolution.dppx", "css.types.resolution.x"], description: "The resolution CSS media query sets styles based on the pixel density, or how many pixels a device uses to display a single CSS pixel.", description_html: "The <code>resolution</code> CSS media query sets styles based on the pixel density, or how many pixels a device uses to display a single CSS pixel.", group: ["media-queries"], kind: "feature", name: "resolution media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#resolution"], status: { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: { "css.at-rules.media.r\
esolution": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "8", firefox_android: "8", safari: "16", safari_ios: "16" } }, "css.types.resolution": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "8", firefox_android: "8", safari: "16", safari_ios: "16" } }, "css.types.resolution.dpcm": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "8", firefox_android: "8", safari: "16", safari_ios: "16" } }, "css.types.resolution.dpi": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "8", firefox_android: "8", safari: "16", safari_ios: "16" } }, "css.types.resolution.dppx": { baseline: "\
high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "16", firefox_android: "16", safari: "16", safari_ios: "16" } }, "css.types.resolution.x": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "62", firefox_android: "62", safari: "16", safari_ios: "16" } } }, support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "62", firefox_android: "62", safari: "16", safari_ios: "16" } } }, "resolution-compat": { compat_features: ["css.at-rules.media.-webkit-device-pixel-ratio", "css.at-rules.media.-webkit-max-device-pixel-ratio", "css.at-rules.media.-webkit-min-device-pixel-ratio"], description: "The -webkit-device-pixel-ratio, -webkit-min-device-pixel-ratio, and -webkit-max-device-pixel-ratio CSS media queries are standardized compatibility alternatives to resolution media queries.", description_html: "\
The <code>-webkit-device-pixel-ratio</code>, <code>-webkit-min-device-pixel-ratio</code>, and <code>-webkit-max-device-pixel-ratio</code> CSS media queries are standardized compatibility alternatives to <code>resolution</code> media queries.", group: ["media-queries"], kind: "feature", name: "resolution media query (compatibility prefixes)", spec: ["https://compat.spec.whatwg.org/#css-media-queries-webkit-device-pixel-ratio"], status: { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", by_compat_key: { "css.at-rules.media.-webkit-device-pixel-ratio": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "63", firefox_android: "63", safari: "3", safari_ios: "1" } }, "css.at-rules.media.-webkit-max-device-pixel-ratio": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "63", firefox_android: "63", safari: "3", safari_ios: "1" } }, "css.at-rules.media.-webkit-min-device-pixel-ratio": { baseline: "high", baseline_high_date: "2021-04-23", baseline_low_date: "2018-10-23", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "63", firefox_android: "63", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "63", firefox_android: "63", safari: "3", safari_ios: "1" } } }, "resource-size": { compat_features: ["api.PerformanceResourceTiming.decodedBodySize", "api.PerformanceResourceTiming.encodedBodySize", "api.PerformanceResourceTiming.transferSize"], description: "The decodedBodySize, encodedBodySize, and transferSize properties of the PerformanceResourceTiming API reports the size of resources loaded.", description_html: "The <code>decodedBodySize</code>, <code>encodedBodySize</code>, and <code>transferSize</code> properties of the <code>PerformanceResourceTiming</code> API report\
s the size of resources loaded.", group: ["performance"], kind: "feature", name: "Resource size", spec: ["https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-decodedbodysize", "https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-encodedbodysize", "https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.PerformanceResourceTiming.decodedBodySize": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "45", firefox_android: "45", safari: "16.4", safari_ios: "16.4" } }, "api.PerformanceResourceTiming.encodedBodySize": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "45", firefox_android: "45", safari: "16.4",
    safari_ios: "16.4" } }, "api.PerformanceResourceTiming.transferSize": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "45", firefox_android: "45", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "54", chrome_android: "54", edge: "17", firefox: "45", firefox_android: "45", safari: "16.4", safari_ios: "16.4" } } }, "resource-timing": { caniuse: ["resource-timing"], compat_features: ["api.Performance.clearResourceTimings", "api.Performance.resourcetimingbufferfull_event", "api.Performance.setResourceTimingBufferSize", "api.PerformanceResourceTiming", "api.PerformanceResourceTiming.connectEnd", "api.PerformanceResourceTiming.connectStart", "api.PerformanceResourceTiming.contentType", "api.PerformanceResourceTiming.deliveryType", "api.PerformanceResourceTiming.domainLookupEnd", "api.PerformanceResourceTiming.domainLookupStart", "api.PerformanceResourceTiming.fetchStart",
    "api.PerformanceResourceTiming.firstInterimResponseStart", "api.PerformanceResourceTiming.initiatorType", "api.PerformanceResourceTiming.nextHopProtocol", "api.PerformanceResourceTiming.redirectEnd", "api.PerformanceResourceTiming.redirectStart", "api.PerformanceResourceTiming.renderBlockingStatus", "api.PerformanceResourceTiming.requestStart", "api.PerformanceResourceTiming.responseEnd", "api.PerformanceResourceTiming.responseStart", "api.PerformanceResourceTiming.responseStatus", "api.PerformanceResourceTiming.secureConnectionStart", "api.PerformanceResourceTiming.toJSON", "api.PerformanceResourceTiming.workerStart", "api.PerformanceResourceTiming.worker_support"], description: "PerformanceResourceTiming entries report when network events happen while loading a resource, such as when connections start and end. You can use this information to measure loading times.", description_html: "<code>PerformanceResourceTiming</code> entries report when network events happen while loading a\
 resource, such as when connections start and end. You can use this information to measure loading times.", group: ["performance"], kind: "feature", name: "Resource timing", spec: ["https://w3c.github.io/resource-timing/"], status: { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", by_compat_key: { "api.Performance.clearResourceTimings": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.Performance.resourcetimingbufferfull_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.Performance.setResourceTimingBufferSize": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: {
    chrome: "46", chrome_android: "46", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.connectEnd": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.connectStart": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.contentType": { baseline: false, support: { firefox: "129", firefox_android: "\
129" } }, "api.PerformanceResourceTiming.deliveryType": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "26.4", safari_ios: "26.4" } }, "api.PerformanceResourceTiming.domainLookupEnd": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.domainLookupStart": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.fetchStart": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceRes\
ourceTiming.firstInterimResponseStart": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26.4", safari_ios: "26.4" } }, "api.PerformanceResourceTiming.initiatorType": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.nextHopProtocol": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "61", chrome_android: "61", edge: "17", firefox: "45", firefox_android: "45", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.redirectEnd": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.redirec\
tStart": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.renderBlockingStatus": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107" } }, "api.PerformanceResourceTiming.requestStart": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.responseEnd": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.responseStart": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "\
2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.responseStatus": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "129", firefox_android: "129" } }, "api.PerformanceResourceTiming.secureConnectionStart": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "43", chrome_android: "43", edge: "18", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.toJSON": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "45", chrome_android: "45", edge: "16", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.workerStart": { baseline: "high", baseline_high_date: "2020-07-23", baseline_low_date: "2018-01-23", support: { chrome: "\
46", chrome_android: "46", edge: "16", firefox: "58", firefox_android: "58", safari: "11", safari_ios: "11" } }, "api.PerformanceResourceTiming.worker_support": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "15", firefox: "60", firefox_android: "60", safari: "12" } } }, support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "35", firefox_android: "35", safari: "11", safari_ios: "11" } } }, "revert-value": { caniuse: ["css-revert-value"], compat_features: ["css.types.global_keywords.revert"], description: "The revert CSS keyword resets any property to its previous default, provided by either the user or browser stylesheets. For example, setting display: revert on a <div> will likely result in display: block, the browser default style. This is often confused with initial.", description_html: "The <code>revert</code> CSS keyword resets any property to its previous default, provided by either the user or browser stylesheets. For example, setting <code\
>display: revert</code> on a <code>&#x3C;div></code> will likely result in <code>display: block</code>, the browser default style. This is often confused with <code>initial</code>.", group: ["explicit-defaults"], kind: "feature", name: "revert", spec: ["https://drafts.csswg.org/css-cascade-4/#default"], status: { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", by_compat_key: { "css.types.global_keywords.revert": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "67", firefox_android: "67", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "67", firefox_android: "67", safari: "9.1", safari_ios: "9.3" } } }, rex: { compat_features: ["css.types.length.rex"], description: "The rex CSS length unit is a font-relative length that is equal to the x-height of the root element.", description_html: "\
The <code>rex</code> CSS length unit is a font-relative length that is equal to the x-height of the root element.", group: ["units"], kind: "feature", name: "rex unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: { "css.types.length.rex": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, rgb: { compat_features: ["css.types.color.rgb", "css.types.color.rgb.alpha_parameter", "css.types.color.rgb.float_values", "css.types.color.rgb.mixed_type_parameters", "css.types.color.rgb.space_separated_parameters", "css.types.color.rgb_hexadecimal_notation", "css.types.color.rgb_hexadecimal_notation.alpha_hexadeci\
mal_notation"], description: "The rgb(), rgba(), and hexadecimal (as in #004488ff) notations pick colors using red, green, blue, and alpha (transparency) channels.", description_html: "The <code>rgb()</code>, <code>rgba()</code>, and hexadecimal (as in <code>#004488ff</code>) notations pick colors using red, green, blue, and alpha (transparency) channels.", group: ["color-types"], kind: "feature", name: "RGB", spec: ["https://drafts.csswg.org/css-color-4/#rgb-functions"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.types.color.rgb": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.color.rgb.alpha_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "\
79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } }, "css.types.color.rgb.float_values": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } }, "css.types.color.rgb.mixed_type_parameters": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "113", firefox_android: "113", safari: "18", safari_ios: "18" } }, "css.types.color.rgb.space_separated_parameters": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } }, "css.types.color.rgb_hexadecimal_notation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.color.rgb_hexadecimal_notation.alpha_hexadecimal_notation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "9.3" } } }, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "52", firefox_android: "52", safari: "12.1", safari_ios: "12.2" } } }, "rhythmic-sizing": { description: "The line-height-step CSS property creates consistent vertical rhythm by setting the spacing between body text baselines. It rounds taller lines like headings up to the next multiple of the body text spacing.", description_html: "The <code>line-height-step</code> CSS property creates consistent vertical rhythm by setting the spacing between body text baselines. It rounds taller lines like headings up to the next multiple \
of the body text spacing.", group: ["text"], kind: "feature", name: "Rhythmic sizing", spec: ["https://drafts.csswg.org/css-rhythm-1/"], status: { baseline: false, support: {} } }, ric: { compat_features: ["css.types.length.ric"], description: "The ric CSS length unit, or root international character, is a font-relative length equal to the width of CJK character relative to the root element.", description_html: "The <code>ric</code> CSS length unit, or root international character, is a font-relative length equal to the width of CJK character relative to the root element.", group: ["units"], kind: "feature", name: "ric unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "low", baseline_low_date: "2026-01-13", by_compat_key: { "css.types.length.ric": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } },
    support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "147", firefox_android: "147", safari: "17.2", safari_ios: "17.2" } } }, rlh: { compat_features: ["css.types.length.rlh"], description: "The rlh CSS length unit is a font-relative length relative to the line height of root element.", description_html: "The <code>rlh</code> CSS length unit is a font-relative length relative to the line height of root element.", group: ["units"], kind: "feature", name: "rlh unit", spec: ["https://drafts.csswg.org/css-values-4/#font-relative-lengths"], status: { baseline: "low", baseline_low_date: "2023-11-21", by_compat_key: { "css.types.length.rlh": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } } },
    root: { compat_features: ["css.selectors.root"], description: "The :root pseudo-class matches the root element of the document, usually the <html> element.", description_html: "The <code>:root</code> pseudo-class matches the root element of the document, usually the <code>&#x3C;html></code> element.", group: ["selectors"], kind: "feature", name: ":root", spec: ["https://drafts.csswg.org/selectors-4/#the-root-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.root": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "round-mod-rem": { compat_features: ["css.types.mod", "css.types.mod.mixed_type_parameters", "\
css.types.rem", "css.types.rem.mixed_type_parameters", "css.types.round", "css.types.round.mixed_type_parameters"], description: "The round(), mod(), and rem() CSS functions compute rounded values and the remainder after division.", description_html: "The <code>round()</code>, <code>mod()</code>, and <code>rem()</code> CSS functions compute rounded values and the remainder after division.", group: ["css"], kind: "feature", name: "round(), mod(), and rem()", spec: ["https://drafts.csswg.org/css-values-4/#round-func"], status: { baseline: "low", baseline_low_date: "2024-05-17", by_compat_key: { "css.types.mod": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.mod.mixed_type_parameters": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "118", firefox_android: "11\
8", safari: "17.2", safari_ios: "17.2" } }, "css.types.rem": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.rem.mixed_type_parameters": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "118", firefox_android: "118", safari: "17.2", safari_ios: "17.2" } }, "css.types.round": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "118", firefox_android: "118", safari: "15.4", safari_ios: "15.4" } }, "css.types.round.mixed_type_parameters": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "118", firefox_android: "118", safari: "17.2", safari_ios: "17.2" } } }, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "\
118", firefox_android: "118", safari: "17.2", safari_ios: "17.2" } } }, ruby: { caniuse: ["ruby"], compat_features: ["html.elements.rp", "html.elements.rt", "html.elements.ruby"], description: "The <ruby> element produces small annotations that are rendered with its base text.", description_html: "The <code>&#x3C;ruby></code> element produces small annotations that are rendered with its base text.", group: ["html", "ruby"], kind: "feature", name: "<ruby>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-rp-element", "https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-rt-element", "https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-ruby-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.rp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "\
38", firefox_android: "38", safari: "5", safari_ios: "4.2" } }, "html.elements.rt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "38", firefox_android: "38", safari: "5", safari_ios: "4.2" } }, "html.elements.ruby": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "38", firefox_android: "38", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "38", firefox_android: "38", safari: "5", safari_ios: "4.2" } } }, "ruby-align": { compat_features: ["css.properties.ruby-align", "css.properties.ruby-align.center", "css.properties.ruby-align.space-around", "css.properties.ruby-align.space-between", "css.properties.ruby-align.start"], description: "The ruby-align CSS property sets the spacing and alignment of ruby annotation text whe\
n it does not fill its available space.", description_html: "The <code>ruby-align</code> CSS property sets the spacing and alignment of ruby annotation text when it does not fill its available space.", group: ["ruby"], kind: "feature", name: "ruby-align", spec: ["https://drafts.csswg.org/css-ruby-1/#ruby-align-property"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "css.properties.ruby-align": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-align.center": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-align.space-around": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "128", chrome_android: "128", edge: "\
128", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-align.space-between": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-align.start": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "128", chrome_android: "128", edge: "128", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } } }, "ruby-overhang": { compat_features: ["css.properties.ruby-overhang", "css.properties.ruby-overhang.auto", "css.properties.ruby-overhang.none"], description: "The ruby-overhang CSS property sets whether ruby annotations may overlap adjacent text.", description_html: "The <code>ruby-overhang</code> CSS property\
 sets whether ruby annotations may overlap adjacent text.", group: ["ruby"], kind: "feature", name: "ruby-overhang", spec: ["https://drafts.csswg.org/css-ruby-1/#ruby-overhang"], status: { baseline: false, by_compat_key: { "css.properties.ruby-overhang": { baseline: false, support: { safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-overhang.auto": { baseline: false, support: { safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-overhang.none": { baseline: false, support: { safari: "18.2", safari_ios: "18.2" } } }, support: { safari: "18.2", safari_ios: "18.2" } } }, "ruby-position": { compat_features: ["css.properties.ruby-position", "css.properties.ruby-position.inter-character", "css.properties.ruby-position.over", "css.properties.ruby-position.under"], description: "The ruby-position CSS property sets the position of a ruby annotation in relation to its base text. Annotations can display over, under, or interleaved with the base text.", description_html: "The <c\
ode>ruby-position</code> CSS property sets the position of a ruby annotation in relation to its base text. Annotations can display over, under, or interleaved with the base text.", group: ["ruby"], kind: "feature", name: "ruby-position", spec: ["https://drafts.csswg.org/css-ruby-1/#rubypos"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "css.properties.ruby-position": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-position.inter-character": { baseline: false, support: { safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-position.over": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } }, "css.properties.ruby-position.under": { baseline: "low", baseline_low_date: "\
2024-12-11", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "38", firefox_android: "38", safari: "18.2", safari_ios: "18.2" } } }, s: { compat_features: ["html.elements.s"], description: "The <s> HTML element indicates text that is no longer relevant or accurate, styling text as strikethrough by default.", description_html: "The <code>&#x3C;s></code> HTML element indicates text that is no longer relevant or accurate, styling text as strikethrough by default.", group: ["html-elements"], kind: "feature", name: "<s>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-s-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.s": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "safe-area-inset": { caniuse: ["css-env-function"], compat_features: ["css.types.env", "css.types.env.safe-area-inset-bottom", "css.types.env.safe-area-inset-left", "css.types.env.safe-area-inset-right", "css.types.env.safe-area-inset-top"], description: "The safe-area-inset- CSS environment variables represent a rectangle that cannot cut off content within a non-rectangular screen. For example, top:\\ env(safe-area-inset-top); positions the top of an element below the notch on an iPhone.", description_html: "The <code>safe-area-inset-</code> CSS environment variables represent a rectangle that cannot cut off content within a non-rectangular screen. For example, <code>top:\\ env(safe-area-inset-top);</code> positions the top of an elem\
ent below the notch on an iPhone.", group: ["environment-variables"], kind: "feature", name: "Safe area inset environment variables", spec: ["https://drafts.csswg.org/css-env-1/#safe-area-insets"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.types.env": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } }, "css.types.env.safe-area-inset-bottom": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } }, "css.types.env.safe-area-inset-left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "\
65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } }, "css.types.env.safe-area-inset-right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } }, "css.types.env.safe-area-inset-top": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } } }, samp: { compat_features: ["html.elements.samp"], description: "The <samp> element represents a sample or quoted output from a computer program. Styled in a monospace font by default.", description_html: "The <code>&#x3C;samp></code> element represents a sample or quo\
ted output from a computer program. Styled in a monospace font by default.", group: ["html-elements"], kind: "feature", name: "<samp>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-samp-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.samp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, sanitizer: { compat_features: ["api.Document.parseHTML_static", "api.Element.setHTML", "api.Sanitizer", "api.Sanitizer.Sanitizer", "api.Sanitizer.allowAttribute", "api.Sanitizer.allowElement", "api.Sanitizer.get", "api.Sanitizer.removeAttribute", "api.Sanitizer.removeElemen\
t", "api.Sanitizer.removeUnsafe", "api.Sanitizer.replaceElementWithChildren", "api.Sanitizer.setComments", "api.Sanitizer.setDataAttributes", "api.ShadowRoot.setHTML"], description: "The Document.parseHTML() static method and the setHTML() method of Element and ShadowRoot objects parse and insert HTML into the DOM in a way that can prevent cross-site scripting attacks. The Sanitizer API can customize the sanitization process.", description_html: "The <code>Document.parseHTML()</code> static method and the <code>setHTML()</code> method of <code>Element</code> and <code>ShadowRoot</code> objects parse and insert HTML into the DOM in a way that can prevent cross-site scripting attacks. The <code>Sanitizer</code> API can customize the sanitization process.", kind: "feature", name: "Sanitizer API", spec: ["https://wicg.github.io/sanitizer-api/"], status: { baseline: false, by_compat_key: { "api.Document.parseHTML_static": { baseline: false, support: { firefox: "148", firefox_android: "148" } },
    "api.Element.setHTML": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.Sanitizer": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.allowAttribute": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.allowElement": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.get": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.removeAttribute": { baseline: false, support: { chrome: "146", chrome_android: "1\
46", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.removeElement": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.removeUnsafe": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.replaceElementWithChildren": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.setComments": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.Sanitizer.setDataAttributes": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "148", firefox_android: "148" } }, "api.ShadowRoot.setHTML": { baseline: false, support: { firefox: "148", firefox_android: "148" } } }, support: { firefox: "148", firefox_android: "\
148" } } }, savedata: { compat_features: ["api.NetworkInformation.saveData", "http.headers.Save-Data"], description: "Browsers send the Save-Data HTTP request header when the user turns on a data-saving mode. It is a hint to reduce data sent to the browser. Servers should respond with alternative content, such as smaller images and videos, or different markup and styling.", description_html: "Browsers send the <code>Save-Data</code> HTTP request header when the user turns on a data-saving mode. It is a hint to reduce data sent to the browser. Servers should respond with alternative content, such as smaller images and videos, or different markup and styling.", kind: "feature", name: "Save-Data", spec: ["https://wicg.github.io/savedata/"], status: { baseline: false, by_compat_key: { "api.NetworkInformation.saveData": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79" } }, "http.headers.Save-Data": { baseline: false, support: { chrome: "49", chrome_android: "49",
    edge: "79" } } }, support: { chrome: "65", chrome_android: "65", edge: "79" } } }, scheduler: { compat_features: ["api.Scheduler", "api.Scheduler.postTask", "api.Scheduler.yield", "api.TaskController", "api.TaskController.TaskController", "api.TaskController.setPriority", "api.TaskPriorityChangeEvent", "api.TaskPriorityChangeEvent.TaskPriorityChangeEvent", "api.TaskPriorityChangeEvent.previousPriority", "api.TaskSignal", "api.TaskSignal.any_static", "api.TaskSignal.priority", "api.TaskSignal.prioritychange_event", "api.scheduler"], description: "The scheduler API provides a way to prioritize all tasks belonging to an application.", description_html: "The <code>scheduler</code> API provides a way to prioritize all tasks belonging to an application.", kind: "feature", name: "Scheduler API", spec: ["https://wicg.github.io/scheduling-apis/"], status: { baseline: false, by_compat_key: { "api.Scheduler": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "\
142", firefox_android: "142" } }, "api.Scheduler.postTask": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.Scheduler.yield": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "142", firefox_android: "142" } }, "api.TaskController": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskController.TaskController": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskController.setPriority": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskPriorityChangeEvent": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskPriorityChangeEvent.TaskPriorityChangeEvent": { baseline: false,
    support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskPriorityChangeEvent.previousPriority": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskSignal": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskSignal.any_static": { baseline: false, support: { chrome: "116", chrome_android: "116", edge: "116", firefox: "142", firefox_android: "142" } }, "api.TaskSignal.priority": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.TaskSignal.prioritychange_event": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "142" } }, "api.scheduler": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "142", firefox_android: "\
142" } } }, support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "142", firefox_android: "142" } } }, scope: { caniuse: ["css-cascade-scope"], compat_features: ["api.CSSScopeRule", "api.CSSScopeRule.end", "api.CSSScopeRule.start", "css.at-rules.scope", "css.selectors.nesting.at-scope"], description: "The @scope CSS at-rule sets the scope for a group of rules.", description_html: "The <code>@scope</code> CSS at-rule sets the scope for a group of rules.", group: ["css"], kind: "feature", name: "@scope", spec: ["https://drafts.csswg.org/css-cascade-6/#scope-atrule"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "api.CSSScopeRule": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "146", firefox_android: "146", safari: "17.4", safari_ios: "17.4" } }, "api.CSSScopeRule.end": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "118", chrome_android: "1\
18", edge: "118", firefox: "146", firefox_android: "146", safari: "17.4", safari_ios: "17.4" } }, "api.CSSScopeRule.start": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "146", firefox_android: "146", safari: "17.4", safari_ios: "17.4" } }, "css.at-rules.scope": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "146", firefox_android: "146", safari: "17.4", safari_ios: "17.4" } }, "css.selectors.nesting.at-scope": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "142", firefox_android: "142", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "143", chrome_android: "143", edge: "143", firefox: "146", firefox_android: "146", safari: "26.2", safari_ios: "26.2" } } }, "scope-pseudo": { compat_features: ["css.selectors.scope", "css.selectors.scope.dom_api"], description: "\
The :scope CSS pseudo-class matches the scoping root, for instance the element that querySelector() is called on, or the root of a DOM subtree specified with @scope.", description_html: "The <code>:scope</code> CSS pseudo-class matches the scoping root, for instance the element that <code>querySelector()</code> is called on, or the root of a DOM subtree specified with <code>@scope</code>.", group: ["selectors"], kind: "feature", name: ":scope (pseudo-class)", spec: ["https://drafts.csswg.org/selectors-4/#the-scope-pseudo"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.selectors.scope": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "32", firefox_android: "32", safari: "7", safari_ios: "7" } }, "css.selectors.scope.dom_api": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "32", firefox_android: "32", safari: "7", safari_ios: "7" } } }, support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "32", firefox_android: "32", safari: "7", safari_ios: "7" } } }, "scoped-custom-element-registries": { compat_features: ["api.CustomElementRegistry.CustomElementRegistry", "api.CustomElementRegistry.initialize", "api.Document.customElementRegistry", "api.Element.customElementRegistry", "api.HTMLTemplateElement.shadowRootCustomElementRegistry", "api.ShadowRoot.customElementRegistry"], description: "The CustomElementRegistry() constructor creates a new custom element registry that's separate from the global window.customElements registry. Creating more than one registry is useful for multiple custom elements that have the same tag name to coexist.", description_html: "The <code>CustomElementRegistry()</code> constructor creates a new custom element registry that's separate from the glob\
al <code>window.customElements</code> registry. Creating more than one registry is useful for multiple custom elements that have the same tag name to coexist.", group: ["custom-elements"], kind: "feature", name: "Scoped custom element registries", spec: ["https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-api", "https://dom.spec.whatwg.org/#element-custom-element-registry"], status: { baseline: false, by_compat_key: { "api.CustomElementRegistry.CustomElementRegistry": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } }, "api.CustomElementRegistry.initialize": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } }, "api.Document.customElementRegistry": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } }, "api.Element.customElementRegistry": { baseline: false, support: { chrome: "\
146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } }, "api.HTMLTemplateElement.shadowRootCustomElementRegistry": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } }, "api.ShadowRoot.customElementRegistry": { baseline: false, support: { chrome: "146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } } }, support: { chrome: "146", chrome_android: "146", edge: "146", safari: "26", safari_ios: "26" } } }, screen: { compat_features: ["api.Screen", "api.Screen.availHeight", "api.Screen.availWidth", "api.Screen.colorDepth", "api.Screen.height", "api.Screen.pixelDepth", "api.Screen.width"], description: "The window.screen property contains information about the screen of the output device that the referenced window is being rendered on.", description_html: "The <code>window.screen</code> property contains information about the screen of the output device that the referenced <code>window<\
/code> is being rendered on.", kind: "feature", name: "Screen", spec: ["https://drafts.csswg.org/cssom-view-1/#screen"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Screen": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Screen.availHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Screen.availWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Screen.colorDepth": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Screen.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Screen.pixelDepth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Screen.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } } }, "screen-capture": { compat_features: ["api.CaptureController", "api.CaptureController.CaptureController", "api.CaptureController.setFocusBehavior", "api.MediaDevices.getDisplayMedia", "api.MediaDevices.getDisplayMedia.audio_capture_support", "api.MediaDevices.getDisplayMedia.controller_option", "api.MediaDevices.getDisplayMedia.monitorTypeSurfaces_option", "api.MediaDevices.getDisplayMedia.selfBrowserSurface_option", "api.MediaDevices.getDisplayMedia.surfaceSwitching_option", "api.MediaDevices.getDisplayMedia.systemAudio_option", "api.MediaStreamTrack.applyConstraints.displaySurface_constraint", "api.MediaStreamTrack.applyConstraints.logicalSurface_constraint", "api.MediaStreamTrack.applyConstraints.suppressLocalAudioPlayback_constraint", "html.elements.iframe.allow.display-capture", "http.headers.Permissions-Policy.display-capture"], description: "The navigator.mediaDevices.getDisplayMedia() method asks the user to choose a screen or portion of a screen (such as a window) to\
 capture as a media stream.", description_html: "The <code>navigator.mediaDevices.getDisplayMedia()</code> method asks the user to choose a screen or portion of a screen (such as a window) to capture as a media stream.", kind: "feature", name: "Screen capture", spec: ["https://w3c.github.io/mediacapture-screen-share/"], status: { baseline: false, by_compat_key: { "api.CaptureController": { baseline: false, support: { chrome: "109", edge: "109" } }, "api.CaptureController.CaptureController": { baseline: false, support: { chrome: "109", edge: "109" } }, "api.CaptureController.setFocusBehavior": { baseline: false, support: { chrome: "109", edge: "109" } }, "api.MediaDevices.getDisplayMedia": { baseline: false, support: { chrome: "72", edge: "79", firefox: "33", safari: "13" } }, "api.MediaDevices.getDisplayMedia.audio_capture_support": { baseline: false, support: { chrome: "74", edge: "79" } }, "api.MediaDevices.getDisplayMedia.controller_option": { baseline: false, support: { chrome: "10\
9", edge: "109" } }, "api.MediaDevices.getDisplayMedia.monitorTypeSurfaces_option": { baseline: false, support: { chrome: "119", edge: "119" } }, "api.MediaDevices.getDisplayMedia.selfBrowserSurface_option": { baseline: false, support: { chrome: "112", edge: "112" } }, "api.MediaDevices.getDisplayMedia.surfaceSwitching_option": { baseline: false, support: { chrome: "107", edge: "107" } }, "api.MediaDevices.getDisplayMedia.systemAudio_option": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.MediaStreamTrack.applyConstraints.displaySurface_constraint": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107", safari: "11.1", safari_ios: "11.3" } }, "api.MediaStreamTrack.applyConstraints.logicalSurface_constraint": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "api.MediaStreamTrack.applyConstraints.suppressLocalAudioPlayback_constraint": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109" } }, "h\
tml.elements.iframe.allow.display-capture": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "74", safari: "13" } }, "http.headers.Permissions-Policy.display-capture": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } } }, support: { chrome: "72", edge: "79", firefox: "33", safari: "13" } } }, "screen-orientation": { caniuse: ["screen-orientation"], compat_features: ["api.Screen.orientation", "api.ScreenOrientation", "api.ScreenOrientation.angle", "api.ScreenOrientation.change_event", "api.ScreenOrientation.type"], description: "The screen.orientation API gets information about the orientation of the viewport, such as landscape or portrait. With this API, you can adapt an application's layout or behavior in response to changes in orientation.", description_html: "The <code>screen.orientation</code> API gets information about the orientation of the viewport, such as landscape or portrait. With this API, you can adapt an \
application's layout or behavior in response to changes in orientation.", kind: "feature", name: "Screen orientation", spec: ["https://w3c.github.io/screen-orientation/"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.Screen.orientation": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "38", chrome_android: "39", edge: "79", firefox: "43", firefox_android: "43", safari: "16.4", safari_ios: "16.4" } }, "api.ScreenOrientation": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "43", firefox_android: "43", safari: "16.4", safari_ios: "16.4" } }, "api.ScreenOrientation.angle": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "43", firefox_android: "43", safari: "\
16.4", safari_ios: "16.4" } }, "api.ScreenOrientation.change_event": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "43", firefox_android: "43", safari: "16.4", safari_ios: "16.4" } }, "api.ScreenOrientation.type": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "43", firefox_android: "43", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "38", chrome_android: "39", edge: "79", firefox: "43", firefox_android: "43", safari: "16.4", safari_ios: "16.4" } } }, "screen-orientation-lock": { compat_features: ["api.ScreenOrientation.lock", "api.ScreenOrientation.unlock"], description: "The screen.orientation.lock() method prevents changes to the screen orientation, typically in fullscreen applications such as games. For example, while locked, rotating a phone to the side\
 won't change the screen orientation from landscape to portrait.", description_html: "The <code>screen.orientation.lock()</code> method prevents changes to the screen orientation, typically in fullscreen applications such as games. For example, while locked, rotating a phone to the side won't change the screen orientation from landscape to portrait.", kind: "feature", name: "Screen orientation lock", spec: ["https://w3c.github.io/screen-orientation/#lock-method"], status: { baseline: false, by_compat_key: { "api.ScreenOrientation.lock": { baseline: false, support: { chrome_android: "38", firefox: "144", firefox_android: "144" } }, "api.ScreenOrientation.unlock": { baseline: false, support: { chrome_android: "38", firefox: "144", firefox_android: "144" } } }, support: { chrome_android: "38", firefox: "144", firefox_android: "144" } } }, "screen-wake-lock": { caniuse: ["wake-lock"], compat_features: ["api.Navigator.wakeLock", "api.Permissions.permission_screen-wake-lock", "api.WakeLock",
    "api.WakeLock.request", "api.WakeLockSentinel", "api.WakeLockSentinel.release", "api.WakeLockSentinel.release_event", "api.WakeLockSentinel.released", "api.WakeLockSentinel.type", "html.elements.iframe.allow.screen-wake-lock", "http.headers.Permissions-Policy.screen-wake-lock"], description: `The navigator.wakeLock.request("screen") API prevents the device's screen from dimming or being turned off.`, description_html: `The <code>navigator.wakeLock.request("screen")</code> API prevents the device's screen from dimming or being turned off.`, kind: "feature", name: "Screen wake lock", spec: ["https://w3c.github.io/screen-wake-lock/"], status: { baseline: "low", baseline_low_date: "2025-03-31", by_compat_key: { "api.Navigator.wakeLock": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "api.Permissions.permission_screen-wake-lock": { baseline: "lo\
w", baseline_low_date: "2024-05-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "16.4" } }, "api.WakeLock": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "api.WakeLock.request": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "api.WakeLockSentinel": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "api.WakeLockSentinel.release": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "\
16.4", safari_ios: "18.4" } }, "api.WakeLockSentinel.release_event": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "api.WakeLockSentinel.released": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "api.WakeLockSentinel.type": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } }, "html.elements.iframe.allow.screen-wake-lock": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Permissions-Policy.screen-wake-lock": { baseline: false,
    support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "126", firefox_android: "126", safari: "16.4", safari_ios: "18.4" } } }, script: { compat_features: ["api.HTMLScriptElement", "api.HTMLScriptElement.async", "api.HTMLScriptElement.crossOrigin", "api.HTMLScriptElement.defer", "api.HTMLScriptElement.src", "api.HTMLScriptElement.supports_static", "api.HTMLScriptElement.text", "api.HTMLScriptElement.type", "html.elements.noscript", "html.elements.script", "html.elements.script.async", "html.elements.script.crossorigin", "html.elements.script.defer", "html.elements.script.src", "html.elements.script.type"], description: "The <script> element contains or loads data or executable code. This is typically used to load JavaScript code. The <noscript> element represents alternative content to show when scripting is not allowed.", description_html: "The <code>&#x3C;script></code> element contains or loads data or\
 executable code. This is typically used to load JavaScript code. The <code>&#x3C;noscript></code> element represents alternative content to show when scripting is not allowed.", group: ["html-elements"], kind: "feature", name: "<script> and <noscript>", spec: ["https://html.spec.whatwg.org/multipage/scripting.html#script"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLScriptElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLScriptElement.async": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLScriptElement.crossOrigin": { baseline: "high", baseline_high_date: "\
2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "19", chrome_android: "25", edge: "14", firefox: "14", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.HTMLScriptElement.defer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLScriptElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLScriptElement.supports_static": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "94", firefox_android: "94", safari: "16", safari_ios: "16" } }, "api.HTMLScriptElement.text": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLScriptElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.noscript": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.script": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.script.async": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.script.crossorigin": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "19", chrome_android: "25", edge: "14", firefox: "14", firefox_android: "14", safari: "6", safari_ios: "6" } }, "html.elements.script.defer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.script.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.script.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, scripting: { compat_features: ["css.at-rules.media.scripting"], description: "The scripting CSS media query sets styles based on whether scripting such as JavaScript is available. Values are enabled if scripting is available, initial-only if scripting is only available on page load (for example, printed content), or none.", description_html: "The <code>scripting</code> CSS media query sets styles based on whether scripting such as JavaScript is available. Values are <code>enabled</code> if scripting is available, <code>initial-only</code> if scripting is only available on page load (for example, printed content), or <code>none</code>.", group: ["media-queries"], kind: "feature", name: "scripting media query", spec: [
    "https://drafts.csswg.org/mediaqueries-5/#scripting"], status: { baseline: "low", baseline_low_date: "2023-12-07", by_compat_key: { "css.at-rules.media.scripting": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "113", firefox_android: "113", safari: "17", safari_ios: "17" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "113", firefox_android: "113", safari: "17", safari_ios: "17" } } }, "scroll-behavior": { caniuse: ["css-scroll-behavior"], compat_features: ["css.properties.scroll-behavior", "css.properties.scroll-behavior.auto", "css.properties.scroll-behavior.smooth"], description: "The scroll-behavior CSS property controls whether scrolling is smooth or snaps, for scroll actions not performed by the user such as those triggered by navigation.", description_html: "The <code>scroll-behavior</code> CSS property controls whether scrolling is smooth or snaps, for scroll actions n\
ot performed by the user such as those triggered by navigation.", group: ["scrolling"], kind: "feature", name: "scroll-behavior", spec: ["https://drafts.csswg.org/css-overflow-3/#smooth-scrolling"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.scroll-behavior": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "15.4", safari_ios: "15.4" } }, "css.properties.scroll-behavior.auto": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "15.4", safari_ios: "15.4" } }, "css.properties.scroll-behavior.smooth": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "61", chrome_android: "\
61", edge: "79", firefox: "36", firefox_android: "36", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "15.4", safari_ios: "15.4" } } }, "scroll-buttons": { compat_features: ["css.selectors.scroll-button", "css.selectors.scroll-button.block-end", "css.selectors.scroll-button.block-start", "css.selectors.scroll-button.down", "css.selectors.scroll-button.inline-end", "css.selectors.scroll-button.inline-start", "css.selectors.scroll-button.left", "css.selectors.scroll-button.next", "css.selectors.scroll-button.prev", "css.selectors.scroll-button.right", "css.selectors.scroll-button.star", "css.selectors.scroll-button.up"], description: "The ::scroll-button(<dir>) CSS pseudo-element is a focusable button which scrolls its originating scroll container element in the specified direction.", description_html: "The <code>::scroll-button(&#x3C;dir>)</code> CSS pseudo-element is a focusable button w\
hich scrolls its originating scroll container element in the specified direction.", group: ["scrolling"], kind: "feature", name: "::scroll-button", spec: ["https://drafts.csswg.org/css-overflow-5/#scroll-buttons"], status: { baseline: false, by_compat_key: { "css.selectors.scroll-button": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.block-end": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.block-start": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.down": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.inline-end": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.inline-start": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } },
    "css.selectors.scroll-button.left": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.next": { baseline: false, support: {} }, "css.selectors.scroll-button.prev": { baseline: false, support: {} }, "css.selectors.scroll-button.right": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.star": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-button.up": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: {} } }, "scroll-driven-animations": { compat_features: ["api.ScrollTimeline", "api.ScrollTimeline.ScrollTimeline", "api.ScrollTimeline.axis", "api.ScrollTimeline.source", "api.ViewTimeline", "api.ViewTimeline.ViewTimeline", "api.ViewTimeline.endOffset", "api.ViewTimeline.startOffset", "api.ViewTimeline.subject", "css.properties.animation-range", "css.propertie\
s.animation-range-end", "css.properties.animation-range-end.normal", "css.properties.animation-range-start", "css.properties.animation-range-start.normal", "css.properties.animation-timeline", "css.properties.animation-timeline.scroll", "css.properties.animation-timeline.view", "css.properties.animation.animation-timeline_included", "css.properties.scroll-timeline", "css.properties.scroll-timeline-axis", "css.properties.scroll-timeline-axis.block", "css.properties.scroll-timeline-axis.inline", "css.properties.scroll-timeline-axis.x", "css.properties.scroll-timeline-axis.y", "css.properties.scroll-timeline-name", "css.properties.timeline-scope", "css.properties.timeline-scope.all", "css.properties.timeline-scope.none", "css.properties.view-timeline", "css.properties.view-timeline-axis", "css.properties.view-timeline-axis.block", "css.properties.view-timeline-axis.inline", "css.properties.view-timeline-axis.x", "css.properties.view-timeline-axis.y", "css.properties.view-timeline-inset", "\
css.properties.view-timeline-inset.auto", "css.properties.view-timeline-name"], description: "The animation-timeline, scroll-timeline, and view-timeline CSS properties advance animations based on the user's scroll position.", description_html: "The <code>animation-timeline</code>, <code>scroll-timeline</code>, and <code>view-timeline</code> CSS properties advance animations based on the user's scroll position.", group: ["scrolling", "animation"], kind: "feature", name: "Scroll-driven animations", spec: ["https://drafts.csswg.org/scroll-animations-1/"], status: { baseline: false, by_compat_key: { "api.ScrollTimeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ScrollTimeline.ScrollTimeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ScrollTimeline.axis": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "11\
5", safari: "26", safari_ios: "26" } }, "api.ScrollTimeline.source": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ViewTimeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ViewTimeline.ViewTimeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ViewTimeline.endOffset": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ViewTimeline.startOffset": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.ViewTimeline.subject": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.animation-range": { baseline: "low", baseline_low_date: "2026-04-21", support: {
    chrome: "115", chrome_android: "115", edge: "115", firefox: "150", firefox_android: "150", safari: "26", safari_ios: "26" } }, "css.properties.animation-range-end": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "150", firefox_android: "150", safari: "26", safari_ios: "26" } }, "css.properties.animation-range-end.normal": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "150", firefox_android: "150", safari: "26", safari_ios: "26" } }, "css.properties.animation-range-start": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "150", firefox_android: "150", safari: "26", safari_ios: "26" } }, "css.properties.animation-range-start.normal": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "150",
    firefox_android: "150", safari: "26", safari_ios: "26" } }, "css.properties.animation-timeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.animation-timeline.scroll": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.animation-timeline.view": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.animation.animation-timeline_included": { baseline: false, support: {} }, "css.properties.scroll-timeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.scroll-timeline-axis": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.scroll-timeline-axis.block": { baseline: false, support: {
    chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.scroll-timeline-axis.inline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.scroll-timeline-axis.x": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.scroll-timeline-axis.y": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.scroll-timeline-name": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.timeline-scope": { baseline: false, support: { chrome: "116", chrome_android: "116", edge: "116", safari: "26", safari_ios: "26" } }, "css.properties.timeline-scope.all": { baseline: false, support: { safari: "26", safari_ios: "26" } }, "css.properties.timel\
ine-scope.none": { baseline: false, support: { chrome: "116", chrome_android: "116", edge: "116", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-axis": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-axis.block": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-axis.inline": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-axis.x": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-axis.y": { baseline: false, support: { chrome: "115", chrome_android: "\
115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-inset": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-inset.auto": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "css.properties.view-timeline-name": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } } }, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } } }, "scroll-elements": { caniuse: ["element-scroll-methods"], compat_features: ["api.Document.scroll_event", "api.Document.scrollingElement", "api.Element.scroll", "api.Element.scroll.options_behavior_parameter", "api.Element.scroll.options_left_parameter", "api.Element.scroll.options_top_parameter", "api.Element.scrollBy", "api.Element.scrollBy.options_behavior_parameter", "\
api.Element.scrollBy.options_left_parameter", "api.Element.scrollBy.options_top_parameter", "api.Element.scrollHeight", "api.Element.scrollLeft", "api.Element.scrollTo", "api.Element.scrollTo.options_behavior_parameter", "api.Element.scrollTo.options_left_parameter", "api.Element.scrollTo.options_top_parameter", "api.Element.scrollTop", "api.Element.scrollWidth", "api.Element.scroll_event", "api.Window.scroll", "api.Window.scroll.options_behavior_parameter", "api.Window.scroll.options_left_parameter", "api.Window.scroll.options_top_parameter", "api.Window.scrollBy", "api.Window.scrollBy.options_behavior_parameter", "api.Window.scrollBy.options_left_parameter", "api.Window.scrollBy.options_top_parameter", "api.Window.scrollTo", "api.Window.scrollTo.options_behavior_parameter", "api.Window.scrollTo.options_left_parameter", "api.Window.scrollTo.options_top_parameter", "api.Window.scrollX", "api.Window.scrollX.subpixel_precision", "api.Window.scrollY", "api.Window.scrollY.subpixel_precisio\
n"], description: "The scroll() and scrollBy() methods change the scroll position of overflow content within an element. Similar to setting scrollTop and scrollLeft properties, but with options setting whether the scroll should animate smoothly or jump. Note that scrollTo() is an alias for scroll().", description_html: "The <code>scroll()</code> and <code>scrollBy()</code> methods change the scroll position of overflow content within an element. Similar to setting <code>scrollTop</code> and <code>scrollLeft</code> properties, but with options setting whether the scroll should animate smoothly or jump. Note that <code>scrollTo()</code> is an alias for <code>scroll()</code>.", kind: "feature", name: "Scroll methods on elements", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-element-scroll"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "api.Document.scroll_event": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "2", safari_ios: "1" } }, "api.Document.scrollingElement": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "api.Element.scroll": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scroll.options_behavior_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Element.scroll.options_left_parameter": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scroll.options_top_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollBy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollBy.options_behavior_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Element.scrollBy.options_\
left_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollBy.options_top_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "21", firefox_android: "21", safari: "1", safari_ios: "1" } }, "api.Element.scrollLeft": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "ap\
i.Element.scrollTo": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollTo.options_behavior_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Element.scrollTo.options_left_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollTo.options_top_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "\
36", safari: "10.1", safari_ios: "10.3" } }, "api.Element.scrollTop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.scrollWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Element.scroll_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1.3", safari_ios: "1" } }, "api.Window.scroll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "api.Window.scroll.options_behavior_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Window.scroll.options_left_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Window.scroll.options_top_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Window.scrollBy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "api.Window.scrollBy.options_behavior_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Window.scrollBy.options_left_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Window.scrollBy.options_top_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Window.scrollTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.scrollTo.options_behavior_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Window.scrollTo.options_left_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Window.scrollTo.options_top_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.Window.scrollX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-2\
9", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.scrollX.subpixel_precision": { baseline: false, support: { chrome: "40", chrome_android: "40", edge: "≤18", firefox: "55", firefox_android: "55" } }, "api.Window.scrollY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.scrollY.subpixel_precision": { baseline: false, support: { chrome: "40", chrome_android: "40", edge: "≤18", firefox: "55", firefox_android: "55" } } }, support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } } }, "scroll-initial-target": { compat_features: ["css.properties.scroll-initial-target", "css.properties.scroll-initial-target.nearest", "css.properties.scroll-initial-ta\
rget.none"], description: "The scroll-initial-target: nearest CSS declaration sets the initial scroll position of its scroll container to the top of the element, much like scrolling to a URL fragment.", description_html: "The <code>scroll-initial-target: nearest</code> CSS declaration sets the initial scroll position of its scroll container to the top of the element, much like scrolling to a URL fragment.", kind: "feature", name: "scroll-initial-target", spec: ["https://drafts.csswg.org/css-scroll-snap-2/#properties-on-the-scroll-container"], status: { baseline: false, by_compat_key: { "css.properties.scroll-initial-target": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.properties.scroll-initial-target.nearest": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } }, "css.properties.scroll-initial-target.none": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133" } } }, support: { chrome: "\
133", chrome_android: "133", edge: "133" } } }, "scroll-into-view": { caniuse: ["scrollintoview"], compat_features: ["api.Element.scrollIntoView", "api.Element.scrollIntoView.options_parameter", "api.Element.scrollIntoView.options_parameter.block_option", "api.Element.scrollIntoView.options_parameter.inline_option"], description: "The scrollIntoView() method scrolls an element's ancestor containers such that the element is visible to the user.", description_html: "The <code>scrollIntoView()</code> method scrolls an element's ancestor containers such that the element is visible to the user.", group: ["scrolling"], kind: "feature", name: "scrollIntoView()", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-element-scrollintoview"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Element.scrollIntoView": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "\
18", edge: "79", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Element.scrollIntoView.options_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "36", firefox_android: "36", safari: "14", safari_ios: "14" } }, "api.Element.scrollIntoView.options_parameter.block_option": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "58", firefox_android: "58", safari: "14", safari_ios: "14" } }, "api.Element.scrollIntoView.options_parameter.inline_option": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "58", firefox_android: "58", safari: "14", safari_ios: "14" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "1" } } }, "scroll-into-view-container": { compat_features: ["api.Element.scrollIntoView.options_parameter.container_option"], description: 'The container option of the scrollIntoView() method sets which ancestor scroll container to scroll. The "nearest" value scrolls only the nearest ancestor, instead of the default "all".', description_html: 'The <code>container</code> option of the <code>scrollIntoView()</code> method sets which ancestor scroll container to scroll. The <code>"nearest"</code> value scrolls only the nearest ancestor, instead of the default <code>"all"</code>.', group: ["scrolling"], kind: "feature", name: "scrollIntoView() container", spec: ["https://drafts.csswg.org/cssom-view-1/#dom-scrollintoviewoptions-container"], status: { baseline: false, by_compat_key: { "api.Element.scrollIntoView.options_parameter.container_option": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140" } } }, support: { chrome: "140", chrome_android: "\
140", edge: "140" } } }, "scroll-marker-targets": { compat_features: ["css.selectors.target-after", "css.selectors.target-before", "css.selectors.target-current"], description: "The :target-current CSS pseudo-class selects the active scroll marker (as in ::scroll-marker), while the :target-after and :target-before pseudo-classes select the inactive markers preceding and following the active scroll marker.", description_html: "The <code>:target-current</code> CSS pseudo-class selects the active scroll marker (as in <code>::scroll-marker</code>), while the <code>:target-after</code> and <code>:target-before</code> pseudo-classes select the inactive markers preceding and following the active scroll marker.", group: ["scroll-markers"], kind: "feature", name: "Scroll marker target pseudo-classes", spec: ["https://drafts.csswg.org/css-overflow-5/#active-before-after-scroll-markers"], status: { baseline: false, by_compat_key: { "css.selectors.target-after": { baseline: false, support: { chrome: "\
142", chrome_android: "142", edge: "142" } }, "css.selectors.target-before": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "css.selectors.target-current": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "142", chrome_android: "142", edge: "142" } } }, "scroll-markers": { compat_features: ["css.properties.scroll-marker-group", "css.properties.scroll-marker-group.after", "css.properties.scroll-marker-group.before", "css.properties.scroll-marker-group.none", "css.selectors.scroll-marker", "css.selectors.scroll-marker-group"], description: "A scroll marker scrolls a container to a scroll target. The ::scroll-marker CSS pseudo-element selects a scroll marker in a ::scroll-marker-group pseudo-element, generated before or after the scroll container. You can use them to navigate and style tables of contents, tab panels, and carousels.", description_html: "A scroll marker scrolls a container to a sc\
roll target. The <code>::scroll-marker</code> CSS pseudo-element selects a scroll marker in a <code>::scroll-marker-group</code> pseudo-element, generated before or after the scroll container. You can use them to navigate and style tables of contents, tab panels, and carousels.", group: ["scroll-markers"], kind: "feature", name: "Scroll markers", spec: ["https://drafts.csswg.org/css-overflow-5/#scroll-markers"], status: { baseline: false, by_compat_key: { "css.properties.scroll-marker-group": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.properties.scroll-marker-group.after": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.properties.scroll-marker-group.before": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.properties.scroll-marker-group.none": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-marker": {
    baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } }, "css.selectors.scroll-marker-group": { baseline: false, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, support: { chrome: "135", chrome_android: "135", edge: "135" } } }, "scroll-snap": { caniuse: ["css-snappoints"], compat_features: ["css.properties.scroll-margin", "css.properties.scroll-margin-block", "css.properties.scroll-margin-block-end", "css.properties.scroll-margin-block-start", "css.properties.scroll-margin-bottom", "css.properties.scroll-margin-inline", "css.properties.scroll-margin-inline-end", "css.properties.scroll-margin-inline-start", "css.properties.scroll-margin-left", "css.properties.scroll-margin-right", "css.properties.scroll-margin-top", "css.properties.scroll-padding", "css.properties.scroll-padding-block", "css.properties.scroll-padding-block-end", "css.properties.scroll-padding-block-end.auto", "css.properties.scroll-padding-block-start", "css.properties.\
scroll-padding-block-start.auto", "css.properties.scroll-padding-block.auto", "css.properties.scroll-padding-bottom", "css.properties.scroll-padding-inline", "css.properties.scroll-padding-inline-end", "css.properties.scroll-padding-inline-end.auto", "css.properties.scroll-padding-inline-start", "css.properties.scroll-padding-inline-start.auto", "css.properties.scroll-padding-inline.auto", "css.properties.scroll-padding-left", "css.properties.scroll-padding-right", "css.properties.scroll-padding-top", "css.properties.scroll-padding.auto", "css.properties.scroll-snap-align", "css.properties.scroll-snap-align.center", "css.properties.scroll-snap-align.end", "css.properties.scroll-snap-align.none", "css.properties.scroll-snap-align.start", "css.properties.scroll-snap-stop", "css.properties.scroll-snap-stop.always", "css.properties.scroll-snap-stop.normal", "css.properties.scroll-snap-type", "css.properties.scroll-snap-type.block", "css.properties.scroll-snap-type.both", "css.properties.sc\
roll-snap-type.inline", "css.properties.scroll-snap-type.none", "css.properties.scroll-snap-type.x", "css.properties.scroll-snap-type.y"], description: "CSS scroll snap controls the panning and scrolling behavior within a scroll container.", description_html: "CSS scroll snap controls the panning and scrolling behavior within a scroll container.", group: ["scrolling"], kind: "feature", name: "Scroll snap", spec: ["https://drafts.csswg.org/css-scroll-snap-2/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.scroll-margin": { baseline: "high", baseline_high_date: "2024-01-13", baseline_low_date: "2021-07-13", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "90", firefox_android: "90", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-margin-block": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "\
69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-margin-block-end": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-margin-block-start": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-margin-bottom": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-margin-inline": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09\
-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-margin-inline-end": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-margin-inline-start": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-margin-left": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-margin-right": { baseline: "high", baseline_high_date: "\
2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-margin-top": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-padding": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-padding-block": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-block-end": {
    baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-block-end.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-block-start": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-block-start.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15",
    safari_ios: "15" } }, "css.properties.scroll-padding-block.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-bottom": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-padding-inline": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-inline-end": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "7\
9", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-inline-end.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-inline-start": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-inline-start.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-inline.auto": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "\
2021-09-20", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15" } }, "css.properties.scroll-padding-left": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-padding-right": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-padding-top": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-padding.auto": { baseline: "high", baseline_high_date: "\
2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "14.1", safari_ios: "14.5" } }, "css.properties.scroll-snap-align": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-align.center": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-align.end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-align.none": {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-align.start": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-stop": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "103", firefox_android: "103", safari: "15", safari_ios: "15" } }, "css.properties.scroll-snap-stop.always": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "103", firefox_android: "103", safari: "15", safari_ios: "15" } },
    "css.properties.scroll-snap-stop.normal": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "103", firefox_android: "103", safari: "15", safari_ios: "15" } }, "css.properties.scroll-snap-type": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "39", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-type.block": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-type.both": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "\
68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-type.inline": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-type.none": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "39", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-type.x": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "99", firefox_android: "68", safari: "11", safari_ios: "11" } }, "css.properties.scroll-snap-type.y": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "69", chrome_android: "69", edge: "79",
    firefox: "99", firefox_android: "68", safari: "11", safari_ios: "11" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } } }, "scroll-snap-events": { compat_features: ["api.Document.scrollsnapchange_event", "api.Document.scrollsnapchanging_event", "api.Element.scrollsnapchange_event", "api.Element.scrollsnapchanging_event", "api.SnapEvent", "api.SnapEvent.SnapEvent", "api.SnapEvent.snapTargetBlock", "api.SnapEvent.snapTargetInline", "api.Window.scrollsnapchange_event", "api.Window.scrollsnapchanging_event"], description: "The scrollsnapchanging and scrollsnapchange events fire when a scroll gesture changes the selected scroll snap target.", description_html: "The <code>scrollsnapchanging</code> and <code>scrollsnapchange</code> events fire when a scroll gesture changes the selected scroll snap target.", group: ["scrolling"], kind: "feature", name: "Scroll snap events", spec: ["https://drafts.csswg.\
org/css-scroll-snap-2/#scrollsnapchange-and-scrollsnapchanging"], status: { baseline: false, by_compat_key: { "api.Document.scrollsnapchange_event": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.Document.scrollsnapchanging_event": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.Element.scrollsnapchange_event": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.Element.scrollsnapchanging_event": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.SnapEvent": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.SnapEvent.SnapEvent": { baseline: false, support: {} }, "api.SnapEvent.snapTargetBlock": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.SnapEvent.snapTargetInline": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "12\
9" } }, "api.Window.scrollsnapchange_event": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "api.Window.scrollsnapchanging_event": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, "scroll-target-group": { compat_features: ["css.properties.scroll-target-group", "css.properties.scroll-target-group.auto", "css.properties.scroll-target-group.none"], description: "The scroll-target-group CSS property sets the container where anchor links act as scroll markers. Using selectors such as :target-current, you can style elements when a target has scrolled into view. It's an alternative to the ::scroll-marker-group pseudo-element, which generates scroll markers.", description_html: "The <code>scroll-target-group</code> CSS property sets the container where anchor links act as scroll markers. Using selectors such as <code>:target-current</code>, you can sty\
le elements when a target has scrolled into view. It's an alternative to the <code>::scroll-marker-group</code> pseudo-element, which generates scroll markers.", group: ["scroll-markers"], kind: "feature", name: "scroll-target-group", spec: ["https://drafts.csswg.org/css-overflow-5/#scroll-target-group"], status: { baseline: false, by_compat_key: { "css.properties.scroll-target-group": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140" } }, "css.properties.scroll-target-group.auto": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140" } }, "css.properties.scroll-target-group.none": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140" } } }, support: { chrome: "140", chrome_android: "140", edge: "140" } } }, "scroll-to-text-fragment": { caniuse: ["url-scroll-to-text-fragment"], compat_features: ["api.Document.fragmentDirective", "api.FragmentDirective", "html.elements.a.text_fragments"], description: "Tex\
t fragments are URL fragments on the form #:~:text=snippet and link to a snippet of text within a page. The browser may scroll, highlight, or otherwise bring that text to the reader's attention.", description_html: "Text fragments are URL fragments on the form <code>#:~:text=snippet</code> and link to a snippet of text within a page. The browser may scroll, highlight, or otherwise bring that text to the reader's attention.", group: ["text-fragments", "scrolling"], kind: "feature", name: "Scroll to text fragment", spec: ["https://wicg.github.io/scroll-to-text-fragment/"], status: { baseline: "low", baseline_low_date: "2024-10-01", by_compat_key: { "api.Document.fragmentDirective": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "api.FragmentDirective": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "81", chrome_android: "8\
1", edge: "83", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } }, "html.elements.a.text_fragments": { baseline: "low", baseline_low_date: "2024-10-01", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "131", firefox_android: "131", safari: "16.1", safari_ios: "16.1" } } }, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "131", firefox_android: "131", safari: "16.1", safari_ios: "16.1" } } }, "scrollbar-color": { compat_features: ["css.properties.scrollbar-color", "css.properties.scrollbar-color.auto"], description: "The scrollbar-color CSS property sets the color of the scrollbar track and thumb.", description_html: "The <code>scrollbar-color</code> CSS property sets the color of the scrollbar track and thumb.", group: ["scrolling"], kind: "feature", name: "scrollbar-color", spec: ["https://drafts.csswg.org/css-scrollbars-1/#scrollbar-color"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: {
    "css.properties.scrollbar-color": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "26.2", safari_ios: "26.2" } }, "css.properties.scrollbar-color.auto": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "26.2", safari_ios: "26.2" } } }, "scrollbar-gutter": { compat_features: ["css.properties.scrollbar-gutter", "css.properties.scrollbar-gutter.auto", "css.properties.scrollbar-gutter.stable"], description: "The scrollbar-gutter CSS property reserves space for the scrollbar, preventing unwanted layout changes as the scrollbar appears and disappears.", description_html: "The <code>scrollbar-gutter</code> CSS property reserves sp\
ace for the scrollbar, preventing unwanted layout changes as the scrollbar appears and disappears.", group: ["scrolling"], kind: "feature", name: "scrollbar-gutter", spec: ["https://drafts.csswg.org/css-overflow-3/#scrollbar-gutter-property"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "css.properties.scrollbar-gutter": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "97", firefox_android: "97", safari: "18.2", safari_ios: "18.2" } }, "css.properties.scrollbar-gutter.auto": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "97", firefox_android: "97", safari: "18.2", safari_ios: "18.2" } }, "css.properties.scrollbar-gutter.stable": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "97", firefox_android: "97", safari: "18.2", safari_ios: "18.2" } } },
    support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "97", firefox_android: "97", safari: "18.2", safari_ios: "18.2" } } }, "scrollbar-width": { compat_features: ["css.properties.scrollbar-width", "css.properties.scrollbar-width.auto", "css.properties.scrollbar-width.none", "css.properties.scrollbar-width.thin"], description: "The scrollbar-width CSS property sets the width of the scrollbar.", description_html: "The <code>scrollbar-width</code> CSS property sets the width of the scrollbar.", group: ["scrolling"], kind: "feature", name: "scrollbar-width", spec: ["https://drafts.csswg.org/css-scrollbars-1/#scrollbar-width"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "css.properties.scrollbar-width": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "18.2", safari_ios: "18.2" } }, "css.properties.scrollbar-width.auto": { baseline: "\
low", baseline_low_date: "2024-12-11", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "18.2", safari_ios: "18.2" } }, "css.properties.scrollbar-width.none": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "18.2", safari_ios: "18.2" } }, "css.properties.scrollbar-width.thin": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "64", firefox_android: "64", safari: "18.2", safari_ios: "18.2" } } }, scrollend: { compat_features: ["api.Document.scrollend_event", "api.Element.scrollend_event"], description: "The scrollend event fires when an element or document has finished scrolling.", description_html: "The <co\
de>scrollend</code> event fires when an element or document has finished scrolling.", group: ["scrolling"], kind: "feature", name: "scrollend", spec: ["https://drafts.csswg.org/cssom-view-1/#eventdef-document-scrollend"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "api.Document.scrollend_event": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "109", firefox_android: "109", safari: "26.2", safari_ios: "26.2" } }, "api.Element.scrollend_event": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "109", firefox_android: "109", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "109", firefox_android: "109", safari: "26.2", safari_ios: "26.2" } } }, search: { compat_features: ["html.elements.search"], description: "The <search> HTML element is a contai\
ner that represents the parts of the web page with search functionality.", description_html: "The <code>&#x3C;search></code> HTML element is a container that represents the parts of the web page with search functionality.", group: ["html-elements"], kind: "feature", name: "<search>", spec: ["https://html.spec.whatwg.org/multipage/grouping-content.html#the-search-element"], status: { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", by_compat_key: { "html.elements.search": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "118", firefox_android: "118", safari: "17", safari_ios: "17" } } }, support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "118", firefox_android: "118", safari: "17", safari_ios: "17" } } }, "search-input-type": { caniuse: ["input-search"], compat_features: ["html.elements.input.type_search"], description: 'The\
 <input type="search"> HTML element represents a text field for search queries.', description_html: 'The <code>&#x3C;input type="search"></code> HTML element represents a text field for search queries.', group: ["forms"], kind: "feature", name: '<input type="search">', spec: ["https://html.spec.whatwg.org/multipage/input.html#text-(type=text)-state-and-search-state-(type=search)"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.input.type_search": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, section: { compat_features: ["html.elements.section"], description: "The <section> element is a generic standalone se\
ction of a document, which doesn't have a more specific semantic element to represent it.", description_html: "The <code>&#x3C;section></code> element is a generic standalone section of a document, which doesn't have a more specific semantic element to represent it.", group: ["landmark-elements"], kind: "feature", name: "<section>", spec: ["https://html.spec.whatwg.org/multipage/sections.html#the-section-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.section": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, "secure-payment-confirmation": { compat_features: ["api.CredentialsContainer.create.publicKey\
_option.extensions.payment", "api.PaymentRequest.securePaymentConfirmationAvailability_static"], description: "The payment extension of a web authentication credential allows a relying party (such as a bank) to create a credential that can be queried by any merchant origin as part of an online checkout that uses the Payment Request API's secure-payment-confirmation payment method. Also known as SPC.", description_html: "The <code>payment</code> extension of a web authentication credential allows a relying party (such as a bank) to create a credential that can be queried by any merchant origin as part of an online checkout that uses the Payment Request API's <code>secure-payment-confirmation</code> payment method. Also known as SPC.", group: ["payments"], kind: "feature", name: "Secure payment confirmation", spec: ["https://w3c.github.io/secure-payment-confirmation/"], status: { baseline: false, by_compat_key: { "api.CredentialsContainer.create.publicKey_option.extensions.payment": { baseline: false,
    support: { chrome: "95", chrome_android: "95", edge: "95" } }, "api.PaymentRequest.securePaymentConfirmationAvailability_static": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, select: { compat_features: ["api.HTMLOptGroupElement", "api.HTMLOptGroupElement.disabled", "api.HTMLOptGroupElement.label", "api.HTMLOptionElement", "api.HTMLOptionElement.Option", "api.HTMLOptionElement.defaultSelected", "api.HTMLOptionElement.disabled", "api.HTMLOptionElement.form", "api.HTMLOptionElement.index", "api.HTMLOptionElement.label", "api.HTMLOptionElement.selected", "api.HTMLOptionElement.text", "api.HTMLOptionElement.value", "api.HTMLSelectElement", "api.HTMLSelectElement.add", "api.HTMLSelectElement.add.index_before_parameter", "api.HTMLSelectElement.autocomplete", "api.HTMLSelectElement.disabled", "api.HTMLSelectElement.form", "api.HTMLSelectElement.item", "api.HTMLSelectElement.labels",
    "api.HTMLSelectElement.length", "api.HTMLSelectElement.multiple", "api.HTMLSelectElement.name", "api.HTMLSelectElement.namedItem", "api.HTMLSelectElement.options", "api.HTMLSelectElement.remove", "api.HTMLSelectElement.required", "api.HTMLSelectElement.selectedIndex", "api.HTMLSelectElement.selectedOptions", "api.HTMLSelectElement.size", "api.HTMLSelectElement.type", "api.HTMLSelectElement.value", "html.elements.optgroup", "html.elements.optgroup.disabled", "html.elements.optgroup.label", "html.elements.option", "html.elements.option.disabled", "html.elements.option.label", "html.elements.option.selected", "html.elements.option.value", "html.elements.select", "html.elements.select.disabled", "html.elements.select.form", "html.elements.select.hr_in_select", "html.elements.select.multiple", "html.elements.select.name", "html.elements.select.required", "html.elements.select.size"], description: "The <select> element provides a menu of options for a user to pick from, typically rendere\
d as a dropdown list.", description_html: "The <code>&#x3C;select></code> element provides a menu of options for a user to pick from, typically rendered as a dropdown list.", group: ["forms", "html-elements"], kind: "feature", name: "<select>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-optgroup-element", "https://html.spec.whatwg.org/multipage/form-elements.html#the-option-element", "https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLOptGroupElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptGroupElement.disabled": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
7" } }, "api.HTMLOptGroupElement.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptionElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.HTMLOptionElement.Option": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.HTMLOptionElement.defaultSelected": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } },
    "api.HTMLOptionElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptionElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptionElement.index": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptionElement.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "3", safari_ios: "1" } }, "api.HTMLO\
ptionElement.selected": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptionElement.text": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLOptionElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLSelectElement.add": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.add.index_before_parameter": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "8", firefox_android: "8", safari: "9", safari_ios: "9" } }, "api.HTMLSelectElement.autocomplete": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "59", firefox_android: "59", safari: "9.1", safari_ios: "9.3" } }, "api.HTMLSelectElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.H\
TMLSelectElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.item": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "5.1", safari_ios: "5" } }, "api.HTMLSelectElement.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectEle\
ment.multiple": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.namedItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.options": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.rem\
ove": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.HTMLSelectElement.selectedIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.selectedOptions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "26", firefox_android: "26", safari: "6", safari_ios: "6" } }, "api.HTMLSelec\
tElement.size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLSelectElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.optgroup": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.optgroup.disab\
led": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "7" } }, "html.elements.optgroup.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.option": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.option.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.option.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.option.selected": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.option.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.select": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.select.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.select.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.select.hr_in_select": { baseline: false, support: { chrome: "119", edge: "119", firefox: "122", firefox_android: "145", safari: "17", safari_ios: "17.4" } }, "html.elements.select.multiple": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.select.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "html.elements.select.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.elements.select.size": { baseline: false, support: { chrome: "1", chrome_android: "142", edge: "12", firefox: "1", firefox_android: "4", safari: "3" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, selection: { caniuse: ["css-selection"], compat_features: ["css.selectors.selection"], description: "The ::selection CSS pseudo-element selects text a user has highlighted.", description_html: "The <code>::selection</code> CSS pseudo-element selects text a user has highlighted.", group: ["selectors", "selection"], kind: "feature", name: "::selection", spec: ["https://drafts.csswg.org/css-pseudo-4/#selectordef-select\
ion"], status: { baseline: false, by_compat_key: { "css.selectors.selection": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "62", firefox_android: "62", safari: "1.1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "62", firefox_android: "62", safari: "1.1" } } }, "selection-api": { caniuse: ["selection-api"], compat_features: ["api.AbstractRange", "api.AbstractRange.collapsed", "api.AbstractRange.endContainer", "api.AbstractRange.endOffset", "api.AbstractRange.startContainer", "api.AbstractRange.startOffset", "api.Document.createRange", "api.Document.getSelection", "api.Document.selectionchange_event", "api.HTMLInputElement.selectionchange_event", "api.HTMLTextAreaElement.selectionchange_event", "api.Node.selectstart_event", "api.Range", "api.Range.Range", "api.Range.cloneContents", "api.Range.cloneRange", "api.Range.collapse", "api.Range.collapse.toStart_parameter_optional", "api.Range.collapsed", "api.Range.commonAnce\
storContainer", "api.Range.compareBoundaryPoints", "api.Range.comparePoint", "api.Range.createContextualFragment", "api.Range.deleteContents", "api.Range.endContainer", "api.Range.endOffset", "api.Range.extractContents", "api.Range.getBoundingClientRect", "api.Range.getClientRects", "api.Range.insertNode", "api.Range.intersectsNode", "api.Range.isPointInRange", "api.Range.selectNode", "api.Range.selectNodeContents", "api.Range.setEnd", "api.Range.setEndAfter", "api.Range.setEndBefore", "api.Range.setStart", "api.Range.setStartAfter", "api.Range.setStartBefore", "api.Range.startContainer", "api.Range.startOffset", "api.Range.surroundContents", "api.Range.toString", "api.Selection", "api.Selection.addRange", "api.Selection.anchorNode", "api.Selection.anchorOffset", "api.Selection.collapse", "api.Selection.collapseToEnd", "api.Selection.collapseToStart", "api.Selection.containsNode", "api.Selection.deleteFromDocument", "api.Selection.direction", "api.Selection.empty", "api.Selection.exten\
d", "api.Selection.focusNode", "api.Selection.focusOffset", "api.Selection.getRangeAt", "api.Selection.isCollapsed", "api.Selection.modify", "api.Selection.rangeCount", "api.Selection.removeAllRanges", "api.Selection.removeRange", "api.Selection.selectAllChildren", "api.Selection.setBaseAndExtent", "api.Selection.setPosition", "api.Selection.toString", "api.Selection.type", "api.StaticRange", "api.StaticRange.StaticRange", "api.StaticRange.collapsed", "api.StaticRange.endContainer", "api.StaticRange.endOffset", "api.StaticRange.startContainer", "api.StaticRange.startOffset", "api.Window.getSelection"], description: "The Selection API controls and modifies user text selections within the page.", description_html: "The Selection API controls and modifies user text selections within the page.", group: ["selection"], kind: "feature", name: "Selection", spec: ["https://w3c.github.io/selection-api/"], status: { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-0\
7", by_compat_key: { "api.AbstractRange": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AbstractRange.collapsed": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AbstractRange.endContainer": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AbstractRange.endOffset": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "69", firefox_android: "79", safari: "\
14.1", safari_ios: "14.5" } }, "api.AbstractRange.startContainer": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AbstractRange.startOffset": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.Document.createRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Document.getSelection": { baseline: "high", baseline_high_date: "2020-05-28", baseline_low_date: "2017-11-28", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "57", firefox_android: "57",
    safari: "4", safari_ios: "3.2" } }, "api.Document.selectionchange_event": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "52", firefox_android: "52", safari: "5.1", safari_ios: "5" } }, "api.HTMLInputElement.selectionchange_event": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "92", firefox_android: "92", safari: "18", safari_ios: "18" } }, "api.HTMLTextAreaElement.selectionchange_event": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "92", firefox_android: "92", safari: "18", safari_ios: "18" } }, "api.Node.selectstart_event": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "52", firefox_android: "52", safari: "1.3" } }, "api.Range": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.Range": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "29", chrome_android: "29", edge: "15", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "api.Range.cloneContents": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.cloneRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.collapse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.collapse.toStart_parameter_optional": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "1", chrome_android: "18", edge: "16", firefox: "25", firefox_android: "25", safari: "1", safari_ios: "1" } }, "api.Range.collapsed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.commonAncestorContainer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.compareBoundaryPoints": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.comparePoint": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Range.createContextualFragment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.deleteContents": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.endContainer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.endOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.extractContents": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.getBoundingClientRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.Range.getClientRects": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4",
    safari: "5", safari_ios: "4" } }, "api.Range.insertNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.intersectsNode": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "17", firefox_android: "19", safari: "3", safari_ios: "1" } }, "api.Range.isPointInRange": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "15", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Range.selectNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } },
    "api.Range.selectNodeContents": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.setEnd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.setEndAfter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.setEndBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.setStart": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.setStartAfter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.setStartBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.startContainer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.startOffset": { baseline: "high", baseline_high_date: "2018\
-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.surroundContents": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Range.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Selection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.addRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Selection.anchorNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.anchorOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.collapse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.collapseToEnd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.collapseToStart": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.containsNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Selection.deleteFromDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Selection.direction": { baseline: "low", baseline_low_date: "2025-05-29", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "126", firefox_android: "\
126", safari: "17", safari_ios: "17" } }, "api.Selection.empty": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "1.3", safari_ios: "1" } }, "api.Selection.extend": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Selection.focusNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.focusOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "\
1" } }, "api.Selection.getRangeAt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Selection.isCollapsed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.modify": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.rangeCount": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Selection.remo\
veAllRanges": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Selection.removeRange": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "58", chrome_android: "58", edge: "12", firefox: "1", firefox_android: "4", safari: "17", safari_ios: "17" } }, "api.Selection.selectAllChildren": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Selection.setBaseAndExtent": { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "53", firefox_android: "53", safari: "1.3", safari_ios: "1" } }, "api.Selection.setP\
osition": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "1", chrome_android: "18", edge: "14", firefox: "55", firefox_android: "55", safari: "1.3", safari_ios: "1" } }, "api.Selection.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Selection.type": { baseline: "high", baseline_high_date: "2020-05-28", baseline_low_date: "2017-11-28", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "57", firefox_android: "57", safari: "1.3", safari_ios: "1" } }, "api.StaticRange": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.StaticRange.StaticRange": { baseline: "\
high", baseline_high_date: "2023-10-15", baseline_low_date: "2021-04-15", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "71", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.StaticRange.collapsed": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.StaticRange.endContainer": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.StaticRange.endOffset": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.StaticRange.startConta\
iner": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.StaticRange.startOffset": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "60", chrome_android: "60", edge: "18", firefox: "69", firefox_android: "79", safari: "10.1", safari_ios: "10.3" } }, "api.Window.getSelection": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "52", firefox_android: "52", safari: "5.1", safari_ios: "5" } } }, selectors: { caniuse: ["css-sel2"], compat_features: ["css.selectors.attribute", "css.selectors.child", "css.selectors.class", "css.sel\
ectors.descendant", "css.selectors.id", "css.selectors.list", "css.selectors.next-sibling", "css.selectors.subsequent-sibling", "css.selectors.type", "css.selectors.type.namespaces", "css.selectors.universal", "css.selectors.universal.namespaces"], description: "CSS selectors match elements based on their type, attributes, and relationship to other elements. They define the specific elements to which a block of styles will be applied. This feature represents the oldest selectors of CSS.", description_html: "CSS selectors match elements based on their type, attributes, and relationship to other elements. They define the specific elements to which a block of styles will be applied. This feature represents the oldest selectors of CSS.", group: ["selectors"], kind: "feature", name: "Selectors (core)", spec: ["https://drafts.csswg.org/selectors-4/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.attribute": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.selectors.child": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.class": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.descendant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.id": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.list": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.next-sibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.subsequent-sibling": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.selectors.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.type.namespaces": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.selectors.universal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.universal.namespaces": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, serial: { compat_features: [
    "api.Navigator.serial", "api.Serial", "api.Serial.getPorts", "api.Serial.requestPort", "api.Serial.requestPort.allowedBluetoothServiceClassIds_option", "api.Serial.requestPort.filters_bluetoothServiceClassId", "api.SerialPort", "api.SerialPort.close", "api.SerialPort.connect_event", "api.SerialPort.connect_event.bluetooth_rfcomm", "api.SerialPort.connected", "api.SerialPort.disconnect_event", "api.SerialPort.disconnect_event.bluetooth_rfcomm", "api.SerialPort.forget", "api.SerialPort.getInfo", "api.SerialPort.getInfo.bluetoothServiceClassId", "api.SerialPort.getSignals", "api.SerialPort.open", "api.SerialPort.readable", "api.SerialPort.setSignals", "api.SerialPort.writable", "api.WorkerNavigator.serial", "html.elements.iframe.allow.serial", "http.headers.Permissions-Policy.serial"], description: "The navigator.serial API communicates with devices over serial ports, such as microcontrollers.", description_html: "The <code>navigator.serial</code> API communicates with devices over se\
rial ports, such as microcontrollers.", kind: "feature", name: "Web serial", spec: ["https://wicg.github.io/serial/"], status: { baseline: false, by_compat_key: { "api.Navigator.serial": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.Serial": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.Serial.getPorts": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.Serial.requestPort": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.Serial.requestPort.allowedBluetoothServiceClassIds_option": { baseline: false, support: { chrome: "117", edge: "117" } }, "api.Serial.requestPort.filters_bluetoothServiceClassId": { baseline: false, support: { chrome: "117", edge: "117" } }, "api.SerialPort": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.close": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.connect_event": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.Seri\
alPort.connect_event.bluetooth_rfcomm": { baseline: false, support: { chrome: "130", edge: "130" } }, "api.SerialPort.connected": { baseline: false, support: { chrome: "130", edge: "130" } }, "api.SerialPort.disconnect_event": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.disconnect_event.bluetooth_rfcomm": { baseline: false, support: { chrome: "130", edge: "130" } }, "api.SerialPort.forget": { baseline: false, support: { chrome: "103", edge: "103" } }, "api.SerialPort.getInfo": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.getInfo.bluetoothServiceClassId": { baseline: false, support: { chrome: "117", edge: "117" } }, "api.SerialPort.getSignals": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.open": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.readable": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.SerialPort.setSignals": { baseline: false, support: {
    chrome: "89", edge: "89" } }, "api.SerialPort.writable": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.WorkerNavigator.serial": { baseline: false, support: { chrome: "89", edge: "89" } }, "html.elements.iframe.allow.serial": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Permissions-Policy.serial": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } } }, support: { chrome: "89", edge: "89" } } }, "serializable-errors": { compat_features: ["api.DOMException.serializable_object", "javascript.builtins.Error.serializable_object", "javascript.builtins.EvalError.serializable_object", "javascript.builtins.RangeError.serializable_object", "javascript.builtins.ReferenceError.serializable_object", "javascript.builtins.SyntaxError.serializable_object", "javascript.builtins.TypeError.serializable_object", "javascript.builtins.URIError.serializable_object"], description: "The DOMException, Error, Eval\
Error, RangeError, ReferenceError, SyntaxError, TypeError, and URIError objects are serializable. You can call structuredClone() on an error object or pass it to a worker using postMessage().", description_html: "The <code>DOMException</code>, <code>Error</code>, <code>EvalError</code>, <code>RangeError</code>, <code>ReferenceError</code>, <code>SyntaxError</code>, <code>TypeError</code>, and <code>URIError</code> objects are serializable. You can call <code>structuredClone()</code> on an error object or pass it to a worker using <code>postMessage()</code>.", kind: "feature", name: "Serializable errors", spec: ["https://webidl.spec.whatwg.org/#idl-DOMException"], status: { baseline: false, by_compat_key: { "api.DOMException.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "101", firefox_android: "101" } }, "javascript.builtins.Error.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "\
79", firefox: "103", firefox_android: "103" } }, "javascript.builtins.EvalError.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } }, "javascript.builtins.RangeError.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } }, "javascript.builtins.ReferenceError.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } }, "javascript.builtins.SyntaxError.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } }, "javascript.builtins.TypeError.serializable_object": { baseline: false, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } }, "javascript.builtins.URIError.serializable_object": { baseline: false,
    support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } } }, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "103", firefox_android: "103" } } }, "server-sent-events": { caniuse: ["eventsource"], compat_features: ["api.EventSource", "api.EventSource.EventSource", "api.EventSource.EventSource.options_withCredentials_parameter", "api.EventSource.close", "api.EventSource.error_event", "api.EventSource.message_event", "api.EventSource.open_event", "api.EventSource.readyState", "api.EventSource.url", "api.EventSource.withCredentials", "api.EventSource.worker_support"], description: "The EventSource API creates a connection to a server and listens to a stream of events sent by the server.", description_html: "The <code>EventSource</code> API creates a connection to a server and listens to a stream of events sent by the server.", group: ["messaging"], kind: "feature", name: "Server-sent events", spec: ["https://html.spec.what\
wg.org/multipage/server-sent-events.html#server-sent-events"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.EventSource": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.EventSource": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.EventSource.options_withCredentials_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "26", chrome_android: "26", edge: "79", firefox: "11", firefox_android: "45", safari: "7", safari_ios: "7" } }, "api.EventSource.close": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.error_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.message_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.open_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.readyState": { baseline: "high", baseline_high_date: "2022-07-15",
    baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } }, "api.EventSource.url": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "18", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "6", safari_ios: "6" } }, "api.EventSource.withCredentials": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "26", chrome_android: "26", edge: "79", firefox: "6", firefox_android: "45", safari: "7", safari_ios: "7" } }, "api.EventSource.worker_support": { baseline: "low", baseline_low_date: "2024-11-26", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "133", firefox_android: "133", safari: "5", safari_ios: "5" } } }, support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "6", firefox_android: "45", safari: "5", safari_ios: "5" } } },
    "server-timing": { caniuse: ["server-timing"], compat_features: ["api.PerformanceResourceTiming.serverTiming", "api.PerformanceServerTiming", "api.PerformanceServerTiming.description", "api.PerformanceServerTiming.duration", "api.PerformanceServerTiming.name", "api.PerformanceServerTiming.toJSON", "http.headers.Server-Timing", "http.headers.Server-Timing.trailer"], description: "The serverTiming property of the PerformanceResourceTiming API contains server timing information about network requests.", description_html: "The <code>serverTiming</code> property of the <code>PerformanceResourceTiming</code> API contains server timing information about network requests.", group: ["performance"], kind: "feature", name: "Server timing", spec: ["https://w3c.github.io/server-timing/"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.PerformanceResourceTiming.serverTiming": { baseline: "high", baseline_high_date: "2025-09-27",
    baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "api.PerformanceServerTiming": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "api.PerformanceServerTiming.description": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "api.PerformanceServerTiming.duration": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "api.PerformanceServerTiming.name": { baseline: "\
high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "api.PerformanceServerTiming.toJSON": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Server-Timing": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } }, "http.headers.Server-Timing.trailer": { baseline: false, support: { firefox: "71", firefox_android: "79" } } }, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "61", firefox_android: "61", safari: "16.4", safari_ios: "16.4" } } }, "service-workers": { caniuse: [
    "serviceworkers"], compat_features: ["api.Cache", "api.Cache.add", "api.Cache.addAll", "api.Cache.delete", "api.Cache.keys", "api.Cache.match", "api.Cache.matchAll", "api.Cache.put", "api.Cache.worker_support", "api.CacheStorage", "api.CacheStorage.delete", "api.CacheStorage.has", "api.CacheStorage.keys", "api.CacheStorage.match", "api.CacheStorage.open", "api.CacheStorage.secure_context_required", "api.CacheStorage.worker_support", "api.Client", "api.Client.frameType", "api.Client.id", "api.Client.postMessage", "api.Client.type", "api.Client.url", "api.Clients", "api.Clients.claim", "api.Clients.get", "api.Clients.matchAll", "api.Clients.matchAll.options_includeUncontrolled_parameter", "api.Clients.openWindow", "api.ExtendableEvent", "api.ExtendableEvent.ExtendableEvent", "api.ExtendableEvent.waitUntil", "api.ExtendableEvent.waitUntil.async_waitUntil", "api.ExtendableMessageEvent", "api.ExtendableMessageEvent.ExtendableMessageEvent", "api.ExtendableMessageEvent.data", "api.Extenda\
bleMessageEvent.lastEventId", "api.ExtendableMessageEvent.origin", "api.ExtendableMessageEvent.ports", "api.ExtendableMessageEvent.source", "api.FetchEvent", "api.FetchEvent.FetchEvent", "api.FetchEvent.clientId", "api.FetchEvent.handled", "api.FetchEvent.preloadResponse", "api.FetchEvent.request", "api.FetchEvent.respondWith", "api.FetchEvent.respondWith.networkerror_on_same-origin_cors", "api.FetchEvent.respondWith.resource_url", "api.FetchEvent.resultingClientId", "api.InstallEvent", "api.InstallEvent.InstallEvent", "api.InstallEvent.addRoutes", "api.NavigationPreloadManager", "api.NavigationPreloadManager.disable", "api.NavigationPreloadManager.enable", "api.NavigationPreloadManager.getState", "api.NavigationPreloadManager.setHeaderValue", "api.Navigator.serviceWorker", "api.ServiceWorker", "api.ServiceWorker.postMessage", "api.ServiceWorker.scriptURL", "api.ServiceWorker.state", "api.ServiceWorker.statechange_event", "api.ServiceWorkerContainer", "api.ServiceWorkerContainer.contro\
ller", "api.ServiceWorkerContainer.controllerchange_event", "api.ServiceWorkerContainer.getRegistration", "api.ServiceWorkerContainer.getRegistrations", "api.ServiceWorkerContainer.message_event", "api.ServiceWorkerContainer.ready", "api.ServiceWorkerContainer.register", "api.ServiceWorkerContainer.startMessages", "api.ServiceWorkerContainer.worker_support", "api.ServiceWorkerGlobalScope", "api.ServiceWorkerGlobalScope.activate_event", "api.ServiceWorkerGlobalScope.clients", "api.ServiceWorkerGlobalScope.fetch_event", "api.ServiceWorkerGlobalScope.install_event", "api.ServiceWorkerGlobalScope.message_event", "api.ServiceWorkerGlobalScope.registration", "api.ServiceWorkerGlobalScope.serviceWorker", "api.ServiceWorkerGlobalScope.skipWaiting", "api.ServiceWorkerRegistration.active", "api.ServiceWorkerRegistration.installing", "api.ServiceWorkerRegistration.navigationPreload", "api.ServiceWorkerRegistration.scope", "api.ServiceWorkerRegistration.unregister", "api.ServiceWorkerRegistration.\
update", "api.ServiceWorkerRegistration.updateViaCache", "api.ServiceWorkerRegistration.updatefound_event", "api.ServiceWorkerRegistration.waiting", "api.WindowClient", "api.WindowClient.ancestorOrigins", "api.WindowClient.focus", "api.WindowClient.focused", "api.WindowClient.navigate", "api.WindowClient.visibilityState", "api.WorkerNavigator.serviceWorker", "api.caches", "api.caches.secure_context_required", "api.caches.worker_support", "http.headers.Service-Worker-Navigation-Preload"], description: "The service worker of a website is a script that runs in its own thread and which acts as local proxy that intercepts network requests from the website. Use a service worker to implement advanced caching strategies, offline support, background tasks, or push notification support on your website.", description_html: "The service worker of a website is a script that runs in its own thread and which acts as local proxy that intercepts network requests from the website. Use a service worker t\
o implement advanced caching strategies, offline support, background tasks, or push notification support on your website.", group: ["workers"], kind: "feature", name: "Service workers", spec: ["https://w3c.github.io/ServiceWorker/"], status: { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", by_compat_key: { "api.Cache": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "40", chrome_android: "40", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.add": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "44", chrome_android: "44", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.addAll": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "46", chrome_android: "46", edge: "16", firefox: "\
41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.delete": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.keys": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.match": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.matchAll": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "47", chrome_android: "47", edge: "16", firefox: "41", firefox_android: "41",
    safari: "11.1", safari_ios: "11.3" } }, "api.Cache.put": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.Cache.worker_support": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "40", chrome_android: "40", edge: "16", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.CacheStorage": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.CacheStorage.delete": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "\
11.1", safari_ios: "11.3" } }, "api.CacheStorage.has": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.CacheStorage.keys": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.CacheStorage.match": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "54", chrome_android: "54", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.CacheStorage.open": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1",
    safari_ios: "11.3" } }, "api.CacheStorage.secure_context_required": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.CacheStorage.worker_support": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "43", chrome_android: "43", edge: "16", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Client": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Client.frameType": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "43", chrome_android: "43", edge: "17", firefox: "44", firefox_android: "44",
    safari: "11.1", safari_ios: "11.3" } }, "api.Client.id": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Client.postMessage": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Client.type": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "60", chrome_android: "60", edge: "17", firefox: "54", firefox_android: "54", safari: "11.1", safari_ios: "11.3" } }, "api.Client.url": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "\
11.3" } }, "api.Clients": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Clients.claim": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Clients.get": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "45", firefox_android: "45", safari: "11.1", safari_ios: "11.3" } }, "api.Clients.matchAll": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "54", firefox_android: "54", safari: "11.1", safari_ios: "11.3" } }, "api.Clients.m\
atchAll.options_includeUncontrolled_parameter": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "54", firefox_android: "54", safari: "11.1", safari_ios: "11.3" } }, "api.Clients.openWindow": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableEvent.ExtendableEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "41", chrome_android: "41", edge: "17", firefox: "44", firefox_android: "44", safari: "\
11.1", safari_ios: "11.3" } }, "api.ExtendableEvent.waitUntil": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableEvent.waitUntil.async_waitUntil": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "60", chrome_android: "60", edge: "17", firefox: "53", firefox_android: "53", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent.ExtendableMessageEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51",
    edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent.data": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent.lastEventId": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent.origin": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent.ports": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30",
    support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ExtendableMessageEvent.source": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FetchEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FetchEvent.FetchEvent": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "44", chrome_android: "44", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FetchEvent.clientId": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "20\
18-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "45", firefox_android: "45", safari: "11.1", safari_ios: "11.3" } }, "api.FetchEvent.handled": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "84", firefox_android: "84", safari: "16", safari_ios: "16" } }, "api.FetchEvent.preloadResponse": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "18", firefox: "99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.FetchEvent.request": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FetchEvent.respondWith": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "\
2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FetchEvent.respondWith.networkerror_on_same-origin_cors": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "59", firefox_android: "59" } }, "api.FetchEvent.respondWith.resource_url": { baseline: false, support: { firefox: "59", firefox_android: "59" } }, "api.FetchEvent.resultingClientId": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "65", firefox_android: "65", safari: "16", safari_ios: "16" } }, "api.InstallEvent": { baseline: false, support: { chrome: "40", chrome_android: "40", edge: "17" } }, "api.InstallEvent.InstallEvent": { baseline: false, support: { chrome: "40", chrome_android: "40", edge: "79" } }, "api.InstallEvent.addRoutes": { baseline: false, support: { chrome: "123", chrome_android: "\
123", edge: "123" } }, "api.NavigationPreloadManager": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "18", firefox: "99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.NavigationPreloadManager.disable": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "18", firefox: "99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.NavigationPreloadManager.enable": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "18", firefox: "99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.NavigationPreloadManager.getState": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "18", firefox: "\
99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.NavigationPreloadManager.setHeaderValue": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "18", firefox: "99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.Navigator.serviceWorker": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorker": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorker.postMessage": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "\
40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorker.scriptURL": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorker.state": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorker.statechange_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "\
40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.controller": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.controllerchange_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.getRegistration": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.getRegistrations": { baseline: "high", baseline_high_date: "\
2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.message_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.ready": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.register": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContaine\
r.startMessages": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "64", firefox_android: "64", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerContainer.worker_support": { baseline: false, support: { firefox: "133", firefox_android: "133", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope.activate_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope.clients": { baseline: "high", baseline_high_date: "\
2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope.fetch_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope.install_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope.message_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.Serv\
iceWorkerGlobalScope.registration": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerGlobalScope.serviceWorker": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", safari: "15.4", safari_ios: "15.4" } }, "api.ServiceWorkerGlobalScope.skipWaiting": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "41", chrome_android: "41", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.active": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.installing": {
    baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.navigationPreload": { baseline: "high", baseline_high_date: "2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "59", chrome_android: "59", edge: "17", firefox: "99", firefox_android: "99", safari: "15.4", safari_ios: "15.4" } }, "api.ServiceWorkerRegistration.scope": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.unregister": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "\
11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.update": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.updateViaCache": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "68", chrome_android: "68", edge: "18", firefox: "57", firefox_android: "57", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.updatefound_event": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.ServiceWorkerRegistration.waiting": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "\
40", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.WindowClient": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.WindowClient.ancestorOrigins": { baseline: false, support: { safari: "16", safari_ios: "16" } }, "api.WindowClient.focus": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.WindowClient.focused": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.WindowClient.navigate": { baseline: "high", baseline_high_date: "\
2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "50", firefox_android: "50", safari: "16", safari_ios: "16" } }, "api.WindowClient.visibilityState": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "42", chrome_android: "42", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.WorkerNavigator.serviceWorker": { baseline: false, support: { firefox: "133", firefox_android: "133", safari: "11.1", safari_ios: "11.3" } }, "api.caches": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "40", chrome_android: "40", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "api.caches.secure_context_required": { baseline: "high", baseline_high_date: "2025-01-26", baseline_low_date: "2022-07-26", support: { chrome: "65", chrome_android: "65", edge: "\
79", firefox: "103", firefox_android: "103", safari: "11.1", safari_ios: "11.3" } }, "api.caches.worker_support": { baseline: "high", baseline_high_date: "2020-10-12", baseline_low_date: "2018-04-12", support: { chrome: "40", chrome_android: "40", edge: "16", firefox: "41", firefox_android: "41", safari: "11.1", safari_ios: "11.3" } }, "http.headers.Service-Worker-Navigation-Preload": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "18", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } } }, set: { compat_features: ["javascript.builtins.Set", "javascript.builtins.Set.@@iterator", "javascript.builtins.Set.@@species", "javascript.builtins.Set.Set", "javascript.builtins.Set.Set.iterable_allowed", "javascript.builtins.Set.Set.null_allowed", "javascript.builtins.Set.add", "javascript.builtins.Set.clear", "javascript.builtins.Set.delete", "java\
script.builtins.Set.entries", "javascript.builtins.Set.forEach", "javascript.builtins.Set.has", "javascript.builtins.Set.key_equality_for_zeros", "javascript.builtins.Set.keys", "javascript.builtins.Set.size", "javascript.builtins.Set.values"], description: "Set objects store unique values of any type.", description_html: "Set objects store unique values of any type.", group: ["sets"], kind: "feature", name: "Set (initial support)", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/keyed-collections.html#sec-set-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.Set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.@@iterator": { baseline: "high", baseline_high_date: "2018-03-30",
    baseline_low_date: "2015-09-30", support: { chrome: "43", chrome_android: "43", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Set.@@species": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "51", chrome_android: "51", edge: "13", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "javascript.builtins.Set.Set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.Set.iterable_allowed": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "9", safari_ios: "9" } }, "javascript.builtins.Set.Set.null_allowed": { baseline: "hig\
h", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "37", firefox_android: "37", safari: "9", safari_ios: "9" } }, "javascript.builtins.Set.add": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "19", firefox_android: "19", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.delete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.entries": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.forEach": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.has": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.key_equality_for_zeros": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "29", firefox_android: "29", safari: "9", safari_ios: "9" } }, "javascript.builtins.Set.\
keys": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "19", firefox_android: "19", safari: "8", safari_ios: "8" } }, "javascript.builtins.Set.values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } } }, support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "13", firefox_android: "14", safari: "8", safari_ios: "8" } } }, "set-methods": { compat_features: ["javascript.builtins.Set.difference", "javascript.builtins.Set.intersection", "javascript.builtins.Set.\
isDisjointFrom", "javascript.builtins.Set.isSubsetOf", "javascript.builtins.Set.isSupersetOf", "javascript.builtins.Set.symmetricDifference", "javascript.builtins.Set.union"], description: "The difference(), intersection(), isDisjointFrom(), isSubsetOf(), isSupersetOf(), symmetricDifference(), and union() methods of the JavaScript Set object performs operations between two sets.", description_html: "The <code>difference()</code>, <code>intersection()</code>, <code>isDisjointFrom()</code>, <code>isSubsetOf()</code>, <code>isSupersetOf()</code>, <code>symmetricDifference()</code>, and <code>union()</code> methods of the JavaScript <code>Set</code> object performs operations between two sets.", group: ["sets"], kind: "feature", name: "Set methods", spec: ["https://tc39.es/ecma262/multipage/keyed-collections.html#sec-properties-of-the-set-prototype-object"], status: { baseline: "low", baseline_low_date: "2024-06-11", by_compat_key: { "javascript.builtins.Set.difference": { baseline: "low",
    baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } }, "javascript.builtins.Set.intersection": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } }, "javascript.builtins.Set.isDisjointFrom": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } }, "javascript.builtins.Set.isSubsetOf": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } }, "javascript.builtins.Set.isSupersetOf": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "\
122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } }, "javascript.builtins.Set.symmetricDifference": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } }, "javascript.builtins.Set.union": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } } }, support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "127", firefox_android: "127", safari: "17", safari_ios: "17" } } }, setinterval: { compat_features: ["api.clearInterval", "api.clearInterval.worker_support", "api.setInterval", "api.setInterval.worker_support"], description: "The setInterval() global function repeatedly executes provided code on a given delay, and the accompanying clearInterval() cancels the interval.",
    description_html: "The <code>setInterval()</code> global function repeatedly executes provided code on a given delay, and the accompanying <code>clearInterval()</code> cancels the interval.", kind: "feature", name: "setInterval", spec: ["https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.clearInterval": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.clearInterval.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.setInterval": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.setInterval.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, settimeout: { compat_features: ["api.clearTimeout", "api.clearTimeout.worker_support", "api.setTimeout", "api.setTimeout.worker_support"], description: "The setTimeout() global function executes provided code after a given duration of time, and the accompanying clearTimeout() cancels the timer.", description_html: "The <code>setTimeout()</code> global function executes provided code after a given duration of time, and the accompanying <code>clearTimeout()</code> cancels\
 the timer.", kind: "feature", name: "setTimeout()", spec: ["https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.clearTimeout": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "1" } }, "api.clearTimeout.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.setTimeout": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.setTimeout.worker_suppor\
t": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, "shadow-dom": { caniuse: ["shadowdomv1"], compat_features: ["api.Element.attachShadow", "api.Element.attachShadow.options_clonable_parameter", "api.Element.attachShadow.options_delegatesFocus_parameter", "api.Element.attachShadow.options_serializable_parameter", "api.Element.shadowRoot", "api.Event.composed", "api.Event.composedPath", "api.Node.getRootNode", "api.Node.isConnected", "api.ShadowRoot", "api.ShadowRoot.clonable", "api.ShadowRoot.delegatesFocus", "api.ShadowRoot.host", "api.ShadowRoot.mode", "api.ShadowRoot.serializable"], description: 'Shadow DOM allows you to attach encapsulated "shadow" DOM trees to elements. A shadow DOM \
tree is a separate component, isolated from the scripts and styles in other parts of the document. This is a part of Web Components.', description_html: 'Shadow DOM allows you to attach encapsulated "shadow" DOM trees to elements. A shadow DOM tree is a separate component, isolated from the scripts and styles in other parts of the document. This is a part of Web Components.', group: ["dom", "web-components"], kind: "feature", name: "Shadow DOM", spec: ["https://dom.spec.whatwg.org/#shadow-trees"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Element.attachShadow": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.Element.attachShadow.options_clonable_parameter": { baseline: "low", baseline_low_date: "2024-04-18", support: { chrome: "124", chrome_android: "\
124", edge: "124", firefox: "123", firefox_android: "123", safari: "17.4", safari_ios: "17.4" } }, "api.Element.attachShadow.options_delegatesFocus_parameter": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "94", firefox_android: "94", safari: "13.1", safari_ios: "13.4" } }, "api.Element.attachShadow.options_serializable_parameter": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } }, "api.Element.shadowRoot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.Event.composed": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
53", chrome_android: "53", edge: "79", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "api.Event.composedPath": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "59", firefox_android: "59", safari: "10", safari_ios: "10" } }, "api.Node.getRootNode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "53", firefox_android: "53", safari: "10.1", safari_ios: "10.3" } }, "api.Node.isConnected": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "api.ShadowRoot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53",
    edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.ShadowRoot.clonable": { baseline: "low", baseline_low_date: "2024-04-18", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "123", firefox_android: "123", safari: "17.4", safari_ios: "17.4" } }, "api.ShadowRoot.delegatesFocus": { baseline: "high", baseline_high_date: "2024-05-02", baseline_low_date: "2021-11-02", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "94", firefox_android: "94", safari: "15", safari_ios: "15" } }, "api.ShadowRoot.host": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.ShadowRoot.mode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "\
63", safari: "10.1", safari_ios: "10.3" } }, "api.ShadowRoot.serializable": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "128", firefox_android: "128", safari: "18", safari_ios: "18" } } }, support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } } }, "shadow-parts": { compat_features: ["api.Element.part", "css.selectors.part", "html.global_attributes.exportparts", "html.global_attributes.part"], description: "The part and exportparts HTML attributes expose elements of a shadow DOM as named parts, which can be selected by the ::part() CSS pseudo-element for styling.", description_html: "The <code>part</code> and <code>exportparts</code> HTML attributes expose elements of a shadow DOM as named parts, which can be selected by the <code>::part()</code> CSS pseudo-element for styling.", group: ["selectors", "web-components"], kind: "feature",
    name: "Shadow parts", spec: ["https://drafts.csswg.org/css-shadow-1/#exposing"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "api.Element.part": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "css.selectors.part": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "html.global_attributes.exportparts": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "html.global_attributes.part": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, "shape-function": { compat_features: ["css.types.basic-shape.shape"], description: "The shape() CSS function creates shapes with a series of commands like line, move, and curve. It can be used with clip-path and shape-outside.", description_html: "The <code>shape()</code> CSS function creates shapes with a series of commands like <code>line</code>, <code>move</code>, and <code>curve</code>. It can be used with <code>clip-path</code> and <code>shape-outside</code>.", group: ["clipping-shapes-masking"], kind: "feature", name: "shape()", spec: ["https://drafts.csswg.org/css-shapes-1/#shape-function"], status: { baseline: "low", baseline_low_date: "2026-02-24", by_compat_key: {
    "css.types.basic-shape.shape": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "148", firefox_android: "148", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "135", chrome_android: "135", edge: "135", firefox: "148", firefox_android: "148", safari: "18.4", safari_ios: "18.4" } } }, "shape-outside": { compat_features: ["css.properties.shape-image-threshold", "css.properties.shape-image-threshold.percentages", "css.properties.shape-margin", "css.properties.shape-outside", "css.properties.shape-outside.circle", "css.properties.shape-outside.gradient", "css.properties.shape-outside.image", "css.properties.shape-outside.inset", "css.properties.shape-outside.none", "css.properties.shape-outside.path", "css.properties.shape-outside.polygon"], description: "The shape-outside CSS property, along with shape-margin and shape-image-threshold, sets the shape around which adjacent content will wrap.", description_html: "\
The <code>shape-outside</code> CSS property, along with <code>shape-margin</code> and <code>shape-image-threshold</code>, sets the shape around which adjacent content will wrap.", group: ["clipping-shapes-masking"], kind: "feature", name: "shape-outside", spec: ["https://drafts.csswg.org/css-shapes-1/#declaring-shapes"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.shape-image-threshold": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-image-threshold.percentages": { baseline: false, support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "70", firefox_android: "79" } }, "css.properties.shape-margin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside.circle": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside.gradient": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside.image": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside.inset": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } }, "css.properties.shape-outside.path": { baseline: false, support: {} }, "css.properties.shape-outside.polygon": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.\
3" } } }, support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "62", firefox_android: "62", safari: "10.1", safari_ios: "10.3" } } }, shapes: { caniuse: ["css-shapes"], compat_features: ["css.types.basic-shape", "css.types.basic-shape.animation", "css.types.basic-shape.circle", "css.types.basic-shape.ellipse", "css.types.basic-shape.inset", "css.types.basic-shape.polygon"], description: "The circle(), ellipse(), inset(), and polygon() CSS shape functions create shapes for use with clip-path and shape-outside.", description_html: "The <code>circle()</code>, <code>ellipse()</code>, <code>inset()</code>, and <code>polygon()</code> CSS shape functions create shapes for use with <code>clip-path</code> and <code>shape-outside</code>.", group: ["clipping-shapes-masking"], kind: "feature", name: "shapes", spec: ["https://drafts.csswg.org/css-shapes-1/#basic-shape-functions"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: {
    "css.types.basic-shape": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } }, "css.types.basic-shape.animation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } }, "css.types.basic-shape.circle": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } }, "css.types.basic-shape.ellipse": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1",
    safari_ios: "10.3" } }, "css.types.basic-shape.inset": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } }, "css.types.basic-shape.polygon": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "54", firefox_android: "54", safari: "10.1", safari_ios: "10.3" } } }, share: { compat_features: ["api.Navigator.canShare", "api.Navigator.canShare.data_files_parameter", "api.Navigator.canShare.data_text_parameter", "api.Navigator.share", "api.Navigator.share.data_files_parameter", "api.Navigator.share.data_text_parameter", "html.elements.iframe.allow.web-share", "http.headers.Permissio\
ns-Policy.web-share"], description: "The navigator.share() method invokes the device's native sharing mechanism and passes text, links, files, and other content to share targets. Also known as the Web Share API.", description_html: "The <code>navigator.share()</code> method invokes the device's native sharing mechanism and passes text, links, files, and other content to share targets. Also known as the Web Share API.", kind: "feature", name: "navigator.share()", spec: ["https://w3c.github.io/web-share/"], status: { baseline: false, by_compat_key: { "api.Navigator.canShare": { baseline: false, support: { chrome: "128", chrome_android: "75", edge: "93", firefox_android: "96", safari: "14", safari_ios: "14" } }, "api.Navigator.canShare.data_files_parameter": { baseline: false, support: { chrome: "128", chrome_android: "76", edge: "93", safari: "14", safari_ios: "14" } }, "api.Navigator.canShare.data_text_parameter": { baseline: false, support: { chrome: "128", chrome_android: "76", edge: "\
93", firefox_android: "96", safari: "14", safari_ios: "14" } }, "api.Navigator.share": { baseline: false, support: { chrome: "128", chrome_android: "61", edge: "93", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "api.Navigator.share.data_files_parameter": { baseline: false, support: { chrome: "128", chrome_android: "76", edge: "93", safari: "14", safari_ios: "14" } }, "api.Navigator.share.data_text_parameter": { baseline: false, support: { chrome: "128", chrome_android: "76", edge: "93", firefox_android: "79", safari: "14", safari_ios: "14" } }, "html.elements.iframe.allow.web-share": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "81", firefox_android: "81" } }, "http.headers.Permissions-Policy.web-share": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "128", chrome_android: "61", edge: "93", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, "shared-memory": {
    caniuse: ["sharedarraybuffer"], compat_features: ["javascript.builtins.Atomics", "javascript.builtins.Atomics.Atomic_operations_on_non_shared_buffers", "javascript.builtins.Atomics.add", "javascript.builtins.Atomics.and", "javascript.builtins.Atomics.compareExchange", "javascript.builtins.Atomics.exchange", "javascript.builtins.Atomics.isLockFree", "javascript.builtins.Atomics.load", "javascript.builtins.Atomics.notify", "javascript.builtins.Atomics.or", "javascript.builtins.Atomics.store", "javascript.builtins.Atomics.sub", "javascript.builtins.Atomics.wait", "javascript.builtins.Atomics.xor", "javascript.builtins.DataView.DataView.sharedarraybuffer_support", "javascript.builtins.SharedArrayBuffer", "javascript.builtins.SharedArrayBuffer.@@species", "javascript.builtins.SharedArrayBuffer.SharedArrayBuffer", "javascript.builtins.SharedArrayBuffer.byteLength", "javascript.builtins.SharedArrayBuffer.slice"], description: "The SharedArrayBuffer object represents bytes shared between m\
ultiple workers and the main thread. The Atomics object safely accesses SharedArrayBuffer data to make sure predictable values are read and written and that operations are not interrupted.", description_html: "The <code>SharedArrayBuffer</code> object represents bytes shared between multiple workers and the main thread. The <code>Atomics</code> object safely accesses <code>SharedArrayBuffer</code> data to make sure predictable values are read and written and that operations are not interrupted.", group: ["javascript"], kind: "feature", name: "SharedArrayBuffer and Atomics", spec: ["https://tc39.es/ecma262/multipage/structured-data.html#sec-sharedarraybuffer-objects", "https://tc39.es/ecma262/multipage/structured-data.html#sec-atomics-object"], status: { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", by_compat_key: { "javascript.builtins.Atomics": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "\
68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.Atomic_operations_on_non_shared_buffers": { baseline: false, support: { firefox: "79", firefox_android: "79" } }, "javascript.builtins.Atomics.add": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.and": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.compareExchange": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "\
79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.exchange": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.isLockFree": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.load": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.notify": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "\
89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.or": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.store": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.sub": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.wait": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: {
    chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.Atomics.xor": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.DataView.DataView.sharedarraybuffer_support": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.SharedArrayBuffer": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.SharedArrayBuffer.@@species": { baseline: "\
high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.SharedArrayBuffer.SharedArrayBuffer": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.SharedArrayBuffer.byteLength": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "javascript.builtins.SharedArrayBuffer.slice": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79",
    safari: "15.2", safari_ios: "15.2" } } }, support: { chrome: "68", chrome_android: "89", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } } }, "shared-storage": { compat_features: ["api.HTMLIFrameElement.sharedStorageWritable", "api.HTMLImageElement.sharedStorageWritable", "api.SharedStorage", "api.SharedStorage.append", "api.SharedStorage.clear", "api.SharedStorage.createWorklet", "api.SharedStorage.delete", "api.SharedStorage.get", "api.SharedStorage.run", "api.SharedStorage.selectURL", "api.SharedStorage.set", "api.SharedStorage.worklet", "api.SharedStorageWorklet", "api.SharedStorageWorklet.run", "api.SharedStorageWorklet.selectURL", "api.SharedStorageWorkletGlobalScope", "api.SharedStorageWorkletGlobalScope.register", "api.SharedStorageWorkletGlobalScope.sharedStorage", "api.Window.sharedStorage"], description: "The sharedStorage API stores data to a shared space where the data can then be processed without the ability to track users acros\
s the different sites they visit. A common use case is measuring the reach of third-party ads without using user-tracking cookies.", description_html: "The <code>sharedStorage</code> API stores data to a shared space where the data can then be processed without the ability to track users across the different sites they visit. A common use case is measuring the reach of third-party ads without using user-tracking cookies.", discouraged: { according_to: ["https://groups.google.com/a/chromium.org/g/blink-dev/c/uh5Ke6qyegc", "https://chromestatus.com/feature/5076349064708096"], reason: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the shared storage.", reason_html: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the shared storage.", removal_date: "2\
026-06-01" }, group: ["storage", "worklets"], kind: "feature", name: "Shared storage", spec: ["https://wicg.github.io/shared-storage/"], status: { baseline: false, by_compat_key: { "api.HTMLIFrameElement.sharedStorageWritable": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLImageElement.sharedStorageWritable": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.append": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.clear": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.createWorklet": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.delete": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "12\
6" } }, "api.SharedStorage.get": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.run": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.selectURL": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.set": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorage.worklet": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorageWorklet": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorageWorklet.run": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorageWorklet.selectURL": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorageWorkletGlobalScope": { baseline: false, support: { chrome: "1\
26", chrome_android: "126", edge: "126" } }, "api.SharedStorageWorkletGlobalScope.register": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.SharedStorageWorkletGlobalScope.sharedStorage": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.Window.sharedStorage": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } } }, support: { chrome: "126", chrome_android: "126", edge: "126" } } }, "shared-storage-locks": { compat_features: ["api.SharedStorage.batchUpdate", "api.SharedStorageAppendMethod", "api.SharedStorageAppendMethod.SharedStorageAppendMethod", "api.SharedStorageClearMethod", "api.SharedStorageClearMethod.SharedStorageClearMethod", "api.SharedStorageDeleteMethod", "api.SharedStorageDeleteMethod.SharedStorageDeleteMethod", "api.SharedStorageModifierMethod", "api.SharedStorageSetMethod", "api.SharedStorageSetMethod.SharedStorageSetMethod"], description: "The withLock optio\
n to set(), append(), delete(), clear(), and batchUpdate() methods of the sharedStorage API prevents duplicate reporting from cross-site race conditions.", description_html: "The <code>withLock</code> option to <code>set()</code>, <code>append()</code>, <code>delete()</code>, <code>clear()</code>, and <code>batchUpdate()</code> methods of the <code>sharedStorage</code> API prevents duplicate reporting from cross-site race conditions.", discouraged: { according_to: ["https://groups.google.com/a/chromium.org/g/blink-dev/c/uh5Ke6qyegc", "https://chromestatus.com/feature/5076349064708096"], reason: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including shared storage locks.", reason_html: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including shared storage locks.",
    removal_date: "2026-06-01" }, kind: "feature", name: "Shared storage locks", spec: ["https://wicg.github.io/shared-storage/#web-locks-integration"], status: { baseline: false, by_compat_key: { "api.SharedStorage.batchUpdate": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageAppendMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageAppendMethod.SharedStorageAppendMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageClearMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageClearMethod.SharedStorageClearMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageDeleteMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageDeleteMethod.SharedStorageDe\
leteMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageModifierMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageSetMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } }, "api.SharedStorageSetMethod.SharedStorageSetMethod": { baseline: false, support: { chrome: "134", chrome_android: "134", edge: "134" } } }, support: { chrome: "134", chrome_android: "134", edge: "134" } } }, "shared-workers": { caniuse: ["sharedworkers"], compat_features: ["api.SharedWorker", "api.SharedWorker.SharedWorker", "api.SharedWorker.SharedWorker.mime_checks", "api.SharedWorker.SharedWorker.options_name_parameter", "api.SharedWorker.error_event", "api.SharedWorker.port", "api.SharedWorkerGlobalScope", "api.SharedWorkerGlobalScope.close", "api.SharedWorkerGlobalScope.connect_event", "api.SharedWorkerGlobalScope.name"], description: "The SharedWorker()\
 constructor runs a script in its own thread, which can send and receive messages with other scripts running at the same origin.", description_html: "The <code>SharedWorker()</code> constructor runs a script in its own thread, which can send and receive messages with other scripts running at the same origin.", group: ["workers"], kind: "feature", name: "Shared worker", spec: ["https://html.spec.whatwg.org/multipage/workers.html#shared-workers-introduction"], status: { baseline: false, by_compat_key: { "api.SharedWorker": { baseline: false, support: { chrome: "5", edge: "79", firefox: "29", firefox_android: "33", safari: "16", safari_ios: "16" } }, "api.SharedWorker.SharedWorker": { baseline: false, support: { chrome: "5", edge: "79", firefox: "29", firefox_android: "33", safari: "16", safari_ios: "16" } }, "api.SharedWorker.SharedWorker.mime_checks": { baseline: false, support: { firefox: "81", firefox_android: "81", safari: "16", safari_ios: "16" } }, "api.SharedWorker.SharedWorker.op\
tions_name_parameter": { baseline: false, support: { chrome: "70", edge: "79", firefox: "55", firefox_android: "55" } }, "api.SharedWorker.error_event": { baseline: false, support: { chrome: "5", edge: "79", firefox: "29", firefox_android: "33", safari: "16", safari_ios: "16" } }, "api.SharedWorker.port": { baseline: false, support: { chrome: "5", edge: "79", firefox: "29", firefox_android: "33", safari: "16", safari_ios: "16" } }, "api.SharedWorkerGlobalScope": { baseline: false, support: { chrome: "4", edge: "79", firefox: "29", firefox_android: "29", safari: "16", safari_ios: "16" } }, "api.SharedWorkerGlobalScope.close": { baseline: false, support: { chrome: "4", edge: "79", firefox: "29", firefox_android: "29", safari: "16", safari_ios: "16" } }, "api.SharedWorkerGlobalScope.connect_event": { baseline: false, support: { chrome: "4", edge: "79", firefox: "29", firefox_android: "29", safari: "16", safari_ios: "16" } }, "api.SharedWorkerGlobalScope.name": { baseline: false, support: {
    chrome: "4", edge: "79", firefox: "29", firefox_android: "29", safari: "16", safari_ios: "16" } } }, support: { chrome: "5", edge: "79", firefox: "29", firefox_android: "33", safari: "16", safari_ios: "16" } } }, "show-picker-input": { compat_features: ["api.HTMLInputElement.showPicker", "api.HTMLInputElement.showPicker.color_input", "api.HTMLInputElement.showPicker.date_input", "api.HTMLInputElement.showPicker.datetime_local_input", "api.HTMLInputElement.showPicker.file_input"], description: 'The showPicker() method for <input> elements shows the user interface for picking a value. For example, for <input type="date"> it shows the interface for picking a date.', description_html: 'The <code>showPicker()</code> method for <code>&#x3C;input></code> elements shows the user interface for picking a value. For example, for <code>&#x3C;input type="date"></code> it shows the interface for picking a date.', group: ["forms"], kind: "feature", name: "showPicker() for <input>", spec: ["https:\
//html.spec.whatwg.org/multipage/input.html#dom-input-showpicker"], status: { baseline: false, by_compat_key: { "api.HTMLInputElement.showPicker": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "101", firefox_android: "101", safari: "16", safari_ios: "16" } }, "api.HTMLInputElement.showPicker.color_input": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "101", firefox_android: "101", safari: "16" } }, "api.HTMLInputElement.showPicker.date_input": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "101", firefox_android: "101", safari: "17.4" } }, "api.HTMLInputElement.showPicker.datetime_local_input": { baseline: false, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "101", firefox_android: "101", safari: "17.4" } }, "api.HTMLInputElement.showPicker.file_input": { baseline: "high", baseline_high_date: "\
2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "101", firefox_android: "101", safari: "16", safari_ios: "16" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "101", firefox_android: "101", safari: "17.4" } } }, "show-picker-select": { compat_features: ["api.HTMLSelectElement.showPicker"], description: "The showPicker() method for <select> elements shows the dropdown menu or other user interface for picking one of the options.", description_html: "The <code>showPicker()</code> method for <code>&#x3C;select></code> elements shows the dropdown menu or other user interface for picking one of the options.", group: ["forms"], kind: "feature", name: "showPicker() for <select>", spec: ["https://html.spec.whatwg.org/multipage/input.html#dom-select-showpicker"], status: { baseline: false, by_compat_key: { "api.HTMLSelectElement.showPicker": { baseline: false, support: { chrome: "121", chrome_android: "12\
1", edge: "121", firefox: "122", firefox_android: "122" } } }, support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "122", firefox_android: "122" } } }, "sibling-count": { compat_features: ["css.types.sibling-count", "css.types.sibling-index"], description: "The sibling-count() and sibling-index() CSS functions return integers that are useful to style elements based on their positions among siblings or on the number of siblings, for example as part of a calc() expression.", description_html: "The <code>sibling-count()</code> and <code>sibling-index()</code> CSS functions return integers that are useful to style elements based on their positions among siblings or on the number of siblings, for example as part of a <code>calc()</code> expression.", group: ["css"], kind: "feature", name: "sibling-count() and sibling-index()", spec: ["https://drafts.csswg.org/css-values-5/#tree-counting"], status: { baseline: false, by_compat_key: { "css.types.sibling-count": { baseline: false,
    support: { chrome: "138", chrome_android: "138", edge: "138", safari: "26.2", safari_ios: "26.2" } }, "css.types.sibling-index": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "138", chrome_android: "138", edge: "138", safari: "26.2", safari_ios: "26.2" } } }, "signature-based-resource-integrity": { compat_features: ["html.elements.script.integrity.ed25519_public_key", "http.headers.Signature", "http.headers.Signature-Input", "http.headers.Unencoded-Digest"], description: "Signature-based resource integrity verifies a script's provenance by checking that the resource has been signed with a trusted key given by the <script> element's integrity attribute.", description_html: "Signature-based resource integrity verifies a script's provenance by checking that the resource has been signed with a trusted key given by the <code>&#x3C;script></code> element's <code>integrity</code> attribute.", group: [
    "integrity"], kind: "feature", name: "Signature-based resource integrity", spec: ["https://wicg.github.io/signature-based-sri/"], status: { baseline: false, by_compat_key: { "html.elements.script.integrity.ed25519_public_key": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141" } }, "http.headers.Signature": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141" } }, "http.headers.Signature-Input": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141" } }, "http.headers.Unencoded-Digest": { baseline: false, support: { chrome: "141", chrome_android: "141", edge: "141" } } }, support: { chrome: "141", chrome_android: "141", edge: "141" } } }, "single-color-gradients": { kind: "split", redirect_targets: ["gradients", "conic-gradients"] }, "sizes-auto": { compat_features: ["html.elements.img.sizes.auto"], description: 'The sizes="auto" attribute for the <img> HTML element sets the layout size for the image b\
ased on the computed layout size when choosing a source from the srcset. This attribute only applies to images with the loading="lazy" attribute.', description_html: 'The <code>sizes="auto"</code> attribute for the <code>&#x3C;img></code> HTML element sets the layout size for the image based on the computed layout size when choosing a source from the <code>srcset</code>. This attribute only applies to images with the <code>loading="lazy"</code> attribute.', group: ["images"], kind: "feature", name: '<img sizes="auto" loading="lazy">', spec: ["https://html.spec.whatwg.org/multipage/images.html#valdef-sizes-auto"], status: { baseline: false, by_compat_key: { "html.elements.img.sizes.auto": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "150", firefox_android: "150" } } }, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "150", firefox_android: "150" } } }, slot: { compat_features: ["api.Element.assignedSlot", "api.Element.s\
lot", "api.HTMLSlotElement", "api.HTMLSlotElement.assignedElements", "api.HTMLSlotElement.assignedNodes", "api.HTMLSlotElement.name", "api.HTMLSlotElement.slotchange_event", "api.Text.assignedSlot", "css.selectors.slotted", "html.elements.slot", "html.elements.slot.name", "html.global_attributes.slot"], description: "The <slot> HTML element is a placeholder inside a web component where consumers of the component can insert their own markup.", description_html: "The <code>&#x3C;slot></code> HTML element is a placeholder inside a web component where consumers of the component can insert their own markup.", group: ["html-elements", "web-components"], kind: "feature", name: "<slot>", spec: ["https://html.spec.whatwg.org/multipage/scripting.html#the-slot-element"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.Element.assignedSlot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.Element.slot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.HTMLSlotElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.HTMLSlotElement.assignedElements": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "66", firefox_android: "66", safari: "12.1", safari_ios: "12.2" } }, "api.HTMLSlotElement.assignedNodes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.HTMLSlotElement.name": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "api.HTMLSlotElement.slotchange_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10.1", safari_ios: "10.3" } }, "api.Text.assignedSlot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "css.selectors.slotted": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "50", chrome_android: "50", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "html.elements.slot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "html.elements.slot.name": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } }, "html.global_attributes.slot": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } } }, support: { chrome: "53", chrome_android: "53", edge: "79", firefox: "63", firefox_android: "63", safari: "10", safari_ios: "10" } } },
    "slot-assign": { compat_features: ["api.HTMLSlotElement.assign", "api.ShadowRoot.slotAssignment"], description: 'The assign() method for <slot> elements assigns nodes to the slot, as an alternative to using the slot and name HTML attributes. The nodes must be children of a shadow host and the shadow root must be created with the slotAssignment set to "manual". Also known as manual slot assignment.', description_html: 'The <code>assign()</code> method for <code>&#x3C;slot></code> elements assigns nodes to the slot, as an alternative to using the <code>slot</code> and <code>name</code> HTML attributes. The nodes must be children of a shadow host and the shadow root must be created with the <code>slotAssignment</code> set to "manual". Also known as manual slot assignment.', group: ["web-components"], kind: "feature", name: "Imperative slot assignment", spec: ["https://html.spec.whatwg.org/multipage/scripting.html#dom-slot-assign"], status: { baseline: "high", baseline_high_date: "2025\
-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "api.HTMLSlotElement.assign": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "92", firefox_android: "92", safari: "16.4", safari_ios: "16.4" } }, "api.ShadowRoot.slotAssignment": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "92", firefox_android: "92", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "92", firefox_android: "92", safari: "16.4", safari_ios: "16.4" } } }, small: { compat_features: ["html.elements.small"], description: "The <small> element represents side-comments and small print, like copyright and legal text, independent of its styled presentation. Styled in a reduced font size by default.", description_html: "The <code>&#x3C;small></code\
> element represents side-comments and small print, like copyright and legal text, independent of its styled presentation. Styled in a reduced font size by default.", group: ["html-elements"], kind: "feature", name: "<small>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-small-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.small": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "smil-svg-animations": { caniuse: ["svg-smil"], compat_features: ["api.SVGAnimateElement", "api.SVGAnimateMotionElement", "api.SVGAnimateTransformElement", "api.SVGAnimatedAngle", "\
api.SVGAnimatedAngle.animVal", "api.SVGAnimatedAngle.baseVal", "api.SVGAnimatedBoolean", "api.SVGAnimatedBoolean.animVal", "api.SVGAnimatedBoolean.baseVal", "api.SVGAnimatedEnumeration", "api.SVGAnimatedEnumeration.animVal", "api.SVGAnimatedEnumeration.baseVal", "api.SVGAnimatedInteger", "api.SVGAnimatedInteger.animVal", "api.SVGAnimatedInteger.baseVal", "api.SVGAnimatedLength", "api.SVGAnimatedLength.animVal", "api.SVGAnimatedLength.baseVal", "api.SVGAnimatedLengthList", "api.SVGAnimatedLengthList.animVal", "api.SVGAnimatedLengthList.baseVal", "api.SVGAnimatedNumber", "api.SVGAnimatedNumber.animVal", "api.SVGAnimatedNumber.baseVal", "api.SVGAnimatedNumberList", "api.SVGAnimatedNumberList.animVal", "api.SVGAnimatedNumberList.baseVal", "api.SVGAnimatedPreserveAspectRatio", "api.SVGAnimatedPreserveAspectRatio.animVal", "api.SVGAnimatedPreserveAspectRatio.baseVal", "api.SVGAnimatedRect", "api.SVGAnimatedRect.animVal", "api.SVGAnimatedRect.baseVal", "api.SVGAnimatedString", "api.SVGAnimate\
dString.animVal", "api.SVGAnimatedString.baseVal", "api.SVGAnimatedTransformList", "api.SVGAnimatedTransformList.animVal", "api.SVGAnimatedTransformList.baseVal", "api.SVGAnimationElement", "api.SVGAnimationElement.beginElement", "api.SVGAnimationElement.beginElementAt", "api.SVGAnimationElement.beginEvent_event", "api.SVGAnimationElement.endElement", "api.SVGAnimationElement.endElementAt", "api.SVGAnimationElement.endEvent_event", "api.SVGAnimationElement.getCurrentTime", "api.SVGAnimationElement.getSimpleDuration", "api.SVGAnimationElement.getStartTime", "api.SVGAnimationElement.repeatEvent_event", "api.SVGAnimationElement.requiredExtensions", "api.SVGAnimationElement.systemLanguage", "api.SVGAnimationElement.targetElement", "api.SVGPolygonElement.animatedPoints", "api.SVGPolylineElement.animatedPoints", "api.SVGSVGElement.animationsPaused", "api.SVGSVGElement.pauseAnimations", "api.SVGSVGElement.unpauseAnimations", "api.TimeEvent", "api.TimeEvent.detail", "api.TimeEvent.initTimeEven\
t", "api.TimeEvent.view", "svg.elements.animate", "svg.elements.animate.attributeName", "svg.elements.animate.attributeType", "svg.elements.animate.dur", "svg.elements.animate.fill", "svg.elements.animate.from", "svg.elements.animate.href", "svg.elements.animate.repeatCount", "svg.elements.animate.systemLanguage", "svg.elements.animate.to", "svg.elements.animateMotion", "svg.elements.animateMotion.calcMode", "svg.elements.animateMotion.fill", "svg.elements.animateMotion.href", "svg.elements.animateMotion.keyPoints", "svg.elements.animateMotion.origin", "svg.elements.animateMotion.path", "svg.elements.animateMotion.rotate", "svg.elements.animateMotion.systemLanguage", "svg.elements.animateTransform", "svg.elements.animateTransform.by", "svg.elements.animateTransform.fill", "svg.elements.animateTransform.from", "svg.elements.animateTransform.href", "svg.elements.animateTransform.systemLanguage", "svg.elements.animateTransform.to", "svg.elements.animateTransform.type", "svg.global_attribu\
tes.class.animation_support"], description: "The <animate>, <animateMotion>, and <animateTransform> SVG elements declaratively animate SVG elements. Also known as SMIL.", description_html: "The <code>&#x3C;animate></code>, <code>&#x3C;animateMotion></code>, and <code>&#x3C;animateTransform></code> SVG elements declaratively animate SVG elements. Also known as SMIL.", group: ["animation", "svg"], kind: "feature", name: "SMIL SVG animations", spec: ["https://svgwg.org/specs/animations/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.SVGAnimateElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimateMotionElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "\
25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGAnimateTransformElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedAngle.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedAngle.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedBoolean": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.SVGAnimatedBoolean.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedBoolean.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedEnumeration": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedEnumeration.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedEnumeration.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedInteger": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.SVGAnimatedInteger.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "\
3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedInteger.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedLength.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedLength.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedLengthList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedLengthList.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedLengthList.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedNumber": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "\
3", safari_ios: "1" } }, "api.SVGAnimatedNumber.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedNumber.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedNumberList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.SVGAnimatedNumberList.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6",
    safari_ios: "6" } }, "api.SVGAnimatedNumberList.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedPreserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.SVGAnimatedPreserveAspectRatio.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "22", firefox_android: "22", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedPreserveAspectRatio.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "22",
    firefox_android: "22", safari: "6", safari_ios: "6" } }, "api.SVGAnimatedRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedRect.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedRect.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedString.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedString.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedTransformList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedTransformList.animVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.SVGAnimatedTransformList.baseVal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimationElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAnimationElement.beginElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.beginElementAt": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "\
4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.beginEvent_event": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "93", firefox_android: "93", safari: "26.2", safari_ios: "26.2" } }, "api.SVGAnimationElement.endElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.endElementAt": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.endEvent_event": { baseline: false, support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "93", firefox_android: "93" } }, "api.SVGAnimationElement.getCurrentTime": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.getSimpleDuration": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.getStartTime": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGAnimationElement.repeatEvent_event": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "93", firefox_android: "93", safari: "26.2", safari_ios: "26.2" } }, "api.SVGAnimationElement.requiredExtensions": {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGAnimationElement.systemLanguage": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGAnimationElement.targetElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGPolygonElement.animatedPoints": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SV\
GPolylineElement.animatedPoints": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.animationsPaused": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.pauseAnimations": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.unpauseAnimations": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.TimeEvent": { baseline: false, support: { firefox: "4", firefox_android: "4" } }, "api.TimeEvent.detail": { baseline: false, support: { firefox: "4", firefox_android: "4" } }, "api.TimeEvent.initTimeEvent": { baseline: false, support: { firefox: "4", firefox_android: "4" } }, "api.TimeEvent.view": { baseline: false, support: { firefox: "4", firefox_android: "4" } }, "svg.elements.animate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.animate.attributeName": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.elements.animate.attributeType": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.elements.animate.dur": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.elements.animate.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.animate.from": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.elements.animate.href": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
50", chrome_android: "50", edge: "79", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.animate.repeatCount": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.elements.animate.systemLanguage": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "12", firefox_android: "14", safari: "3.1", safari_ios: "2" } }, "svg.elements.animate.to": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.elements.animateMotion": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.calcMode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.href": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.animateMotion.keyPoints": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.origin": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.path": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.rotate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.animateMotion.systemLanguage": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "12", firefox_android: "14", safari: "6", safari_ios: "6" } }, "svg.elements.animateTransform": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "svg.elements.animateTransform.by": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.animateTransform.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "svg.elements.animateTransform.from": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.animateTransform.href": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.animateTransform.systemLanguage": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "svg.elements.animateTransform.to": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.animateTransform.type": { baseline: "high", baseline_high_date: "20\
22-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.global_attributes.class.animation_support": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "5", firefox_android: "5", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } } }, smooth: { compat_features: ["css.properties.image-rendering.smooth"], description: "The image-rendering: smooth CSS declaration scales images while retaining a gradual color blending that is useful for photos.", description_html: "The <code>image-rendering: smooth</code> CSS declaration scales images while retaining a gradual color blending that is useful for photos.", group: ["image-scaling"], kind: "feature", name: "image-r\
endering: smooth", spec: ["https://drafts.csswg.org/css-images-3/#the-image-rendering"], status: { baseline: false, by_compat_key: { "css.properties.image-rendering.smooth": { baseline: false, support: { firefox: "93", firefox_android: "93" } } }, support: { firefox: "93", firefox_android: "93" } } }, source: { compat_features: ["html.elements.source", "html.elements.source.height", "html.elements.source.media", "html.elements.source.src", "html.elements.source.type", "html.elements.source.width"], description: "The <source> element sets a media resource for the <picture>, <video>, and <audio> elements.", description_html: "The <code>&#x3C;source></code> element sets a media resource for the <code>&#x3C;picture></code>, <code>&#x3C;video></code>, and <code>&#x3C;audio></code> elements.", group: ["media-elements", "html-elements"], kind: "feature", name: "<source>", spec: ["https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element"], status: { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.source": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "html.elements.source.height": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "108", firefox_android: "108", safari: "15", safari_ios: "15" } }, "html.elements.source.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3.1", safari_ios: "2" } }, "html.elements.source.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "\
4", safari: "3.1", safari_ios: "2" } }, "html.elements.source.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "html.elements.source.width": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "108", firefox_android: "108", safari: "15", safari_ios: "15" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, "sourcemap-header": { compat_features: ["http.headers.SourceMap"], description: "The Sourcemap HTTP response header links generated code to a source map, so the browser shows the original source in a debugger. This makes it easier to work with minified or transpiled code.", description_html: "The <code>Sourcemap</code> HTT\
P response header links generated code to a source map, so the browser shows the original source in a debugger. This makes it easier to work with minified or transpiled code.", kind: "feature", name: "Sourcemap header", spec: ["https://tc39.es/ecma426/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "http.headers.SourceMap": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "18", chrome_android: "18", edge: "79", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "7" } } }, support: { chrome: "18", chrome_android: "18", edge: "79", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "7" } } }, span: { compat_features: ["api.HTMLSpanElement", "html.elements.span"], description: "The <span> HTML element is the generic inline container for content.", description_html: "The <code>&#x3C;span></code> HTML element is the generic inline container for\
 content.", group: ["html-elements"], kind: "feature", name: "<span>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-span-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLSpanElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "6", safari_ios: "6" } }, "html.elements.span": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, speak: { compat_features: ["css.properties.speak"], description: "The speak CSS property sets whether or not text sh\
ould be spoken.", description_html: "The <code>speak</code> CSS property sets whether or not text should be spoken.", group: ["speech", "css"], kind: "feature", name: "speak", spec: ["https://drafts.csswg.org/css-speech-1/#speaking-props-speak"], status: { baseline: false, by_compat_key: { "css.properties.speak": { baseline: false, support: {} } }, support: {} } }, "speak-as": { compat_features: ["css.properties.speak-as", "css.properties.speak-as.digits", "css.properties.speak-as.literal-punctuation", "css.properties.speak-as.no-punctuation", "css.properties.speak-as.normal", "css.properties.speak-as.spell-out"], description: "The speak-as CSS property sets how any element's content is spoken. Not to be confused with the speak-as descriptor of @counter-style at-rules.", description_html: "The <code>speak-as</code> CSS property sets how any element's content is spoken. Not to be confused with the <code>speak-as</code> descriptor of <code>@counter-style</code> at-rules.", group: ["speec\
h", "css"], kind: "feature", name: "speak-as", spec: ["https://drafts.csswg.org/css-speech-1/#speaking-props-speak-as"], status: { baseline: false, by_compat_key: { "css.properties.speak-as": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "css.properties.speak-as.digits": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "css.properties.speak-as.literal-punctuation": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "css.properties.speak-as.no-punctuation": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "css.properties.speak-as.normal": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "css.properties.speak-as.spell-out": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } } }, support: { safari: "11.1", safari_ios: "11.3" } } }, "speculation-rules": { compat_features: ["api.Document.prerendering", "api.Document.prerenderingchange_event", "api.PerformanceNavigationTi\
ming.activationStart", "api.Request.destination.speculationrules", "html.elements.script.type.speculationrules", "html.elements.script.type.speculationrules.eagerness", "html.elements.script.type.speculationrules.expects_no_vary_search", "html.elements.script.type.speculationrules.prefetch", "html.elements.script.type.speculationrules.prerender", "html.elements.script.type.speculationrules.referrer_policy", "html.elements.script.type.speculationrules.relative_to", "html.elements.script.type.speculationrules.requires", "html.elements.script.type.speculationrules.requires.anonymous-client-ip-when-cross-origin", "html.elements.script.type.speculationrules.source_optional", "html.elements.script.type.speculationrules.tag", "html.elements.script.type.speculationrules.target_hint", "html.elements.script.type.speculationrules.urls", "html.elements.script.type.speculationrules.where", "http.headers.Content-Security-Policy.script-src.inline-speculation-rules", "http.headers.Sec-Purpose.speculat\
ionrules", "http.headers.Sec-Speculation-Tags", "http.headers.Speculation-Rules", "http.headers.Supports-Loading-Mode", "http.headers.Supports-Loading-Mode.credentialed-prerender", "http.headers.Supports-Loading-Mode.fenced-frame"], description: "Speculation rules are hints to the browser to proactively download pages in the background so they appear instantly when the user navigates to them.", description_html: "Speculation rules are hints to the browser to proactively download pages in the background so they appear instantly when the user navigates to them.", kind: "feature", name: "Speculation rules", spec: ["https://html.spec.whatwg.org/multipage/speculative-loading.html#speculation-rules", "https://wicg.github.io/nav-speculation/prerendering.html"], status: { baseline: false, by_compat_key: { "api.Document.prerendering": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.Document.prerenderingchange_event": { baseline: false, support: { chrome: "\
108", chrome_android: "108", edge: "108" } }, "api.PerformanceNavigationTiming.activationStart": { baseline: false, support: { chrome: "108", chrome_android: "57", edge: "108" } }, "api.Request.destination.speculationrules": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "html.elements.script.type.speculationrules": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109" } }, "html.elements.script.type.speculationrules.eagerness": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "html.elements.script.type.speculationrules.expects_no_vary_search": { baseline: false, support: { chrome: "127", chrome_android: "127", edge: "127" } }, "html.elements.script.type.speculationrules.prefetch": { baseline: false, support: { chrome: "110", chrome_android: "109", edge: "110" } }, "html.elements.script.type.speculationrules.prerender": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "\
109" } }, "html.elements.script.type.speculationrules.referrer_policy": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "html.elements.script.type.speculationrules.relative_to": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "html.elements.script.type.speculationrules.requires": { baseline: false, support: { chrome: "110", chrome_android: "109", edge: "110" } }, "html.elements.script.type.speculationrules.requires.anonymous-client-ip-when-cross-origin": { baseline: false, support: { chrome: "110", chrome_android: "109" } }, "html.elements.script.type.speculationrules.source_optional": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "html.elements.script.type.speculationrules.tag": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136" } }, "html.elements.script.type.speculationrules.target_hint": { baseline: false, support: {} }, "html.elements.script\
.type.speculationrules.urls": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109" } }, "html.elements.script.type.speculationrules.where": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "http.headers.Content-Security-Policy.script-src.inline-speculation-rules": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "http.headers.Sec-Purpose.speculationrules": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "http.headers.Sec-Speculation-Tags": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136" } }, "http.headers.Speculation-Rules": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121" } }, "http.headers.Supports-Loading-Mode": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109" } }, "http.headers.Supports-Loading-Mode.credentialed-prerender": { baseline: false, support: { chrome: "\
109", chrome_android: "109", edge: "109" } }, "http.headers.Supports-Loading-Mode.fenced-frame": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } } }, support: { chrome: "109", chrome_android: "109", edge: "109" } } }, "speech-recognition": { caniuse: ["speech-recognition"], compat_features: ["api.SpeechRecognition", "api.SpeechRecognition.SpeechRecognition", "api.SpeechRecognition.abort", "api.SpeechRecognition.audioend_event", "api.SpeechRecognition.audiostart_event", "api.SpeechRecognition.continuous", "api.SpeechRecognition.end_event", "api.SpeechRecognition.error_event", "api.SpeechRecognition.interimResults", "api.SpeechRecognition.lang", "api.SpeechRecognition.maxAlternatives", "api.SpeechRecognition.nomatch_event", "api.SpeechRecognition.result_event", "api.SpeechRecognition.soundend_event", "api.SpeechRecognition.soundstart_event", "api.SpeechRecognition.speechend_event", "api.SpeechRecognition.speechstart_event", "api.SpeechRecognition.start",
    "api.SpeechRecognition.start_event", "api.SpeechRecognition.stop", "api.SpeechRecognitionAlternative", "api.SpeechRecognitionAlternative.confidence", "api.SpeechRecognitionAlternative.transcript", "api.SpeechRecognitionErrorEvent", "api.SpeechRecognitionErrorEvent.SpeechRecognitionErrorEvent", "api.SpeechRecognitionErrorEvent.error", "api.SpeechRecognitionErrorEvent.message", "api.SpeechRecognitionEvent", "api.SpeechRecognitionEvent.SpeechRecognitionEvent", "api.SpeechRecognitionEvent.resultIndex", "api.SpeechRecognitionEvent.results", "api.SpeechRecognitionResult", "api.SpeechRecognitionResult.isFinal", "api.SpeechRecognitionResult.item", "api.SpeechRecognitionResult.length", "api.SpeechRecognitionResultList", "api.SpeechRecognitionResultList.item", "api.SpeechRecognitionResultList.length"], description: "The SpeechRecognition API converts audio into text using the device's speech recognition service.", description_html: "The <code>SpeechRecognition</code> API converts audio into \
text using the device's speech recognition service.", group: ["speech"], kind: "feature", name: "Speech recognition", spec: ["https://webaudio.github.io/web-speech-api/#speechreco-section"], status: { baseline: false, by_compat_key: { "api.SpeechRecognition": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.SpeechRecognition": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.abort": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.audioend_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.audiostart_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.continuous": { baseline: false, support: { chrome: "139", edge: "139" } }, "api.SpeechRecognition.end_event": { baseline: false, support: {
    chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.error_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.interimResults": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.lang": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.maxAlternatives": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.nomatch_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.result_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.soundend_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.soundstart_event": { baseline: false, support: { chrome: "\
139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.speechend_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.speechstart_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.start": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.start_event": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.stop": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognitionAlternative": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionAlternative.confidence": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionAltern\
ative.transcript": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionErrorEvent": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionErrorEvent.SpeechRecognitionErrorEvent": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionErrorEvent.error": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionErrorEvent.message": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionEvent": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionEvent.SpeechRecognitionE\
vent": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionEvent.resultIndex": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionEvent.results": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResult": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResult.isFinal": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResult.item": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResult.length": { baseline: false, support: { chrome: "33", chrome_android: "\
33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResultList": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResultList.item": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.SpeechRecognitionResultList.length": { baseline: false, support: { chrome: "33", chrome_android: "33", edge: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, "speech-recognition-grammar": { compat_features: ["api.SpeechGrammar", "api.SpeechGrammar.src", "api.SpeechGrammar.weight", "api.SpeechGrammarList", "api.SpeechGrammarList.SpeechGrammarList", "api.SpeechGrammarList.addFromString", "api.SpeechGrammarList.addFromURI", "api.SpeechGrammarList.item", "api.SpeechGrammarList.length", "api.SpeechRecognition.grammars"], description: "The SpeechRecognition.gr\
ammars property of the Web Speech API represents a set of words or patterns of words that the recognition service should recognize, used for when the recognition service's accuracy is low.", description_html: "The <code>SpeechRecognition.grammars</code> property of the Web Speech API represents a set of words or patterns of words that the recognition service should recognize, used for when the recognition service's accuracy is low.", discouraged: { according_to: ["https://github.com/WebAudio/web-speech-api/pull/117"], reason: "Advancements in speech recognition mean that speech grammars are not needed to achieve low error rates.", reason_html: "Advancements in speech recognition mean that speech grammars are not needed to achieve low error rates." }, group: ["speech"], kind: "feature", name: "Speech recognition grammar", spec: ["https://webaudio.github.io/web-speech-api/#speechreco-section"], status: { baseline: false, by_compat_key: { "api.SpeechGrammar": { baseline: false, support: {} },
    "api.SpeechGrammar.src": { baseline: false, support: {} }, "api.SpeechGrammar.weight": { baseline: false, support: {} }, "api.SpeechGrammarList": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechGrammarList.SpeechGrammarList": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechGrammarList.addFromString": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechGrammarList.addFromURI": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechGrammarList.item": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechGrammarList.length": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } }, "api.SpeechRecognition.grammars": { baseline: false, support: { chrome: "139", chrome_android: "139", edge: "139" } } }, support: {} } }, "speech-synthesis": { caniuse: [
    "speech-synthesis"], compat_features: ["api.SpeechSynthesis", "api.SpeechSynthesis.cancel", "api.SpeechSynthesis.getVoices", "api.SpeechSynthesis.pause", "api.SpeechSynthesis.paused", "api.SpeechSynthesis.pending", "api.SpeechSynthesis.resume", "api.SpeechSynthesis.speak", "api.SpeechSynthesis.speaking", "api.SpeechSynthesis.voiceschanged_event", "api.SpeechSynthesisErrorEvent", "api.SpeechSynthesisErrorEvent.SpeechSynthesisErrorEvent", "api.SpeechSynthesisErrorEvent.error", "api.SpeechSynthesisEvent", "api.SpeechSynthesisEvent.SpeechSynthesisEvent", "api.SpeechSynthesisEvent.charIndex", "api.SpeechSynthesisEvent.charLength", "api.SpeechSynthesisEvent.elapsedTime", "api.SpeechSynthesisEvent.name", "api.SpeechSynthesisEvent.utterance", "api.SpeechSynthesisUtterance", "api.SpeechSynthesisUtterance.SpeechSynthesisUtterance", "api.SpeechSynthesisUtterance.boundary_event", "api.SpeechSynthesisUtterance.end_event", "api.SpeechSynthesisUtterance.error_event", "api.SpeechSynthesisUtterance\
.lang", "api.SpeechSynthesisUtterance.mark_event", "api.SpeechSynthesisUtterance.pause_event", "api.SpeechSynthesisUtterance.pitch", "api.SpeechSynthesisUtterance.rate", "api.SpeechSynthesisUtterance.resume_event", "api.SpeechSynthesisUtterance.start_event", "api.SpeechSynthesisUtterance.text", "api.SpeechSynthesisUtterance.voice", "api.SpeechSynthesisUtterance.volume", "api.SpeechSynthesisVoice", "api.SpeechSynthesisVoice.default", "api.SpeechSynthesisVoice.lang", "api.SpeechSynthesisVoice.localService", "api.SpeechSynthesisVoice.name", "api.SpeechSynthesisVoice.voiceURI", "api.Window.speechSynthesis"], description: "The SpeechSynthesis API converts text to speech with artificial voices.", description_html: "The <code>SpeechSynthesis</code> API converts text to speech with artificial voices.", group: ["speech"], kind: "feature", name: "Speech synthesis", spec: ["https://webaudio.github.io/web-speech-api/#tts-section"], status: { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "\
2018-09-05", by_compat_key: { "api.SpeechSynthesis": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.cancel": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.getVoices": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.pause": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "\
7" } }, "api.SpeechSynthesis.paused": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.pending": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.resume": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.speak": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "\
api.SpeechSynthesis.speaking": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesis.voiceschanged_event": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "16", safari_ios: "16" } }, "api.SpeechSynthesisErrorEvent": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "33", chrome_android: "33", edge: "≤18", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisErrorEvent.SpeechSynthesisErrorEvent": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "49", firefox_android: "\
62", safari: "16", safari_ios: "16" } }, "api.SpeechSynthesisErrorEvent.error": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "33", chrome_android: "33", edge: "≤18", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisEvent": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisEvent.SpeechSynthesisEvent": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "71", chrome_android: "71", edge: "14", firefox: "49", firefox_android: "62", safari: "16", safari_ios: "16" } }, "api.SpeechSynthesisEvent.charIndex": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "\
14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisEvent.charLength": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "77", chrome_android: "77", edge: "15", firefox: "53", firefox_android: "62", safari: "16", safari_ios: "16" } }, "api.SpeechSynthesisEvent.elapsedTime": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisEvent.name": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisEvent.utterance": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "33", chrome_android: "\
33", edge: "14", firefox: "49", firefox_android: "62", safari: "16", safari_ios: "16" } }, "api.SpeechSynthesisUtterance": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.SpeechSynthesisUtterance": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.boundary_event": { baseline: false, support: { edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.end_event": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62",
    safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.error_event": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.lang": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.mark_event": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.pause_event": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "\
14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.pitch": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.rate": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.resume_event": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.start_event": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "\
33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.text": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.voice": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisUtterance.volume": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisVoice": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: {
    chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisVoice.default": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisVoice.lang": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisVoice.localService": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisVoice.name": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-\
09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.SpeechSynthesisVoice.voiceURI": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } }, "api.Window.speechSynthesis": { baseline: "high", baseline_high_date: "2021-03-05", baseline_low_date: "2018-09-05", support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } } }, support: { chrome: "33", chrome_android: "33", edge: "14", firefox: "49", firefox_android: "62", safari: "7", safari_ios: "7" } } }, spellcheck: { compat_features: ["api.HTMLElement.spellcheck", "html.global_attributes.spellcheck"], description: "The spellcheck global HTML attribute sets whether the browser may check an element for spelling errors.", description_html: "\
The <code>spellcheck</code> global HTML attribute sets whether the browser may check an element for spelling errors.", kind: "feature", name: "spellcheck", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#attr-spellcheck"], status: { baseline: "high", baseline_high_date: "2020-05-28", baseline_low_date: "2017-11-28", by_compat_key: { "api.HTMLElement.spellcheck": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "html.global_attributes.spellcheck": { baseline: "high", baseline_high_date: "2020-05-28", baseline_low_date: "2017-11-28", support: { chrome: "9", chrome_android: "47", edge: "12", firefox: "2", firefox_android: "57", safari: "5.1", safari_ios: "5" } } }, support: { chrome: "9", chrome_android: "47", edge: "12", firefox: "2", firefox_android: "57", safari: "5.1", safari_ios: "5" } } }, "spelling-gr\
ammar-error": { compat_features: ["css.selectors.grammar-error", "css.selectors.spelling-error"], description: "The ::spelling-error and ::grammar-error CSS pseudo-elements match text that is highlighted as misspelled and grammatically incorrect, respectively.", description_html: "The <code>::spelling-error</code> and <code>::grammar-error</code> CSS pseudo-elements match text that is highlighted as misspelled and grammatically incorrect, respectively.", group: ["selectors"], kind: "feature", name: "::spelling-error and ::grammar-error", spec: ["https://drafts.csswg.org/css-pseudo-4/#selectordef-spelling-error", "https://drafts.csswg.org/css-pseudo-4/#selectordef-grammar-error"], status: { baseline: false, by_compat_key: { "css.selectors.grammar-error": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121", safari: "17.4", safari_ios: "17.4" } }, "css.selectors.spelling-error": { baseline: false, support: { chrome: "121", chrome_android: "121", edge: "121", safari: "\
17.4", safari_ios: "17.4" } } }, support: { chrome: "121", chrome_android: "121", edge: "121", safari: "17.4", safari_ios: "17.4" } } }, spread: { compat_features: ["javascript.operators.spread", "javascript.operators.spread.spread_in_arrays", "javascript.operators.spread.spread_in_function_calls", "javascript.operators.spread.spread_in_object_literals"], description: "The spread (...) syntax allows an iterable, such as an array or string, to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected.", description_html: "The spread (<code>...</code>) syntax allows an iterable, such as an array or string, to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected.", group: ["javascript"], kind: "feature", name: "Spread syntax", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#prod-SpreadElement"], status: {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.operators.spread": { baseline: "high", baseline_high_date: "2018-04-14", baseline_low_date: "2015-10-14", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "16", firefox_android: "16", safari: "8", safari_ios: "8" } }, "javascript.operators.spread.spread_in_arrays": { baseline: "high", baseline_high_date: "2018-04-14", baseline_low_date: "2015-10-14", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "16", firefox_android: "16", safari: "8", safari_ios: "8" } }, "javascript.operators.spread.spread_in_function_calls": { baseline: "high", baseline_high_date: "2018-04-14", baseline_low_date: "2015-10-14", support: { chrome: "46", chrome_android: "46", edge: "12", firefox: "27", firefox_android: "27", safari: "8", safari_ios: "8" } }, "javascript.operators.spread.spread_in_object_literals": { baseline: "high", baseline_high_date: "2022-07\
-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "55", firefox_android: "55", safari: "11.1", safari_ios: "11.3" } } }, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "55", firefox_android: "55", safari: "11.1", safari_ios: "11.3" } } }, srcset: { caniuse: ["srcset"], compat_features: ["api.HTMLImageElement.sizes", "api.HTMLImageElement.srcset", "api.HTMLSourceElement.sizes", "api.HTMLSourceElement.srcset", "html.elements.img.sizes", "html.elements.img.srcset", "html.elements.source.sizes", "html.elements.source.srcset"], description: "The srcset and sizes attributes for <img> elements set a list of possible sources for the image and a corresponding list of size conditions for choosing a source, to show a responsive image that fits the size of the display.", description_html: "The <code>srcset</code> and <code>sizes</code> attributes for <code>&#x3C;img></code> elements set a list of possible sources for the\
 image and a corresponding list of size conditions for choosing a source, to show a responsive image that fits the size of the display.", group: ["html"], kind: "feature", name: "srcset and sizes", spec: ["https://html.spec.whatwg.org/multipage/embedded-content.html#attr-img-srcset"], status: { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", by_compat_key: { "api.HTMLImageElement.sizes": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "9.1", safari_ios: "9.3" } }, "api.HTMLImageElement.srcset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "38", firefox_android: "38", safari: "8", safari_ios: "8" } }, "api.HTMLSourceElement.sizes": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "\
2017-03-27", support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLSourceElement.srcset": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "10.1", safari_ios: "10.3" } }, "html.elements.img.sizes": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "38", firefox_android: "38", safari: "9.1", safari_ios: "9.3" } }, "html.elements.img.srcset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "38", firefox_android: "38", safari: "8", safari_ios: "8" } }, "html.elements.source.sizes": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "\
2016-03-21", support: { chrome: "34", chrome_android: "34", edge: "13", firefox: "38", firefox_android: "38", safari: "9.1", safari_ios: "9.3" } }, "html.elements.source.srcset": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "34", chrome_android: "34", edge: "13", firefox: "38", firefox_android: "38", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "38", chrome_android: "38", edge: "13", firefox: "38", firefox_android: "38", safari: "10.1", safari_ios: "10.3" } } }, "stable-array-sort": { compat_features: ["javascript.builtins.Array.sort.stable_sorting"], description: "Stable array sort() function", description_html: "Stable array sort() function", group: ["arrays"], kind: "feature", name: "Stable array sort", snapshot: ["ecmascript-2019"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.sort"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2\
020-01-15", by_compat_key: { "javascript.builtins.Array.sort.stable_sorting": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "3", firefox_android: "4", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "3", firefox_android: "4", safari: "10.1", safari_ios: "10.3" } } }, "starting-style": { compat_features: ["api.CSSStartingStyleRule", "css.at-rules.starting-style"], description: "The @starting-style CSS at-rule sets the starting values for properties that are transitioning when the target element's style is first updated.", description_html: "The <code>@starting-style</code> CSS at-rule sets the starting values for properties that are transitioning when the target element's style is first updated.", group: ["css"], kind: "feature", name: "@starting-style", spec: ["https://drafts.csswg.org/css-transitions-2/#defining-befo\
re-change-style"], status: { baseline: "low", baseline_low_date: "2024-08-06", by_compat_key: { "api.CSSStartingStyleRule": { baseline: "low", baseline_low_date: "2024-08-06", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "129", firefox_android: "129", safari: "17.5", safari_ios: "17.5" } }, "css.at-rules.starting-style": { baseline: "low", baseline_low_date: "2024-08-06", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "129", firefox_android: "129", safari: "17.5", safari_ios: "17.5" } } }, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "129", firefox_android: "129", safari: "17.5", safari_ios: "17.5" } } }, state: { compat_features: ["api.CustomStateSet", "api.CustomStateSet.@@iterator", "api.CustomStateSet.add", "api.CustomStateSet.clear", "api.CustomStateSet.delete", "api.CustomStateSet.entries", "api.CustomStateSet.forEach", "api.CustomStateSet.has", "api.CustomStateSet.keys", "api.CustomStateSet.size", "api.C\
ustomStateSet.values", "api.ElementInternals.states", "css.selectors.state"], description: "The :state() CSS pseudo-class matches custom elements based on their custom state, set through the ElementInternals.states API.", description_html: "The <code>:state()</code> CSS pseudo-class matches custom elements based on their custom state, set through the <code>ElementInternals.states</code> API.", group: ["custom-elements"], kind: "feature", name: ":state()", spec: ["https://html.spec.whatwg.org/multipage/custom-elements.html#custom-state-pseudo-class"], status: { baseline: "low", baseline_low_date: "2024-05-17", by_compat_key: { "api.CustomStateSet": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.@@iterator": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "\
126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.add": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.clear": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.delete": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.entries": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.forEach": { baseline: "low", baseline_low_date: "\
2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.has": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.keys": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.size": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "api.CustomStateSet.values": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4",
    safari_ios: "17.4" } }, "api.ElementInternals.states": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } }, "css.selectors.state": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "126", firefox_android: "126", safari: "17.4", safari_ios: "17.4" } } }, "static-positioning": { compat_features: ["css.properties.position.static"], description: "The position: static CSS declaration positions an element in the normal flow. A statically positioned element ignores physical and logical properties such as top or inset-block-start.", description_html: "The <code>position: static</code> CSS declaration positions an element in the normal flow. \
A statically positioned element ignores physical and logical properties such as <code>top</code> or <code>inset-block-start</code>.", group: ["positioning"], kind: "feature", name: "Static positioning", spec: ["https://drafts.csswg.org/css-position-3/#position-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.position.static": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "steps-easing": { compat_features: ["css.types.easing-function.steps", "css.types.easing-function.steps.jump"], description: "The steps() CSS easing function divides an animation or transition into equidistant intervals, jumping from \
value to value. The step-start and step-end keyword values are presets with a single interval.", description_html: "The <code>steps()</code> CSS easing function divides an animation or transition into equidistant intervals, jumping from value to value. The <code>step-start</code> and <code>step-end</code> keyword values are presets with a single interval.", group: ["animation", "transitions"], kind: "feature", name: "steps() easing", spec: ["https://drafts.csswg.org/css-easing-2/#step-easing-functions"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "css.types.easing-function.steps": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "8", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "css.types.easing-function.steps.jump": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16",
    support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } } }, support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } } }, "sticky-positioning": { caniuse: ["css-sticky"], compat_features: ["css.properties.position.position_sticky_table_elements", "css.properties.position.sticky"], description: "The position: sticky CSS declaration positions an element in the normal flow until it crosses a specified threshold, at which points it becomes fixed (stuck) at that position.", description_html: "The <code>position: sticky</code> CSS declaration positions an element in the normal flow until it crosses a specified threshold, at which points it becomes fixed (stuck) at that position.", group: ["positioning"], kind: "feature", name: "Sticky positioning", spec: ["https://drafts.csswg.org/css-position-3/#stickypos-insets"], status: { baseline: "high",
    baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", by_compat_key: { "css.properties.position.position_sticky_table_elements": { baseline: "high", baseline_high_date: "2020-09-13", baseline_low_date: "2018-03-13", support: { chrome: "56", chrome_android: "56", edge: "16", firefox: "59", firefox_android: "59", safari: "8", safari_ios: "8" } }, "css.properties.position.sticky": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "56", chrome_android: "56", edge: "16", firefox: "32", firefox_android: "32", safari: "13", safari_ios: "13" } } }, support: { chrome: "56", chrome_android: "56", edge: "16", firefox: "59", firefox_android: "59", safari: "13", safari_ios: "13" } } }, "storage-access": { compat_features: ["api.Document.hasStorageAccess", "api.Document.requestStorageAccess", "api.Permissions.permission_storage-access", "html.elements.iframe.allow.storage-access", "http.headers.Permissions-Policy.storage-access"],
    description: "The document.requestStorageAccess() method allows content in iframes to request storing and reading cookies and other site data, while the document.hasStorageAccess() method checks if such access is granted.", description_html: "The <code>document.requestStorageAccess()</code> method allows content in iframes to request storing and reading cookies and other site data, while the <code>document.hasStorageAccess()</code> method checks if such access is granted.", group: ["storage"], kind: "feature", name: "Storage access", spec: ["https://privacycg.github.io/storage-access/"], status: { baseline: "low", baseline_low_date: "2023-12-05", by_compat_key: { "api.Document.hasStorageAccess": { baseline: "low", baseline_low_date: "2023-12-05", support: { chrome: "119", chrome_android: "120", edge: "85", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } }, "api.Document.requestStorageAccess": { baseline: "low", baseline_low_date: "2023-12-05", support: { chrome: "\
119", chrome_android: "120", edge: "85", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } }, "api.Permissions.permission_storage-access": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "119", chrome_android: "120", edge: "85", firefox: "117", firefox_android: "117", safari: "26.2", safari_ios: "26.2" } }, "html.elements.iframe.allow.storage-access": { baseline: false, support: { chrome: "113", chrome_android: "113", edge: "113" } }, "http.headers.Permissions-Policy.storage-access": { baseline: false, support: { chrome: "113", chrome_android: "113", edge: "113" } } }, support: { chrome: "119", chrome_android: "120", edge: "85", firefox: "65", firefox_android: "65", safari: "11.1", safari_ios: "11.3" } } }, "storage-buckets": { compat_features: ["api.Navigator.storageBuckets", "api.StorageBucket", "api.StorageBucket.caches", "api.StorageBucket.estimate", "api.StorageBucket.expires", "api.StorageBucket.getDirectory", "api.StorageBucket.ind\
exedDB", "api.StorageBucket.name", "api.StorageBucket.persist", "api.StorageBucket.persisted", "api.StorageBucket.setExpires", "api.StorageBucketManager", "api.StorageBucketManager.delete", "api.StorageBucketManager.keys", "api.StorageBucketManager.open", "api.WorkerNavigator.storageBuckets"], description: "The navigator.storageBuckets API allows you to organize locally stored data into groups called storage buckets. Each bucket can have different settings, allowing the browser to manage and delete buckets independently rather than applying the same treatment to all.", description_html: "The <code>navigator.storageBuckets</code> API allows you to organize locally stored data into groups called storage buckets. Each bucket can have different settings, allowing the browser to manage and delete buckets independently rather than applying the same treatment to all.", group: ["storage"], kind: "feature", name: "Storage buckets", spec: ["https://wicg.github.io/storage-buckets/"], status: { baseline: false,
    by_compat_key: { "api.Navigator.storageBuckets": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.caches": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.estimate": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.expires": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.getDirectory": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.indexedDB": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.name": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.persist": { baseline: false, support: { chrome: "\
122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.persisted": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucket.setExpires": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucketManager": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucketManager.delete": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucketManager.keys": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.StorageBucketManager.open": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.WorkerNavigator.storageBuckets": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } } }, support: { chrome: "122", chrome_android: "122", edge: "122" } } }, "storage-manager": { compat_features: ["api.Navigator.stora\
ge", "api.Permissions.permission_persistent-storage", "api.StorageManager", "api.StorageManager.estimate", "api.StorageManager.persist", "api.StorageManager.persisted", "api.WorkerNavigator.storage"], description: "The navigator.storage API provides information about the availability and persistence of the data that a site stores on the device, by using APIs such as the Cache API or the IndexedDB API.", description_html: "The <code>navigator.storage</code> API provides information about the availability and persistence of the data that a site stores on the device, by using APIs such as the Cache API or the IndexedDB API.", group: ["storage"], kind: "feature", name: "Storage manager", spec: ["https://storage.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "api.Navigator.storage": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "55", chrome_android: "\
55", edge: "79", firefox: "57", firefox_android: "57", safari: "15.2", safari_ios: "15.2" } }, "api.Permissions.permission_persistent-storage": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "53", firefox_android: "53" } }, "api.StorageManager": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "57", firefox_android: "57", safari: "15.2", safari_ios: "15.2" } }, "api.StorageManager.estimate": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "57", firefox_android: "57", safari: "17", safari_ios: "17" } }, "api.StorageManager.persist": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "57", firefox_android: "57", safari: "15.2", safari_ios: "\
15.2" } }, "api.StorageManager.persisted": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "57", firefox_android: "57", safari: "15.2", safari_ios: "15.2" } }, "api.WorkerNavigator.storage": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "57", firefox_android: "57", safari: "15.2", safari_ios: "15.2" } } }, support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "57", firefox_android: "57", safari: "17", safari_ios: "17" } } }, streams: { compat_features: ["api.ByteLengthQueuingStrategy", "api.ByteLengthQueuingStrategy.ByteLengthQueuingStrategy", "api.ByteLengthQueuingStrategy.highWaterMark", "api.ByteLengthQueuingStrategy.size", "api.CountQueuingStrategy", "api.CountQueuingStrategy.CountQueuingStrategy", "api.CountQueuingStrategy.highWaterMark", "api.CountQueuin\
gStrategy.size", "api.ReadableStream", "api.ReadableStream.ReadableStream", "api.ReadableStream.cancel", "api.ReadableStream.getReader", "api.ReadableStream.locked", "api.ReadableStream.pipeThrough", "api.ReadableStream.pipeTo", "api.ReadableStream.tee", "api.ReadableStreamDefaultController", "api.ReadableStreamDefaultController.close", "api.ReadableStreamDefaultController.desiredSize", "api.ReadableStreamDefaultController.enqueue", "api.ReadableStreamDefaultController.error", "api.ReadableStreamDefaultReader", "api.ReadableStreamDefaultReader.ReadableStreamDefaultReader", "api.ReadableStreamDefaultReader.cancel", "api.ReadableStreamDefaultReader.closed", "api.ReadableStreamDefaultReader.read", "api.ReadableStreamDefaultReader.releaseLock", "api.ReadableStreamDefaultReader.releaseLock.reject_pending_read_request", "api.TransformStream", "api.TransformStream.TransformStream", "api.TransformStream.readable", "api.TransformStream.writable", "api.TransformStreamDefaultController", "api.Tra\
nsformStreamDefaultController.desiredSize", "api.TransformStreamDefaultController.enqueue", "api.TransformStreamDefaultController.error", "api.TransformStreamDefaultController.terminate", "api.WritableStream", "api.WritableStream.WritableStream", "api.WritableStream.abort", "api.WritableStream.close", "api.WritableStream.getWriter", "api.WritableStream.locked", "api.WritableStreamDefaultController", "api.WritableStreamDefaultController.error", "api.WritableStreamDefaultController.signal", "api.WritableStreamDefaultWriter", "api.WritableStreamDefaultWriter.WritableStreamDefaultWriter", "api.WritableStreamDefaultWriter.abort", "api.WritableStreamDefaultWriter.close", "api.WritableStreamDefaultWriter.closed", "api.WritableStreamDefaultWriter.desiredSize", "api.WritableStreamDefaultWriter.ready", "api.WritableStreamDefaultWriter.releaseLock", "api.WritableStreamDefaultWriter.write"], description: "The streams API creates, composes, and consumes continuously generated data.", description_html: "\
The streams API creates, composes, and consumes continuously generated data.", group: ["streams"], kind: "feature", name: "Streams", spec: ["https://streams.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", by_compat_key: { "api.ByteLengthQueuingStrategy": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ByteLengthQueuingStrategy.ByteLengthQueuingStrategy": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ByteLengthQueuingStrategy.highWaterMark": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "\
52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ByteLengthQueuingStrategy.size": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.CountQueuingStrategy": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.CountQueuingStrategy.CountQueuingStrategy": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.CountQueuingStrategy.highWaterMark": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "20\
19-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.CountQueuingStrategy.size": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "16", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "43", chrome_android: "43", edge: "14", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.ReadableStream": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.cancel": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "\
2019-01-29", support: { chrome: "43", chrome_android: "43", edge: "14", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.getReader": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "43", chrome_android: "43", edge: "14", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.locked": { baseline: "high", baseline_high_date: "2021-07-29", baseline_low_date: "2019-01-29", support: { chrome: "52", chrome_android: "52", edge: "14", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.pipeThrough": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "102", firefox_android: "102", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.pipeTo": { baseline: "high", baseline_high_date: "2024-11-03",
    baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "100", firefox_android: "100", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStream.tee": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10.1", safari_ios: "10.3" } }, "api.ReadableStreamDefaultController": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultController.close": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultController.desiredSize": {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultController.enqueue": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultController.error": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultReader": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "\
10" } }, "api.ReadableStreamDefaultReader.ReadableStreamDefaultReader": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "100", firefox_android: "100", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultReader.cancel": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultReader.closed": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultReader.read": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "43", chrome_android: "43", edge: "7\
9", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultReader.releaseLock": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "65", firefox_android: "65", safari: "10", safari_ios: "10" } }, "api.ReadableStreamDefaultReader.releaseLock.reject_pending_read_request": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "102", firefox_android: "102", safari: "17", safari_ios: "17" } }, "api.TransformStream": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStream.TransformStream": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "\
2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStream.readable": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStream.writable": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStreamDefaultController": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStreamDefaultController.desiredSize": { baseline: "h\
igh", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStreamDefaultController.enqueue": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStreamDefaultController.error": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } }, "api.TransformStreamDefaultController.terminate": { baseline: "high", baseline_high_date: "2024-12-28", baseline_low_date: "2022-06-28", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "\
14.1", safari_ios: "14.5" } }, "api.WritableStream": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStream.WritableStream": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStream.abort": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStream.close": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "100", firefox_android: "\
100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStream.getWriter": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStream.locked": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultController": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultController.error": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59",
    edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultController.signal": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "100", firefox_android: "100", safari: "16.4", safari_ios: "16.4" } }, "api.WritableStreamDefaultWriter": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.WritableStreamDefaultWriter": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "78", chrome_android: "78", edge: "79", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.abort": { baseline: "high", baseline_high_date: "\
2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.close": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.closed": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.desiredSize": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.Wr\
itableStreamDefaultWriter.ready": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.releaseLock": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.WritableStreamDefaultWriter.write": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "59", chrome_android: "59", edge: "16", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "102", firefox_android: "102", safari: "14.1", safari_ios: "14.5" } } }, stretch: { compat_features: ["css.properties.height.stret\
ch", "css.properties.max-height.stretch", "css.properties.max-width.stretch", "css.properties.min-height.stretch", "css.properties.min-width.stretch", "css.properties.width.stretch"], description: "The stretch CSS keyword expands a box as needed to fit its contents until the maximum size is reached, without preserving the content's preferred aspect ratio.", description_html: "The <code>stretch</code> CSS keyword expands a box as needed to fit its contents until the maximum size is reached, without preserving the content's preferred aspect ratio.", group: ["layout"], kind: "feature", name: "stretch", spec: ["https://drafts.csswg.org/css-sizing-4/#stretch-fit-sizing"], status: { baseline: false, by_compat_key: { "css.properties.height.stretch": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.properties.max-height.stretch": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.properties.max-width.stretch": { baseline: false,
    support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.properties.min-height.stretch": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.properties.min-width.stretch": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.properties.width.stretch": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } } }, support: { chrome: "138", chrome_android: "138", edge: "138" } } }, "string-at": { compat_features: ["javascript.builtins.String.at"], description: "The at() method of strings returns the character (one UTF-16 code unit) at an index, including negative indices for getting the character relative to the end of the string. Also known as the relative indexing method.", description_html: "The <code>at()</code> method of strings returns the character (one UTF-16 code unit) at an index, including negative indices for getting the character relative to the end of the str\
ing. Also known as the relative indexing method.", group: ["string"], kind: "feature", name: "String at()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "javascript.builtins.String.at": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "90", firefox_android: "90", safari: "15.4", safari_ios: "15.4" } } }, "string-codepoint": { compat_features: ["javascript.builtins.String.codePointAt", "javascript.builtins.String.fromCodePoint"], description: "The codePointAt() method returns the numeric value of the UTF-16 code point at an index of the string. The fromCodePoint() method returns a string created f\
rom one or more code points.", description_html: "The <code>codePointAt()</code> method returns the numeric value of the UTF-16 code point at an index of the string. The <code>fromCodePoint()</code> method returns a string created from one or more code points.", group: ["string"], kind: "feature", name: "String codePointAt() and fromCodePoint()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.String.codePointAt": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "29", firefox_android: "29", safari: "9", safari_ios: "9" } }, "javascript.builtins.String.fromCodePoint": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "\
29", firefox_android: "29", safari: "9", safari_ios: "9" } } }, support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "29", firefox_android: "29", safari: "9", safari_ios: "9" } } }, "string-includes": { caniuse: ["es6-string-includes"], compat_features: ["javascript.builtins.String.includes"], description: "The includes() method of strings returns whether a search string appears within the string.", description_html: "The <code>includes()</code> method of strings returns whether a search string appears within the string.", group: ["string"], kind: "feature", name: "String includes()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.String.includes": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "4\
0", firefox_android: "40", safari: "9", safari_ios: "9" } } }, support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "40", firefox_android: "40", safari: "9", safari_ios: "9" } } }, "string-matchall": { compat_features: ["javascript.builtins.String.matchAll"], description: "The matchAll() method of strings matches a string against a regular expression and returns an iterator of all results, including capturing groups.", description_html: "The <code>matchAll()</code> method of strings matches a string against a regular expression and returns an iterator of all results, including capturing groups.", group: ["string"], kind: "feature", name: "String matchAll()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.builtins.String.matchAll": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-\
15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "67", firefox_android: "67", safari: "13", safari_ios: "13" } } }, support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "67", firefox_android: "67", safari: "13", safari_ios: "13" } } }, "string-normalize": { compat_features: ["javascript.builtins.String.normalize"], description: "The normalize() method of strings returns a Unicode normal form of a string as a new string. More than one code point sequence can represent the same characters. You can use the normalize() method to find canonically or compatibly equivalent strings.", description_html: "The <code>normalize()</code> method of strings returns a Unicode normal form of a string as a new string. More than one code point sequence can represent the same characters. You can use the <code>normalize()</code> method to find canonically or compatibly equivalent strings.", group: ["string"], kind: "feature", name: "String normalize()", spec: ["https:/\
/tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.String.normalize": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "31", firefox_android: "31", safari: "10", safari_ios: "10" } } }, support: { chrome: "34", chrome_android: "34", edge: "12", firefox: "31", firefox_android: "31", safari: "10", safari_ios: "10" } } }, "string-pad": { caniuse: ["pad-start-end"], compat_features: ["javascript.builtins.String.padEnd", "javascript.builtins.String.padStart"], description: "The padStart() and padEnd() methods of strings return a string lengthened to a minimum number of characters by adding characters to the start or end of the string.", description_html: "The <code>padStart()</code> and <code>padEnd()</code> methods of strings return a s\
tring lengthened to a minimum number of characters by adding characters to the start or end of the string.", group: ["string"], kind: "feature", name: "String padStart() and padEnd()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", by_compat_key: { "javascript.builtins.String.padEnd": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "57", chrome_android: "57", edge: "15", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } }, "javascript.builtins.String.padStart": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "57", chrome_android: "57", edge: "15", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } } }, support: { chrome: "57", chrome_android: "57", edge: "15", firefox: "48", firefox_android: "48", safari: "\
10", safari_ios: "10" } } }, "string-raw": { compat_features: ["javascript.builtins.String.raw"], description: "The String.raw() static method interpolates template literal substitutions, but ignores escape sequences. It is the tag function for template literals.", description_html: "The <code>String.raw()</code> static method interpolates template literal substitutions, but ignores escape sequences. It is the tag function for template literals.", group: ["string"], kind: "feature", name: "String raw()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.String.raw": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } } }, support: { chrome: "41", chrome_android: "\
41", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } } }, "string-repeat": { compat_features: ["javascript.builtins.String.repeat"], description: "The repeat() method of strings returns the original string repeated a number of times.", description_html: "The <code>repeat()</code> method of strings returns the original string repeated a number of times.", group: ["string"], kind: "feature", name: "String repeat()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.String.repeat": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "36", edge: "12", firefox: "24", firefox_android: "24", safari: "9", safari_ios: "9" } } }, support: { chrome: "41", chrome_android: "36", edge: "12", firefox: "24", firefox_android: "24",
    safari: "9", safari_ios: "9" } } }, "string-replaceall": { compat_features: ["javascript.builtins.String.replaceAll"], description: "The replaceAll() method of strings returns a new string where all matches of a pattern (a string or regular expression) have been substituted with a replacement string.", description_html: "The <code>replaceAll()</code> method of strings returns a new string where all matches of a pattern (a string or regular expression) have been substituted with a replacement string.", group: ["string"], kind: "feature", name: "String replaceAll()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2023-02-27", baseline_low_date: "2020-08-27", by_compat_key: { "javascript.builtins.String.replaceAll": { baseline: "high", baseline_high_date: "2023-02-27", baseline_low_date: "2020-08-27", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "77", firefox_android: "79", safari: "\
13.1", safari_ios: "13.4" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "77", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, "string-startsends-with": { compat_features: ["javascript.builtins.String.endsWith", "javascript.builtins.String.startsWith"], description: "The startsWith() and endsWith() methods of strings returns whether a search string appears at the beginning or end of the provided string.", description_html: "The <code>startsWith()</code> and <code>endsWith()</code> methods of strings returns whether a search string appears at the beginning or end of the provided string.", group: ["string"], kind: "feature", name: "String startsWith() and endsWith()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.String.endsWith": { baseline: "high", baseline_high_date: "201\
8-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "36", edge: "12", firefox: "17", firefox_android: "17", safari: "9", safari_ios: "9" } }, "javascript.builtins.String.startsWith": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "36", edge: "12", firefox: "17", firefox_android: "17", safari: "9", safari_ios: "9" } } }, support: { chrome: "41", chrome_android: "36", edge: "12", firefox: "17", firefox_android: "17", safari: "9", safari_ios: "9" } } }, "string-trim-startend": { compat_features: ["javascript.builtins.String.trimEnd", "javascript.builtins.String.trimStart"], description: "The trimStart() and trimEnd() methods of strings return a new string with whitespace removed from the beginning or end of the string.", description_html: "The <code>trimStart()</code> and <code>trimEnd()</code> methods of strings return a new string with whitespace removed from the beginning or\
 end of the string.", group: ["string"], kind: "feature", name: "String trimStart() and trimEnd()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.builtins.String.trimEnd": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "javascript.builtins.String.trimStart": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } } }, support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } } }, "string-wellformed": { compat_features: ["javasc\
ript.builtins.String.isWellFormed", "javascript.builtins.String.toWellFormed"], description: "The isWellFormed() method of strings returns a boolean indicating if the string contains any Unicode lone surrogates. The toWellFormed() method returns a new string where all lone surrogates are replaced by the Unicode replacement character.", description_html: "The <code>isWellFormed()</code> method of strings returns a boolean indicating if the string contains any Unicode lone surrogates. The <code>toWellFormed()</code> method returns a new string where all lone surrogates are replaced by the Unicode replacement character.", group: ["string"], kind: "feature", name: "String isWellFormed() and toWellFormed()", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", by_compat_key: { "javascript.builtins.String.isWellFormed": { baseline: "high", baseline_high_date: "2026-0\
4-24", baseline_low_date: "2023-10-24", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.String.toWellFormed": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "119", firefox_android: "119", safari: "16.4", safari_ios: "16.4" } } }, strings: { compat_features: ["javascript.builtins.String", "javascript.builtins.String.@@iterator", "javascript.builtins.String.String", "javascript.builtins.String.charAt", "javascript.builtins.String.charCodeAt", "javascript.builtins.String.concat", "javascript.builtins.String.fromCharCode", "javascript.builtins.String.indexOf", "javascript.builtins.String.lastIndexOf", "javascript.builtins.Stri\
ng.length", "javascript.builtins.String.match", "javascript.builtins.String.replace", "javascript.builtins.String.search", "javascript.builtins.String.slice", "javascript.builtins.String.split", "javascript.builtins.String.substring", "javascript.builtins.String.toLowerCase", "javascript.builtins.String.toString", "javascript.builtins.String.toUpperCase", "javascript.builtins.String.trim", "javascript.builtins.String.unicode_code_point_escapes", "javascript.builtins.String.valueOf", "javascript.grammar.string_literals"], description: "The string type (and String object) represents a sequence of characters.", description_html: "The string type (and <code>String</code> object) represents a sequence of characters.", group: ["primitive-types"], kind: "feature", name: "String (initial support)", spec: ["https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "\
javascript.builtins.String": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.@@iterator": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.String.String": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.charAt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } },
    "javascript.builtins.String.charCodeAt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.concat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.fromCharCode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.indexOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1",
    safari_ios: "1" } }, "javascript.builtins.String.lastIndexOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.match": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.replace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.search": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.slice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.split": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.substring": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.toLowerCase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.toString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.toUpperCase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.trim": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5",
    firefox_android: "4", safari: "5", safari_ios: "5" } }, "javascript.builtins.String.unicode_code_point_escapes": { baseline: "high", baseline_high_date: "2018-02-11", baseline_low_date: "2015-08-11", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "40", firefox_android: "40", safari: "1", safari_ios: "1" } }, "javascript.builtins.String.valueOf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "javascript.grammar.string_literals": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, strong: { compat_features: [
    "html.elements.strong"], description: "The <strong> HTML element brings attention to the content, styling text as bold by default.", description_html: "The <code>&#x3C;strong></code> HTML element brings attention to the content, styling text as bold by default.", group: ["html-elements"], kind: "feature", name: "<strong>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-strong-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.strong": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "structured-clone": { compat_features: ["api.structuredClone"], description: "\
The structuredClone() global method creates a deep copy of an object. Values that cannot be cloned can instead be transferred, making the original value no longer usable.", description_html: "The <code>structuredClone()</code> global method creates a deep copy of an object. Values that cannot be cloned can instead be transferred, making the original value no longer usable.", kind: "feature", name: "structuredClone()", spec: ["https://html.spec.whatwg.org/multipage/structured-data.html#structured-cloning"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "api.structuredClone": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "94", firefox_android: "94", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "94", firefox_android: "94", safari: "15.4", safari_ios: "1\
5.4" } } }, style: { compat_features: ["api.HTMLStyleElement", "api.HTMLStyleElement.disabled", "api.HTMLStyleElement.media", "html.elements.style", "html.elements.style.media"], description: "The <style> element embeds an inline CSS stylesheet in a document.", description_html: "The <code>&#x3C;style></code> element embeds an inline CSS stylesheet in a document.", group: ["html-elements"], kind: "feature", name: "<style>", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#the-style-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLStyleElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLStyleElement.disabled": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "\
1", chrome_android: "18", edge: "13", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLStyleElement.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.style.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "style-attr": { compat_features: [
    "html.global_attributes.style"], description: "The style global HTML attribute applies inline CSS styling declarations to individual elements.", description_html: "The <code>style</code> global HTML attribute applies inline CSS styling declarations to individual elements.", group: ["css", "html"], kind: "feature", name: "style (attribute)", spec: ["https://html.spec.whatwg.org/multipage/dom.html#the-style-attribute"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.global_attributes.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "style-query-range-syntax": { compat_features: ["css.at-rules.container.style_queri\
es_for_custom_properties.range_syntax", "css.types.if.style.range_syntax"], description: "The @container style() CSS at-rule and if(style()) CSS function queries accept a range syntax, such as >, <, >=, <=, to query for inexact values.", description_html: "The <code>@container style()</code> CSS at-rule and <code>if(style())</code> CSS function queries accept a range syntax, such as <code>></code>, <code>&#x3C;</code>, <code>>=</code>, <code>&#x3C;=</code>, to query for inexact values.", group: ["container-queries"], kind: "feature", name: "Range syntax for style queries", spec: ["https://drafts.csswg.org/css-conditional-5/#typedef-style-range"], status: { baseline: false, by_compat_key: { "css.at-rules.container.style_queries_for_custom_properties.range_syntax": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } }, "css.types.if.style.range_syntax": { baseline: false, support: { chrome: "142", chrome_android: "142", edge: "142" } } }, support: { chrome: "\
142", chrome_android: "142", edge: "142" } } }, "sub-sup": { compat_features: ["html.elements.sub", "html.elements.sup"], description: "The <sub> and <sup> elements sets inline text to be displayed as subscript or superscript for solely typographical reasons.", description_html: "The <code>&#x3C;sub></code> and <code>&#x3C;sup></code> elements sets inline text to be displayed as subscript or superscript for solely typographical reasons.", group: ["html-elements"], kind: "feature", name: "<sub> and <sup>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-sub-element", "https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-sup-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.sub": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4",
    safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.sup": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, subgrid: { caniuse: ["css-subgrid"], compat_features: ["css.properties.grid-template-columns.subgrid", "css.properties.grid-template-rows.subgrid"], description: "The subgrid value for the grid-template-columns and grid-template-rows properties allows a grid item to inherit the grid definition of its parent grid container.", description_html: "The <code>subgrid</code> value for the <code>grid-template-columns</code> and <code>grid-template-rows</code> properties allows a grid item to inherit the grid definition of its parent grid container.", group: ["grid"], kind: "\
feature", name: "Subgrid", spec: ["https://drafts.csswg.org/css-grid-2/#subgrids"], status: { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", by_compat_key: { "css.properties.grid-template-columns.subgrid": { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "71", firefox_android: "79", safari: "16", safari_ios: "16" } }, "css.properties.grid-template-rows.subgrid": { baseline: "high", baseline_high_date: "2026-03-15", baseline_low_date: "2023-09-15", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "71", firefox_android: "79", safari: "16", safari_ios: "16" } } }, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "71", firefox_android: "79", safari: "16", safari_ios: "16" } } }, "subresource-integrity": { caniuse: ["subresource-integrity"], compat_features: ["api.HTMLLinkElement.integrity", "api.HTMLSc\
riptElement.integrity", "api.Request.integrity", "html.elements.link.integrity", "html.elements.script.integrity"], description: "Subresource integrity verifies that a resource, such as script served from a content delivery network, matches a known cryptographic hash. Also known as SRI.", description_html: "Subresource integrity verifies that a resource, such as script served from a content delivery network, matches a known cryptographic hash. Also known as SRI.", group: ["integrity"], kind: "feature", name: "Subresource integrity", spec: ["https://w3c.github.io/webappsec-subresource-integrity/"], status: { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", by_compat_key: { "api.HTMLLinkElement.integrity": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "43", firefox_android: "43", safari: "11.1", safari_ios: "11.3" } }, "api.HTMLScriptElement.int\
egrity": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "43", firefox_android: "43", safari: "11.1", safari_ios: "11.3" } }, "api.Request.integrity": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "46", chrome_android: "46", edge: "14", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "html.elements.link.integrity": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "43", firefox_android: "43", safari: "11.1", safari_ios: "11.3" } }, "html.elements.script.integrity": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "45", chrome_android: "45", edge: "17", firefox: "43", firefox_android: "43", safari: "11.1", safari_ios: "11.3" } } }, support: {
    chrome: "46", chrome_android: "46", edge: "17", firefox: "51", firefox_android: "51", safari: "11.1", safari_ios: "11.3" } } }, summarizer: { compat_features: ["api.Summarizer", "api.Summarizer.availability_static", "api.Summarizer.create_static", "api.Summarizer.destroy", "api.Summarizer.expectedContextLanguages", "api.Summarizer.expectedInputLanguages", "api.Summarizer.format", "api.Summarizer.inputQuota", "api.Summarizer.length", "api.Summarizer.measureInputUsage", "api.Summarizer.outputLanguage", "api.Summarizer.sharedContext", "api.Summarizer.summarize", "api.Summarizer.summarizeStreaming", "api.Summarizer.type", "http.headers.Permissions-Policy.summarizer"], description: "The Summarizer API uses an on-device language model to summarize text.", description_html: "The <code>Summarizer</code> API uses an on-device language model to summarize text.", kind: "feature", name: "Summarizer", spec: ["https://webmachinelearning.github.io/writing-assistance-apis/"], status: { baseline: false,
    by_compat_key: { "api.Summarizer": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.availability_static": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.create_static": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.destroy": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.expectedContextLanguages": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.expectedInputLanguages": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.format": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.inputQuota": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.length": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.measureInputUsage": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.outputLanguage": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.sharedContext": { baseline: false, support: { chrome: "138" } }, "api.Summariz\
er.summarize": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.summarizeStreaming": { baseline: false, support: { chrome: "138" } }, "api.Summarizer.type": { baseline: false, support: { chrome: "138" } }, "http.headers.Permissions-Policy.summarizer": { baseline: false, support: { chrome: "138" } } }, support: { chrome: "138" } } }, supports: { caniuse: ["css-featurequeries"], compat_features: ["api.CSSImportRule.supportsText", "api.CSSSupportsRule", "css.at-rules.import.supports", "css.at-rules.supports", "css.at-rules.supports.font-format", "css.at-rules.supports.font-tech", "css.at-rules.supports.selector"], description: "The @supports at-rule applies styles based on a browser's support for CSS features, such as a CSS property and value. Also known as feature queries.", description_html: "The <code>@supports</code> at-rule applies styles based on a browser's support for CSS features, such as a CSS property and value. Also known as feature queries.", group: ["css"], kind: "\
feature", name: "@supports", spec: ["https://drafts.csswg.org/css-conditional-3/#at-supports"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "api.CSSImportRule.supportsText": { baseline: "low", baseline_low_date: "2024-05-13", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "114", firefox_android: "114", safari: "17.5", safari_ios: "17.5" } }, "api.CSSSupportsRule": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.at-rules.import.supports": { baseline: "low", baseline_low_date: "2024-05-13", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "115", firefox_android: "115", safari: "17.5", safari_ios: "17.5" } }, "css.at-rules.supports": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "\
2015-09-30", support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.at-rules.supports.font-format": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "106", firefox_android: "106", safari: "17", safari_ios: "17" } }, "css.at-rules.supports.font-tech": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "106", firefox_android: "106", safari: "17", safari_ios: "17" } }, "css.at-rules.supports.selector": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "69", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "28", chrome_android: "28", edge: "12", firefox: "22", firefox_android: "\
22", safari: "9", safari_ios: "9" } } }, "supports-at-rule": { description: "The at-rule() function, when used with @supports, checks if a CSS at-rule is supported. For example @supports at-rule(@starting-style) checks if the @starting-style at-rule is supported.", description_html: "The <code>at-rule()</code> function, when used with <code>@supports</code>, checks if a CSS at-rule is supported. For example <code>@supports at-rule(@starting-style)</code> checks if the <code>@starting-style</code> at-rule is supported.", group: ["css"], kind: "feature", name: "at-rule()", spec: ["https://drafts.csswg.org/css-conditional-5/#typedef-supports-at-rule-fn"], status: { baseline: false, support: {} } }, "supports-compat": { compat_features: ["css.at-rules.media.-webkit-transform-3d"], description: "The @supports (-webkit-transform-3d) CSS media query is a standardized compatibility alternative to @supports (transform-style).", description_html: "The <code>@supports (-webkit-transform-3d)</code\
> CSS media query is a standardized compatibility alternative to <code>@supports (transform-style)</code>.", group: ["media-queries"], kind: "feature", name: "@supports (compatibility prefix)", spec: ["https://compat.spec.whatwg.org/#css-media-queries-webkit-transform-3d"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "css.at-rules.media.-webkit-transform-3d": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "49", firefox_android: "49", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "49", firefox_android: "49", safari: "4", safari_ios: "3.2" } } }, svg: { caniuse: ["svg"], compat_features: ["api.CanvasRenderingContext2D.drawImage.SVGImageElement_source_image", "api.DOMParser.parseFromString.svg", "api.SVGAElement", "api.SVGAElement.href", "api.SVGAElement.href\
lang", "api.SVGAElement.referrerPolicy", "api.SVGAElement.rel", "api.SVGAElement.relList", "api.SVGAElement.target", "api.SVGAElement.type", "api.SVGAngle", "api.SVGAngle.convertToSpecifiedUnits", "api.SVGAngle.newValueSpecifiedUnits", "api.SVGAngle.unitType", "api.SVGAngle.value", "api.SVGAngle.valueAsString", "api.SVGAngle.valueInSpecifiedUnits", "api.SVGCircleElement", "api.SVGCircleElement.cx", "api.SVGCircleElement.cy", "api.SVGCircleElement.r", "api.SVGComponentTransferFunctionElement", "api.SVGComponentTransferFunctionElement.amplitude", "api.SVGComponentTransferFunctionElement.exponent", "api.SVGComponentTransferFunctionElement.intercept", "api.SVGComponentTransferFunctionElement.offset", "api.SVGComponentTransferFunctionElement.slope", "api.SVGComponentTransferFunctionElement.tableValues", "api.SVGComponentTransferFunctionElement.type", "api.SVGDefsElement", "api.SVGDescElement", "api.SVGElement", "api.SVGElement.attributeStyleMap", "api.SVGElement.blur", "api.SVGElement.error\
_event", "api.SVGElement.focus", "api.SVGElement.focus.options_preventScroll_parameter", "api.SVGElement.load_event", "api.SVGElement.nonce", "api.SVGElement.ownerSVGElement", "api.SVGElement.style", "api.SVGElement.tabIndex", "api.SVGElement.viewportElement", "api.SVGEllipseElement", "api.SVGEllipseElement.cx", "api.SVGEllipseElement.cy", "api.SVGEllipseElement.rx", "api.SVGEllipseElement.ry", "api.SVGForeignObjectElement", "api.SVGForeignObjectElement.height", "api.SVGForeignObjectElement.width", "api.SVGForeignObjectElement.x", "api.SVGForeignObjectElement.y", "api.SVGGElement", "api.SVGGeometryElement", "api.SVGGeometryElement.getPointAtLength", "api.SVGGeometryElement.getTotalLength", "api.SVGGeometryElement.isPointInFill", "api.SVGGeometryElement.isPointInFill.point_parameter_DOMPoint", "api.SVGGeometryElement.isPointInStroke", "api.SVGGeometryElement.isPointInStroke.point_parameter_DOMPoint", "api.SVGGeometryElement.pathLength", "api.SVGGradientElement", "api.SVGGradientElement.\
gradientTransform", "api.SVGGradientElement.gradientUnits", "api.SVGGradientElement.href", "api.SVGGradientElement.spreadMethod", "api.SVGGraphicsElement", "api.SVGGraphicsElement.getBBox", "api.SVGGraphicsElement.getCTM", "api.SVGGraphicsElement.getScreenCTM", "api.SVGGraphicsElement.requiredExtensions", "api.SVGGraphicsElement.systemLanguage", "api.SVGGraphicsElement.transform", "api.SVGImageElement", "api.SVGImageElement.crossOrigin", "api.SVGImageElement.decode", "api.SVGImageElement.decoding", "api.SVGImageElement.height", "api.SVGImageElement.href", "api.SVGImageElement.preserveAspectRatio", "api.SVGImageElement.width", "api.SVGImageElement.x", "api.SVGImageElement.y", "api.SVGLength", "api.SVGLength.convertToSpecifiedUnits", "api.SVGLength.newValueSpecifiedUnits", "api.SVGLength.unitType", "api.SVGLength.value", "api.SVGLength.valueAsString", "api.SVGLength.valueInSpecifiedUnits", "api.SVGLengthList", "api.SVGLengthList.appendItem", "api.SVGLengthList.clear", "api.SVGLengthList.\
getItem", "api.SVGLengthList.initialize", "api.SVGLengthList.insertItemBefore", "api.SVGLengthList.length", "api.SVGLengthList.numberOfItems", "api.SVGLengthList.removeItem", "api.SVGLengthList.replaceItem", "api.SVGLineElement", "api.SVGLineElement.x1", "api.SVGLineElement.x2", "api.SVGLineElement.y1", "api.SVGLineElement.y2", "api.SVGLinearGradientElement", "api.SVGLinearGradientElement.x1", "api.SVGLinearGradientElement.x2", "api.SVGLinearGradientElement.y1", "api.SVGLinearGradientElement.y2", "api.SVGMPathElement", "api.SVGMPathElement.href", "api.SVGMarkerElement", "api.SVGMarkerElement.markerHeight", "api.SVGMarkerElement.markerUnits", "api.SVGMarkerElement.markerWidth", "api.SVGMarkerElement.orient", "api.SVGMarkerElement.orientAngle", "api.SVGMarkerElement.orientType", "api.SVGMarkerElement.preserveAspectRatio", "api.SVGMarkerElement.refX", "api.SVGMarkerElement.refY", "api.SVGMarkerElement.setOrientToAngle", "api.SVGMarkerElement.setOrientToAuto", "api.SVGMarkerElement.viewBox",
    "api.SVGMaskElement", "api.SVGMaskElement.height", "api.SVGMaskElement.maskContentUnits", "api.SVGMaskElement.maskUnits", "api.SVGMaskElement.width", "api.SVGMaskElement.x", "api.SVGMaskElement.y", "api.SVGMetadataElement", "api.SVGNumber", "api.SVGNumber.value", "api.SVGNumberList", "api.SVGNumberList.appendItem", "api.SVGNumberList.clear", "api.SVGNumberList.getItem", "api.SVGNumberList.initialize", "api.SVGNumberList.insertItemBefore", "api.SVGNumberList.length", "api.SVGNumberList.numberOfItems", "api.SVGNumberList.removeItem", "api.SVGNumberList.replaceItem", "api.SVGPathElement", "api.SVGPatternElement", "api.SVGPatternElement.height", "api.SVGPatternElement.href", "api.SVGPatternElement.patternContentUnits", "api.SVGPatternElement.patternTransform", "api.SVGPatternElement.patternUnits", "api.SVGPatternElement.preserveAspectRatio", "api.SVGPatternElement.viewBox", "api.SVGPatternElement.width", "api.SVGPatternElement.x", "api.SVGPatternElement.y", "api.SVGPointList", "api.SVG\
PointList.appendItem", "api.SVGPointList.clear", "api.SVGPointList.getItem", "api.SVGPointList.initialize", "api.SVGPointList.insertItemBefore", "api.SVGPointList.length", "api.SVGPointList.numberOfItems", "api.SVGPointList.removeItem", "api.SVGPointList.replaceItem", "api.SVGPolygonElement", "api.SVGPolygonElement.points", "api.SVGPolylineElement", "api.SVGPolylineElement.points", "api.SVGPreserveAspectRatio", "api.SVGPreserveAspectRatio.align", "api.SVGPreserveAspectRatio.meetOrSlice", "api.SVGRadialGradientElement", "api.SVGRadialGradientElement.cx", "api.SVGRadialGradientElement.cy", "api.SVGRadialGradientElement.fr", "api.SVGRadialGradientElement.fx", "api.SVGRadialGradientElement.fy", "api.SVGRadialGradientElement.r", "api.SVGRect", "api.SVGRect.height", "api.SVGRect.width", "api.SVGRect.x", "api.SVGRect.y", "api.SVGRectElement", "api.SVGRectElement.height", "api.SVGRectElement.rx", "api.SVGRectElement.ry", "api.SVGRectElement.width", "api.SVGRectElement.x", "api.SVGRectElement.y",
    "api.SVGSVGElement", "api.SVGSVGElement.checkEnclosure", "api.SVGSVGElement.checkIntersection", "api.SVGSVGElement.createSVGAngle", "api.SVGSVGElement.createSVGLength", "api.SVGSVGElement.createSVGMatrix", "api.SVGSVGElement.createSVGNumber", "api.SVGSVGElement.createSVGPoint", "api.SVGSVGElement.createSVGRect", "api.SVGSVGElement.createSVGTransform", "api.SVGSVGElement.createSVGTransformFromMatrix", "api.SVGSVGElement.currentScale", "api.SVGSVGElement.currentTranslate", "api.SVGSVGElement.deselectAll", "api.SVGSVGElement.getCurrentTime", "api.SVGSVGElement.getElementById", "api.SVGSVGElement.getEnclosureList", "api.SVGSVGElement.getIntersectionList", "api.SVGSVGElement.height", "api.SVGSVGElement.preserveAspectRatio", "api.SVGSVGElement.setCurrentTime", "api.SVGSVGElement.viewBox", "api.SVGSVGElement.width", "api.SVGSVGElement.x", "api.SVGSVGElement.y", "api.SVGScriptElement", "api.SVGScriptElement.async", "api.SVGScriptElement.crossOrigin", "api.SVGScriptElement.defer", "api.SVGS\
criptElement.href", "api.SVGScriptElement.type", "api.SVGSetElement", "api.SVGStopElement", "api.SVGStopElement.offset", "api.SVGStringList", "api.SVGStringList.appendItem", "api.SVGStringList.clear", "api.SVGStringList.getItem", "api.SVGStringList.initialize", "api.SVGStringList.insertItemBefore", "api.SVGStringList.length", "api.SVGStringList.numberOfItems", "api.SVGStringList.removeItem", "api.SVGStringList.replaceItem", "api.SVGStyleElement", "api.SVGStyleElement.disabled", "api.SVGStyleElement.media", "api.SVGStyleElement.sheet", "api.SVGStyleElement.title", "api.SVGSwitchElement", "api.SVGSymbolElement", "api.SVGSymbolElement.preserveAspectRatio", "api.SVGSymbolElement.viewBox", "api.SVGTSpanElement", "api.SVGTextContentElement", "api.SVGTextContentElement.getCharNumAtPosition", "api.SVGTextContentElement.getComputedTextLength", "api.SVGTextContentElement.getEndPositionOfChar", "api.SVGTextContentElement.getExtentOfChar", "api.SVGTextContentElement.getNumberOfChars", "api.SVGText\
ContentElement.getRotationOfChar", "api.SVGTextContentElement.getStartPositionOfChar", "api.SVGTextContentElement.getSubStringLength", "api.SVGTextContentElement.lengthAdjust", "api.SVGTextContentElement.textLength", "api.SVGTextElement", "api.SVGTextPathElement", "api.SVGTextPathElement.href", "api.SVGTextPathElement.method", "api.SVGTextPathElement.spacing", "api.SVGTextPathElement.startOffset", "api.SVGTextPositioningElement", "api.SVGTextPositioningElement.dx", "api.SVGTextPositioningElement.dy", "api.SVGTextPositioningElement.rotate", "api.SVGTextPositioningElement.x", "api.SVGTextPositioningElement.y", "api.SVGTitleElement", "api.SVGTransform", "api.SVGTransform.angle", "api.SVGTransform.matrix", "api.SVGTransform.setMatrix", "api.SVGTransform.setRotate", "api.SVGTransform.setScale", "api.SVGTransform.setSkewX", "api.SVGTransform.setSkewY", "api.SVGTransform.setTranslate", "api.SVGTransform.type", "api.SVGTransformList", "api.SVGTransformList.appendItem", "api.SVGTransformList.cl\
ear", "api.SVGTransformList.consolidate", "api.SVGTransformList.createSVGTransformFromMatrix", "api.SVGTransformList.getItem", "api.SVGTransformList.initialize", "api.SVGTransformList.insertItemBefore", "api.SVGTransformList.length", "api.SVGTransformList.numberOfItems", "api.SVGTransformList.removeItem", "api.SVGTransformList.replaceItem", "api.SVGUnitTypes", "api.SVGUseElement", "api.SVGUseElement.height", "api.SVGUseElement.href", "api.SVGUseElement.width", "api.SVGUseElement.x", "api.SVGUseElement.y", "api.SVGViewElement", "api.SVGViewElement.preserveAspectRatio", "api.SVGViewElement.viewBox", "css.at-rules.font-face.OpenType_SVG", "css.properties.background-image.svg_images", "css.properties.background.SVG_image_as_background", "css.properties.clip-rule", "css.properties.clip-rule.evenodd", "css.properties.clip-rule.nonzero", "css.properties.color-interpolation", "css.properties.color-interpolation.auto", "css.properties.color-interpolation.linearGradient", "css.properties.color-i\
nterpolation.sRGB", "css.properties.cx", "css.properties.cy", "css.properties.d", "css.properties.fill", "css.properties.fill-rule", "css.properties.fill-rule.evenodd", "css.properties.fill-rule.nonzero", "css.properties.fill.none", "css.properties.letter-spacing.svg_elements", "css.properties.marker", "css.properties.marker-end", "css.properties.marker-end.none", "css.properties.marker-mid", "css.properties.marker-mid.none", "css.properties.marker-start", "css.properties.marker-start.none", "css.properties.marker.none", "css.properties.r", "css.properties.rx", "css.properties.ry", "css.properties.shape-rendering", "css.properties.shape-rendering.auto", "css.properties.stop-color", "css.properties.stop-opacity", "css.properties.stroke", "css.properties.stroke-color", "css.properties.stroke-dasharray", "css.properties.stroke-dasharray.none", "css.properties.stroke-dashoffset", "css.properties.stroke-linecap", "css.properties.stroke-linecap.butt", "css.properties.stroke-linecap.round", "\
css.properties.stroke-linecap.square", "css.properties.stroke-linejoin", "css.properties.stroke-linejoin.bevel", "css.properties.stroke-linejoin.miter", "css.properties.stroke-linejoin.round", "css.properties.stroke-miterlimit", "css.properties.stroke-width", "css.properties.stroke.none", "css.properties.text-anchor", "css.properties.text-anchor.end", "css.properties.text-anchor.middle", "css.properties.text-anchor.start", "css.properties.text-rendering", "css.properties.text-rendering.auto", "css.properties.text-rendering.geometricPrecision", "css.properties.transform-origin.svg_elements", "css.properties.vector-effect", "css.properties.word-spacing.svg_elements", "css.properties.x", "css.properties.y", "svg.elements.a", "svg.elements.a.href", "svg.elements.a.hreflang", "svg.elements.a.referrerpolicy", "svg.elements.a.referrerpolicy.no-referrer-when-downgrade", "svg.elements.a.referrerpolicy.origin-when-cross-origin", "svg.elements.a.referrerpolicy.unsafe-url", "svg.elements.a.rel", "\
svg.elements.a.systemLanguage", "svg.elements.a.target", "svg.elements.a.type", "svg.elements.circle", "svg.elements.circle.cx", "svg.elements.circle.cy", "svg.elements.circle.fill", "svg.elements.circle.r", "svg.elements.circle.systemLanguage", "svg.elements.defs", "svg.elements.defs.systemLanguage", "svg.elements.desc", "svg.elements.ellipse", "svg.elements.ellipse.cx", "svg.elements.ellipse.cy", "svg.elements.ellipse.fill", "svg.elements.ellipse.rx", "svg.elements.ellipse.ry", "svg.elements.ellipse.systemLanguage", "svg.elements.foreignObject", "svg.elements.foreignObject.height", "svg.elements.foreignObject.systemLanguage", "svg.elements.foreignObject.width", "svg.elements.foreignObject.x", "svg.elements.foreignObject.y", "svg.elements.g", "svg.elements.g.systemLanguage", "svg.elements.image", "svg.elements.image.crossorigin", "svg.elements.image.decoding", "svg.elements.image.height", "svg.elements.image.href", "svg.elements.image.preserveAspectRatio", "svg.elements.image.systemLa\
nguage", "svg.elements.image.width", "svg.elements.image.x", "svg.elements.image.y", "svg.elements.line", "svg.elements.line.systemLanguage", "svg.elements.line.x1", "svg.elements.line.x2", "svg.elements.line.y1", "svg.elements.line.y2", "svg.elements.linearGradient", "svg.elements.linearGradient.gradientTransform", "svg.elements.linearGradient.gradientUnits", "svg.elements.linearGradient.href", "svg.elements.linearGradient.spreadMethod", "svg.elements.linearGradient.x1", "svg.elements.linearGradient.x2", "svg.elements.linearGradient.y1", "svg.elements.linearGradient.y2", "svg.elements.marker", "svg.elements.marker.markerHeight", "svg.elements.marker.markerUnits", "svg.elements.marker.markerWidth", "svg.elements.marker.orient", "svg.elements.marker.refX", "svg.elements.marker.refY", "svg.elements.marker.viewBox", "svg.elements.mask", "svg.elements.mask.height", "svg.elements.mask.maskContentUnits", "svg.elements.mask.maskUnits", "svg.elements.mask.systemLanguage", "svg.elements.mask.wi\
dth", "svg.elements.mask.x", "svg.elements.mask.y", "svg.elements.metadata", "svg.elements.mpath", "svg.elements.mpath.href", "svg.elements.path", "svg.elements.path.d", "svg.elements.path.d.path", "svg.elements.path.fill", "svg.elements.path.systemLanguage", "svg.elements.pattern", "svg.elements.pattern.height", "svg.elements.pattern.href", "svg.elements.pattern.patternContentUnits", "svg.elements.pattern.patternTransform", "svg.elements.pattern.patternUnits", "svg.elements.pattern.systemLanguage", "svg.elements.pattern.width", "svg.elements.pattern.x", "svg.elements.pattern.y", "svg.elements.polygon", "svg.elements.polygon.fill", "svg.elements.polygon.points", "svg.elements.polygon.systemLanguage", "svg.elements.polyline", "svg.elements.polyline.fill", "svg.elements.polyline.points", "svg.elements.polyline.systemLanguage", "svg.elements.radialGradient", "svg.elements.radialGradient.cx", "svg.elements.radialGradient.cy", "svg.elements.radialGradient.fr", "svg.elements.radialGradient.f\
x", "svg.elements.radialGradient.fy", "svg.elements.radialGradient.gradientTransform", "svg.elements.radialGradient.gradientUnits", "svg.elements.radialGradient.href", "svg.elements.radialGradient.r", "svg.elements.radialGradient.spreadMethod", "svg.elements.rect", "svg.elements.rect.fill", "svg.elements.rect.height", "svg.elements.rect.rx", "svg.elements.rect.ry", "svg.elements.rect.systemLanguage", "svg.elements.rect.width", "svg.elements.rect.x", "svg.elements.rect.y", "svg.elements.script", "svg.elements.script.async", "svg.elements.script.defer", "svg.elements.script.href", "svg.elements.script.type", "svg.elements.set", "svg.elements.set.fill", "svg.elements.set.href", "svg.elements.set.systemLanguage", "svg.elements.set.to", "svg.elements.stop", "svg.elements.stop.offset", "svg.elements.style", "svg.elements.style.media", "svg.elements.style.title", "svg.elements.style.type", "svg.elements.svg", "svg.elements.svg.height", "svg.elements.svg.preserveAspectRatio", "svg.elements.svg\
.systemLanguage", "svg.elements.svg.viewBox", "svg.elements.svg.width", "svg.elements.svg.x", "svg.elements.svg.y", "svg.elements.switch", "svg.elements.switch.systemLanguage", "svg.elements.symbol", "svg.elements.symbol.preserveAspectRatio", "svg.elements.symbol.viewBox", "svg.elements.text", "svg.elements.text.dx", "svg.elements.text.dy", "svg.elements.text.fill", "svg.elements.text.lengthAdjust", "svg.elements.text.rotate", "svg.elements.text.systemLanguage", "svg.elements.text.textLength", "svg.elements.text.x", "svg.elements.text.y", "svg.elements.textPath", "svg.elements.textPath.fill", "svg.elements.textPath.href", "svg.elements.textPath.path", "svg.elements.textPath.side", "svg.elements.textPath.spacing", "svg.elements.textPath.startOffset", "svg.elements.textPath.systemLanguage", "svg.elements.textPath.textLength", "svg.elements.title", "svg.elements.title.tooltip_display", "svg.elements.tspan", "svg.elements.tspan.dx", "svg.elements.tspan.dy", "svg.elements.tspan.fill", "svg.\
elements.tspan.lengthAdjust", "svg.elements.tspan.rotate", "svg.elements.tspan.systemLanguage", "svg.elements.tspan.textLength", "svg.elements.tspan.x", "svg.elements.tspan.y", "svg.elements.use", "svg.elements.use.data_uri", "svg.elements.use.external_uri", "svg.elements.use.height", "svg.elements.use.href", "svg.elements.use.systemLanguage", "svg.elements.use.width", "svg.elements.use.x", "svg.elements.use.y", "svg.elements.view", "svg.elements.view.preserveAspectRatio", "svg.elements.view.viewBox", "svg.global_attributes.alignment-baseline", "svg.global_attributes.baseline-shift", "svg.global_attributes.class", "svg.global_attributes.clip-rule", "svg.global_attributes.color", "svg.global_attributes.color-interpolation", "svg.global_attributes.color-interpolation-filters", "svg.global_attributes.color-interpolation.linearGradient", "svg.global_attributes.color-interpolation.sRGB", "svg.global_attributes.data_attributes", "svg.global_attributes.direction", "svg.global_attributes.displ\
ay", "svg.global_attributes.dominant-baseline", "svg.global_attributes.fill-rule", "svg.global_attributes.id", "svg.global_attributes.image-rendering", "svg.global_attributes.lang", "svg.global_attributes.lighting-color", "svg.global_attributes.marker-end", "svg.global_attributes.marker-mid", "svg.global_attributes.marker-start", "svg.global_attributes.mask", "svg.global_attributes.overflow", "svg.global_attributes.pointer-events", "svg.global_attributes.requiredExtensions", "svg.global_attributes.requiredExtensions.mathml", "svg.global_attributes.shape-rendering", "svg.global_attributes.stop-color", "svg.global_attributes.stop-opacity", "svg.global_attributes.stroke", "svg.global_attributes.stroke-dasharray", "svg.global_attributes.stroke-dashoffset", "svg.global_attributes.stroke-linecap", "svg.global_attributes.stroke-linejoin", "svg.global_attributes.stroke-miterlimit", "svg.global_attributes.stroke-width", "svg.global_attributes.style", "svg.global_attributes.tabindex", "svg.globa\
l_attributes.text-anchor", "svg.global_attributes.text-decoration", "svg.global_attributes.text-rendering", "svg.global_attributes.transform", "svg.global_attributes.transform-origin", "svg.global_attributes.unicode-bidi", "svg.global_attributes.vector-effect", "svg.global_attributes.visibility"], description: "The SVG image format, represented by the <svg> element, creates two-dimensional vector graphics with declarative or scripted interaction and animation.", description_html: "The SVG image format, represented by the <code>&#x3C;svg></code> element, creates two-dimensional vector graphics with declarative or scripted interaction and animation.", group: ["svg", "image-formats"], kind: "feature", name: "SVG", spec: ["https://w3c.github.io/svgwg/svg2-draft/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.CanvasRenderingContext2D.drawImage.SVGImageElement_source_image": { baseline: "high", baseline_high_date: "2026\
-03-18", baseline_low_date: "2023-09-18", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "56", firefox_android: "56", safari: "17", safari_ios: "17" } }, "api.DOMParser.parseFromString.svg": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "3", safari_ios: "1" } }, "api.SVGAElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAElement.hreflang": { baseline: "low", baseline_low_date: "2026-01-21", support: { chrome: "\
144", chrome_android: "144", edge: "144", firefox: "61", firefox_android: "61", safari: "26.2", safari_ios: "26.2" } }, "api.SVGAElement.referrerPolicy": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "61", firefox_android: "61" } }, "api.SVGAElement.rel": { baseline: "low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "61", firefox_android: "61", safari: "14", safari_ios: "14" } }, "api.SVGAElement.relList": { baseline: "low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "61", firefox_android: "61", safari: "14", safari_ios: "14" } }, "api.SVGAElement.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAElement.type": { baseline: "low", baseline_low_date: "\
2026-01-21", support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "61", firefox_android: "61", safari: "26.2", safari_ios: "26.2" } }, "api.SVGAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAngle.convertToSpecifiedUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAngle.newValueSpecifiedUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAngle.unitType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAngle.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAngle.valueAsString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGAngle.valueInSpecifiedUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGCircleElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGCircleElement.cx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGCircleElement.cy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGCircleElement.r": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGComponentTransferFunctionElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.amplitude": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.exponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.intercept": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.offset": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.slope": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.tableValues": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGComponentTransferFunctionElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGDefsElement": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGDescElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGElement.attributeStyleMap": { baseline: false, support: { chrome: "66", chrome_android: "66", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.SVGElement.blur": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "\
51", firefox_android: "51", safari: "3", safari_ios: "1" } }, "api.SVGElement.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGElement.focus": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "1", chrome_android: "18", edge: "17", firefox: "51", firefox_android: "51", safari: "3", safari_ios: "1" } }, "api.SVGElement.focus.options_preventScroll_parameter": { baseline: "high", baseline_high_date: "2024-11-16", baseline_low_date: "2022-05-16", support: { chrome: "78", chrome_android: "78", edge: "17", firefox: "68", firefox_android: "68", safari: "15", safari_ios: "15.5" } }, "api.SVGElement.load_event": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", safari: "3", safari_ios: "1" } }, "api.SVGElement.nonce": { baseline: "\
high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "api.SVGElement.ownerSVGElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGElement.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGElement.tabIndex": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "36", chrome_android: "36", edge: "17", firefox: "51", firefox_android: "51", safari: "8", safari_ios: "8" } }, "api.SVGElement.viewportElement": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGEllipseElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGEllipseElement.cx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGEllipseElement.cy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGEllipseElement.rx": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGEllipseElement.ry": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGForeignObjectElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGForeignObjectElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGForeignObjectElement.width": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGForeignObjectElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGForeignObjectElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGGElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGGeometryElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.getPointAtLength": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.getTotalLength": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.isPointInFill": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "69", firefox_android: "79", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.isPointInFill.point_parameter_DOMPoint": { baseline: "\
low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "69", firefox_android: "79", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.isPointInStroke": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "69", firefox_android: "79", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.isPointInStroke.point_parameter_DOMPoint": { baseline: "low", baseline_low_date: "2025-05-01", support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "69", firefox_android: "79", safari: "12", safari_ios: "12" } }, "api.SVGGeometryElement.pathLength": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "61", firefox_android: "61", safari: "12", safari_ios: "12" } }, "api.SVGGradientElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGGradientElement.gradientTransform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGGradientElement.gradientUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGGradientElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGGradientElement.spreadMethod": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGGraphicsElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGGraphicsElement.getBBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGGraphicsElement.getCTM": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGGraphicsElement.getScreenCTM": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGGraphicsElement.requiredExtensions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGGraphicsElement.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGGraphicsElement.transform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.SVGImageElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGImageElement.crossOrigin": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "114", firefox_android: "114", safari: "17.2", safari_ios: "17.2" } }, "api.SVGImageElement.decode": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "68", firefox_android: "68", safari: "18.4", safari_ios: "18.4" } }, "api.SVGImageElement.decoding": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "63", firefox_android: "63" } }, "api.SVGImageElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3",
    safari_ios: "1" } }, "api.SVGImageElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGImageElement.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGImageElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGImageElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGImageElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength.convertToSpecifiedUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength.newValueSpecifiedUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "\
api.SVGLength.unitType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength.valueAsString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength.valueInSpecifiedUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLength\
List": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.appendItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.getItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.initialize": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.insertItemBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.length": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "5", firefox_android: "5", safari: "13.1", safari_ios: "13.4" } }, "api.SVGLengthList.numberOfItems": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.removeItem": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLengthList.replaceItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLineElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLineElement.x1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLineElement.x2": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLineElement.y1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLineElement.y2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLinearGradientElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLinearGradientElement.x1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLinearGradientElement.x2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLinearGradientElement.y1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGLinearGradientElement.y2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMPathElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020\
-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGMPathElement.href": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGMarkerElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.markerHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.markerUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.markerWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.orient": { baseline: false, support: { safari: "13.1", safari_ios: "13.4" } }, "api.SVGMarkerElement.orientAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.orientType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElem\
ent.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.refX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.refY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.setOrientToAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGM\
arkerElement.setOrientToAuto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMarkerElement.viewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMaskElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMaskElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMaskElement.mask\
ContentUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGMaskElement.maskUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGMaskElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMaskElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMaskElement.y": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGMetadataElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGNumber": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGNumber.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGNumberList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.SVGNumberList.appendItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.getItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.initialize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.insertItemBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.length": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "5", firefox_android: "5", safari: "13.1", safari_ios: "13.4" } }, "api.SVGNumberList.numberOfItems": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.removeItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGNumberList.replaceItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGPathElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.patternContentUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.patternTransform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.patternUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.viewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPatternElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.appendItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.getItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.initialize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.insertItemBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.length": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "5", firefox_android: "5", safari: "\
13.1", safari_ios: "13.4" } }, "api.SVGPointList.numberOfItems": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.removeItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPointList.replaceItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPolygonElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGPolygonElement.points": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPolylineElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPolylineElement.points": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPreserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "ap\
i.SVGPreserveAspectRatio.align": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPreserveAspectRatio.meetOrSlice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRadialGradientElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRadialGradientElement.cx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGRadialGradientElement.cy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRadialGradientElement.fr": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "7" } }, "api.SVGRadialGradientElement.fx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRadialGradientElement.fy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGRadialGradientElement.r": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRect.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRect.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRect.x": { baseline: "hi\
gh", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRect.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRectElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRectElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRectElement.rx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGRectElement.ry": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGRectElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRectElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRectElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.checkEnclosure": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.checkIntersection": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGNumber": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGPoint": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGRect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGTransform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.createSVGTransformFromMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.currentScale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.currentTranslate": { baseline: "high", baseline_high_date: "201\
8-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.deselectAll": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.getCurrentTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.getElementById": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "5.1", safari_ios: "5" } }, "api.SVGSVGElement.getEnclosureList": { baseline: false, support: { chrome: "\
1", chrome_android: "18", edge: "12", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.getIntersectionList": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.setCurrentTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.v\
iewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGScriptElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGScriptElement.async": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "142", chrome_android: "142", edge: "142", firefox: "117", firefox_android: "117", safari: "26.2", safari_ios: "26.2" } }, "api.SVGScriptElement.crossOrigin": { baseline: false, support: { firefox: "14", firefox_android: "14" } }, "api.SVGScriptElement.defer": { baseline: false, support: { firefox: "117", firefox_android: "117" } }, "api.SVGScriptElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGScriptElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSetElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGStopElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGStopElement.offset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGStringList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "\
14", safari: "3", safari_ios: "1" } }, "api.SVGStringList.appendItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGStringList.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGStringList.getItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGStringList.initialize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "\
3", safari_ios: "1" } }, "api.SVGStringList.insertItemBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGStringList.length": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "12", firefox_android: "14", safari: "13.1", safari_ios: "13.4" } }, "api.SVGStringList.numberOfItems": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGStringList.removeItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "\
3", safari_ios: "1" } }, "api.SVGStringList.replaceItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "1" } }, "api.SVGStyleElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGStyleElement.disabled": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "104", firefox_android: "104", safari: "6", safari_ios: "6" } }, "api.SVGStyleElement.media": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGStyleElement.sheet": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "1.5", firefox_android: "4", safari: "16.4", safari_ios: "16.4" } }, "api.SVGStyleElement.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSwitchElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSymbolElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSymbo\
lElement.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSymbolElement.viewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTSpanElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextConte\
ntElement.getCharNumAtPosition": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getComputedTextLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getEndPositionOfChar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getExtentOfChar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getNumberOfChars": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getRotationOfChar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getStartPositionOfChar": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.getSubStringLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.lengthAdjust": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.textLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextPathElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGTextPathElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGTextPathElement.method": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "2" } }, "api.SVGTextPathElement.spacing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "2" } }, "api.SVGTextPathElement.startOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "2" } }, "api.SVGTextPositioningElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextPositioningElement.dx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextPositioningElement.dy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextPositioningElement.rotate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextPositioningElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextPositioningElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTitleElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.angle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.matrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.setMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.setRotate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.setScale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.setSkewX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.setSkewY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransform.setTranslate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "\
4", safari_ios: "3.2" } }, "api.SVGTransform.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.SVGTransformList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.appendItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGTransformList.consolidate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.createSVGTransformFromMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.getItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.initialize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "\
3", safari_ios: "1" } }, "api.SVGTransformList.insertItemBefore": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.length": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "9", firefox_android: "9", safari: "13.1", safari_ios: "13.4" } }, "api.SVGTransformList.numberOfItems": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.removeItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.SVGTransformList.replaceItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGUnitTypes": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.SVGUseElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGUseElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "\
1" } }, "api.SVGUseElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGUseElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGUseElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGUseElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGViewElement": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "1" } }, "api.SVGViewElement.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "1" } }, "api.SVGViewElement.viewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "1" } }, "css.at-rules.font-face.OpenType_SVG": { baseline: false, support: { firefox: "31", firefox_android: "31", safari: "12.1", safari_ios: "12.2" } }, "css.properties.background-image.svg_images": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "8", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "css.properties.background.SVG_image_as_background": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "1" } }, "css.properties.clip-rule": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "≤15", chrome_android: "18", edge: "79", firefox: "3.5", firefox_android: "4", safari: "≤5", safari_ios: "≤4.2" } }, "css.properties.clip-rule.evenodd": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "≤15", chrome_android: "18", edge: "79", firefox: "3.5", firefox_android: "4", safari: "≤5", safari_ios: "≤4.2" } }, "css.properties.clip-rule.nonzero": { baseline: "high", baseline_high_date: "2022-07-15",
    baseline_low_date: "2020-01-15", support: { chrome: "≤15", chrome_android: "18", edge: "79", firefox: "3.5", firefox_android: "4", safari: "≤5", safari_ios: "≤4.2" } }, "css.properties.color-interpolation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.color-interpolation.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.color-interpolation.linearGradient": { baseline: false, support: { firefox: "123", firefox_android: "123" } }, "css.properties.color-interpolation.sRGB": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "\
79", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.cx": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "69", firefox_android: "79", safari: "9", safari_ios: "9" } }, "css.properties.cy": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "69", firefox_android: "79", safari: "9", safari_ios: "9" } }, "css.properties.d": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "97", firefox_android: "97" } }, "css.properties.fill": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.fill-rule": { baseline: "high", baseline_high_date: "\
≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.fill-rule.evenodd": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.fill-rule.nonzero": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.fill.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.letter-spacing.svg_el\
ements": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "72", firefox_android: "79", safari: "5.1", safari_ios: "5" } }, "css.properties.marker": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.marker-end": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.marker-end.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.p\
roperties.marker-mid": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.marker-mid.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.marker-start": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.marker-start.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "\
4", safari_ios: "3.2" } }, "css.properties.marker.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.r": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "69", firefox_android: "79", safari: "9", safari_ios: "9" } }, "css.properties.rx": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "69", firefox_android: "79", safari: "17.4", safari_ios: "17.4" } }, "css.properties.ry": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "69", firefox_android: "79", safari: "17.4", safari_ios: "17.4" } }, "css.properties.shape-rendering": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.shape-rendering.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stop-color": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stop-opacity": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke": { baseline: "high", baseline_high_date: "\
≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-color": { baseline: false, support: { safari: "11.1", safari_ios: "11.3" } }, "css.properties.stroke-dasharray": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-dasharray.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-dashoffset": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "\
≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linecap": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linecap.butt": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linecap.round": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linecap.square": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-0\
4-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linejoin": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linejoin.bevel": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linejoin.miter": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-linejoin.round": { baseline: "high", baseline_high_date: "\
≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-miterlimit": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke-width": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.stroke.none": { baseline: "high", baseline_high_date: "≤2019-10-05", baseline_low_date: "≤2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "≤15", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.text-anchor": { baseline: "\
high", baseline_high_date: "≤2019-02-02", baseline_low_date: "≤2016-08-02", support: { chrome: "1", chrome_android: "18", edge: "≤14", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.text-anchor.end": { baseline: "high", baseline_high_date: "≤2019-02-02", baseline_low_date: "≤2016-08-02", support: { chrome: "1", chrome_android: "18", edge: "≤14", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.text-anchor.middle": { baseline: "high", baseline_high_date: "≤2019-02-02", baseline_low_date: "≤2016-08-02", support: { chrome: "1", chrome_android: "18", edge: "≤14", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.properties.text-anchor.start": { baseline: "high", baseline_high_date: "≤2019-02-02", baseline_low_date: "≤2016-08-02", support: { chrome: "1", chrome_android: "18", edge: "≤14", firefox: "3", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "c\
ss.properties.text-rendering": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "4", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "46", safari: "5", safari_ios: "4.2" } }, "css.properties.text-rendering.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "4", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "46", safari: "5", safari_ios: "4.2" } }, "css.properties.text-rendering.geometricPrecision": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "46", safari: "6", safari_ios: "6" } }, "css.properties.transform-origin.svg_elements": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "36", chrome_android: "36", edge: "17", firefox: "43", firefox_android: "\
43", safari: "9", safari_ios: "9" } }, "css.properties.vector-effect": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "css.properties.word-spacing.svg_elements": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "72", firefox_android: "79", safari: "5.1", safari_ios: "5" } }, "css.properties.x": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "69", firefox_android: "79", safari: "9", safari_ios: "9" } }, "css.properties.y": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "69", firefox_android: "79", safari: "\
9", safari_ios: "9" } }, "svg.elements.a": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.a.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.a.hreflang": { baseline: false, support: { firefox: "61", firefox_android: "61" } }, "svg.elements.a.referrerpolicy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "52", firefox_android: "52", safari: "14", safari_ios: "14" } }, "svg.elements.a.referrerpolicy.no-referrer-when-downgrade": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } },
    "svg.elements.a.referrerpolicy.origin-when-cross-origin": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "svg.elements.a.referrerpolicy.unsafe-url": { baseline: false, support: { chrome: "51", chrome_android: "51", edge: "79" } }, "svg.elements.a.rel": { baseline: false, support: { firefox: "61", firefox_android: "61", safari: "14", safari_ios: "14" } }, "svg.elements.a.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3.1", safari_ios: "2" } }, "svg.elements.a.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.a.type": { baseline: false, support: { firefox: "61", firefox_android: "61" } }, "svg.elements\
.circle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.circle.cx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.circle.cy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.circle.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.circle.r": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.circle.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.defs": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.defs.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3.1", safari_ios: "2" } }, "svg.elements.desc": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.ellipse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.ellipse.cx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.ellipse.cy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.ellipse.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.ellipse.rx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.ellipse.ry": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.ellipse.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.foreignObject": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-2\
9", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.foreignObject.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.foreignObject.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.foreignObject.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.foreignObject.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.foreignObject.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.g": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.g.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3.1", safari_ios: "2" } }, "svg.elements.image": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.image.crossorigin": { baseline: "low", baseline_low_date: "2023-12-11", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "114", firefox_android: "114", safari: "17.2", safari_ios: "17.2" } }, "svg.elements.image.decoding": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "63", firefox_android: "63" } }, "svg.elements.image.height": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.image.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.\
image.preserveAspectRatio": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.image.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.image.width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.image.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.i\
mage.y": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.line": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.line.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.line.x1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.line.x2": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.line.y1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.line.y2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.linearGradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.gradientTransform": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.gradientUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.linearGradient.spreadMethod": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.x1": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.x2": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.y1": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.y2": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.markerHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.markerUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.markerWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.orient": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.refX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.refY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.marker.viewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask.maskContentUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask.maskUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07\
-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.mask.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mask.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.metadata": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.mpath": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "19", chrome_android: "25", edge: "≤18", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.mpath.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "≤18", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.path": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.path.d": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.path.d.path": { baseline: false, support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "97", firefox_android: "97" } }, "svg.elements.path.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.path.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.pattern": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.height": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.href": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "3", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.pattern.patternContentUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.patternTransform": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.patternUnits": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.pattern.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polygon": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polygon.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polygon.points": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polygon.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.polyline": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polyline.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polyline.points": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.polyline.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "3" } }, "svg.elements.radialGradient": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.cx": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.cy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.fr": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "24", chrome_android: "25", edge: "79", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "7" } }, "svg.elements.radialGradient.fx": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.fy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.gradientTransform": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.gradientUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.radialGradient.r": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.radialGradient.spreadMethod": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.rect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.rx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.ry": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.rect.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.script": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.script.async": { baseline: false, support: { firefox: "117", firefox_android: "117" } }, "svg.elements.script.defer": { baseline: false, support: { firefox: "117", firefox_android: "117" } }, "svg.elements.script.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.script.type": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "svg.elements.set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "svg.elements.set.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.set.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "51", firefox_android: "51", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.set.systemLanguage": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "2", chrome_android: "18", edge: "79", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "\
1" } }, "svg.elements.set.to": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "1" } }, "svg.elements.stop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.stop.offset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.style.media": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.style.title": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.style.type": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.svg": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.svg.height": { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.svg.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.svg.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.svg.viewBox": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.svg.width": { baseline: "high", baseline_high_date: "2018-\
01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.svg.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.svg.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.switch": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.switch.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3.1", safari_ios: "2" } }, "svg.elements.symbol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.symbol.preserveAspectRatio": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.symbol.viewBox": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.dx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.dy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.lengthAdjust": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.rotate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.text.textLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.text.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.textPath": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.textPath.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.textPath.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "12", firefox: "\
2", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.textPath.path": { baseline: false, support: { firefox: "61", firefox_android: "61" } }, "svg.elements.textPath.side": { baseline: false, support: { firefox: "61", firefox_android: "61" } }, "svg.elements.textPath.spacing": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "2" } }, "svg.elements.textPath.startOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "2" } }, "svg.elements.textPath.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14",
    safari: "3.1", safari_ios: "2" } }, "svg.elements.textPath.textLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.title.tooltip_display": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "4", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.tspan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3",
    safari_ios: "2" } }, "svg.elements.tspan.dx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.dy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.fill": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.lengthAdjust": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.rotate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.textLength": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.tspan.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3",
    safari_ios: "2" } }, "svg.elements.use": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.use.data_uri": { baseline: false, support: { edge: "≤18" } }, "svg.elements.use.external_uri": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "22", chrome_android: "25", edge: "13", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "svg.elements.use.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.use.href": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "50", chrome_android: "50", edge: "1\
2", firefox: "1.5", firefox_android: "4", safari: "12.1", safari_ios: "12.2" } }, "svg.elements.use.systemLanguage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "3", safari_ios: "2" } }, "svg.elements.use.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.use.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.use.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "\
4", safari: "3", safari_ios: "2" } }, "svg.elements.view": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "1", chrome_android: "18", edge: "≤18", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } }, "svg.elements.view.preserveAspectRatio": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } }, "svg.elements.view.viewBox": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } }, "svg.global_attributes.alignment-baseline": { baseline: false, support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.baseline-sh\
ift": { baseline: false, support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.class": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.clip-rule": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.color-interpolation": { baseline: false, support: { firefox: "\
≤72", firefox_android: "≤79" } }, "svg.global_attributes.color-interpolation-filters": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.color-interpolation.linearGradient": { baseline: false, support: { firefox: "123", firefox_android: "123" } }, "svg.global_attributes.color-interpolation.sRGB": { baseline: false, support: { firefox: "≤72", firefox_android: "≤79" } }, "svg.global_attributes.data_attributes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "51", firefox_android: "51", safari: "10", safari_ios: "10" } }, "svg.global_attributes.direction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.display": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.dominant-baseline": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.fill-rule": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤15", chrome_android: "18", edge: "79", firefox: "18", firefox_android: "18", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.id": { baseline: "high", baseline_high_date: "2018-01\
-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.image-rendering": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "3.6", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.global_attributes.lang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "svg.global_attributes.lighting-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.global_attributes.marker-end": { baseline: "high", baseline_high_date: "\
≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.marker-mid": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.marker-start": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.mask": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "53", firefox_android: "53", safari: "15.4", safari_ios: "15.\
4" } }, "svg.global_attributes.overflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.pointer-events": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "svg.global_attributes.requiredExtensions": { baseline: "high", baseline_high_date: "2022-10-13", baseline_low_date: "2020-04-13", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "2", firefox_android: "4", safari: "8", safari_ios: "8" } }, "svg.global_attributes.requiredExtensions.mathml": { baseline: "high", baseline_high_date: "2025-07-12", baseline_low_date: "2023-01-12", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "2", firefox_android: "\
4", safari: "8", safari_ios: "8" } }, "svg.global_attributes.shape-rendering": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stop-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.global_attributes.stop-opacity": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "14" } }, "svg.global_attributes.stroke": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "\
≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-dasharray": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-dashoffset": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-linecap": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-lin\
ejoin": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-miterlimit": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.stroke-width": { baseline: "high", baseline_high_date: "≤2022-09-24", baseline_low_date: "≤2020-03-24", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "1", firefox_android: "4", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.style": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.tabindex": { baseline: "high", baseline_high_date: "2019-07-24", baseline_low_date: "2017-01-24", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "51", firefox_android: "51", safari: "≤4", safari_ios: "≤3.2" } }, "svg.global_attributes.text-anchor": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.text-decoration": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.text-rendering": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "4", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "46", safari: "5", safari_ios: "4.2" } }, "svg.global_attributes.transform": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "≤16", firefox_android: "≤16", safari: "9", safari_ios: "9" } }, "svg.global_attributes.transform-origin": { baseline: false, support: { chrome: "≤83", chrome_android: "≤83", edge: "≤83", firefox: "77", firefox_android: "79" } }, "svg.global_attributes.unicode-bidi": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "svg.global_attributes.vector-effect": { baseline: "high", baseline_high_date: "≤2023-01-28", baseline_low_date: "≤2020-07-28", support: { chrome: "≤80", chrome_android: "≤80", edge: "\
≤80", firefox: "≤72", firefox_android: "≤79", safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.visibility": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } } }, "svg-discouraged": { compat_features: ["api.SVGAElement.text", "api.SVGElement.className", "api.SVGPathElement.createSVGPathSegArcAbs", "api.SVGPathElement.createSVGPathSegArcRel", "api.SVGPathElement.createSVGPathSegClosePath", "api.SVGPathElement.createSVGPathSegCurvetoCubicAbs", "api.SVGPathElement.createSVGPathSegCurvetoCubicRel", "api.SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs", "api.SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel", "api.SVGPathElement.createSVGPathSegCurvetoQuadraticAbs", "api\
.SVGPathElement.createSVGPathSegCurvetoQuadraticRel", "api.SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs", "api.SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel", "api.SVGPathElement.createSVGPathSegLinetoAbs", "api.SVGPathElement.createSVGPathSegLinetoHorizontalAbs", "api.SVGPathElement.createSVGPathSegLinetoHorizontalRel", "api.SVGPathElement.createSVGPathSegLinetoRel", "api.SVGPathElement.createSVGPathSegLinetoVerticalAbs", "api.SVGPathElement.createSVGPathSegLinetoVerticalRel", "api.SVGPathElement.createSVGPathSegMovetoAbs", "api.SVGPathElement.createSVGPathSegMovetoRel", "api.SVGPathElement.getPathSegAtLength", "api.SVGPoint", "api.SVGPoint.matrixTransform", "api.SVGPoint.x", "api.SVGPoint.y", "api.SVGRenderingIntent", "api.SVGSVGElement.currentView", "api.SVGSVGElement.forceRedraw", "api.SVGSVGElement.suspendRedraw", "api.SVGSVGElement.unsuspendRedraw", "api.SVGSVGElement.unsuspendRedrawAll", "api.SVGSVGElement.useCurrentView", "api.SVGStyleElement.type", "api.\
SVGTextContentElement.selectSubString", "css.at-rules.font-face.SVG_fonts", "svg.elements.a.xlink_actuate", "svg.elements.a.xlink_href", "svg.elements.a.xlink_show", "svg.elements.a.xlink_title", "svg.elements.feImage.xlink_href", "svg.elements.filter.xlink_href", "svg.elements.image.xlink_href", "svg.elements.linearGradient.xlink_href", "svg.elements.mpath.xlink_href", "svg.elements.pattern.xlink_href", "svg.elements.radialGradient.xlink_href", "svg.elements.script.xlink_href", "svg.elements.svg.baseProfile", "svg.elements.svg.version", "svg.elements.svg.zoomAndPan", "svg.elements.textPath.xlink_href", "svg.elements.use.xlink_href", "svg.elements.view.zoomAndPan", "svg.global_attributes.clip", "svg.global_attributes.glyph-orientation-horizontal", "svg.global_attributes.glyph-orientation-vertical", "svg.global_attributes.xml_lang", "svg.global_attributes.xml_space"], description: "The SVG 1.1 image format has several components that were excluded from SVG 2, such as fonts, alternate gl\
yphs, and the xlink namespace.", description_html: "The SVG 1.1 image format has several components that were excluded from SVG 2, such as fonts, alternate glyphs, and the <code>xlink</code> namespace.", discouraged: { according_to: ["https://w3c.github.io/svgwg/svg2-draft/changes.html#substantial"], alternatives: ["svg", "font-face"], reason: 'SVG 2 omittted some parts of SVG 1.1 to "improv[e] the usability and precision of the language."', reason_html: 'SVG 2 omittted some parts of SVG 1.1 to "improv[e] the usability and precision of the language."' }, group: ["svg", "image-formats"], kind: "feature", name: "SVG 1.1", spec: ["https://www.w3.org/TR/SVG11/"], status: { baseline: false, by_compat_key: { "api.SVGAElement.text": { baseline: false, support: {} }, "api.SVGElement.className": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegArcAbs": { baseline: false,
    support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegArcRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegClosePath": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoCubicAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoCubicRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoQuadraticAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoQuadraticRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "a\
pi.SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegLinetoAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegLinetoHorizontalAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegLinetoHorizontalRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegLinetoRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegLinetoVerticalAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegLinetoVerticalRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegMo\
vetoAbs": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.createSVGPathSegMovetoRel": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPathElement.getPathSegAtLength": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGPoint": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPoint.matrixTransform": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPoint.x": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGPoint.y": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGRenderingIntent": { baseline: false,
    support: {} }, "api.SVGSVGElement.currentView": { baseline: false, support: { safari: "7", safari_ios: "7" } }, "api.SVGSVGElement.forceRedraw": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.suspendRedraw": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.unsuspendRedraw": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.unsuspendRedrawAll": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGSVGElement.useCurrentView": { baseline: false, support: { safari: "3", safari_ios: "1" } }, "api.SVGStyleElement.type": { baseline: false,
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.SVGTextContentElement.selectSubString": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.at-rules.font-face.SVG_fonts": { baseline: false, support: { safari: "3.1", safari_ios: "3" } }, "svg.elements.a.xlink_actuate": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.a.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.a.xlink_show": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.a.xlink_title": {
    baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.feImage.xlink_href": { baseline: false, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.xlink_href": { baseline: false, support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.image.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.linearGradient.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.mpath.xlink_href": { baseline: false, support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "\
4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.pattern.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "3" } }, "svg.elements.radialGradient.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.script.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.svg.baseProfile": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.svg.version": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.svg.zoomAndP\
an": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.textPath.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "svg.elements.use.xlink_href": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3", safari_ios: "2" } }, "svg.elements.view.zoomAndPan": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } }, "svg.global_attributes.clip": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.glyph-orientation-horizontal": { baseline: false, support: { safari: "≤13.1", safari_ios: "≤13.4" } },
    "svg.global_attributes.glyph-orientation-vertical": { baseline: false, support: { safari: "≤13.1", safari_ios: "≤13.4" } }, "svg.global_attributes.xml_lang": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "svg.global_attributes.xml_space": { baseline: false, support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "5", safari_ios: "4.2" } } }, support: {} } }, "svg-filters": { caniuse: ["svg-filters"], compat_features: ["api.SVGFEBlendElement", "api.SVGFEBlendElement.height", "api.SVGFEBlendElement.in1", "api.SVGFEBlendElement.in2", "api.SVGFEBlendElement.mode", "api.SVGFEBlendElement.result", "api.SVGFEBlendElement.width", "api.SVGFEBlendElement.x", "api.SVGFEBlendElement.y", "api.SVGFEColorMatrixElement", "api.SVGFEColorMatrixElement.height", "api.SVGFEColorMatrixElement.in1", "api.SVGFEColorMatrixElement.result", "api.SVGFEC\
olorMatrixElement.type", "api.SVGFEColorMatrixElement.values", "api.SVGFEColorMatrixElement.width", "api.SVGFEColorMatrixElement.x", "api.SVGFEColorMatrixElement.y", "api.SVGFEComponentTransferElement", "api.SVGFEComponentTransferElement.height", "api.SVGFEComponentTransferElement.in1", "api.SVGFEComponentTransferElement.result", "api.SVGFEComponentTransferElement.width", "api.SVGFEComponentTransferElement.x", "api.SVGFEComponentTransferElement.y", "api.SVGFECompositeElement", "api.SVGFECompositeElement.height", "api.SVGFECompositeElement.in1", "api.SVGFECompositeElement.in2", "api.SVGFECompositeElement.k1", "api.SVGFECompositeElement.k2", "api.SVGFECompositeElement.k3", "api.SVGFECompositeElement.k4", "api.SVGFECompositeElement.operator", "api.SVGFECompositeElement.result", "api.SVGFECompositeElement.width", "api.SVGFECompositeElement.x", "api.SVGFECompositeElement.y", "api.SVGFEConvolveMatrixElement", "api.SVGFEConvolveMatrixElement.bias", "api.SVGFEConvolveMatrixElement.divisor", "a\
pi.SVGFEConvolveMatrixElement.edgeMode", "api.SVGFEConvolveMatrixElement.height", "api.SVGFEConvolveMatrixElement.in1", "api.SVGFEConvolveMatrixElement.kernelMatrix", "api.SVGFEConvolveMatrixElement.kernelUnitLengthX", "api.SVGFEConvolveMatrixElement.kernelUnitLengthY", "api.SVGFEConvolveMatrixElement.orderX", "api.SVGFEConvolveMatrixElement.orderY", "api.SVGFEConvolveMatrixElement.preserveAlpha", "api.SVGFEConvolveMatrixElement.result", "api.SVGFEConvolveMatrixElement.targetX", "api.SVGFEConvolveMatrixElement.targetY", "api.SVGFEConvolveMatrixElement.width", "api.SVGFEConvolveMatrixElement.x", "api.SVGFEConvolveMatrixElement.y", "api.SVGFEDiffuseLightingElement", "api.SVGFEDiffuseLightingElement.diffuseConstant", "api.SVGFEDiffuseLightingElement.height", "api.SVGFEDiffuseLightingElement.in1", "api.SVGFEDiffuseLightingElement.kernelUnitLengthX", "api.SVGFEDiffuseLightingElement.kernelUnitLengthY", "api.SVGFEDiffuseLightingElement.result", "api.SVGFEDiffuseLightingElement.surfaceScale",
    "api.SVGFEDiffuseLightingElement.width", "api.SVGFEDiffuseLightingElement.x", "api.SVGFEDiffuseLightingElement.y", "api.SVGFEDisplacementMapElement", "api.SVGFEDisplacementMapElement.height", "api.SVGFEDisplacementMapElement.in1", "api.SVGFEDisplacementMapElement.in2", "api.SVGFEDisplacementMapElement.result", "api.SVGFEDisplacementMapElement.scale", "api.SVGFEDisplacementMapElement.width", "api.SVGFEDisplacementMapElement.x", "api.SVGFEDisplacementMapElement.xChannelSelector", "api.SVGFEDisplacementMapElement.y", "api.SVGFEDisplacementMapElement.yChannelSelector", "api.SVGFEDistantLightElement", "api.SVGFEDistantLightElement.azimuth", "api.SVGFEDistantLightElement.elevation", "api.SVGFEDropShadowElement", "api.SVGFEDropShadowElement.dx", "api.SVGFEDropShadowElement.dy", "api.SVGFEDropShadowElement.height", "api.SVGFEDropShadowElement.in1", "api.SVGFEDropShadowElement.result", "api.SVGFEDropShadowElement.setStdDeviation", "api.SVGFEDropShadowElement.stdDeviationX", "api.SVGFEDropSh\
adowElement.stdDeviationY", "api.SVGFEDropShadowElement.width", "api.SVGFEDropShadowElement.x", "api.SVGFEDropShadowElement.y", "api.SVGFEFloodElement", "api.SVGFEFloodElement.height", "api.SVGFEFloodElement.result", "api.SVGFEFloodElement.width", "api.SVGFEFloodElement.x", "api.SVGFEFloodElement.y", "api.SVGFEFuncAElement", "api.SVGFEFuncBElement", "api.SVGFEFuncGElement", "api.SVGFEFuncRElement", "api.SVGFEGaussianBlurElement", "api.SVGFEGaussianBlurElement.edgeMode", "api.SVGFEGaussianBlurElement.height", "api.SVGFEGaussianBlurElement.in1", "api.SVGFEGaussianBlurElement.result", "api.SVGFEGaussianBlurElement.setStdDeviation", "api.SVGFEGaussianBlurElement.stdDeviationX", "api.SVGFEGaussianBlurElement.stdDeviationY", "api.SVGFEGaussianBlurElement.width", "api.SVGFEGaussianBlurElement.x", "api.SVGFEGaussianBlurElement.y", "api.SVGFEImageElement", "api.SVGFEImageElement.crossOrigin", "api.SVGFEImageElement.height", "api.SVGFEImageElement.href", "api.SVGFEImageElement.preserveAspectRati\
o", "api.SVGFEImageElement.result", "api.SVGFEImageElement.width", "api.SVGFEImageElement.x", "api.SVGFEImageElement.y", "api.SVGFEMergeElement", "api.SVGFEMergeElement.height", "api.SVGFEMergeElement.result", "api.SVGFEMergeElement.width", "api.SVGFEMergeElement.x", "api.SVGFEMergeElement.y", "api.SVGFEMergeNodeElement", "api.SVGFEMergeNodeElement.in1", "api.SVGFEMorphologyElement", "api.SVGFEMorphologyElement.height", "api.SVGFEMorphologyElement.in1", "api.SVGFEMorphologyElement.operator", "api.SVGFEMorphologyElement.radiusX", "api.SVGFEMorphologyElement.radiusY", "api.SVGFEMorphologyElement.result", "api.SVGFEMorphologyElement.width", "api.SVGFEMorphologyElement.x", "api.SVGFEMorphologyElement.y", "api.SVGFEOffsetElement", "api.SVGFEOffsetElement.dx", "api.SVGFEOffsetElement.dy", "api.SVGFEOffsetElement.height", "api.SVGFEOffsetElement.in1", "api.SVGFEOffsetElement.result", "api.SVGFEOffsetElement.width", "api.SVGFEOffsetElement.x", "api.SVGFEOffsetElement.y", "api.SVGFEPointLightEl\
ement", "api.SVGFEPointLightElement.x", "api.SVGFEPointLightElement.y", "api.SVGFEPointLightElement.z", "api.SVGFESpecularLightingElement", "api.SVGFESpecularLightingElement.height", "api.SVGFESpecularLightingElement.in1", "api.SVGFESpecularLightingElement.kernelUnitLengthX", "api.SVGFESpecularLightingElement.kernelUnitLengthY", "api.SVGFESpecularLightingElement.result", "api.SVGFESpecularLightingElement.specularConstant", "api.SVGFESpecularLightingElement.specularExponent", "api.SVGFESpecularLightingElement.surfaceScale", "api.SVGFESpecularLightingElement.width", "api.SVGFESpecularLightingElement.x", "api.SVGFESpecularLightingElement.y", "api.SVGFESpotLightElement", "api.SVGFESpotLightElement.limitingConeAngle", "api.SVGFESpotLightElement.pointsAtX", "api.SVGFESpotLightElement.pointsAtY", "api.SVGFESpotLightElement.pointsAtZ", "api.SVGFESpotLightElement.specularExponent", "api.SVGFESpotLightElement.x", "api.SVGFESpotLightElement.y", "api.SVGFESpotLightElement.z", "api.SVGFETileElement",
    "api.SVGFETileElement.height", "api.SVGFETileElement.in1", "api.SVGFETileElement.result", "api.SVGFETileElement.width", "api.SVGFETileElement.x", "api.SVGFETileElement.y", "api.SVGFETurbulenceElement", "api.SVGFETurbulenceElement.baseFrequencyX", "api.SVGFETurbulenceElement.baseFrequencyY", "api.SVGFETurbulenceElement.height", "api.SVGFETurbulenceElement.numOctaves", "api.SVGFETurbulenceElement.result", "api.SVGFETurbulenceElement.seed", "api.SVGFETurbulenceElement.stitchTiles", "api.SVGFETurbulenceElement.type", "api.SVGFETurbulenceElement.width", "api.SVGFETurbulenceElement.x", "api.SVGFETurbulenceElement.y", "api.SVGFilterElement", "api.SVGFilterElement.filterUnits", "api.SVGFilterElement.height", "api.SVGFilterElement.href", "api.SVGFilterElement.primitiveUnits", "api.SVGFilterElement.width", "api.SVGFilterElement.x", "api.SVGFilterElement.y", "css.properties.color-interpolation-filters", "css.properties.color-interpolation-filters.auto", "css.properties.color-interpolation-fil\
ters.linearRGB", "css.properties.color-interpolation-filters.sRGB", "css.properties.filter.svg_elements", "css.properties.flood-color", "css.properties.flood-color.currentColor", "css.properties.flood-color.transparent", "css.properties.flood-opacity", "css.properties.lighting-color", "css.properties.lighting-color.currentColor", "css.properties.lighting-color.transparent", "svg.elements.feBlend", "svg.elements.feBlend.in", "svg.elements.feBlend.in2", "svg.elements.feBlend.mode", "svg.elements.feColorMatrix", "svg.elements.feColorMatrix.in", "svg.elements.feColorMatrix.type", "svg.elements.feColorMatrix.values", "svg.elements.feComponentTransfer", "svg.elements.feComponentTransfer.in", "svg.elements.feComposite", "svg.elements.feComposite.in", "svg.elements.feComposite.in2", "svg.elements.feComposite.k1", "svg.elements.feComposite.k2", "svg.elements.feComposite.k3", "svg.elements.feComposite.k4", "svg.elements.feComposite.operator", "svg.elements.feComposite.operator.lighter_value", "s\
vg.elements.feConvolveMatrix", "svg.elements.feConvolveMatrix.bias", "svg.elements.feConvolveMatrix.divisor", "svg.elements.feConvolveMatrix.edgeMode", "svg.elements.feConvolveMatrix.in", "svg.elements.feConvolveMatrix.kernelMatrix", "svg.elements.feConvolveMatrix.kernelUnitLength", "svg.elements.feConvolveMatrix.order", "svg.elements.feConvolveMatrix.preserveAlpha", "svg.elements.feConvolveMatrix.targetX", "svg.elements.feConvolveMatrix.targetY", "svg.elements.feDiffuseLighting", "svg.elements.feDiffuseLighting.diffuseConstant", "svg.elements.feDiffuseLighting.in", "svg.elements.feDiffuseLighting.kernelUnitLength", "svg.elements.feDiffuseLighting.surfaceScale", "svg.elements.feDisplacementMap", "svg.elements.feDisplacementMap.in", "svg.elements.feDisplacementMap.in2", "svg.elements.feDisplacementMap.scale", "svg.elements.feDisplacementMap.xChannelSelector", "svg.elements.feDisplacementMap.yChannelSelector", "svg.elements.feDistantLight", "svg.elements.feDistantLight.azimuth", "svg.ele\
ments.feDistantLight.elevation", "svg.elements.feDropShadow", "svg.elements.feDropShadow.dx", "svg.elements.feDropShadow.dy", "svg.elements.feDropShadow.in", "svg.elements.feDropShadow.stdDeviation", "svg.elements.feFlood", "svg.elements.feFuncA", "svg.elements.feFuncB", "svg.elements.feFuncG", "svg.elements.feFuncR", "svg.elements.feGaussianBlur", "svg.elements.feGaussianBlur.edgeMode", "svg.elements.feGaussianBlur.in", "svg.elements.feGaussianBlur.stdDeviation", "svg.elements.feImage", "svg.elements.feImage.crossorigin", "svg.elements.feImage.href", "svg.elements.feImage.preserveAspectRatio", "svg.elements.feMerge", "svg.elements.feMergeNode", "svg.elements.feMergeNode.in", "svg.elements.feMorphology", "svg.elements.feMorphology.in", "svg.elements.feMorphology.operator", "svg.elements.feMorphology.radius", "svg.elements.feOffset", "svg.elements.feOffset.dx", "svg.elements.feOffset.dy", "svg.elements.feOffset.in", "svg.elements.fePointLight", "svg.elements.fePointLight.x", "svg.elemen\
ts.fePointLight.y", "svg.elements.fePointLight.z", "svg.elements.feSpecularLighting", "svg.elements.feSpecularLighting.in", "svg.elements.feSpecularLighting.kernelUnitLength", "svg.elements.feSpecularLighting.specularConstant", "svg.elements.feSpecularLighting.specularExponent", "svg.elements.feSpecularLighting.surfaceScale", "svg.elements.feSpotLight", "svg.elements.feSpotLight.limitingConeAngle", "svg.elements.feSpotLight.pointsAtX", "svg.elements.feSpotLight.pointsAtY", "svg.elements.feSpotLight.pointsAtZ", "svg.elements.feSpotLight.specularExponent", "svg.elements.feSpotLight.x", "svg.elements.feSpotLight.y", "svg.elements.feSpotLight.z", "svg.elements.feTile", "svg.elements.feTile.in", "svg.elements.feTurbulence", "svg.elements.feTurbulence.baseFrequency", "svg.elements.feTurbulence.numOctaves", "svg.elements.feTurbulence.seed", "svg.elements.feTurbulence.stitchTiles", "svg.elements.feTurbulence.type", "svg.elements.filter", "svg.elements.filter.filterUnits", "svg.elements.filter.\
height", "svg.elements.filter.primitiveUnits", "svg.elements.filter.width", "svg.elements.filter.x", "svg.elements.filter.y", "svg.global_attributes.filter", "svg.global_attributes.flood-color", "svg.global_attributes.flood-opacity"], description: "The <filter> SVG element applies custom effects such as color manipulation, blurring, or morphing to SVG elements.", description_html: "The <code>&#x3C;filter></code> SVG element applies custom effects such as color manipulation, blurring, or morphing to SVG elements.", group: ["svg"], kind: "feature", name: "SVG filters", spec: ["https://drafts.csswg.org/filter-effects-1/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.SVGFEBlendElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendEleme\
nt.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.in2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.mode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.result": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEBlendElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.type": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEColorMatrixElement.y": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement.result": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEComponentTransferElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeEleme\
nt": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.in2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.k1": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.k2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.k3": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.k4": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.operator": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFECompositeElement.y": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.bias": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.divisor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.edgeMode": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.kernelMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.kernelUnitLengthX": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.kernelUnitLengthY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.orderX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.orderY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveM\
atrixElement.preserveAlpha": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.targetX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.targetY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "\
6" } }, "api.SVGFEConvolveMatrixElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEConvolveMatrixElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "\
6" } }, "api.SVGFEDiffuseLightingElement.diffuseConstant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.kernelUnitLengthX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "\
4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.kernelUnitLengthY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.surfaceScale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "\
12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDiffuseLightingElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "1\
8", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.in2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.scale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5",
    chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.xChannelSelector": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-0\
7-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDisplacementMapElement.yChannelSelector": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDistantLightElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDistantLightElement.azimuth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDistantLightElement.elevation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.dx": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.dy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.height": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.in1": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.result": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.setStdDeviation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.stdDeviationX": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.stdDeviationY": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEDropShadowElement.y": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "api.SVGFEFloodElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEFloodElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "api.SVGFEFloodElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "api.SVGFEFloodElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "api.SVGFEFloodElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "api.SVGFEFloodElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "35", firefox_android: "35", safari: "6", safari_ios: "6" } }, "api.SVGFEFuncAElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEFuncBElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEFuncGElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEFuncRElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.edgeMode": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "api.SVGFEGaussianBlurElement.height": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.setStdDeviation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.stdDeviationX": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.stdDeviationY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEGaussianBlurElement.y": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "29", firefox_android: "29", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.crossOrigin": { baseline: false, support: { firefox: "114", firefox_android: "114" } }, "api.SVGFEImageElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "\
3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.preserveAspectRatio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "22", firefox_android: "22", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3",
    firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEImageElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMergeElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMergeElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMergeElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4",
    safari: "6", safari_ios: "6" } }, "api.SVGFEMergeElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMergeElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMergeElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMergeNodeElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "\
6" } }, "api.SVGFEMergeNodeElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } },
    "api.SVGFEMorphologyElement.operator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.radiusX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.radiusY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "\
6" } }, "api.SVGFEMorphologyElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEMorphologyElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.S\
VGFEOffsetElement.dx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.dy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.r\
esult": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEOffsetElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEPointLightElement": { baseline: "h\
igh", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEPointLightElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEPointLightElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFEPointLightElement.z": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.kernelUnitLengthX": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "3", firefox_android: "4", safari: "17.4", safari_ios: "17.4" } }, "api.SVGFESpecularLightingElement.kernelUnitLengthY": { baseline: "low",
    baseline_low_date: "2024-03-05", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "3", firefox_android: "4", safari: "17.4", safari_ios: "17.4" } }, "api.SVGFESpecularLightingElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.specularConstant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.specularExponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.\
surfaceScale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpecularLightingElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SV\
GFESpotLightElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpotLightElement.limitingConeAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpotLightElement.pointsAtX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpotLightElement.pointsAtY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } },
    "api.SVGFESpotLightElement.pointsAtZ": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpotLightElement.specularExponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpotLightElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFESpotLightElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "\
6" } }, "api.SVGFESpotLightElement.z": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElement.in1": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElem\
ent.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETileElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement": { baseline: "hi\
gh", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.baseFrequencyX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.baseFrequencyY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.\
numOctaves": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.result": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.seed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.stitchTiles": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETur\
bulenceElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFETurbulenceElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElem\
ent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.filterUnits": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.primitiveUnits": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.SVGFilterElement.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.color-interpolation-filters": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.color-interpolation-filters.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "3", safari_ios: "2" } }, "css.properties.color-interpolation-filters.linearRGB": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "28", chrome_android: "28", edge: "79", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "9" } }, "css.properties.color-interpolation-filters.sRGB": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "28", chrome_android: "28", edge: "79", firefox: "22", firefox_android: "22", safari: "9", safari_ios: "\
9" } }, "css.properties.filter.svg_elements": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "35", firefox_android: "35" } }, "css.properties.flood-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.flood-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.flood-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.flood-opacity": { baseline: "high", baseline_high_date: "2\
018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.lighting-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.lighting-color.currentColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "css.properties.lighting-color.transparent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feBlend": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feBlend.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feBlend.in2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feBlend.mode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feColorMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feColorMatrix.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feColorMatrix.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feColorMatrix.values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComponentTransfer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComponentTransfer.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.in": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.in2": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "\
≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.k1": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.k2": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.k3": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.k4": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15",
    support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.operator": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feComposite.operator.lighter_value": { baseline: "high", baseline_high_date: "2023-08-23", baseline_low_date: "2021-02-23", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "86", firefox_android: "86", safari: "10", safari_ios: "10" } }, "svg.elements.feConvolveMatrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.bias": { baseline: "high", baseline_high_date: "2022-07-1\
5", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.divisor": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.edgeMode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.kernelMatrix": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.kernelUnitLength": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.order": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.preserveAlpha": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.targetX": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feConvolveMatrix.targetY": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "6", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDiffuseLighting": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDiffuseLighting.diffuseConstant": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDiffuseLight\
ing.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDiffuseLighting.kernelUnitLength": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDiffuseLighting.surfaceScale": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDisplacementMap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } },
    "svg.elements.feDisplacementMap.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDisplacementMap.in2": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDisplacementMap.scale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDisplacementMap.xChannelSelector": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "\
6", safari_ios: "6" } }, "svg.elements.feDisplacementMap.yChannelSelector": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDistantLight": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDistantLight.azimuth": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feDistantLight.elevation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "\
4", safari: "6", safari_ios: "6" } }, "svg.elements.feDropShadow": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "svg.elements.feDropShadow.dx": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "svg.elements.feDropShadow.dy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "svg.elements.feDropShadow.in": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30",
    safari: "6", safari_ios: "6" } }, "svg.elements.feDropShadow.stdDeviation": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "13", chrome_android: "18", edge: "79", firefox: "30", firefox_android: "30", safari: "6", safari_ios: "6" } }, "svg.elements.feFlood": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feFuncA": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feFuncB": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "\
6" } }, "svg.elements.feFuncG": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feFuncR": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feGaussianBlur": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feGaussianBlur.edgeMode": { baseline: false, support: { safari: "8", safari_ios: "8" } }, "svg.elements.feGaussianBlur.in": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "\
18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feGaussianBlur.stdDeviation": { baseline: "high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "5", chrome_android: "18", edge: "≤18", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feImage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feImage.crossorigin": { baseline: false, support: { firefox: "114", firefox_android: "114" } }, "svg.elements.feImage.href": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feImage.preserveAspectRatio": { baseline: "\
high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "22", firefox_android: "22", safari: "6", safari_ios: "6" } }, "svg.elements.feMerge": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feMergeNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feMergeNode.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feMorphology": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feMorphology.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feMorphology.operator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feMorphology.radius": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feOffset": { baseline: "high", baseline_high_date: "2018-01-2\
9", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feOffset.dx": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feOffset.dy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feOffset.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.fePointLight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "201\
5-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.fePointLight.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.fePointLight.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.fePointLight.z": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpecularLighting": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpecularLighting.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpecularLighting.kernelUnitLength": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "45", chrome_android: "45", edge: "79", firefox: "3", firefox_android: "4", safari: "17.4", safari_ios: "17.4" } }, "svg.elements.feSpecularLighting.specularConstant": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpecularLighting.specularExponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpecularLighting.surfaceScale": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.limitingConeAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.pointsAtX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.pointsAtY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.pointsAtZ": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.specularExponent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.x": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.y": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feSpotLight.z": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTile": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTile.in": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTurbulence": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTurbulence.baseFrequency": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTurbulence.numOctaves": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTurbulence.seed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTurbulence.stitchTiles": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.feTurbulence.type": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.filterUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "\
18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.height": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.primitiveUnits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.width": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.x": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "\
3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.elements.filter.y": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "5", chrome_android: "18", edge: "79", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.global_attributes.filter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "≤53", chrome_android: "≤53", edge: "79", firefox: "35", firefox_android: "35", safari: "≤10.1", safari_ios: "≤10.3" } }, "svg.global_attributes.flood-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } }, "svg.global_attributes.flood-opacity": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "1\
2", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "6", safari_ios: "6" } } }, symbol: { compat_features: ["javascript.builtins.Array.@@species", "javascript.builtins.Symbol", "javascript.builtins.Symbol.@@toPrimitive", "javascript.builtins.Symbol.Symbol", "javascript.builtins.Symbol.description", "javascript.builtins.Symbol.for", "javascript.builtins.Symbol.hasInstance", "javascript.builtins.Symbol.isConcatSpreadable", "javascript.builtins.Symbol.iterator", "javascript.builtins.Symbol.keyFor", "javascript.builtins.Symbol.match", "javascript.builtins.Symbol.matchAll", "javascript.builtins.Symbol.replace", "javascript.builtins.Symbol.search", "javascript.builtins.Symbol.species", "javascript.builtins.Symbol.split", "javascript.builtins.Symbol.toPrimitive", "javascript.builtins.Symbol.toString", "javascript.builtins.Symbol.toStringTag", "javascript.builtins.Symbo\
l.toStringTag.dom_objects", "javascript.builtins.Symbol.valueOf"], description: "A Symbol value is a unique, non-enumerable primitive value used for encapsulation or information hiding. For example, a symbol can be a key of an object that can never collide with any other key.", description_html: "A <code>Symbol</code> value is a unique, non-enumerable primitive value used for encapsulation or information hiding. For example, a symbol can be a key of an object that can never collide with any other key.", group: ["primitive-types"], kind: "feature", name: "Symbol", spec: ["https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-symbol-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.Array.@@species": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "51", chrome_android: "51", edge: "79", firefox: "48", firefox_android: "48", safari: "\
10", safari_ios: "10" } }, "javascript.builtins.Symbol": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Symbol.@@toPrimitive": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "47", chrome_android: "47", edge: "15", firefox: "44", firefox_android: "44", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.Symbol": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Symbol.description": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "63", firefox_android: "\
63", safari: "12.1", safari_ios: "12.2" } }, "javascript.builtins.Symbol.for": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "40", chrome_android: "40", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Symbol.hasInstance": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "50", chrome_android: "50", edge: "15", firefox: "50", firefox_android: "50", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.isConcatSpreadable": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "48", chrome_android: "48", edge: "15", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.iterator": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "43", chrome_android: "43",
    edge: "12", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.keyFor": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "40", chrome_android: "40", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Symbol.match": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "40", firefox_android: "40", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.matchAll": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "67", firefox_android: "67", safari: "13", safari_ios: "13" } }, "javascript.builtins.Symbol.replace": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
50", chrome_android: "50", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.search": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.species": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "51", chrome_android: "51", edge: "13", firefox: "41", firefox_android: "41", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.split": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "49", firefox_android: "49", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.toPrimitive": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "\
2017-04-05", support: { chrome: "47", chrome_android: "47", edge: "15", firefox: "44", firefox_android: "44", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.toString": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.Symbol.toStringTag": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "49", chrome_android: "49", edge: "15", firefox: "51", firefox_android: "51", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.toStringTag.dom_objects": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "78", firefox_android: "79", safari: "14", safari_ios: "14" } }, "javascript.builtins.Symbol.valueOf": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } } }, support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } } }, "system-color": { compat_features: ["css.types.color.system-color", "css.types.color.system-color.accentcolor_accentcolortext", "css.types.color.system-color.buttonborder", "css.types.color.system-color.mark", "css.types.color.system-color.marktext"], description: "The system color CSS keywords, such as ButtonBorder or LinkText, allow you to match default colors from the user agent.", description_html: "The system color CSS keywords, such as <code>ButtonBorder</code> or <code>LinkText</code>, allow you to match default colors from the user agent.", group: ["color-types"], kind: "feature", name: "System colors", spec: ["https://drafts.csswg.org/css-color-4/#css-system-colors"], status: {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.types.color.system-color": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.color.system-color.accentcolor_accentcolortext": { baseline: false, support: { firefox: "103", firefox_android: "103", safari: "16.5", safari_ios: "16.5" } }, "css.types.color.system-color.buttonborder": { baseline: false, support: { chrome: "101", chrome_android: "101", edge: "101", firefox: "109", firefox_android: "109" } }, "css.types.color.system-color.mark": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "109", firefox_android: "109" } }, "css.types.color.system-color.marktext": { baseline: false, support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "109", firefox_android: "\
109" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "tab-size": { caniuse: ["css3-tabsize"], compat_features: ["css.properties.tab-size", "css.properties.tab-size.length"], description: "The tab-size CSS property sets the width of the tab character.", description_html: "The <code>tab-size</code> CSS property sets the width of the tab character.", group: ["white-space"], kind: "feature", name: "tab-size", spec: ["https://drafts.csswg.org/css-text-4/#tab-size-property"], status: { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", by_compat_key: { "css.properties.tab-size": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "21", chrome_android: "25", edge: "79", firefox: "91", firefox_android: "91", safari: "7", safari_ios: "7" } }, "css.properties.tab-size.length": { baseline: "high", baseline_high_date: "2024\
-02-10", baseline_low_date: "2021-08-10", support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "91", firefox_android: "91", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "42", chrome_android: "42", edge: "79", firefox: "91", firefox_android: "91", safari: "13.1", safari_ios: "13.4" } } }, tabindex: { caniuse: ["tabindex-attr"], compat_features: ["api.HTMLElement.tabIndex", "html.global_attributes.tabindex"], description: "The tabindex HTML attribute make an element focusable, and sets the element's relative ordering for sequential focus navigation.", description_html: "The <code>tabindex</code> HTML attribute make an element focusable, and sets the element's relative ordering for sequential focus navigation.", group: ["html", "reading-order"], kind: "feature", name: "tabindex", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#attr-tabindex"], status: { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", by_compat_key: {
    "api.HTMLElement.tabIndex": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "1", chrome_android: "18", edge: "18", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "html.global_attributes.tabindex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "18", firefox: "1.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, table: { compat_features: ["api.HTMLTableCaptionElement", "api.HTMLTableCellElement", "api.HTMLTableCellElement.abbr", "api.HTMLTableCellElement.cellIndex", "api.HTMLTableCellElement.colSpan", "api.HTMLTableCellElement.headers", "api.HTMLTableCellElement.rowSpan", "api.HTMLTableCellElement.scope", "api.HTMLTableColElement", "api.HTMLTableColElement.span", "ap\
i.HTMLTableElement", "api.HTMLTableElement.caption", "api.HTMLTableElement.createCaption", "api.HTMLTableElement.createTBody", "api.HTMLTableElement.createTFoot", "api.HTMLTableElement.createTHead", "api.HTMLTableElement.deleteCaption", "api.HTMLTableElement.deleteRow", "api.HTMLTableElement.deleteTFoot", "api.HTMLTableElement.deleteTHead", "api.HTMLTableElement.insertRow", "api.HTMLTableElement.rows", "api.HTMLTableElement.tBodies", "api.HTMLTableElement.tFoot", "api.HTMLTableElement.tHead", "api.HTMLTableRowElement", "api.HTMLTableRowElement.cells", "api.HTMLTableRowElement.deleteCell", "api.HTMLTableRowElement.insertCell", "api.HTMLTableRowElement.insertCell.index_parameter_negative_one", "api.HTMLTableRowElement.insertCell.index_parameter_optional", "api.HTMLTableRowElement.rowIndex", "api.HTMLTableRowElement.sectionRowIndex", "api.HTMLTableSectionElement", "api.HTMLTableSectionElement.deleteRow", "api.HTMLTableSectionElement.insertRow", "api.HTMLTableSectionElement.rows", "css.pro\
perties.border-collapse", "css.properties.border-collapse.collapse", "css.properties.border-collapse.separate", "css.properties.border-spacing", "css.properties.caption-side", "css.properties.caption-side.bottom", "css.properties.caption-side.bottom-outside", "css.properties.caption-side.top", "css.properties.caption-side.top-outside", "css.properties.caption-side.writing-mode_relative_values", "css.properties.empty-cells", "css.properties.empty-cells.hide", "css.properties.empty-cells.show", "css.properties.table-layout", "css.properties.table-layout.auto", "css.properties.table-layout.fixed", "html.elements.caption", "html.elements.col", "html.elements.col.span", "html.elements.colgroup", "html.elements.colgroup.span", "html.elements.table", "html.elements.tbody", "html.elements.td", "html.elements.td.colspan", "html.elements.td.headers", "html.elements.td.rowspan", "html.elements.td.rowspan.rowspan_zero", "html.elements.tfoot", "html.elements.th", "html.elements.th.abbr", "html.elem\
ents.th.colspan", "html.elements.th.headers", "html.elements.th.rowspan", "html.elements.th.rowspan.rowspan_zero", "html.elements.th.scope", "html.elements.thead", "html.elements.tr"], description: "The <table> HTML element, with several related elements, represents tabular data in rows and columns of cells.", description_html: "The <code>&#x3C;table></code> HTML element, with several related elements, represents tabular data in rows and columns of cells.", group: ["html-elements"], kind: "feature", name: "Tables", spec: ["https://html.spec.whatwg.org/multipage/tables.html"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLTableCaptionElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.abbr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.cellIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.colSpan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.headers": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.rowSpan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.scope": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement.span": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.caption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.createCaption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.createTBody": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.HTMLTableElement.createTFoot": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.createTHead": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.deleteCaption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.deleteRow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.deleteTFoot": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.deleteTHead": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.insertRow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.HTMLTableElement.rows": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-\
07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.tBodies": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.tFoot": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.tHead": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.cells": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.deleteCell": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.insertCell": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.insertCell.index_parameter_negative_one": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.insertCell.index_parameter_optional": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.rowIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.sectionRowIndex": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.deleteRow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.insertRow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.rows": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.border-collapse": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "css.properties.border-collapse.collapse": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "css.properties.border-collapse.separate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "css.properties.border-spacing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.caption-side": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.caption-side.bottom": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.caption-side.bottom-outside": { baseline: false, support: {} }, "css.properties.caption-side.top": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.caption-side.top-outside": { baseline: false, support: {} }, "css.properties.caption-side.writing-mode_relative_values": { baseline: false, support: { firefox: "42", firefox_android: "42" } }, "css.properties.empty-cells": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.empty-cells.hide": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.empty-cells.show": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "css.properties.table-layout": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "css.properties.table-layout.auto": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "css.properties.table-layout.fixed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "3" } }, "html.elements.caption": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.col": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.col.span": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.colgroup": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.colgroup.span": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.table": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tbody": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.colspan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.headers": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.rowspan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.rowspan.rowspan_zero": { baseline: false, support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "≤55", firefox_android: "≤55" } }, "html.elements.tfoot": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th.abbr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elemen\
ts.th.colspan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th.headers": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th.rowspan": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th.rowspan.rowspan_zero": { baseline: false, support: { firefox: "≤55", firefox_android: "≤55" } }, "html.elements.th.scope": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.thead": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "table-discouraged": { compat_features: ["api.HTMLTableCaptionElement.align", "api.HTMLTableCellElement.align", "api.HTMLTableCellElement.axis", "api.HTMLTableCellElement.bgColor", "api.HTMLTableCellElement.ch", "api.HTMLTableCellElement.chOff", "api.HTMLTableCellElement.height", "api.HTMLTableCellElement.noWrap", "api\
.HTMLTableCellElement.vAlign", "api.HTMLTableCellElement.width", "api.HTMLTableColElement.align", "api.HTMLTableColElement.ch", "api.HTMLTableColElement.chOff", "api.HTMLTableColElement.vAlign", "api.HTMLTableColElement.width", "api.HTMLTableElement.align", "api.HTMLTableElement.bgColor", "api.HTMLTableElement.border", "api.HTMLTableElement.cellPadding", "api.HTMLTableElement.cellSpacing", "api.HTMLTableElement.frame", "api.HTMLTableElement.rules", "api.HTMLTableElement.summary", "api.HTMLTableElement.width", "api.HTMLTableRowElement.align", "api.HTMLTableRowElement.bgColor", "api.HTMLTableRowElement.ch", "api.HTMLTableRowElement.chOff", "api.HTMLTableRowElement.vAlign", "api.HTMLTableSectionElement.align", "api.HTMLTableSectionElement.ch", "api.HTMLTableSectionElement.chOff", "api.HTMLTableSectionElement.vAlign", "html.elements.caption.align", "html.elements.col.align", "html.elements.col.char", "html.elements.col.charoff", "html.elements.col.valign", "html.elements.col.width", "html.\
elements.colgroup.align", "html.elements.colgroup.char", "html.elements.colgroup.charoff", "html.elements.colgroup.valign", "html.elements.colgroup.width", "html.elements.table.align", "html.elements.table.bgcolor", "html.elements.table.border", "html.elements.table.cellpadding", "html.elements.table.cellspacing", "html.elements.table.frame", "html.elements.table.rules", "html.elements.table.summary", "html.elements.table.width", "html.elements.tbody.align", "html.elements.tbody.bgcolor", "html.elements.tbody.char", "html.elements.tbody.charoff", "html.elements.tbody.valign", "html.elements.td.abbr", "html.elements.td.align", "html.elements.td.axis", "html.elements.td.bgcolor", "html.elements.td.char", "html.elements.td.charoff", "html.elements.td.scope", "html.elements.td.valign", "html.elements.td.width", "html.elements.tfoot.align", "html.elements.tfoot.bgcolor", "html.elements.tfoot.char", "html.elements.tfoot.charoff", "html.elements.tfoot.valign", "html.elements.th.align", "html.\
elements.th.axis", "html.elements.th.bgcolor", "html.elements.th.char", "html.elements.th.charoff", "html.elements.th.valign", "html.elements.th.width", "html.elements.thead.align", "html.elements.thead.bgcolor", "html.elements.thead.char", "html.elements.thead.charoff", "html.elements.thead.valign", "html.elements.tr.align", "html.elements.tr.bgcolor", "html.elements.tr.char", "html.elements.tr.charoff", "html.elements.tr.valign"], description: "Attributes and properties of table elements, such as align, vAlign, noWrap, bgcolor, or char set various visual presentation properties of the table and its sections and cells.", description_html: "Attributes and properties of table elements, such as <code>align</code>, <code>vAlign</code>, <code>noWrap</code>, <code>bgcolor</code>, or <code>char</code> set various visual presentation properties of the table and its sections and cells.", discouraged: { according_to: ["https://html.spec.whatwg.org/multipage/obsolete.html"], reason: "Some table \
styling attributes have no effect. They are superseded by CSS.", reason_html: "Some table styling attributes have no effect. They are superseded by CSS." }, group: ["html-elements"], kind: "feature", name: "Table styling", spec: ["https://html.spec.whatwg.org/multipage/obsolete.html"], status: { baseline: false, by_compat_key: { "api.HTMLTableCaptionElement.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.axis": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.bgColor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1",
    firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.ch": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.chOff": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.height": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.noWrap": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.vAlign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableCellElement.width": {
    baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement.ch": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement.chOff": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement.vAlign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableColElement.width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.bgColor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.border": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.cellPadding": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.cellSpacing": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.frame": { baseline: false, support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.rules": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.summary": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableElement.width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.bgColor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } },
    "api.HTMLTableRowElement.ch": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.chOff": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableRowElement.vAlign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.ch": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.chOff": { baseline: false, support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTableSectionElement.vAlign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.caption.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.col.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.col.char": { baseline: false, support: {} }, "html.elements.col.charoff": { baseline: false, support: {} }, "html.elements.col.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.col.width": { baseline: false, support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.colgroup.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.colgroup.char": { baseline: false, support: {} }, "html.elements.colgroup.charoff": { baseline: false, support: {} }, "html.elements.colgroup.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.colgroup.width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.table.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "\
html.elements.table.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.border": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.cellpadding": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.cellspacing": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.frame": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.rules": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.summary": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.table.width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tbody.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.tbody.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tbody.char": { baseline: false, support: {} }, "html.elements.tbody.charoff": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "html.elements.tbody.valign": { baseline: false, support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.td.abbr": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.td.axis": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.char": { baseline: false, support: {} }, "html.elements.td.charoff": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "html.elements.td.scope": { baseline: false,
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.td.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.td.width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tfoot.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.tfoot.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tfoot.char": { baseline: false, support: {} }, "html.elements.tfoot.charoff": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "htm\
l.elements.tfoot.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.th.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.th.axis": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.th.char": { baseline: false, support: {} }, "html.elements.th.charoff": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "html.elements.th.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3",
    safari_ios: "2" } }, "html.elements.th.width": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.thead.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.thead.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.thead.char": { baseline: false, support: {} }, "html.elements.thead.charoff": { baseline: false, support: { firefox: "1", firefox_android: "4" } }, "html.elements.thead.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.tr.align": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "3", safari_ios: "2" } }, "html.elements.tr.bgcolor": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "html.elements.tr.char": { baseline: false, support: {} }, "html.elements.tr.charoff": { baseline: false, support: {} }, "html.elements.tr.valign": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "2" } } }, support: {} } }, target: { compat_features: ["css.selectors.target"], description: "The :target CSS pseudo-class matches the element with an ID matching the URL fragment.", description_html: "The <code>:target</code> CSS pseudo-class matches the element with an ID matching the URL fragment.", group: ["selectors"], kind: "feature", name: ":target", spec: ["https://drafts.csswg.org/selectors-4/#the-target-pseudo"], status: { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.target": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "2" } } }, "target-text": { compat_features: ["css.selectors.target-text"], description: "The ::target-text pseudo-element allows you to style text highlighted by a URL text fragment such as #:~:text=snippet.", description_html: "The <code>::target-text</code> pseudo-element allows you to style text highlighted by a URL text fragment such as <code>#:~:text=snippet</code>.", group: ["text-fragments"], kind: "feature", name: "::target-text", spec: ["https://drafts.csswg.org/css-pseudo-4/#selectordef-target-text"], status: { baseline: "low", baseline_low_date: "2024-12-11",
    by_compat_key: { "css.selectors.target-text": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "131", firefox_android: "131", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "131", firefox_android: "131", safari: "18.2", safari_ios: "18.2" } } }, "target-within": { description: "The :target-within CSS pseudo-class matches the element with an ID matching the URL fragment and its ancestors.", description_html: "The <code>:target-within</code> CSS pseudo-class matches the element with an ID matching the URL fragment and its ancestors.", discouraged: { according_to: ["https://drafts.csswg.org/selectors-4/#the-target-pseudo", "https://github.com/w3c/csswg-drafts/issues/8357"], alternatives: ["has", "target"], reason: "The :target-within pseudo-class was dropped from the specification in favor of :has(:target).", reason_html: "The <code>:target-within</code\
> pseudo-class was dropped from the specification in favor of <code>:has(:target)</code>.", removal_date: "2023-08-16" }, group: ["selectors"], kind: "feature", name: ":target-within", spec: ["https://www.w3.org/TR/2022/WD-selectors-4-20220507/#the-target-within-pseudo"], status: { baseline: false, support: {} } }, template: { caniuse: ["template"], compat_features: ["api.HTMLTemplateElement", "api.HTMLTemplateElement.content", "html.elements.template"], description: "The <template> HTML element holds HTML fragments which you can clone and insert into the document using JavaScript.", description_html: "The <code>&#x3C;template></code> HTML element holds HTML fragments which you can clone and insert into the document using JavaScript.", group: ["html-elements", "web-components"], kind: "feature", name: "<template>", spec: ["https://html.spec.whatwg.org/multipage/scripting.html#the-template-element"], status: { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-\
11-12", by_compat_key: { "api.HTMLTemplateElement": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "26", chrome_android: "26", edge: "13", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.HTMLTemplateElement.content": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "26", chrome_android: "26", edge: "13", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } }, "html.elements.template": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "26", chrome_android: "26", edge: "13", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } } }, support: { chrome: "26", chrome_android: "26", edge: "13", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } } }, "template-literals": { compat_features: ["javascript.grammar.template_literals", "javascript.gramm\
ar.template_literals.template_literal_revision"], description: "Template literals are literals delimited with backtick (`) characters, allowing for multi-line strings, string interpolation with embedded expressions, and special constructs called tagged templates.", description_html: "Template literals are literals delimited with backtick (`) characters, allowing for multi-line strings, string interpolation with embedded expressions, and special constructs called tagged templates.", group: ["javascript"], kind: "feature", name: "Template literals", spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-template-literals"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "javascript.grammar.template_literals": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "34", firefox_android: "34", safari: "\
9", safari_ios: "9" } }, "javascript.grammar.template_literals.template_literal_revision": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "53", firefox_android: "53", safari: "11", safari_ios: "11" } } }, support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "53", firefox_android: "53", safari: "11", safari_ios: "11" } } }, temporal: { caniuse: ["temporal"], compat_features: ["javascript.builtins.Date.toTemporalInstant", "javascript.builtins.Temporal", "javascript.builtins.Temporal.Duration", "javascript.builtins.Temporal.Duration.Duration", "javascript.builtins.Temporal.Duration.abs", "javascript.builtins.Temporal.Duration.add", "javascript.builtins.Temporal.Duration.blank", "javascript.builtins.Temporal.Duration.compare", "javascript.builtins.Temporal.Duration.days", "javascript.builtins.Temporal.Duration.from", "javascript.builtins.Temporal.Duration.hours", "java\
script.builtins.Temporal.Duration.microseconds", "javascript.builtins.Temporal.Duration.milliseconds", "javascript.builtins.Temporal.Duration.minutes", "javascript.builtins.Temporal.Duration.months", "javascript.builtins.Temporal.Duration.nanoseconds", "javascript.builtins.Temporal.Duration.negated", "javascript.builtins.Temporal.Duration.round", "javascript.builtins.Temporal.Duration.seconds", "javascript.builtins.Temporal.Duration.sign", "javascript.builtins.Temporal.Duration.subtract", "javascript.builtins.Temporal.Duration.toJSON", "javascript.builtins.Temporal.Duration.toLocaleString", "javascript.builtins.Temporal.Duration.toString", "javascript.builtins.Temporal.Duration.total", "javascript.builtins.Temporal.Duration.valueOf", "javascript.builtins.Temporal.Duration.weeks", "javascript.builtins.Temporal.Duration.with", "javascript.builtins.Temporal.Duration.years", "javascript.builtins.Temporal.Instant", "javascript.builtins.Temporal.Instant.Instant", "javascript.builtins.Tempora\
l.Instant.add", "javascript.builtins.Temporal.Instant.compare", "javascript.builtins.Temporal.Instant.epochMilliseconds", "javascript.builtins.Temporal.Instant.epochNanoseconds", "javascript.builtins.Temporal.Instant.equals", "javascript.builtins.Temporal.Instant.from", "javascript.builtins.Temporal.Instant.fromEpochMilliseconds", "javascript.builtins.Temporal.Instant.fromEpochNanoseconds", "javascript.builtins.Temporal.Instant.round", "javascript.builtins.Temporal.Instant.since", "javascript.builtins.Temporal.Instant.subtract", "javascript.builtins.Temporal.Instant.toJSON", "javascript.builtins.Temporal.Instant.toLocaleString", "javascript.builtins.Temporal.Instant.toString", "javascript.builtins.Temporal.Instant.toZonedDateTimeISO", "javascript.builtins.Temporal.Instant.until", "javascript.builtins.Temporal.Instant.valueOf", "javascript.builtins.Temporal.Now", "javascript.builtins.Temporal.Now.instant", "javascript.builtins.Temporal.Now.plainDateISO", "javascript.builtins.Temporal.No\
w.plainDateTimeISO", "javascript.builtins.Temporal.Now.plainTimeISO", "javascript.builtins.Temporal.Now.timeZoneId", "javascript.builtins.Temporal.Now.zonedDateTimeISO", "javascript.builtins.Temporal.PlainDate", "javascript.builtins.Temporal.PlainDate.PlainDate", "javascript.builtins.Temporal.PlainDate.add", "javascript.builtins.Temporal.PlainDate.calendarId", "javascript.builtins.Temporal.PlainDate.compare", "javascript.builtins.Temporal.PlainDate.day", "javascript.builtins.Temporal.PlainDate.dayOfWeek", "javascript.builtins.Temporal.PlainDate.dayOfYear", "javascript.builtins.Temporal.PlainDate.daysInMonth", "javascript.builtins.Temporal.PlainDate.daysInWeek", "javascript.builtins.Temporal.PlainDate.daysInYear", "javascript.builtins.Temporal.PlainDate.equals", "javascript.builtins.Temporal.PlainDate.era", "javascript.builtins.Temporal.PlainDate.eraYear", "javascript.builtins.Temporal.PlainDate.from", "javascript.builtins.Temporal.PlainDate.inLeapYear", "javascript.builtins.Temporal.Pl\
ainDate.month", "javascript.builtins.Temporal.PlainDate.monthCode", "javascript.builtins.Temporal.PlainDate.monthsInYear", "javascript.builtins.Temporal.PlainDate.since", "javascript.builtins.Temporal.PlainDate.subtract", "javascript.builtins.Temporal.PlainDate.toJSON", "javascript.builtins.Temporal.PlainDate.toLocaleString", "javascript.builtins.Temporal.PlainDate.toPlainDateTime", "javascript.builtins.Temporal.PlainDate.toPlainMonthDay", "javascript.builtins.Temporal.PlainDate.toPlainYearMonth", "javascript.builtins.Temporal.PlainDate.toString", "javascript.builtins.Temporal.PlainDate.toZonedDateTime", "javascript.builtins.Temporal.PlainDate.until", "javascript.builtins.Temporal.PlainDate.valueOf", "javascript.builtins.Temporal.PlainDate.weekOfYear", "javascript.builtins.Temporal.PlainDate.with", "javascript.builtins.Temporal.PlainDate.withCalendar", "javascript.builtins.Temporal.PlainDate.year", "javascript.builtins.Temporal.PlainDate.yearOfWeek", "javascript.builtins.Temporal.Plain\
DateTime", "javascript.builtins.Temporal.PlainDateTime.PlainDateTime", "javascript.builtins.Temporal.PlainDateTime.add", "javascript.builtins.Temporal.PlainDateTime.calendarId", "javascript.builtins.Temporal.PlainDateTime.compare", "javascript.builtins.Temporal.PlainDateTime.day", "javascript.builtins.Temporal.PlainDateTime.dayOfWeek", "javascript.builtins.Temporal.PlainDateTime.dayOfYear", "javascript.builtins.Temporal.PlainDateTime.daysInMonth", "javascript.builtins.Temporal.PlainDateTime.daysInWeek", "javascript.builtins.Temporal.PlainDateTime.daysInYear", "javascript.builtins.Temporal.PlainDateTime.equals", "javascript.builtins.Temporal.PlainDateTime.era", "javascript.builtins.Temporal.PlainDateTime.eraYear", "javascript.builtins.Temporal.PlainDateTime.from", "javascript.builtins.Temporal.PlainDateTime.hour", "javascript.builtins.Temporal.PlainDateTime.inLeapYear", "javascript.builtins.Temporal.PlainDateTime.microsecond", "javascript.builtins.Temporal.PlainDateTime.millisecond", "j\
avascript.builtins.Temporal.PlainDateTime.minute", "javascript.builtins.Temporal.PlainDateTime.month", "javascript.builtins.Temporal.PlainDateTime.monthCode", "javascript.builtins.Temporal.PlainDateTime.monthsInYear", "javascript.builtins.Temporal.PlainDateTime.nanosecond", "javascript.builtins.Temporal.PlainDateTime.round", "javascript.builtins.Temporal.PlainDateTime.second", "javascript.builtins.Temporal.PlainDateTime.since", "javascript.builtins.Temporal.PlainDateTime.subtract", "javascript.builtins.Temporal.PlainDateTime.toJSON", "javascript.builtins.Temporal.PlainDateTime.toLocaleString", "javascript.builtins.Temporal.PlainDateTime.toPlainDate", "javascript.builtins.Temporal.PlainDateTime.toPlainTime", "javascript.builtins.Temporal.PlainDateTime.toString", "javascript.builtins.Temporal.PlainDateTime.toZonedDateTime", "javascript.builtins.Temporal.PlainDateTime.until", "javascript.builtins.Temporal.PlainDateTime.valueOf", "javascript.builtins.Temporal.PlainDateTime.weekOfYear", "ja\
vascript.builtins.Temporal.PlainDateTime.with", "javascript.builtins.Temporal.PlainDateTime.withCalendar", "javascript.builtins.Temporal.PlainDateTime.withPlainTime", "javascript.builtins.Temporal.PlainDateTime.year", "javascript.builtins.Temporal.PlainDateTime.yearOfWeek", "javascript.builtins.Temporal.PlainMonthDay", "javascript.builtins.Temporal.PlainMonthDay.PlainMonthDay", "javascript.builtins.Temporal.PlainMonthDay.calendarId", "javascript.builtins.Temporal.PlainMonthDay.day", "javascript.builtins.Temporal.PlainMonthDay.equals", "javascript.builtins.Temporal.PlainMonthDay.from", "javascript.builtins.Temporal.PlainMonthDay.monthCode", "javascript.builtins.Temporal.PlainMonthDay.toJSON", "javascript.builtins.Temporal.PlainMonthDay.toLocaleString", "javascript.builtins.Temporal.PlainMonthDay.toPlainDate", "javascript.builtins.Temporal.PlainMonthDay.toString", "javascript.builtins.Temporal.PlainMonthDay.valueOf", "javascript.builtins.Temporal.PlainMonthDay.with", "javascript.builtins\
.Temporal.PlainTime", "javascript.builtins.Temporal.PlainTime.PlainTime", "javascript.builtins.Temporal.PlainTime.add", "javascript.builtins.Temporal.PlainTime.compare", "javascript.builtins.Temporal.PlainTime.equals", "javascript.builtins.Temporal.PlainTime.from", "javascript.builtins.Temporal.PlainTime.hour", "javascript.builtins.Temporal.PlainTime.microsecond", "javascript.builtins.Temporal.PlainTime.millisecond", "javascript.builtins.Temporal.PlainTime.minute", "javascript.builtins.Temporal.PlainTime.nanosecond", "javascript.builtins.Temporal.PlainTime.round", "javascript.builtins.Temporal.PlainTime.second", "javascript.builtins.Temporal.PlainTime.since", "javascript.builtins.Temporal.PlainTime.subtract", "javascript.builtins.Temporal.PlainTime.toJSON", "javascript.builtins.Temporal.PlainTime.toLocaleString", "javascript.builtins.Temporal.PlainTime.toString", "javascript.builtins.Temporal.PlainTime.until", "javascript.builtins.Temporal.PlainTime.valueOf", "javascript.builtins.Tempo\
ral.PlainTime.with", "javascript.builtins.Temporal.PlainYearMonth", "javascript.builtins.Temporal.PlainYearMonth.PlainYearMonth", "javascript.builtins.Temporal.PlainYearMonth.add", "javascript.builtins.Temporal.PlainYearMonth.calendarId", "javascript.builtins.Temporal.PlainYearMonth.compare", "javascript.builtins.Temporal.PlainYearMonth.daysInMonth", "javascript.builtins.Temporal.PlainYearMonth.daysInYear", "javascript.builtins.Temporal.PlainYearMonth.equals", "javascript.builtins.Temporal.PlainYearMonth.era", "javascript.builtins.Temporal.PlainYearMonth.eraYear", "javascript.builtins.Temporal.PlainYearMonth.from", "javascript.builtins.Temporal.PlainYearMonth.inLeapYear", "javascript.builtins.Temporal.PlainYearMonth.month", "javascript.builtins.Temporal.PlainYearMonth.monthCode", "javascript.builtins.Temporal.PlainYearMonth.monthsInYear", "javascript.builtins.Temporal.PlainYearMonth.since", "javascript.builtins.Temporal.PlainYearMonth.subtract", "javascript.builtins.Temporal.PlainYearM\
onth.toJSON", "javascript.builtins.Temporal.PlainYearMonth.toLocaleString", "javascript.builtins.Temporal.PlainYearMonth.toPlainDate", "javascript.builtins.Temporal.PlainYearMonth.toString", "javascript.builtins.Temporal.PlainYearMonth.until", "javascript.builtins.Temporal.PlainYearMonth.valueOf", "javascript.builtins.Temporal.PlainYearMonth.with", "javascript.builtins.Temporal.PlainYearMonth.year", "javascript.builtins.Temporal.ZonedDateTime", "javascript.builtins.Temporal.ZonedDateTime.ZonedDateTime", "javascript.builtins.Temporal.ZonedDateTime.add", "javascript.builtins.Temporal.ZonedDateTime.calendarId", "javascript.builtins.Temporal.ZonedDateTime.compare", "javascript.builtins.Temporal.ZonedDateTime.day", "javascript.builtins.Temporal.ZonedDateTime.dayOfWeek", "javascript.builtins.Temporal.ZonedDateTime.dayOfYear", "javascript.builtins.Temporal.ZonedDateTime.daysInMonth", "javascript.builtins.Temporal.ZonedDateTime.daysInWeek", "javascript.builtins.Temporal.ZonedDateTime.daysInYea\
r", "javascript.builtins.Temporal.ZonedDateTime.epochMilliseconds", "javascript.builtins.Temporal.ZonedDateTime.epochNanoseconds", "javascript.builtins.Temporal.ZonedDateTime.equals", "javascript.builtins.Temporal.ZonedDateTime.era", "javascript.builtins.Temporal.ZonedDateTime.eraYear", "javascript.builtins.Temporal.ZonedDateTime.from", "javascript.builtins.Temporal.ZonedDateTime.getTimeZoneTransition", "javascript.builtins.Temporal.ZonedDateTime.hour", "javascript.builtins.Temporal.ZonedDateTime.hoursInDay", "javascript.builtins.Temporal.ZonedDateTime.inLeapYear", "javascript.builtins.Temporal.ZonedDateTime.microsecond", "javascript.builtins.Temporal.ZonedDateTime.millisecond", "javascript.builtins.Temporal.ZonedDateTime.minute", "javascript.builtins.Temporal.ZonedDateTime.month", "javascript.builtins.Temporal.ZonedDateTime.monthCode", "javascript.builtins.Temporal.ZonedDateTime.monthsInYear", "javascript.builtins.Temporal.ZonedDateTime.nanosecond", "javascript.builtins.Temporal.Zoned\
DateTime.offset", "javascript.builtins.Temporal.ZonedDateTime.offsetNanoseconds", "javascript.builtins.Temporal.ZonedDateTime.round", "javascript.builtins.Temporal.ZonedDateTime.second", "javascript.builtins.Temporal.ZonedDateTime.since", "javascript.builtins.Temporal.ZonedDateTime.startOfDay", "javascript.builtins.Temporal.ZonedDateTime.subtract", "javascript.builtins.Temporal.ZonedDateTime.timeZoneId", "javascript.builtins.Temporal.ZonedDateTime.toInstant", "javascript.builtins.Temporal.ZonedDateTime.toJSON", "javascript.builtins.Temporal.ZonedDateTime.toLocaleString", "javascript.builtins.Temporal.ZonedDateTime.toPlainDate", "javascript.builtins.Temporal.ZonedDateTime.toPlainDateTime", "javascript.builtins.Temporal.ZonedDateTime.toPlainTime", "javascript.builtins.Temporal.ZonedDateTime.toString", "javascript.builtins.Temporal.ZonedDateTime.until", "javascript.builtins.Temporal.ZonedDateTime.valueOf", "javascript.builtins.Temporal.ZonedDateTime.weekOfYear", "javascript.builtins.Tempo\
ral.ZonedDateTime.with", "javascript.builtins.Temporal.ZonedDateTime.withCalendar", "javascript.builtins.Temporal.ZonedDateTime.withPlainTime", "javascript.builtins.Temporal.ZonedDateTime.withTimeZone", "javascript.builtins.Temporal.ZonedDateTime.year", "javascript.builtins.Temporal.ZonedDateTime.yearOfWeek"], description: "The Temporal API allows you to work with dates, times, time zones, and durations. It is more powerful than the Date API.", description_html: "The <code>Temporal</code> API allows you to work with dates, times, time zones, and durations. It is more powerful than the <code>Date</code> API.", group: ["javascript"], kind: "feature", name: "Temporal", spec: ["https://tc39.es/proposal-temporal/"], status: { baseline: false, by_compat_key: { "javascript.builtins.Date.toTemporalInstant": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal": { baseline: false, support: { chrome: "\
144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.Duration": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.abs": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.add": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.blank": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.compare": { baseline: false,
    support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.days": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.hours": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.microseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.milliseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builti\
ns.Temporal.Duration.minutes": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.months": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.nanoseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.negated": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.round": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.seconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "\
139" } }, "javascript.builtins.Temporal.Duration.sign": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.toString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.total": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "\
144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.weeks": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Duration.years": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.Instant": { baseline: false, support: { firefox: "139", firefox_android: "\
139" } }, "javascript.builtins.Temporal.Instant.add": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.compare": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.epochMilliseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.epochNanoseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.from": { baseline: false, support: { chrome: "144", chrome_android: "144",
    edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.fromEpochMilliseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.fromEpochNanoseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.round": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.since": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.toJSON": { baseline: false,
    support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.toString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.toZonedDateTimeISO": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.until": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Instant.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascr\
ipt.builtins.Temporal.Now": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Now.instant": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Now.plainDateISO": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Now.plainDateTimeISO": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Now.plainTimeISO": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Now.timeZoneId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "\
139" } }, "javascript.builtins.Temporal.Now.zonedDateTimeISO": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.PlainDate": { baseline: false, support: { firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.add": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.calendarId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.compare": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } },
    "javascript.builtins.Temporal.PlainDate.day": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.dayOfWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.dayOfYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.daysInMonth": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.daysInWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.daysInYear": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.era": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.eraYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.inLeapYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.month": { baseline: false, support: {
    chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.monthCode": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.monthsInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.since": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.\
Temporal.PlainDate.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.toPlainDateTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.toPlainMonthDay": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.toPlainYearMonth": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.toString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.toZonedDateTime": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.until": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.weekOfYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.withCalendar": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "javascript.builtins.Temporal.PlainDate.year": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDate.yearOfWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.PlainDateTime": { baseline: false, support: { firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.add": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.calendarId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.compare": { baseline: false, support: { chrome: "144",
    chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.day": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.dayOfWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.dayOfYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.daysInMonth": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.daysInWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.bu\
iltins.Temporal.PlainDateTime.daysInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.era": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.eraYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.hour": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "\
144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.inLeapYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.microsecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.millisecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.minute": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.month": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.mon\
thCode": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.monthsInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.nanosecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.round": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.second": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.since": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "13\
9", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.toPlainDate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.toPlainTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.toString": { baseline: false,
    support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.toZonedDateTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.until": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.weekOfYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "\
139" } }, "javascript.builtins.Temporal.PlainDateTime.withCalendar": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "javascript.builtins.Temporal.PlainDateTime.withPlainTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.year": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainDateTime.yearOfWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.PlainMonthDay": { baseline: false, support: { firefox: "139", firefox_android: "139" } },
    "javascript.builtins.Temporal.PlainMonthDay.calendarId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.day": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.monthCode": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.toPlainDate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.toString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainMonthDay.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Pla\
inTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.PlainTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.add": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.compare": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } },
    "javascript.builtins.Temporal.PlainTime.hour": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.microsecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.millisecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.minute": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.nanosecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.round": { baseline: false, support: { chrome: "144", chrome_android: "144",
    edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.second": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.since": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.toString": { baseline: false,
    support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.until": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainTime.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.PlainYearMonth": { baseline: false, support: { firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.add": { baseline: false,
    support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.calendarId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.compare": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.daysInMonth": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.daysInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "\
139" } }, "javascript.builtins.Temporal.PlainYearMonth.era": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.eraYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.inLeapYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.month": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.monthCode": { baseline: false, support: { chrome: "\
144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.monthsInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.since": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "jav\
ascript.builtins.Temporal.PlainYearMonth.toPlainDate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.toString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.until": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.valueOf": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.PlainYearMonth.year": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.ZonedDateTime": { baseline: false, support: { firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.add": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.calendarId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.compare": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.day": { baseline: false, support: { chrome: "144", chrome_android: "\
144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.dayOfWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.dayOfYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.daysInMonth": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.daysInWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.daysInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Tempora\
l.ZonedDateTime.epochMilliseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.epochNanoseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.equals": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.era": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.eraYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.from": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "\
144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.getTimeZoneTransition": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.hour": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.hoursInDay": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.inLeapYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.microsecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.Zone\
dDateTime.millisecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.minute": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.month": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.monthCode": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.monthsInYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.nanosecond": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "\
144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.offset": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.offsetNanoseconds": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.round": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.second": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.since": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.startOf\
Day": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.subtract": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.timeZoneId": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toInstant": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toJSON": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toLocaleString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "\
139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toPlainDate": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toPlainDateTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toPlainTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.toString": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.until": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.valueOf": { baseline: false,
    support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.weekOfYear": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.with": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.withCalendar": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144" } }, "javascript.builtins.Temporal.ZonedDateTime.withPlainTime": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.withTimeZone": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtin\
s.Temporal.ZonedDateTime.year": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } }, "javascript.builtins.Temporal.ZonedDateTime.yearOfWeek": { baseline: false, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } } }, support: { chrome: "144", chrome_android: "144", edge: "144", firefox: "139", firefox_android: "139" } } }, "text-align": { compat_features: ["css.properties.text-align", "css.properties.text-align.center", "css.properties.text-align.end", "css.properties.text-align.justify", "css.properties.text-align.left", "css.properties.text-align.match-parent", "css.properties.text-align.right", "css.properties.text-align.start"], description: "The text-align CSS property sets the horizontal placement of the inner content of a block element.", description_html: "The <code>text-align</code> CSS property sets the horizontal placement of the inner content of a bloc\
k element.", group: ["text"], kind: "feature", name: "text-align", spec: ["https://drafts.csswg.org/css-text-4/#text-align-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.text-align": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-align.center": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "css.properties.text-align.end": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "\
css.properties.text-align.justify": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-align.left": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "css.properties.text-align.match-parent": { baseline: false, support: { firefox: "40", firefox_android: "40", safari: "15.4", safari_ios: "15.4" } }, "css.properties.text-align.right": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "css.properties.text-align.start": { baseline: "high", baseline_high_date: "2022-07-\
15", baseline_low_date: "2020-01-15", support: { chrome: "1", chrome_android: "18", edge: "79", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "text-align-last": { caniuse: ["css-text-align-last"], compat_features: ["css.properties.text-align-last", "css.properties.text-align-last.auto"], description: "The text-align-last CSS property sets the alignment of the last line of text before a forced line break.", description_html: "The <code>text-align-last</code> CSS property sets the alignment of the last line of text before a forced line break.", group: ["text"], kind: "feature", name: "text-align-last", spec: ["https://drafts.csswg.org/css-text-4/#text-align-last-property"], status: { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", by_compat_key: { "css.properties.text-align-last": { baseline: "hi\
gh", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "49", firefox_android: "49", safari: "16", safari_ios: "16" } }, "css.properties.text-align-last.auto": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "49", firefox_android: "49", safari: "16", safari_ios: "16" } } }, support: { chrome: "47", chrome_android: "47", edge: "12", firefox: "49", firefox_android: "49", safari: "16", safari_ios: "16" } } }, "text-autospace": { compat_features: ["css.properties.text-autospace", "css.properties.text-autospace.auto", "css.properties.text-autospace.ideograph-alpha", "css.properties.text-autospace.ideograph-numeric", "css.properties.text-autospace.insert", "css.properties.text-autospace.no-autospace", "css.properties.text-autospace.normal", "css.properties.text-autospace.punctuation", "css.properties.tex\
t-autospace.replace"], description: "The text-autospace CSS property sets whether and how to insert spaces in inter-script text (such as when mixing Latin and Chinese characters) and around punctuation.", description_html: "The <code>text-autospace</code> CSS property sets whether and how to insert spaces in inter-script text (such as when mixing Latin and Chinese characters) and around punctuation.", kind: "feature", name: "text-autospace", spec: ["https://drafts.csswg.org/css-text-4/#text-autospace-property"], status: { baseline: false, by_compat_key: { "css.properties.text-autospace": { baseline: "low", baseline_low_date: "2025-11-11", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "145", firefox_android: "145", safari: "18.4", safari_ios: "18.4" } }, "css.properties.text-autospace.auto": { baseline: false, support: { firefox: "145", firefox_android: "145", safari: "18.4", safari_ios: "18.4" } }, "css.properties.text-autospace.ideograph-alpha": { baseline: false,
    support: { firefox: "145", firefox_android: "145", safari: "18.4", safari_ios: "18.4" } }, "css.properties.text-autospace.ideograph-numeric": { baseline: false, support: { firefox: "145", firefox_android: "145", safari: "18.4", safari_ios: "18.4" } }, "css.properties.text-autospace.insert": { baseline: false, support: { firefox: "145", firefox_android: "145" } }, "css.properties.text-autospace.no-autospace": { baseline: "low", baseline_low_date: "2025-11-11", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "145", firefox_android: "145", safari: "18.4", safari_ios: "18.4" } }, "css.properties.text-autospace.normal": { baseline: "low", baseline_low_date: "2025-11-11", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "145", firefox_android: "145", safari: "18.4", safari_ios: "18.4" } }, "css.properties.text-autospace.punctuation": { baseline: false, support: {} }, "css.properties.text-autospace.replace": { baseline: false, support: {} } }, support: {} } },
    "text-box": { caniuse: ["css-text-box-trim"], compat_features: ["css.properties.text-box", "css.properties.text-box-edge", "css.properties.text-box-edge.auto", "css.properties.text-box-trim", "css.properties.text-box-trim.none", "css.properties.text-box-trim.trim-both", "css.properties.text-box-trim.trim-end", "css.properties.text-box-trim.trim-start", "css.properties.text-box.normal", "css.types.text-edge", "css.types.text-edge.alphabetic", "css.types.text-edge.cap", "css.types.text-edge.ex", "css.types.text-edge.text"], description: "The text-box CSS property sets the spacing above and below text based on a font's typographic features. For example, text-box: trim-both ex alphabetic trims the top to the top of the letter x and the bottom to the bottom of most letters, without descenders.", description_html: "The <code>text-box</code> CSS property sets the spacing above and below text based on a font's typographic features. For example, <code>text-box: trim-both ex alphabetic</code\
> trims the top to the top of the letter x and the bottom to the bottom of most letters, without descenders.", group: ["text"], kind: "feature", name: "text-box", spec: ["https://drafts.csswg.org/css-inline-3/#leading-trim"], status: { baseline: false, by_compat_key: { "css.properties.text-box": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box-edge": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box-edge.auto": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box-trim": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box-trim.none": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "\
18.2", safari_ios: "18.2" } }, "css.properties.text-box-trim.trim-both": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box-trim.trim-end": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box-trim.trim-start": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-box.normal": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.types.text-edge": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.types.text-edge.alphabetic": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.types.text-edge.cap": {
    baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.types.text-edge.ex": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } }, "css.types.text-edge.text": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "133", chrome_android: "133", edge: "133", safari: "18.2", safari_ios: "18.2" } } }, "text-combine-upright": { compat_features: ["css.properties.text-combine-upright", "css.properties.text-combine-upright.all", "css.properties.text-combine-upright.none"], description: "The text-combine-upright CSS property displays multiple characters in the space of a single character in vertical text. This is used in East Asian documents to display Latin-based strings such as components of a date or letters of an initialism.", description_html: "The <code>text-combine-\
upright</code> CSS property displays multiple characters in the space of a single character in vertical text. This is used in East Asian documents to display Latin-based strings such as components of a date or letters of an initialism.", group: ["text"], kind: "feature", name: "text-combine-upright", spec: ["https://drafts.csswg.org/css-writing-modes-4/#text-combine-upright"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.text-combine-upright": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } }, "css.properties.text-combine-upright.all": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "\
15.4" } }, "css.properties.text-combine-upright.none": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "48", firefox_android: "48", safari: "15.4", safari_ios: "15.4" } } }, "text-decoration": { caniuse: ["text-decoration"], compat_features: ["css.properties.text-decoration", "css.properties.text-decoration-color", "css.properties.text-decoration-line", "css.properties.text-decoration-line.line-through", "css.properties.text-decoration-line.none", "css.properties.text-decoration-line.overline", "css.properties.text-decoration-line.underline", "css.properties.text-decoration-style", "css.properties.text-decoration-style.wavy", "css.properties.text-decoration-thickness", "css.properties.text-decoration-thickness.auto", "css.properties.text-decora\
tion-thickness.from-font", "css.properties.text-decoration-thickness.percentage", "css.properties.text-decoration.includes_color-and-style", "css.properties.text-decoration.includes_thickness"], description: "The text-decoration CSS property sets the style and color of decorative lines including underline, overline, line-through, or a combination of lines.", description_html: "The <code>text-decoration</code> CSS property sets the style and color of decorative lines including underline, overline, line-through, or a combination of lines.", kind: "feature", name: "text-decoration", spec: ["https://drafts.csswg.org/css-text-decor-4/#line-decoration"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.text-decoration": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "css.properties.text-decoration-color": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-line": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-line.line-through": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-line.none": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79",
    firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-line.overline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-line.underline": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-style": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-style.wavy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-thickness": { baseline: "high", baseline_high_date: "2023-09-04", baseline_low_date: "2021-03-04", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "70", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-thickness.auto": { baseline: "high", baseline_high_date: "2023-09-04", baseline_low_date: "2021-03-04", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "70", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration-thickness.from-font": { baseline: "high", baseline_high_date: "2023-09-04", baseline_low_date: "2021-03-04", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "70", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-decoration\
-thickness.percentage": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "74", firefox_android: "79", safari: "17.4", safari_ios: "17.4" } }, "css.properties.text-decoration.includes_color-and-style": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "6", firefox_android: "6", safari: "26.2", safari_ios: "26.2" } }, "css.properties.text-decoration.includes_thickness": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "70", firefox_android: "79", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "text-decoration-line-blink": { compat_features: ["css.properties.text-decoration-line.blink"], description: "The text-decoration: blink CSS declaration flashes text b\
etween visible and invisible.", description_html: "The <code>text-decoration: blink</code> CSS declaration flashes text between visible and invisible.", discouraged: { according_to: ["https://drafts.csswg.org/css-text-decor-3/#valdef-text-decoration-line-blink"], alternatives: ["animations-css"], reason: "Browsers may ignore the blink value.", reason_html: "Browsers may ignore the <code>blink</code> value." }, group: ["animation", "css"], kind: "feature", name: "text-decoration-line: blink", spec: ["https://drafts.csswg.org/css-text-decor-3/#valdef-text-decoration-line-blink"], status: { baseline: false, by_compat_key: { "css.properties.text-decoration-line.blink": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "36", firefox_android: "36", safari: "12.1", safari_ios: "12.2" } } }, "text-decoration-selection": {
    compat_features: ["css.selectors.selection.text-decoration"], description: "The text-decoration CSS property in a ::selection rule sets the underline and other text decoration styles on the text a user has highlighted.", description_html: "The <code>text-decoration</code> CSS property in a <code>::selection</code> rule sets the underline and other text decoration styles on the text a user has highlighted.", group: ["selectors", "selection"], kind: "feature", name: "text-decoration in ::selection", spec: ["https://drafts.csswg.org/css-pseudo-4/#highlight-styling"], status: { baseline: false, by_compat_key: { "css.selectors.selection.text-decoration": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105" } } }, support: { chrome: "105", chrome_android: "105", edge: "105" } } }, "text-decoration-skip-ink": { compat_features: ["css.properties.text-decoration-skip-ink", "css.properties.text-decoration-skip-ink.auto", "css.properties.text-decoration-skip-ink.non\
e"], description: "The text-decoration-skip-ink CSS property sets whether underlines and overlines may be interrupted where the line would cross a glyph.", description_html: "The <code>text-decoration-skip-ink</code> CSS property sets whether underlines and overlines may be interrupted where the line would cross a glyph.", kind: "feature", name: "text-decoration-skip-ink", spec: ["https://drafts.csswg.org/css-text-decor-4/#text-decoration-skip-ink-property"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.text-decoration-skip-ink": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "70", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "css.properties.text-decoration-skip-ink.auto": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "64",
    chrome_android: "64", edge: "79", firefox: "70", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "css.properties.text-decoration-skip-ink.none": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "70", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "70", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, "text-decoration-skip-ink-all": { compat_features: ["css.properties.text-decoration-skip-ink.all"], description: "The text-decoration-skip-ink: all CSS declaration forces interruptions in underlines and overlines where the line would cross a glyph. This contrasts with auto, which does not skip for CJK glyphs.", description_html: "The <code>text-decoration-skip-ink: all</code> CSS declaration forces interruptions in underlines and overlines where the line would cross \
a glyph. This contrasts with <code>auto</code>, which does not skip for CJK glyphs.", kind: "feature", name: "text-decoration-skip-ink: all", spec: ["https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-all"], status: { baseline: false, by_compat_key: { "css.properties.text-decoration-skip-ink.all": { baseline: false, support: { firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, support: { firefox: "75", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } } }, "text-decoration-spelling-grammar": { compat_features: ["css.properties.text-decoration-line.grammar-error", "css.properties.text-decoration-line.spelling-error"], description: "The text-decoration-line: spelling-error and text-decoration-line: grammar-error CSS declarations apply the browser's marking for spelling and grammatical mistakes. This is typically a wavy underline in red or green.", description_html: "The <code>text-decoration-line: spelling-error</code> and <c\
ode>text-decoration-line: grammar-error</code> CSS declarations apply the browser's marking for spelling and grammatical mistakes. This is typically a wavy underline in red or green.", kind: "feature", name: "Spelling and grammar text decorations", spec: ["https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-spelling-error"], status: { baseline: "low", baseline_low_date: "2025-12-12", by_compat_key: { "css.properties.text-decoration-line.grammar-error": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "137", firefox_android: "137", safari: "26.2", safari_ios: "26.2" } }, "css.properties.text-decoration-line.spelling-error": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "137", firefox_android: "137", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "121", chrome_android: "121", edge: "121", firefox: "137", firefox_android: "\
137", safari: "26.2", safari_ios: "26.2" } } }, "text-emphasis": { caniuse: ["text-emphasis"], compat_features: ["css.properties.text-emphasis", "css.properties.text-emphasis-color", "css.properties.text-emphasis-position", "css.properties.text-emphasis-position.auto", "css.properties.text-emphasis-position.left", "css.properties.text-emphasis-position.over", "css.properties.text-emphasis-position.right", "css.properties.text-emphasis-position.under", "css.properties.text-emphasis-style", "css.properties.text-emphasis-style.circle", "css.properties.text-emphasis-style.dot", "css.properties.text-emphasis-style.double-circle", "css.properties.text-emphasis-style.filled", "css.properties.text-emphasis-style.none", "css.properties.text-emphasis-style.sesame", "css.properties.text-emphasis-style.triangle"], description: "The text-emphasis CSS property sets position and style for text emphasis marks, especially for East Asian languages.", description_html: "The <code>text-emphasis</code> CSS\
 property sets position and style for text emphasis marks, especially for East Asian languages.", kind: "feature", name: "text-emphasis", spec: ["https://drafts.csswg.org/css-text-decor-4/#text-emphasis-property"], status: { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", by_compat_key: { "css.properties.text-emphasis": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-color": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-position": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "\
99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-position.auto": { baseline: false, support: { firefox: "132", firefox_android: "132" } }, "css.properties.text-emphasis-position.left": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "8", safari_ios: "8" } }, "css.properties.text-emphasis-position.over": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "108", firefox_android: "108", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-position.right": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "8", safari_ios: "8" } },
    "css.properties.text-emphasis-position.under": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "108", firefox_android: "108", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.circle": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.dot": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "\
46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.double-circle": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.filled": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.none": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.sesame": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "\
99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } }, "css.properties.text-emphasis-style.triangle": { baseline: "high", baseline_high_date: "2024-09-03", baseline_low_date: "2022-03-03", support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } } }, support: { chrome: "99", chrome_android: "99", edge: "99", firefox: "46", firefox_android: "46", safari: "7", safari_ios: "7" } } }, "text-encoding": { caniuse: ["textencoder"], compat_features: ["api.TextDecoder", "api.TextDecoder.TextDecoder", "api.TextDecoder.decode", "api.TextDecoder.encoding", "api.TextDecoder.fatal", "api.TextDecoder.ignoreBOM", "api.TextDecoder.worker_support", "api.TextDecoderStream", "api.TextDecoderStream.TextDecoderStream", "api.TextDecoderStream.encoding", "api.TextDecoderStream.fatal", "api.TextDecoderStream.ignoreBOM", "api.TextDecoderStream.readable", "api.TextDecoderStream.writable", "api.TextEncoder", "\
api.TextEncoder.TextEncoder", "api.TextEncoder.encode", "api.TextEncoder.encodeInto", "api.TextEncoder.encoding", "api.TextEncoder.worker_support", "api.TextEncoderStream", "api.TextEncoderStream.TextEncoderStream", "api.TextEncoderStream.encoding", "api.TextEncoderStream.readable", "api.TextEncoderStream.writable"], description: "The TextEncoder API transforms a stream of code points into a byte stream with UTF-8 encoding, and TextDecoder does the reverse.", description_html: "The <code>TextEncoder</code> API transforms a stream of code points into a byte stream with UTF-8 encoding, and <code>TextDecoder</code> does the reverse.", kind: "feature", name: "Text encoding and decoding", spec: ["https://encoding.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.TextDecoder": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38",
    edge: "79", firefox: "19", firefox_android: "19", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoder.TextDecoder": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "19", firefox_android: "19", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoder.decode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "19", firefox_android: "19", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoder.encoding": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "19", firefox_android: "19", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoder.fatal": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "\
38", edge: "79", firefox: "36", firefox_android: "36", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoder.ignoreBOM": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "63", firefox_android: "63", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoder.worker_support": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "10.3" } }, "api.TextDecoderStream": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextDecoderStream.TextDecoderStream": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "\
71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextDecoderStream.encoding": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextDecoderStream.fatal": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextDecoderStream.ignoreBOM": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextDecoderStream.readable": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "\
2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextDecoderStream.writable": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextEncoder": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "18", firefox_android: "18", safari: "10.1", safari_ios: "10.3" } }, "api.TextEncoder.TextEncoder": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "18", firefox_android: "18", safari: "10.1", safari_ios: "10.3" } }, "api.TextEncoder.encode": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "18", firefox_android: "18", safari: "10.1", safari_ios: "10.3" } }, "api.TextEncoder.encodeInto": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "66", firefox_android: "66", safari: "14.1", safari_ios: "14.5" } }, "api.TextEncoder.encoding": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "18", firefox_android: "18", safari: "10.1", safari_ios: "10.3" } }, "api.TextEncoder.worker_support": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "20", firefox_android: "20", safari: "10.1", safari_ios: "10.3" } }, "api.TextEncoderStream": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "\
2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextEncoderStream.TextEncoderStream": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextEncoderStream.encoding": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextEncoderStream.readable": { baseline: "high", baseline_high_date: "2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } }, "api.TextEncoderStream.writable": { baseline: "high", baseline_high_date: "\
2025-03-20", baseline_low_date: "2022-09-20", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "105", firefox_android: "105", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "38", chrome_android: "38", edge: "79", firefox: "19", firefox_android: "19", safari: "10.1", safari_ios: "10.3" } } }, "text-indent": { caniuse: ["css-text-indent"], compat_features: ["css.properties.text-indent"], description: "The text-indent CSS property sets the size of the empty space (indentation) at the beginning of lines in a text.", description_html: "The <code>text-indent</code> CSS property sets the size of the empty space (indentation) at the beginning of lines in a text.", group: ["css"], kind: "feature", name: "text-indent", spec: ["https://drafts.csswg.org/css-text-3/#text-indent-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.text-indent": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "text-indent-each-line": { compat_features: ["css.properties.text-indent.each-line"], description: "The text-indent: each-line CSS declaration indents text after forced breaks as well as to the first line of a block.", description_html: "The <code>text-indent: each-line</code> CSS declaration indents text after forced breaks as well as to the first line of a block.", group: ["text"], kind: "feature", name: "text-indent: each-line", spec: ["https://drafts.csswg.org/css-text-4/#text-indent-property"], status: { baseline: "low", baseline_low_date: "2026-03-13", by_compat_key: { "css.properties.text-indent.each-line": { baseline: "low", baseline_low_date: "2026-03-13", support: { chrome: "\
146", chrome_android: "146", edge: "146", firefox: "121", firefox_android: "121", safari: "15", safari_ios: "15" } } }, support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "121", firefox_android: "121", safari: "15", safari_ios: "15" } } }, "text-indent-hanging": { compat_features: ["css.properties.text-indent.hanging"], description: "The text-indent: hanging CSS declaration indents all lines except the first.", description_html: "The <code>text-indent: hanging</code> CSS declaration indents all lines except the first.", group: ["text"], kind: "feature", name: "text-indent: hanging", spec: ["https://drafts.csswg.org/css-text-4/#text-indent-property"], status: { baseline: "low", baseline_low_date: "2026-03-13", by_compat_key: { "css.properties.text-indent.hanging": { baseline: "low", baseline_low_date: "2026-03-13", support: { chrome: "146", chrome_android: "146", edge: "146", firefox: "121", firefox_android: "121", safari: "15", safari_ios: "15" } } }, support: { chrome: "\
146", chrome_android: "146", edge: "146", firefox: "121", firefox_android: "121", safari: "15", safari_ios: "15" } } }, "text-justify": { caniuse: ["css-text-justify"], compat_features: ["css.properties.text-justify", "css.properties.text-justify.auto", "css.properties.text-justify.inter-character", "css.properties.text-justify.inter-word", "css.properties.text-justify.none"], description: "The text-justify CSS property sets the justification method of text when text-align: justify is set.", description_html: "The <code>text-justify</code> CSS property sets the justification method of text when <code>text-align: justify</code> is set.", group: ["text"], kind: "feature", name: "text-justify", spec: ["https://drafts.csswg.org/css-text-4/#text-justify-property"], status: { baseline: false, by_compat_key: { "css.properties.text-justify": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "55", firefox_android: "55" } }, "css.properties.text-justify.au\
to": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "55", firefox_android: "55" } }, "css.properties.text-justify.inter-character": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "55", firefox_android: "55" } }, "css.properties.text-justify.inter-word": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "55", firefox_android: "55" } }, "css.properties.text-justify.none": { baseline: false, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "55", firefox_android: "55" } } }, support: { chrome: "145", chrome_android: "145", edge: "145", firefox: "55", firefox_android: "55" } } }, "text-orientation": { caniuse: ["css-text-orientation"], compat_features: ["css.properties.text-orientation", "css.properties.text-orientation.mixed", "css.properties.text-orientation.sideways", "css.properties.text-orientation.upright"], description: "The text-orientat\
ion CSS property sets the how text is typeset within a line when the writing mode is vertical.", description_html: "The <code>text-orientation</code> CSS property sets the how text is typeset within a line when the writing mode is vertical.", group: ["text"], kind: "feature", name: "text-orientation", spec: ["https://drafts.csswg.org/css-writing-modes-4/#text-orientation"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "css.properties.text-orientation": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "14", safari_ios: "14" } }, "css.properties.text-orientation.mixed": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "14", safari_ios: "14" } },
    "css.properties.text-orientation.sideways": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "≤44", firefox_android: "≤44", safari: "14", safari_ios: "14" } }, "css.properties.text-orientation.upright": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "14", safari_ios: "14" } } }, support: { chrome: "48", chrome_android: "48", edge: "79", firefox: "41", firefox_android: "41", safari: "14", safari_ios: "14" } } }, "text-overflow": { caniuse: ["text-overflow"], compat_features: ["css.properties.text-overflow", "css.properties.text-overflow.clip", "css.properties.text-overflow.ellipsis", "css.properties.text-overflow.two_value_syntax", "svg.global_attributes.text-overflow"], description: "The text-overflow CSS property sets how hidden o\
verflow content appears to users. The property can clip content, truncate content with an ellipsis (…), or truncate with a custom string.", description_html: "The <code>text-overflow</code> CSS property sets how hidden overflow content appears to users. The property can clip content, truncate content with an ellipsis (…), or truncate with a custom string.", group: ["css"], kind: "feature", name: "Text overflow", spec: ["https://drafts.csswg.org/css-overflow-4/#text-overflow"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.text-overflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "1.3", safari_ios: "1" } }, "css.properties.text-overflow.clip": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "7", firefox_android: "7", safari: "1.3", safari_ios: "1" } }, "css.properties.text-overflow.ellipsis": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "1.3", safari_ios: "1" } }, "css.properties.text-overflow.two_value_syntax": { baseline: false, support: { firefox: "9", firefox_android: "9" } }, "svg.global_attributes.text-overflow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "1.3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "7", firefox_android: "7", safari: "1.3", safari_ios: "1" } } }, "text-shadow": { caniuse: ["css-textshadow"], compat_features: ["css.properties.text-shadow"], description: "The text-shadow CSS property sets t\
he position and styles of shadow on text.", description_html: "The <code>text-shadow</code> CSS property sets the position and styles of shadow on text.", group: ["text"], kind: "feature", name: "text-shadow", spec: ["https://drafts.csswg.org/css-text-decor-4/#text-shadow-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.text-shadow": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "1.1", safari_ios: "1" } } }, support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "1.1", safari_ios: "1" } } }, "text-size-adjust": { caniuse: ["text-size-adjust"], compat_features: ["css.properties.text-size-adjust", "css.properties.text-size-adjust.auto", "css.properties.text-size-adjust.none", "css.properties.text-size-adjust\
.percentages"], description: "The text-size-adjust CSS property disables or modifies the browser's default text size adjustment for small screen sizes.", description_html: "The <code>text-size-adjust</code> CSS property disables or modifies the browser's default text size adjustment for small screen sizes.", kind: "feature", name: "text-size-adjust", spec: ["https://drafts.csswg.org/css-size-adjust-1/#adjustment-control"], status: { baseline: false, by_compat_key: { "css.properties.text-size-adjust": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79" } }, "css.properties.text-size-adjust.auto": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79" } }, "css.properties.text-size-adjust.none": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79" } }, "css.properties.text-size-adjust.percentages": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79" } } }, support: { chrome: "54", chrome_android: "\
54", edge: "79" } } }, "text-spacing-trim": { compat_features: ["css.properties.text-spacing-trim", "css.properties.text-spacing-trim.normal", "css.properties.text-spacing-trim.space-all", "css.properties.text-spacing-trim.space-first", "css.properties.text-spacing-trim.trim-start"], description: "The text-spacing-trim CSS property controls spacing around CJK characters, avoiding excessive whitespace when using full-width punctuation characters.", description_html: "The <code>text-spacing-trim</code> CSS property controls spacing around CJK characters, avoiding excessive whitespace when using full-width punctuation characters.", group: ["css"], kind: "feature", name: "text-spacing-trim", spec: ["https://drafts.csswg.org/css-text-4/#text-spacing-trim-property"], status: { baseline: false, by_compat_key: { "css.properties.text-spacing-trim": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "css.properties.text-spacing-trim.normal": { baseline: false, support: {
    chrome: "123", chrome_android: "123", edge: "123" } }, "css.properties.text-spacing-trim.space-all": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "css.properties.text-spacing-trim.space-first": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } }, "css.properties.text-spacing-trim.trim-start": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123" } } }, support: { chrome: "123", chrome_android: "123", edge: "123" } } }, "text-stroke-fill": { caniuse: ["text-stroke"], compat_features: ["css.properties.-webkit-text-fill-color", "css.properties.-webkit-text-stroke", "css.properties.-webkit-text-stroke-color", "css.properties.-webkit-text-stroke-width"], description: "The -webkit-text-stroke-width and -webkit-text-stroke-color CSS properties set the thickness and color of text outlines. The -webkit-text-fill-color sets the color within text character outlines. Both default to the text color\
.", description_html: "The <code>-webkit-text-stroke-width</code> and <code>-webkit-text-stroke-color</code> CSS properties set the thickness and color of text outlines. The <code>-webkit-text-fill-color</code> sets the color within text character outlines. Both default to the text color.", group: ["css"], kind: "feature", name: "Text stroke and fill  (compatibility prefixes)", spec: ["https://compat.spec.whatwg.org/#text-fill-and-stroking"], status: { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", by_compat_key: { "css.properties.-webkit-text-fill-color": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "49", firefox_android: "49", safari: "3", safari_ios: "2" } }, "css.properties.-webkit-text-stroke": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "4", chrome_android: "18", edge: "15",
    firefox: "49", firefox_android: "49", safari: "3", safari_ios: "2" } }, "css.properties.-webkit-text-stroke-color": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "15", firefox: "49", firefox_android: "49", safari: "3", safari_ios: "2" } }, "css.properties.-webkit-text-stroke-width": { baseline: "high", baseline_high_date: "2019-10-05", baseline_low_date: "2017-04-05", support: { chrome: "1", chrome_android: "18", edge: "15", firefox: "49", firefox_android: "49", safari: "3", safari_ios: "2" } } }, support: { chrome: "4", chrome_android: "18", edge: "15", firefox: "49", firefox_android: "49", safari: "3", safari_ios: "2" } } }, "text-tracks": { compat_features: ["api.HTMLMediaElement.addTextTrack", "api.HTMLMediaElement.textTracks", "api.HTMLTrackElement", "api.HTMLTrackElement.cuechange_event", "api.HTMLTrackElement.default", "api.HTMLTrackElement.kind", "api.HTMLTrackElement.label", "api.H\
TMLTrackElement.readyState", "api.HTMLTrackElement.src", "api.HTMLTrackElement.srclang", "api.HTMLTrackElement.track", "api.TextTrack", "api.TextTrack.activeCues", "api.TextTrack.addCue", "api.TextTrack.cuechange_event", "api.TextTrack.cues", "api.TextTrack.id", "api.TextTrack.inBandMetadataTrackDispatchType", "api.TextTrack.kind", "api.TextTrack.label", "api.TextTrack.language", "api.TextTrack.mode", "api.TextTrack.removeCue", "api.TextTrackCue", "api.TextTrackCue.endTime", "api.TextTrackCue.enter_event", "api.TextTrackCue.exit_event", "api.TextTrackCue.id", "api.TextTrackCue.pauseOnExit", "api.TextTrackCue.startTime", "api.TextTrackCue.track", "api.TextTrackCueList", "api.TextTrackCueList.getCueById", "api.TextTrackCueList.length", "api.TextTrackList", "api.TextTrackList.addtrack_event", "api.TextTrackList.change_event", "api.TextTrackList.getTrackById", "api.TextTrackList.length", "api.TextTrackList.removetrack_event", "html.elements.track", "html.elements.track.default", "html.elem\
ents.track.kind", "html.elements.track.label", "html.elements.track.src", "html.elements.track.srclang"], description: "The <track> element is used as a child of the media elements that lets you specify a timed text track to be displayed in parallel with the media element.", description_html: "The <code>&#x3C;track></code> element is used as a child of the media elements that lets you specify a timed text track to be displayed in parallel with the media element.", group: ["media-elements", "html-elements"], kind: "feature", name: "Text tracks", spec: ["https://html.spec.whatwg.org/multipage/media.html#timed-text-tracks"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLMediaElement.addTextTrack": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "ap\
i.HTMLMediaElement.textTracks": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLTrackElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLTrackElement.cuechange_event": { baseline: "high", baseline_high_date: "2022-01-09", baseline_low_date: "2019-07-09", support: { chrome: "32", chrome_android: "32", edge: "14", firefox: "68", firefox_android: "68", safari: "10", safari_ios: "10" } }, "api.HTMLTrackElement.default": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } },
    "api.HTMLTrackElement.kind": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLTrackElement.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLTrackElement.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLTrackElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "a\
pi.HTMLTrackElement.srclang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.HTMLTrackElement.track": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.TextTrack": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.activeCues": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.addCue": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.cuechange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.cues": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.id": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "33", chrome_android: "33", edge: "18", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.TextTrack.inBandMetadataTrackDispatchType": { baseline: false,
    support: { firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.TextTrack.kind": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.language": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrack.mode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "\
31", safari: "6", safari_ios: "7" } }, "api.TextTrack.removeCue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCue.endTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCue.enter_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "\
7" } }, "api.TextTrackCue.exit_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCue.id": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCue.pauseOnExit": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCue.startTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api\
.TextTrackCue.track": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackCueList": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.TextTrackCueList.getCueById": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.TextTrackCueList.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "api.TextTrackLi\
st": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackList.addtrack_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackList.change_event": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "33", chrome_android: "33", edge: "18", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "api.TextTrackList.getTrackById": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "33", chrome_android: "33", edge: "18", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.TextTrackList.\
length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "7" } }, "api.TextTrackList.removetrack_event": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "33", chrome_android: "33", edge: "18", firefox: "31", firefox_android: "31", safari: "7", safari_ios: "7" } }, "html.elements.track": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "html.elements.track.default": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "html.elements.track.kind": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "html.elements.track.label": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } }, "html.elements.track.src": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "50", firefox_android: "50", safari: "6", safari_ios: "6" } }, "html.elements.track.srclang": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } } }, support: { chrome: "23", chrome_android: "\
25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "6" } } }, "text-transform": { compat_features: ["css.properties.text-transform", "css.properties.text-transform.capitalize", "css.properties.text-transform.dutch_ij_digraph", "css.properties.text-transform.full-size-kana", "css.properties.text-transform.full-width", "css.properties.text-transform.greek_accented_characters", "css.properties.text-transform.lowercase", "css.properties.text-transform.lowercase_sigma", "css.properties.text-transform.none", "css.properties.text-transform.turkic_is", "css.properties.text-transform.uppercase", "css.properties.text-transform.uppercase_eszett"], description: "The text-transform CSS property sets text case and capitalization.", description_html: "The <code>text-transform</code> CSS property sets text case and capitalization.", group: ["text"], kind: "feature", name: "text-transform", spec: ["https://drafts.csswg.org/css-text-4/#text-transform-property"], status: { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.text-transform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-transform.capitalize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-transform.dutch_ij_digraph": { baseline: false, support: { firefox: "14", firefox_android: "14" } }, "css.properties.text-transform.full-size-kana": { baseline: false, support: { firefox: "64", firefox_android: "64", safari: "17", safari_ios: "17" } }, "css.properties.text-transform.full-width": { baseline: false, support: { firefox: "19", firefox_android: "19", safari: "17", safari_ios: "\
17" } }, "css.properties.text-transform.greek_accented_characters": { baseline: false, support: { chrome: "34", chrome_android: "34", edge: "79", firefox: "15", firefox_android: "15" } }, "css.properties.text-transform.lowercase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-transform.lowercase_sigma": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "14", firefox_android: "14", safari: "6", safari_ios: "6" } }, "css.properties.text-transform.none": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-transform.tur\
kic_is": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "14", firefox_android: "14", safari: "8", safari_ios: "8" } }, "css.properties.text-transform.uppercase": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.text-transform.uppercase_eszett": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "1", chrome_android: "18", edge: "18", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "text-underline-offset": { compat_features: ["css.properties.text-underline-offset", "css.properties.text-underline-of\
fset.auto", "css.properties.text-underline-offset.percentage"], description: "The text-underline-offset CSS property shifts underlines on text from the initial position by a given distance. The initial position is affected by the text-underline-position property.", description_html: "The <code>text-underline-offset</code> CSS property shifts underlines on text from the initial position by a given distance. The initial position is affected by the <code>text-underline-position</code> property.", group: ["text"], kind: "feature", name: "text-underline-offset", spec: ["https://drafts.csswg.org/css-text-decor-4/#underline-offset"], status: { baseline: "high", baseline_high_date: "2023-05-19", baseline_low_date: "2020-11-19", by_compat_key: { "css.properties.text-underline-offset": { baseline: "high", baseline_high_date: "2023-05-19", baseline_low_date: "2020-11-19", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "70", firefox_android: "79", safari: "12.1", safari_ios: "\
12.2" } }, "css.properties.text-underline-offset.auto": { baseline: "high", baseline_high_date: "2023-05-19", baseline_low_date: "2020-11-19", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "70", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-underline-offset.percentage": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "74", firefox_android: "79", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "70", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, "text-underline-position": { compat_features: ["css.properties.text-underline-position", "css.properties.text-underline-position.auto", "css.properties.text-underline-position.from-font", "css.properties.text-underline-position.left", "css.properties.text-underline-position.right", "css.properties.text-underline-position.under"], description: "\
The text-underline-position CSS property sets the position of underlines on text. For example, text-underline-position: under places the underline below the text, avoiding crossing descenders. The underline may be further adjusted by the text-underline-offset property.", description_html: "The <code>text-underline-position</code> CSS property sets the position of underlines on text. For example, <code>text-underline-position: under</code> places the underline below the text, avoiding crossing descenders. The underline may be further adjusted by the <code>text-underline-offset</code> property.", group: ["text"], kind: "feature", name: "text-underline-position", spec: ["https://drafts.csswg.org/css-text-decor-4/#text-underline-position-property"], status: { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", by_compat_key: { "css.properties.text-underline-position": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: {
    chrome: "33", chrome_android: "33", edge: "12", firefox: "74", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-underline-position.auto": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "74", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-underline-position.from-font": { baseline: "high", baseline_high_date: "2023-05-19", baseline_low_date: "2020-11-19", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "74", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "css.properties.text-underline-position.left": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "74", firefox_android: "79", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-underline-position.right": { baseline: "low", baseline_low_date: "\
2024-12-11", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "74", firefox_android: "79", safari: "18.2", safari_ios: "18.2" } }, "css.properties.text-underline-position.under": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "74", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, support: { chrome: "33", chrome_android: "33", edge: "12", firefox: "74", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } } }, "text-wrap": { compat_features: ["css.properties.text-wrap", "css.properties.text-wrap-mode", "css.properties.text-wrap-mode.nowrap", "css.properties.text-wrap-mode.wrap", "css.properties.text-wrap-style", "css.properties.text-wrap-style.auto", "css.properties.text-wrap-style.stable", "css.properties.text-wrap.nowrap", "css.properties.text-wrap.stable", "css.properties.text-wrap.wrap"], description: "The text-wrap CSS property sets h\
ow lines break in text that overflows the container. It is a shorthand for text-wrap-style and text-wrap-mode.", description_html: "The <code>text-wrap</code> CSS property sets how lines break in text that overflows the container. It is a shorthand for <code>text-wrap-style</code> and <code>text-wrap-mode</code>.", group: ["text-wrap"], kind: "feature", name: "text-wrap", spec: ["https://drafts.csswg.org/css-text-4/#text-wrap-shorthand"], status: { baseline: "low", baseline_low_date: "2024-10-17", by_compat_key: { "css.properties.text-wrap": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "121", firefox_android: "121", safari: "17.4", safari_ios: "17.4" } }, "css.properties.text-wrap-mode": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.text-wrap-mode.\
nowrap": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.text-wrap-mode.wrap": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.text-wrap-style": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.5", safari_ios: "17.5" } }, "css.properties.text-wrap-style.auto": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.5", safari_ios: "17.5" } }, "css.properties.text-wrap-style.stable": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "\
130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.5", safari_ios: "17.5" } }, "css.properties.text-wrap.nowrap": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.text-wrap.stable": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "121", firefox_android: "121", safari: "17.5", safari_ios: "17.5" } }, "css.properties.text-wrap.wrap": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.5", safari_ios: "17.5" } } }, "text-wrap-balance": { compat_features: ["css.p\
roperties.text-wrap-style.balance", "css.properties.text-wrap.balance"], description: "The text-wrap: balance CSS declaration balances the length of each line when text is broken into multiple lines. Also known as headline balancing.", description_html: "The <code>text-wrap: balance</code> CSS declaration balances the length of each line when text is broken into multiple lines. Also known as headline balancing.", group: ["text-wrap"], kind: "feature", name: "text-wrap: balance", spec: ["https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance"], status: { baseline: "low", baseline_low_date: "2024-05-13", by_compat_key: { "css.properties.text-wrap-style.balance": { baseline: "low", baseline_low_date: "2024-10-17", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "124", firefox_android: "124", safari: "17.5", safari_ios: "17.5" } }, "css.properties.text-wrap.balance": { baseline: "low", baseline_low_date: "2024-05-13", support: { chrome: "114", chrome_android: "\
114", edge: "114", firefox: "121", firefox_android: "121", safari: "17.5", safari_ios: "17.5" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "121", firefox_android: "121", safari: "17.5", safari_ios: "17.5" } } }, "text-wrap-mode": { kind: "moved", redirect_target: "text-wrap" }, "text-wrap-nowrap": { kind: "moved", redirect_target: "text-wrap" }, "text-wrap-pretty": { compat_features: ["css.properties.text-wrap-style.pretty", "css.properties.text-wrap.pretty"], description: "The text-wrap: pretty CSS declaration prioritizes better layout over speed when text is broken into multiple lines.", description_html: "The <code>text-wrap: pretty</code> CSS declaration prioritizes better layout over speed when text is broken into multiple lines.", group: ["text-wrap"], kind: "feature", name: "text-wrap: pretty", spec: ["https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty"], status: { baseline: false, by_compat_key: { "css.properties.text-wrap-style.\
pretty": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", safari: "26", safari_ios: "26" } }, "css.properties.text-wrap.pretty": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "26", safari_ios: "26" } } }, support: { chrome: "117", chrome_android: "117", edge: "117", safari: "26", safari_ios: "26" } } }, "text-wrap-stable": { kind: "moved", redirect_target: "text-wrap" }, "text-wrap-style": { kind: "split", redirect_targets: ["text-wrap", "text-wrap-balance", "text-wrap-pretty"] }, textarea: { compat_features: ["api.HTMLTextAreaElement", "api.HTMLTextAreaElement.autocomplete", "api.HTMLTextAreaElement.cols", "api.HTMLTextAreaElement.defaultValue", "api.HTMLTextAreaElement.disabled", "api.HTMLTextAreaElement.form", "api.HTMLTextAreaElement.labels", "api.HTMLTextAreaElement.maxLength", "api.HTMLTextAreaElement.minLength", "api.HTMLTextAreaElement.name", "api.HTMLTextAreaElement.placeholder", "api.HTMLTextAreaElemen\
t.readOnly", "api.HTMLTextAreaElement.required", "api.HTMLTextAreaElement.rows", "api.HTMLTextAreaElement.select", "api.HTMLTextAreaElement.select_event", "api.HTMLTextAreaElement.selectionDirection", "api.HTMLTextAreaElement.selectionEnd", "api.HTMLTextAreaElement.selectionStart", "api.HTMLTextAreaElement.setRangeText", "api.HTMLTextAreaElement.setSelectionRange", "api.HTMLTextAreaElement.textLength", "api.HTMLTextAreaElement.type", "api.HTMLTextAreaElement.value", "api.HTMLTextAreaElement.wrap", "html.elements.textarea", "html.elements.textarea.autocomplete", "html.elements.textarea.cols", "html.elements.textarea.disabled", "html.elements.textarea.form", "html.elements.textarea.maxlength", "html.elements.textarea.minlength", "html.elements.textarea.name", "html.elements.textarea.placeholder", "html.elements.textarea.placeholder.line_breaks", "html.elements.textarea.readonly", "html.elements.textarea.required", "html.elements.textarea.rows", "html.elements.textarea.wrap", "html.elemen\
ts.textarea.wrap.hard"], description: "The <textarea> element represents an editing control that allows users to enter multi-line, free-form, plain text.", description_html: "The <code>&#x3C;textarea></code> element represents an editing control that allows users to enter multi-line, free-form, plain text.", group: ["forms", "html-elements"], kind: "feature", name: "<textarea>", spec: ["https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLTextAreaElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.autocomplete": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "\
79", firefox: "59", firefox_android: "59", safari: "9.1", safari_ios: "9.3" } }, "api.HTMLTextAreaElement.cols": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.defaultValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.labels": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "6", chrome_android: "18", edge: "18", firefox: "56", firefox_android: "56", safari: "5.1", safari_ios: "5" } }, "api.HTMLTextAreaElement.maxLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.minLength": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLTextAreaElement.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.placeholder": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.readOnly": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLTextAreaElement.rows": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.select": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.select_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.selectionDirection": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "15", chrome_android: "18", edge: "79", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.HTMLTextAreaElement.selectionEnd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.HTMLTextAreaElement.selectionStart": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.HTMLTextAreaElement.setRangeText": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "27", firefox_android: "27", safari: "7", safari_ios: "7" } }, "api.HTMLTextAreaElement.setSelectionRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.HTMLTextAreaElement.textLength": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "\
2018-04-30", support: { chrome: "4", chrome_android: "18", edge: "17", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "4" } }, "api.HTMLTextAreaElement.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.HTMLTextAreaElement.wrap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "html.elements.textarea": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3" } }, "html.elements.textarea.autocomplete": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "59", firefox_android: "59", safari: "9.1", safari_ios: "9.3" } }, "html.elements.textarea.cols": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.textarea.disabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.textarea.form": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.textarea.maxlength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "4.2" } }, "html.elements.textarea.minlength": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "40", chrome_android: "40", edge: "17", firefox: "51", firefox_android: "51", safari: "10.1", safari_ios: "10.3" } }, "html.elements.textarea.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.textarea.placeholder": { baseline: "high", baseline_high_date: "2018-\
01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "html.elements.textarea.placeholder.line_breaks": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "59", firefox_android: "59", safari: "16", safari_ios: "16" } }, "html.elements.textarea.readonly": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.textarea.required": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "html.elements.textarea.rows": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.elements.textarea.wrap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "6", safari_ios: "6" } }, "html.elements.textarea.wrap.hard": { baseline: false, support: { chrome: "16", chrome_android: "18", edge: "12" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3" } } }, time: { compat_features: ["api.HTMLTimeElement", "api.HTMLTimeElement.dateTime", "html.elements.time", "html.elements.time.datetime"], description: "The <time> HTML element represents a time, such as a calendar date, clock time, or duration. It may include the datetime attribute to translate dates into machine-rea\
dable format.", description_html: "The <code>&#x3C;time></code> HTML element represents a time, such as a calendar date, clock time, or duration. It may include the <code>datetime</code> attribute to translate dates into machine-readable format.", group: ["html-elements"], kind: "feature", name: "<time>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-time-element"], status: { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", by_compat_key: { "api.HTMLTimeElement": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.HTMLTimeElement.dateTime": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } },
    "html.elements.time": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "7", safari_ios: "4" } }, "html.elements.time.datetime": { baseline: "high", baseline_high_date: "2020-04-24", baseline_low_date: "2017-10-24", support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "7", safari_ios: "4" } } }, support: { chrome: "62", chrome_android: "62", edge: "14", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } } }, "time-relative-selectors": { compat_features: ["css.selectors.future", "css.selectors.past"], description: "The :past and :future CSS pseudo-classes match prior or upcoming text track cues during media playback.", description_html: "The <code>:past</code> and <code>:future</code> CSS pseudo-classes match prior or upcoming text track cues during media playback.", group: [
    "selectors"], kind: "feature", name: "Time-relative pseudo-selectors", spec: ["https://w3c.github.io/webvtt/#the-past-and-future-pseudo-classes"], status: { baseline: false, by_compat_key: { "css.selectors.future": { baseline: false, support: { chrome: "23", chrome_android: "25", edge: "79", safari: "7", safari_ios: "7" } }, "css.selectors.past": { baseline: false, support: { chrome: "23", chrome_android: "25", edge: "79", safari: "7", safari_ios: "7" } } }, support: { chrome: "23", chrome_android: "25", edge: "79", safari: "7", safari_ios: "7" } } }, title: { compat_features: ["api.HTMLTitleElement", "api.HTMLTitleElement.text", "html.elements.title"], description: "The <title> element sets the title of the document and exposes it to users via the UI of the browser or app they're using and through assistive technology.", description_html: "The <code>&#x3C;title></code> element sets the title of the document and exposes it to users via the UI of the browser or app they're using and\
 through assistive technology.", group: ["html-elements"], kind: "feature", name: "<title>", spec: ["https://html.spec.whatwg.org/multipage/semantics.html#the-title-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLTitleElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.HTMLTitleElement.text": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.elements.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "title-attr": { compat_features: ["api.HTMLElement.title", "html.global_attributes.title", "html.global_attributes.title.multi-line_titles"], description: "The title global HTML attribute sets information about an element, such as a name or description. The value is typically shown as a tooltip that appears on mouse over. Since it's not often available to touch-only, keyboard-only, or assistive technology users, it's not a substitute for other text.", description_html: "The <code>title</code> global HTML attribute sets information about an element, such as a name or description. The value is typically shown as a tooltip that appears on mouse over. Since it's not often available to touch-only, keyboard-only, or assistive technology users, it's not a substitute for other text.", kind: "feature", name: "title (attribute)", spec: ["https://html.spec.wh\
atwg.org/multipage/dom.html#attr-title"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLElement.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "html.global_attributes.title": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } }, "html.global_attributes.title.multi-line_titles": { baseline: "high", baseline_high_date: "≤2020-07-23", baseline_low_date: "≤2018-01-23", support: { chrome: "≤64", chrome_android: "≤64", edge: "12", firefox: "≤58", firefox_android: "≤58", safari: "≤11", safari_ios: "≤11" } } }, support: { chrome: "1", chrome_android: "18", edge: "12",
    firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "toggleevent-source": { compat_features: ["api.ToggleEvent.source"], description: "The source property of a ToggleEvent object is the element which triggered the toggle event to fire for a popover, <dialog>, or <details> element, if applicable.", description_html: "The <code>source</code> property of a <code>ToggleEvent</code> object is the element which triggered the <code>toggle</code> event to fire for a popover, <code>&#x3C;dialog></code>, or <code>&#x3C;details></code> element, if applicable.", group: ["html"], kind: "feature", name: "ToggleEvent source", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#dom-toggleevent-source"], status: { baseline: false, by_compat_key: { "api.ToggleEvent.source": { baseline: false, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "145", firefox_android: "145" } } }, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "\
145", firefox_android: "145" } } }, "top-level-await": { compat_features: ["javascript.operators.await.top_level"], description: "The await keyword, when used at the top level of a module (outside of an async function), delays parent module execution until after a promise fulfills.", description_html: "The <code>await</code> keyword, when used at the top level of a module (outside of an async function), delays parent module execution until after a promise fulfills.", group: ["javascript"], kind: "feature", name: "Top-level await", spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-async-function-definitions"], status: { baseline: false, by_compat_key: { "javascript.operators.await.top_level": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "89", firefox_android: "89" } } }, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "89", firefox_android: "89" } } }, topics: { compat_features: ["ap\
i.Document.browsingTopics", "api.HTMLIFrameElement.browsingTopics", "api.Request.Request.init_browsingTopics_parameter", "api.fetch.init_browsingTopics_parameter", "html.elements.iframe.allow.browsing-topics", "html.elements.iframe.browsingtopics", "http.headers.Observe-Browsing-Topics", "http.headers.Permissions-Policy.browsing-topics", "http.headers.Sec-Browsing-Topics"], description: "The topics API reports a user's likely subject-matter interests (as determined by the browser, known as topics) to iframes. This allows for interest-based advertising that does not rely on user's exact browsing history, third-party cookies, or fingerprinting.", description_html: "The topics API reports a user's likely subject-matter interests (as determined by the browser, known as topics) to iframes. This allows for interest-based advertising that does not rely on user's exact browsing history, third-party cookies, or fingerprinting.", discouraged: { according_to: ["https://groups.google.com/a/chromiu\
m.org/g/blink-dev/c/_R85yctz4Rs", "https://chromestatus.com/feature/5135370673061888"], reason: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the topics API.", reason_html: "Following the announcement that Chrome will maintain its current approach to third-party cookies, Chrome decided to withdraw certain Privacy Sandbox features including the topics API.", removal_date: "2026-06-01" }, kind: "feature", name: "Topics", spec: ["https://patcg-individual-drafts.github.io/topics/"], status: { baseline: false, by_compat_key: { "api.Document.browsingTopics": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.HTMLIFrameElement.browsingTopics": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.Request.Request.init_browsingTopics_parameter": { baseline: false, support: { chrome: "126", chrome_android: "\
126", edge: "126" } }, "api.fetch.init_browsingTopics_parameter": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "html.elements.iframe.allow.browsing-topics": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "html.elements.iframe.browsingtopics": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "http.headers.Observe-Browsing-Topics": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "http.headers.Permissions-Policy.browsing-topics": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } }, "http.headers.Sec-Browsing-Topics": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115" } } }, support: { chrome: "126", chrome_android: "126", edge: "126" } } }, "touch-action": { caniuse: ["css-touch-action"], compat_features: ["css.properties.touch-action", "css.properties.touch-action.manipulation", "\
css.properties.touch-action.none", "css.properties.touch-action.pan-down", "css.properties.touch-action.pan-left", "css.properties.touch-action.pan-right", "css.properties.touch-action.pan-up", "css.properties.touch-action.pan-x", "css.properties.touch-action.pan-y", "css.properties.touch-action.pinch-zoom"], description: "The touch-action CSS property sets whether an element on a touch screen can be panned or pinched to zoom.", description_html: "The <code>touch-action</code> CSS property sets whether an element on a touch screen can be panned or pinched to zoom.", kind: "feature", name: "touch-action", spec: ["https://w3c.github.io/pointerevents/#the-touch-action-css-property", "https://compat.spec.whatwg.org/#touch-action"], status: { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", by_compat_key: { "css.properties.touch-action": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "36", chrome_android: "\
36", edge: "12", firefox: "52", firefox_android: "52", safari: "13", safari_ios: "9.3" } }, "css.properties.touch-action.manipulation": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "52", firefox_android: "52", safari: "13", safari_ios: "9.3" } }, "css.properties.touch-action.none": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "52", firefox_android: "52", safari: "13", safari_ios: "13" } }, "css.properties.touch-action.pan-down": { baseline: false, support: { chrome: "55", chrome_android: "55", edge: "79" } }, "css.properties.touch-action.pan-left": { baseline: false, support: { chrome: "55", chrome_android: "55", edge: "79" } }, "css.properties.touch-action.pan-right": { baseline: false, support: { chrome: "55", chrome_android: "55", edge: "79" } }, "css.properties.touc\
h-action.pan-up": { baseline: false, support: { chrome: "55", chrome_android: "55", edge: "79" } }, "css.properties.touch-action.pan-x": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "52", firefox_android: "52", safari: "13", safari_ios: "13" } }, "css.properties.touch-action.pan-y": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "52", firefox_android: "52", safari: "13", safari_ios: "13" } }, "css.properties.touch-action.pinch-zoom": { baseline: "high", baseline_high_date: "2023-07-26", baseline_low_date: "2021-01-26", support: { chrome: "56", chrome_android: "56", edge: "12", firefox: "85", firefox_android: "85", safari: "13", safari_ios: "13" } } }, support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "52", firefox_android: "52", safari: "13", safari_ios: "\
9.3" } } }, "touch-events": { caniuse: ["touch"], compat_features: ["api.Element.touchcancel_event", "api.Element.touchend_event", "api.Element.touchmove_event", "api.Element.touchstart_event", "api.Touch", "api.Touch.Touch", "api.Touch.altitudeAngle", "api.Touch.azimuthAngle", "api.Touch.clientX", "api.Touch.clientY", "api.Touch.force", "api.Touch.identifier", "api.Touch.pageX", "api.Touch.pageY", "api.Touch.radiusX", "api.Touch.radiusY", "api.Touch.rotationAngle", "api.Touch.screenX", "api.Touch.screenY", "api.Touch.target", "api.Touch.touchType", "api.TouchEvent", "api.TouchEvent.TouchEvent", "api.TouchEvent.altKey", "api.TouchEvent.changedTouches", "api.TouchEvent.ctrlKey", "api.TouchEvent.metaKey", "api.TouchEvent.shiftKey", "api.TouchEvent.targetTouches", "api.TouchEvent.touches", "api.TouchList", "api.TouchList.item", "api.TouchList.length"], description: "Touch events touchstart, touchmove, touchend, and touchcancel fire when users interact with a touch-sensitive surface, such \
as a screen or drawing tablet. These events are similar to mouse events.", description_html: "Touch events <code>touchstart</code>, <code>touchmove</code>, <code>touchend</code>, and <code>touchcancel</code> fire when users interact with a touch-sensitive surface, such as a screen or drawing tablet. These events are similar to mouse events.", kind: "feature", name: "Touch events", spec: ["https://w3c.github.io/touch-events/"], status: { baseline: false, by_compat_key: { "api.Element.touchcancel_event": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "52", firefox_android: "6", safari_ios: "≤3" } }, "api.Element.touchend_event": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "52", firefox_android: "6", safari_ios: "≤3" } }, "api.Element.touchmove_event": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "52", firefox_android: "6", safari_ios: "≤3" } }, "api.Element.t\
ouchstart_event": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "52", firefox_android: "6", safari_ios: "≤3" } }, "api.Touch": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "≤3" } }, "api.Touch.Touch": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79", firefox_android: "6", safari_ios: "≤3" } }, "api.Touch.altitudeAngle": { baseline: false, support: { safari_ios: "10" } }, "api.Touch.azimuthAngle": { baseline: false, support: { safari_ios: "10" } }, "api.Touch.clientX": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.clientY": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.force": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79", firefox_android: "\
6", safari_ios: "10" } }, "api.Touch.identifier": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.pageX": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.pageY": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.radiusX": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79", firefox_android: "6", safari_ios: "10" } }, "api.Touch.radiusY": { baseline: false, support: { chrome: "38", chrome_android: "38", edge: "79", firefox_android: "6", safari_ios: "10" } }, "api.Touch.rotationAngle": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox_android: "6", safari_ios: "10" } }, "api.Touch.screenX": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "\
6", safari_ios: "10" } }, "api.Touch.screenY": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.target": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "≤18", firefox_android: "6", safari_ios: "10" } }, "api.Touch.touchType": { baseline: false, support: { safari_ios: "10" } }, "api.TouchEvent": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchEvent.TouchEvent": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "79", firefox_android: "46", safari_ios: "3.2" } }, "api.TouchEvent.altKey": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchEvent.changedTouches": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "\
6", safari_ios: "3.2" } }, "api.TouchEvent.ctrlKey": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchEvent.metaKey": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchEvent.shiftKey": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchEvent.targetTouches": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchEvent.touches": { baseline: false, support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "52", firefox_android: "6", safari_ios: "3.2" } }, "api.TouchList": { baseline: false, support: { chrome: "18", chrome_android: "18", edge: "≤18", firefox_android: "6", safari_ios: "2" } }, "api.\
TouchList.item": { baseline: false, support: { chrome: "18", chrome_android: "18", edge: "≤18", firefox_android: "6", safari_ios: "2" } }, "api.TouchList.length": { baseline: false, support: { chrome: "18", chrome_android: "18", edge: "≤18", firefox_android: "6", safari_ios: "2" } } }, support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "52", firefox_android: "6", safari_ios: "≤3" } } }, "transferable-arraybuffer": { compat_features: ["javascript.builtins.ArrayBuffer.detached", "javascript.builtins.ArrayBuffer.transfer", "javascript.builtins.ArrayBuffer.transferToFixedLength"], description: "The transfer() and transferToFixedLength() methods of ArrayBuffer move a buffer from one context to another (for example, to a worker).", description_html: "The <code>transfer()</code> and <code>transferToFixedLength()</code> methods of <code>ArrayBuffer</code> move a buffer from one context to another (for example, to a worker).", group: ["javascript"], kind: "feature", name: "\
Transferable ArrayBuffer", spec: ["https://tc39.es/ecma262/multipage/structured-data.html#sec-arraybuffer.prototype.transfer"], status: { baseline: "low", baseline_low_date: "2024-03-05", by_compat_key: { "javascript.builtins.ArrayBuffer.detached": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } }, "javascript.builtins.ArrayBuffer.transfer": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } }, "javascript.builtins.ArrayBuffer.transferToFixedLength": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "\
122", firefox_android: "122", safari: "17.4", safari_ios: "17.4" } } }, "transferable-streams": { compat_features: ["api.ReadableStream.transferable", "api.TransformStream.transferable", "api.WritableStream.transferable"], description: "Streams are transferable objects, which can be moved between contexts such as windows and workers.", description_html: "Streams are transferable objects, which can be moved between contexts such as windows and workers.", group: ["streams"], kind: "feature", name: "Transferable streams", spec: ["https://streams.spec.whatwg.org/#rs-transfer"], status: { baseline: false, by_compat_key: { "api.ReadableStream.transferable": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "103", firefox_android: "103" } }, "api.TransformStream.transferable": { baseline: false, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "103", firefox_android: "103" } }, "api.WritableStream.transferable": { baseline: false, support: {
    chrome: "87", chrome_android: "87", edge: "87", firefox: "103", firefox_android: "103" } } }, support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "103", firefox_android: "103" } } }, "transform-box": { compat_features: ["css.properties.transform-box", "css.properties.transform-box.border-box", "css.properties.transform-box.content-box", "css.properties.transform-box.fill-box", "css.properties.transform-box.stroke-box", "css.properties.transform-box.view-box"], description: "The transform-box CSS property sets the position and dimensions of the reference box relative to which an element's transformations are calculated.", description_html: "The <code>transform-box</code> CSS property sets the position and dimensions of the reference box relative to which an element's transformations are calculated.", kind: "feature", name: "transform-box", spec: ["https://drafts.csswg.org/css-transforms-1/#transform-box"], status: { baseline: "low", baseline_low_date: "2024-04-16", by_compat_key: {
    "css.properties.transform-box": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "55", firefox_android: "55", safari: "11", safari_ios: "11" } }, "css.properties.transform-box.border-box": { baseline: "high", baseline_high_date: "2026-04-13", baseline_low_date: "2023-10-13", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "55", firefox_android: "55", safari: "11", safari_ios: "11" } }, "css.properties.transform-box.content-box": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "125", firefox_android: "125", safari: "13.1", safari_ios: "13.4" } }, "css.properties.transform-box.fill-box": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "55", firefox_android: "55", safari: "11", safari_ios: "\
11" } }, "css.properties.transform-box.stroke-box": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "125", firefox_android: "125", safari: "13.1", safari_ios: "13.4" } }, "css.properties.transform-box.view-box": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "55", firefox_android: "55", safari: "11", safari_ios: "11" } } }, support: { chrome: "118", chrome_android: "118", edge: "118", firefox: "125", firefox_android: "125", safari: "13.1", safari_ios: "13.4" } } }, transforms2d: { caniuse: ["transforms2d"], compat_features: ["css.properties.transform", "css.properties.transform-origin", "css.properties.transform-origin.bottom", "css.properties.transform-origin.center", "css.properties.transform-origin.left", "css.properties.transform-origin.right", "css.properties.transform-origin.three_value_syntax", "css\
.properties.transform-origin.top", "css.properties.transform.none", "css.types.angle", "css.types.angle-percentage", "css.types.angle.deg", "css.types.angle.grad", "css.types.angle.rad", "css.types.angle.turn", "css.types.position", "css.types.position.four_value_syntax", "css.types.position.keyword_value_syntax", "css.types.transform-function", "css.types.transform-function.matrix", "css.types.transform-function.rotate", "css.types.transform-function.scale", "css.types.transform-function.scaleX", "css.types.transform-function.scaleY", "css.types.transform-function.skew", "css.types.transform-function.skewX", "css.types.transform-function.skewY", "css.types.transform-function.translate", "css.types.transform-function.translateX", "css.types.transform-function.translateY"], description: "The transform CSS property and its 2D transform functions allow rotating, scaling, skewing, and translating an element. Arbitrary 2D transforms are also possible using a transformation matrix.", description_html: "\
The <code>transform</code> CSS property and its 2D transform functions allow rotating, scaling, skewing, and translating an element. Arbitrary 2D transforms are also possible using a transformation matrix.", group: ["transforms"], kind: "feature", name: "2D transforms", spec: ["https://drafts.csswg.org/css-transforms-1/"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "css.properties.transform": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin.bottom": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin.center": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin.left": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin.right": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin.three_value_s\
yntax": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform-origin.top": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.types.angle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.types.angle-percentage": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.types.angle.deg": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.types.angle.grad": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.types.angle.rad": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "css.types.angle.turn": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "13", firefox_android: "14", safari: "4", safari_ios: "3.2" } }, "css.types.position": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.position.four_value_syntax": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "13", firefox_android: "14", safari: "7", safari_ios: "7" } }, "css.types.position.keyword_value_syntax": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.transform-function": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.matrix": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.rotate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.scale": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.scaleX": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.scaleY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.skew": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.skewX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.tran\
sform-function.skewY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.translate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.translateX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3.2" } }, "css.types.transform-function.translateY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "\
3.1", safari_ios: "3.2" } } }, support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } } }, transforms3d: { caniuse: ["transforms3d"], compat_features: ["css.properties.backface-visibility", "css.properties.perspective", "css.properties.perspective-origin", "css.properties.perspective-origin.bottom", "css.properties.perspective-origin.center", "css.properties.perspective-origin.left", "css.properties.perspective-origin.right", "css.properties.perspective-origin.top", "css.properties.perspective.none", "css.properties.transform-style", "css.properties.transform.3d", "css.types.transform-function.matrix3d", "css.types.transform-function.perspective", "css.types.transform-function.perspective.none", "css.types.transform-function.rotate3d", "css.types.transform-function.rotateX", "css.types.transform-function.rotateY", "css.types.transform-function.rotateZ", "css.types.transform-function.scale3d", "css.types.transform-\
function.scaleZ", "css.types.transform-function.translate3d", "css.types.transform-function.translateZ"], description: "The transform CSS property and its 3D transform functions allow rotations and other transforms in three dimensions, including perspective transforms.", description_html: "The <code>transform</code> CSS property and its 3D transform functions allow rotations and other transforms in three dimensions, including perspective transforms.", group: ["transforms"], kind: "feature", name: "3D transforms", spec: ["https://drafts.csswg.org/css-transforms-2/"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "css.properties.backface-visibility": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "15.4", safari_ios: "15.4" } }, "css.properties.perspective": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective-origin": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective-origin.bottom": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective-origin.center": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective-origin.left": { baseline: "\
high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective-origin.right": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective-origin.top": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.perspective.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transf\
orm-style": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transform.3d": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.types.transform-function.matrix3d": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.perspective": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } },
    "css.types.transform-function.perspective.none": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "93", firefox_android: "93", safari: "15.4", safari_ios: "15.4" } }, "css.types.transform-function.rotate3d": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.rotateX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.rotateY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "\
10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.rotateZ": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.scale3d": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.scaleZ": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.translate3d": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "\
12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } }, "css.types.transform-function.translateZ": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "12", chrome_android: "18", edge: "12", firefox: "10", firefox_android: "10", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "16", firefox_android: "16", safari: "15.4", safari_ios: "15.4" } } }, "transformstream-transformer-cancel": { compat_features: ["api.TransformStream.TransformStream.transformer_cancel"], description: "The cancel() method of a TransformStream transformer cleans up resources when the readable side cancels or the writable side aborts.", description_html: "The <code>cancel()</code> method of a <code>TransformStream</code> transformer cleans up resources when the readable side cancels or the writable side aborts.", group: ["streams"], kind: "feature", name: "TransformStream transformer\
 cancel() method", spec: ["https://streams.spec.whatwg.org/#dom-transformer-cancel"], status: { baseline: false, by_compat_key: { "api.TransformStream.TransformStream.transformer_cancel": { baseline: false, support: {} } }, support: {} } }, "transition-behavior": { compat_features: ["css.properties.transition-behavior", "css.properties.transition.transition-behavior"], description: "The transition-behavior: allow-discrete CSS declaration allows transitions for properties whose animation behavior is discrete. Such properties can't be interpolated and swap from their start value to the end value at 50%.", description_html: "The <code>transition-behavior: allow-discrete</code> CSS declaration allows transitions for properties whose animation behavior is discrete. Such properties can't be interpolated and swap from their start value to the end value at 50%.", group: ["transitions"], kind: "feature", name: "transition-behavior", spec: ["https://drafts.csswg.org/css-transitions-2/#transition\
-behavior-property"], status: { baseline: "low", baseline_low_date: "2024-08-06", by_compat_key: { "css.properties.transition-behavior": { baseline: "low", baseline_low_date: "2024-08-06", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "129", firefox_android: "129", safari: "17.4", safari_ios: "17.4" } }, "css.properties.transition.transition-behavior": { baseline: "low", baseline_low_date: "2024-08-06", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "129", firefox_android: "129", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "129", firefox_android: "129", safari: "17.4", safari_ios: "17.4" } } }, transitions: { caniuse: ["css-transitions"], compat_features: ["api.CSSTransition", "api.CSSTransition.transitionProperty", "api.Element.transitioncancel_event", "api.Element.transitionend_event", "api.Element.transitionrun_event", "api.Element.transitionstart_event", "api.Transi\
tionEvent", "api.TransitionEvent.TransitionEvent", "api.TransitionEvent.elapsedTime", "api.TransitionEvent.propertyName", "api.TransitionEvent.pseudoElement", "css.properties.transition", "css.properties.transition-delay", "css.properties.transition-duration", "css.properties.transition-property", "css.properties.transition-property.IDENT_value", "css.properties.transition-property.all", "css.properties.transition-property.none", "css.properties.transition-timing-function", "css.properties.transition-timing-function.ease", "css.properties.transition-timing-function.ease-in", "css.properties.transition-timing-function.ease-in-out", "css.properties.transition-timing-function.ease-out", "css.properties.transition-timing-function.jump", "css.properties.transition-timing-function.linear", "css.properties.transition-timing-function.step-end", "css.properties.transition-timing-function.step-start", "css.properties.transition.all", "css.properties.transition.ease", "css.properties.transition.e\
ase-in", "css.properties.transition.ease-in-out", "css.properties.transition.ease-out", "css.properties.transition.gradients_can_animate", "css.properties.transition.linear", "css.properties.transition.none", "css.properties.transition.step-end", "css.properties.transition.step-start"], description: "The transition shorthand CSS property sets how changes to an element's styles may occur over time. Transitions can be applied to specific CSS properties, all properties, or none.", description_html: "The <code>transition</code> shorthand CSS property sets how changes to an element's styles may occur over time. Transitions can be applied to specific CSS properties, all properties, or none.", group: ["transitions"], kind: "feature", name: "Transitions (CSS)", spec: ["https://drafts.csswg.org/css-transitions-2/"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "api.CSSTransition": { baseline: "high", baseline_high_date: "2023-01\
-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.CSSTransition.transitionProperty": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Element.transitioncancel_event": { baseline: "high", baseline_high_date: "2023-05-19", baseline_low_date: "2020-11-19", support: { chrome: "87", chrome_android: "87", edge: "87", firefox: "53", firefox_android: "53", safari: "13.1", safari_ios: "13.4" } }, "api.Element.transitionend_event": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "26", chrome_android: "26", edge: "18", firefox: "51", firefox_android: "51", safari: "7", safari_ios: "7" } }, "api.Element.transitionrun_event": { baseline: "\
high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "74", chrome_android: "74", edge: "12", firefox: "53", firefox_android: "53", safari: "13.1", safari_ios: "13.4" } }, "api.Element.transitionstart_event": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "74", chrome_android: "74", edge: "12", firefox: "53", firefox_android: "53", safari: "13.1", safari_ios: "13.4" } }, "api.TransitionEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.TransitionEvent.TransitionEvent": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "27", chrome_android: "27", edge: "14", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "api.TransitionEvent.elapsedTime": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.TransitionEvent.propertyName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "4", firefox_android: "4", safari: "7", safari_ios: "7" } }, "api.TransitionEvent.pseudoElement": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "23", firefox_android: "23", safari: "7", safari_ios: "7" } }, "css.properties.transition": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-d\
elay": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-duration": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-property": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-property.IDENT_value": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } },
    "css.properties.transition-property.all": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-property.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.ease": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "\
16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.ease-in": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.ease-in-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.ease-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.jump": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: {
    chrome: "77", chrome_android: "77", edge: "79", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "css.properties.transition-timing-function.linear": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.step-end": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition-timing-function.step-start": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.all": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.ease": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.ease-in": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.ease-in-out": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.ease-out": { baseline: "high",
    baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.gradients_can_animate": { baseline: false, support: {} }, "css.properties.transition.linear": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.none": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } }, "css.properties.transition.step-end": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "\
16", safari: "9", safari_ios: "9" } }, "css.properties.transition.step-start": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } } }, support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "9", safari_ios: "9" } } }, translate: { compat_features: ["api.HTMLElement.translate", "html.global_attributes.translate"], description: "The translate HTML attribute marks whether an element's text should be translated.", description_html: "The <code>translate</code> HTML attribute marks whether an element's text should be translated.", kind: "feature", name: "translate", spec: ["https://html.spec.whatwg.org/multipage/dom.html#attr-translate"], status: { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", by_compat_key: { "api.HTMLElement.translate": { baseline: "\
high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "111", firefox_android: "111", safari: "6", safari_ios: "6" } }, "html.global_attributes.translate": { baseline: "high", baseline_high_date: "2025-09-14", baseline_low_date: "2023-03-14", support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "111", firefox_android: "111", safari: "6", safari_ios: "6" } } }, support: { chrome: "19", chrome_android: "25", edge: "79", firefox: "111", firefox_android: "111", safari: "6", safari_ios: "6" } } }, translator: { compat_features: ["api.Translator", "api.Translator.availability_static", "api.Translator.create_static", "api.Translator.destroy", "api.Translator.inputQuota", "api.Translator.measureInputUsage", "api.Translator.sourceLanguage", "api.Translator.targetLanguage", "api.Translator.translate", "api.Translator.translateStreaming"], description: "The Translator API translates some text fro\
m one natural language to another, using machine translation.", description_html: "The <code>Translator</code> API translates some text from one natural language to another, using machine translation.", kind: "feature", name: "Translator", spec: ["https://webmachinelearning.github.io/translation-api/#translator-api"], status: { baseline: false, by_compat_key: { "api.Translator": { baseline: false, support: { chrome: "138" } }, "api.Translator.availability_static": { baseline: false, support: { chrome: "138" } }, "api.Translator.create_static": { baseline: false, support: { chrome: "138" } }, "api.Translator.destroy": { baseline: false, support: { chrome: "138" } }, "api.Translator.inputQuota": { baseline: false, support: { chrome: "138" } }, "api.Translator.measureInputUsage": { baseline: false, support: { chrome: "138" } }, "api.Translator.sourceLanguage": { baseline: false, support: { chrome: "138" } }, "api.Translator.targetLanguage": { baseline: false, support: { chrome: "138" } },
    "api.Translator.translate": { baseline: false, support: { chrome: "138" } }, "api.Translator.translateStreaming": { baseline: false, support: { chrome: "138" } } }, support: { chrome: "138" } } }, "trig-functions": { compat_features: ["css.types.acos", "css.types.asin", "css.types.atan", "css.types.atan2", "css.types.cos", "css.types.sin", "css.types.tan"], description: "The sin(), cos(), tan(), asin(), acos(), atan(), and atan2() CSS functions compute various trigonometric functions.", description_html: "The <code>sin()</code>, <code>cos()</code>, <code>tan()</code>, <code>asin()</code>, <code>acos()</code>, <code>atan()</code>, and <code>atan2()</code> CSS functions compute various trigonometric functions.", group: ["css"], kind: "feature", name: "sin(), cos(), tan(), asin(), acos(), atan(), and atan2() (CSS)", spec: ["https://drafts.csswg.org/css-values-4/#trig-funcs"], status: { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", by_compat_key: {
    "css.types.acos": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.asin": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.atan": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.atan2": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.ty\
pes.cos": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.sin": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } }, "css.types.tan": { baseline: "high", baseline_high_date: "2025-09-13", baseline_low_date: "2023-03-13", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "108", firefox_android: "108", safari: "15.4", safari_ios: "15.4" } } }, "trusted-types": { caniuse: ["trusted-types"], compat_features: ["api.Element.innerHTML.enforces_trusted_types", "api.HTMLS\
criptElement.innerText.enforces_trusted_types", "api.HTMLScriptElement.src.enforces_trusted_types", "api.HTMLScriptElement.text.enforces_trusted_types", "api.HTMLScriptElement.textContent.enforces_trusted_types", "api.ShadowRoot.innerHTML.enforces_trusted_types", "api.TrustedHTML", "api.TrustedHTML.toJSON", "api.TrustedHTML.toString", "api.TrustedScript", "api.TrustedScript.toJSON", "api.TrustedScript.toString", "api.TrustedScriptURL", "api.TrustedScriptURL.toJSON", "api.TrustedScriptURL.toString", "api.TrustedTypePolicy", "api.TrustedTypePolicy.createHTML", "api.TrustedTypePolicy.createScript", "api.TrustedTypePolicy.createScriptURL", "api.TrustedTypePolicy.name", "api.TrustedTypePolicyFactory", "api.TrustedTypePolicyFactory.createPolicy", "api.TrustedTypePolicyFactory.defaultPolicy", "api.TrustedTypePolicyFactory.emptyHTML", "api.TrustedTypePolicyFactory.emptyScript", "api.TrustedTypePolicyFactory.getAttributeType", "api.TrustedTypePolicyFactory.getPropertyType", "api.TrustedTypePoli\
cyFactory.isHTML", "api.TrustedTypePolicyFactory.isScript", "api.TrustedTypePolicyFactory.isScriptURL", "api.setInterval.code_param_enforces_trusted_types", "api.setTimeout.code_param_enforces_trusted_types", "api.trustedTypes", "http.headers.Content-Security-Policy.require-trusted-types-for", "http.headers.Content-Security-Policy.trusted-types"], description: "Trusted types allow you to lock down insecure parts of the DOM API and prevent client-side cross-site scripting (XSS) attacks.", description_html: "Trusted types allow you to lock down insecure parts of the DOM API and prevent client-side cross-site scripting (XSS) attacks.", group: ["security"], kind: "feature", name: "Trusted types", spec: ["https://w3c.github.io/trusted-types/dist/spec/"], status: { baseline: "low", baseline_low_date: "2026-02-24", by_compat_key: { "api.Element.innerHTML.enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "\
148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.HTMLScriptElement.innerText.enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.HTMLScriptElement.src.enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.HTMLScriptElement.text.enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.HTMLScriptElement.textContent.enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148",
    safari: "26", safari_ios: "26" } }, "api.ShadowRoot.innerHTML.enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedHTML": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedHTML.toJSON": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedHTML.toString": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedScript": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "\
83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedScript.toJSON": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedScript.toString": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedScriptURL": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedScriptURL.toJSON": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "90", chrome_android: "90", edge: "90", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedScriptURL.to\
String": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicy": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicy.createHTML": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicy.createScript": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicy.createScriptURL": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "\
83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicy.name": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.createPolicy": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.defaultPolicy": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePo\
licyFactory.emptyHTML": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.emptyScript": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.getAttributeType": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.getPropertyType": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.isHTML": { baseline: "low", baseline_low_date: "2026-02-2\
4", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.isScript": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.TrustedTypePolicyFactory.isScriptURL": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.setInterval.code_param_enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.setTimeout.code_param_enforces_trusted_types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83",
    firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "api.trustedTypes": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "http.headers.Content-Security-Policy.require-trusted-types-for": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } }, "http.headers.Content-Security-Policy.trusted-types": { baseline: "low", baseline_low_date: "2026-02-24", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } } }, support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "148", firefox_android: "148", safari: "26", safari_ios: "26" } } }, "two-value-display": { compat_features: ["css.properties.display.multi-keyword_v\
alues"], description: "The display CSS property accepts multiple keyword values, such as inline flex or block flow, to explicitly set an element's inner and outer layout mode. Also known as 2-value, multi-keyword, or multiple value syntax.", description_html: "The <code>display</code> CSS property accepts multiple keyword values, such as <code>inline flex</code> or <code>block flow</code>, to explicitly set an element's inner and outer layout mode. Also known as 2-value, multi-keyword, or multiple value syntax.", group: ["css"], kind: "feature", name: "Two-value display property", spec: ["https://drafts.csswg.org/css-display-3/#the-display-properties"], status: { baseline: "high", baseline_high_date: "2026-01-21", baseline_low_date: "2023-07-21", by_compat_key: { "css.properties.display.multi-keyword_values": { baseline: "high", baseline_high_date: "2026-01-21", baseline_low_date: "2023-07-21", support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "70", firefox_android: "\
79", safari: "15", safari_ios: "15" } } }, support: { chrome: "115", chrome_android: "115", edge: "115", firefox: "70", firefox_android: "79", safari: "15", safari_ios: "15" } } }, "typed-array-iteration-methods": { compat_features: ["javascript.builtins.TypedArray.every", "javascript.builtins.TypedArray.filter", "javascript.builtins.TypedArray.forEach", "javascript.builtins.TypedArray.indexOf", "javascript.builtins.TypedArray.lastIndexOf", "javascript.builtins.TypedArray.map", "javascript.builtins.TypedArray.reduce", "javascript.builtins.TypedArray.reduceRight", "javascript.builtins.TypedArray.some"], description: "Typed array iteration methods", description_html: "Typed array iteration methods", group: ["typed-arrays"], kind: "feature", name: "Typed array iteration methods", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.every", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarr\
ay%25.prototype.filter", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.foreach", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.indexof", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.lastindexof", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.map", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.reduce", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.reduceright", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.some"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.TypedArray.every": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "\
45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.filter": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.forEach": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.indexOf": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.lastIndexOf": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016\
-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.map": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.reduce": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.reduceRight": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.some": { baseline: "high", baseline_high_date: "\
2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } } }, "typed-array-iterators": { compat_features: ["javascript.builtins.TypedArray.@@iterator", "javascript.builtins.TypedArray.entries", "javascript.builtins.TypedArray.keys", "javascript.builtins.TypedArray.values"], description: "Typed arrays are iterable with the for … of statement and enumerable with the methods entries(), keys(), and values().", description_html: "Typed arrays are iterable with the <code>for … of</code> statement and enumerable with the methods <code>entries()</code>, <code>keys()</code>, and <code>values()</code>.", group: ["iterators", "typed-arrays"], kind: "feature", name: "Typed array iterators", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es\
/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype-@@iterator", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.entries", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.keys", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.values"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "javascript.builtins.TypedArray.@@iterator": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.entries": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "\
10", safari_ios: "10" } }, "javascript.builtins.TypedArray.keys": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.values": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } } }, "typed-arrays": { caniuse: ["typedarrays"], compat_features: ["javascript.builtins.ArrayBuffer", "javascript.builtins.ArrayBuffer.@@species", "javascript.builtins.ArrayBuffer.ArrayBuffer", "javascript.builtins.ArrayBuffer.byteLength", "javascript.builtins.ArrayBuffer.isView", "javascript.builtins.ArrayBuffer.slice",
    "javascript.builtins.DataView", "javascript.builtins.DataView.DataView", "javascript.builtins.DataView.buffer", "javascript.builtins.DataView.byteLength", "javascript.builtins.DataView.byteOffset", "javascript.builtins.DataView.getFloat32", "javascript.builtins.DataView.getFloat64", "javascript.builtins.DataView.getInt16", "javascript.builtins.DataView.getInt32", "javascript.builtins.DataView.getInt8", "javascript.builtins.DataView.getUint16", "javascript.builtins.DataView.getUint32", "javascript.builtins.DataView.getUint8", "javascript.builtins.DataView.setFloat32", "javascript.builtins.DataView.setFloat64", "javascript.builtins.DataView.setInt16", "javascript.builtins.DataView.setInt32", "javascript.builtins.DataView.setInt8", "javascript.builtins.DataView.setUint16", "javascript.builtins.DataView.setUint32", "javascript.builtins.DataView.setUint8", "javascript.builtins.Float32Array", "javascript.builtins.Float32Array.Float32Array", "javascript.builtins.Float32Array.Float32Array.\
constructor_without_parameters", "javascript.builtins.Float32Array.Float32Array.iterable_allowed", "javascript.builtins.Float64Array", "javascript.builtins.Float64Array.Float64Array", "javascript.builtins.Float64Array.Float64Array.constructor_without_parameters", "javascript.builtins.Float64Array.Float64Array.iterable_allowed", "javascript.builtins.Int16Array", "javascript.builtins.Int16Array.Int16Array", "javascript.builtins.Int16Array.Int16Array.constructor_without_parameters", "javascript.builtins.Int16Array.Int16Array.iterable_allowed", "javascript.builtins.Int32Array", "javascript.builtins.Int32Array.Int32Array", "javascript.builtins.Int32Array.Int32Array.constructor_without_parameters", "javascript.builtins.Int32Array.Int32Array.iterable_allowed", "javascript.builtins.Int8Array", "javascript.builtins.Int8Array.Int8Array", "javascript.builtins.Int8Array.Int8Array.constructor_without_parameters", "javascript.builtins.Int8Array.Int8Array.iterable_allowed", "javascript.builtins.Typed\
Array", "javascript.builtins.TypedArray.@@species", "javascript.builtins.TypedArray.BYTES_PER_ELEMENT", "javascript.builtins.TypedArray.buffer", "javascript.builtins.TypedArray.byteLength", "javascript.builtins.TypedArray.byteOffset", "javascript.builtins.TypedArray.constructor_without_parameters", "javascript.builtins.TypedArray.index_properties_not_consulting_prototype", "javascript.builtins.TypedArray.iterable_in_constructor", "javascript.builtins.TypedArray.join", "javascript.builtins.TypedArray.length", "javascript.builtins.TypedArray.name", "javascript.builtins.TypedArray.named_properties", "javascript.builtins.TypedArray.reverse", "javascript.builtins.TypedArray.set", "javascript.builtins.TypedArray.slice", "javascript.builtins.TypedArray.sort", "javascript.builtins.TypedArray.subarray", "javascript.builtins.TypedArray.toString", "javascript.builtins.Uint16Array", "javascript.builtins.Uint16Array.Uint16Array", "javascript.builtins.Uint16Array.Uint16Array.constructor_without_para\
meters", "javascript.builtins.Uint16Array.Uint16Array.iterable_allowed", "javascript.builtins.Uint32Array", "javascript.builtins.Uint32Array.Uint32Array", "javascript.builtins.Uint32Array.Uint32Array.constructor_without_parameters", "javascript.builtins.Uint32Array.Uint32Array.iterable_allowed", "javascript.builtins.Uint8Array", "javascript.builtins.Uint8Array.Uint8Array", "javascript.builtins.Uint8Array.Uint8Array.constructor_without_parameters", "javascript.builtins.Uint8Array.Uint8Array.iterable_allowed", "javascript.builtins.Uint8ClampedArray", "javascript.builtins.Uint8ClampedArray.Uint8ClampedArray", "javascript.builtins.Uint8ClampedArray.Uint8ClampedArray.constructor_without_parameters", "javascript.builtins.Uint8ClampedArray.Uint8ClampedArray.iterable_allowed"], description: "Typed arrays are ordered lists of JavaScript values, where all values are of the same numerical type, such as 8-bit integers or 32-bit floating point numbers.", description_html: "Typed arrays are ordered \
lists of JavaScript values, where all values are of the same numerical type, such as 8-bit integers or 32-bit floating point numbers.", group: ["typed-arrays"], kind: "feature", name: "Typed arrays (initial support)", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#table-49", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-typedarray-constructors", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-typedarray-objects", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-typedarray.bytes_per_element", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-get-%25typedarray%25.prototype.buffer", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-get-%25typedarray%25.prototype.bytelength", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-get-%25typedarray%25.prototype.byteoffset", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.pr\
ototype.join", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-get-%25typedarray%25.prototype.length", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-properties-of-the-typedarray-constructors", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.reverse", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.set", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.slice", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.sort", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.subarray", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.tolocalestring", "https://tc39.es/ecma262/multipage/indexed-collections.html#sec-%25typedarray%25.prototype.tostring"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", by_compat_key: { "javascript.builtins.ArrayBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.ArrayBuffer.@@species": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "51", chrome_android: "51", edge: "13", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } }, "javascript.builtins.ArrayBuffer.ArrayBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.ArrayBuffer.byteLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.ArrayBuffer.isView": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "29", firefox_android: "29", safari: "7", safari_ios: "7" } }, "javascript.builtins.ArrayBuffer.slice": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "17", chrome_android: "18", edge: "12", firefox: "12", firefox_android: "14", safari: "5.1", safari_ios: "6" } }, "javascript.builtins.DataView": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.DataView": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9",
    chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.buffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.byteLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.byteOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getFloat32": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getFloat64": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getInt16": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getInt32": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getInt8": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getUint16": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getUint32": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.getUint8": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setFloat32": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setFloat64": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setInt16": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setInt32": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } },
    "javascript.builtins.DataView.setInt8": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setUint16": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setUint32": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.DataView.setUint8": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "\
15", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Float32Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Float32Array.Float32Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Float32Array.Float32Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Float32Array.Float32Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "\
2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Float64Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Float64Array.Float64Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Float64Array.Float64Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Float64Arra\
y.Float64Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Int16Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Int16Array.Int16Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Int16Array.Int16Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "\
55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Int16Array.Int16Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Int32Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Int32Array.Int32Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Int32Array.Int32Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "\
2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Int32Array.Int32Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Int8Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Int8Array.Int8Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Int8Array.Int8Array.constructor_withou\
t_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Int8Array.Int8Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.@@species": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "51", chrome_android: "51", edge: "13", firefox: "48", firefox_android: "48", safari: "\
10", safari_ios: "10" } }, "javascript.builtins.TypedArray.BYTES_PER_ELEMENT": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.buffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.byteLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.byteOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.TypedArray.index_properties_not_consulting_prototype": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.TypedArray.iterable_in_constructor": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.join": { baseline: "high", baseline_high_date: "\
2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.named_properties": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "30", firefox_android: "30", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.TypedArray.r\
everse": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "37", firefox_android: "37", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.slice": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "38", firefox_android: "38", safari: "10", safari_ios: "10" } }, "javascript.builtins.TypedArray.sort": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "45", chrome_android: "45", edge: "12", firefox: "46", firefox_android: "46", safari: "10", safari_ios: "10" } },
    "javascript.builtins.TypedArray.subarray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.TypedArray.toString": { baseline: "high", baseline_high_date: "2019-07-24", baseline_low_date: "2017-01-24", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "51", firefox_android: "51", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Uint16Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint16Array.Uint16Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "\
4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint16Array.Uint16Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Uint16Array.Uint16Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Uint32Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint32Array.Uint32Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint32Array.Uint32Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Uint32Array.Uint32Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Uint8Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Ui\
nt8Array.Uint8Array": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint8Array.Uint8Array.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Uint8Array.Uint8Array.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } }, "javascript.builtins.Uint8ClampedArray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "1\
2", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint8ClampedArray.Uint8ClampedArray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } }, "javascript.builtins.Uint8ClampedArray.Uint8ClampedArray.constructor_without_parameters": { baseline: "high", baseline_high_date: "2020-02-08", baseline_low_date: "2017-08-08", support: { chrome: "7", chrome_android: "18", edge: "12", firefox: "55", firefox_android: "55", safari: "5.1", safari_ios: "5" } }, "javascript.builtins.Uint8ClampedArray.Uint8ClampedArray.iterable_allowed": { baseline: "high", baseline_high_date: "2019-09-07", baseline_low_date: "2017-03-07", support: { chrome: "39", chrome_android: "39", edge: "14", firefox: "52", firefox_android: "52", safari: "10", safari_ios: "10" } } }, support: { chrome: "7", chrome_android: "\
18", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "4.2" } } }, u: { compat_features: ["html.elements.u"], description: "The <u> HTML element makes non-textual annotations, styling text as underlined by default.", description_html: "The <code>&#x3C;u></code> HTML element makes non-textual annotations, styling text as underlined by default.", group: ["html-elements"], kind: "feature", name: "<u>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-u-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.u": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "ua\
-client-hints": { compat_features: ["api.Navigator.userAgentData", "api.Navigator.userAgentData.secure_context_required", "api.NavigatorUAData", "api.NavigatorUAData.brands", "api.NavigatorUAData.getHighEntropyValues", "api.NavigatorUAData.mobile", "api.NavigatorUAData.platform", "api.NavigatorUAData.toJSON", "api.WorkerNavigator.userAgentData", "http.headers.Accept-CH.Sec-CH-UA", "http.headers.Accept-CH.Sec-CH-UA-Arch", "http.headers.Accept-CH.Sec-CH-UA-Full-Version", "http.headers.Accept-CH.Sec-CH-UA-Mobile", "http.headers.Accept-CH.Sec-CH-UA-Model", "http.headers.Accept-CH.Sec-CH-UA-Platform", "http.headers.Accept-CH.Sec-CH-UA-Platform-Version", "http.headers.Sec-CH-UA", "http.headers.Sec-CH-UA-Arch", "http.headers.Sec-CH-UA-Bitness", "http.headers.Sec-CH-UA-Form-Factors", "http.headers.Sec-CH-UA-Full-Version-List", "http.headers.Sec-CH-UA-Mobile", "http.headers.Sec-CH-UA-Model", "http.headers.Sec-CH-UA-Platform", "http.headers.Sec-CH-UA-Platform-Version", "http.headers.Sec-CH-UA-Wo\
W64"], description: "The Sec-CH-UA HTTP request header and the navigator.userAgentData API expose browser and platform information used to vary responses and application logic. User agent client hints are similar to user agent strings but more privacy-preserving and safer to parse.", description_html: "The <code>Sec-CH-UA</code> HTTP request header and the <code>navigator.userAgentData</code> API expose browser and platform information used to vary responses and application logic. User agent client hints are similar to user agent strings but more privacy-preserving and safer to parse.", kind: "feature", name: "User agent client hints", spec: ["https://wicg.github.io/ua-client-hints/"], status: { baseline: false, by_compat_key: { "api.Navigator.userAgentData": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.Navigator.userAgentData.secure_context_required": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.Naviga\
torUAData": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.NavigatorUAData.brands": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.NavigatorUAData.getHighEntropyValues": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.NavigatorUAData.mobile": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.NavigatorUAData.platform": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "api.NavigatorUAData.toJSON": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "api.WorkerNavigator.userAgentData": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "http.headers.Accept-CH.Sec-CH-UA": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Accept-CH.Sec-CH-UA-Arch": { baseline: false, support: { chrome: "89", chrome_android: "\
89", edge: "89" } }, "http.headers.Accept-CH.Sec-CH-UA-Full-Version": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Accept-CH.Sec-CH-UA-Mobile": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Accept-CH.Sec-CH-UA-Model": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Accept-CH.Sec-CH-UA-Platform": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Accept-CH.Sec-CH-UA-Platform-Version": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA-Arch": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA-Bitness": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "\
http.headers.Sec-CH-UA-Form-Factors": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "http.headers.Sec-CH-UA-Full-Version-List": { baseline: false, support: { chrome: "98", chrome_android: "98", edge: "98" } }, "http.headers.Sec-CH-UA-Mobile": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA-Model": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA-Platform": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA-Platform-Version": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Sec-CH-UA-WoW64": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } } }, support: { chrome: "90", chrome_android: "90", edge: "90" } } }, "uint8array-base64-hex": { compat_features: ["javascript.builtins.Uint8Array.fromBase64", "javas\
cript.builtins.Uint8Array.fromHex", "javascript.builtins.Uint8Array.setFromBase64", "javascript.builtins.Uint8Array.setFromHex", "javascript.builtins.Uint8Array.toBase64", "javascript.builtins.Uint8Array.toHex"], description: "The Uint8Array object methods fromBase64(), toBase64(), and setFromBase64() convert to and from base64 strings. The fromHex(), toHex(), and setFromHex() methods convert to and from hex strings.", description_html: "The <code>Uint8Array</code> object methods <code>fromBase64()</code>, <code>toBase64()</code>, and <code>setFromBase64()</code> convert to and from base64 strings. The <code>fromHex()</code>, <code>toHex()</code>, and <code>setFromHex()</code> methods convert to and from hex strings.", group: ["typed-arrays"], kind: "feature", name: "Uint8Array base64 and hex conversion", spec: ["https://tc39.es/ecma262/multipage/indexed-collections.html#sec-additional-properties-of-the-uint8array-constructor", "https://tc39.es/ecma262/multipage/indexed-collections.htm\
l#sec-additional-properties-of-the-uint8array-prototype-object"], status: { baseline: "low", baseline_low_date: "2025-09-05", by_compat_key: { "javascript.builtins.Uint8Array.fromBase64": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Uint8Array.fromHex": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Uint8Array.setFromBase64": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Uint8Array.setFromHex": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "\
140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Uint8Array.toBase64": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } }, "javascript.builtins.Uint8Array.toHex": { baseline: "low", baseline_low_date: "2025-09-05", support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "140", chrome_android: "140", edge: "140", firefox: "133", firefox_android: "133", safari: "18.2", safari_ios: "18.2" } } }, "unicode-point-escapes": { compat_features: ["javascript.grammar.unicode_point_escapes"], description: "Unicode point escapes (\\\\u{}) represent Unicode characters within strings.", description_html: "Unicode point escapes (<code>\\\\u{}</code>) represent Unicode characters within str\
ings.", group: ["javascript"], kind: "feature", name: "Unicode point escapes", snapshot: ["ecmascript-2015"], spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html#prod-UnicodeEscapeSequence"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.grammar.unicode_point_escapes": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "40", firefox_android: "40", safari: "9", safari_ios: "9" } } }, support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "40", firefox_android: "40", safari: "9", safari_ios: "9" } } }, "unset-value": { caniuse: ["css-unset-value"], compat_features: ["css.types.global_keywords.unset"], description: "The unset keyword resets any CSS property, removing any values previously set by the author, user, or browser. Inherited properties (like color) reset to\
 the parent element's computed value. Non-inherited properties (like display) reset to the specified initial value (inline).", description_html: "The <code>unset</code> keyword resets any CSS property, removing any values previously set by the author, user, or browser. Inherited properties (like <code>color</code>) reset to the parent element's computed value. Non-inherited properties (like <code>display</code>) reset to the specified initial value (<code>inline</code>).", group: ["explicit-defaults"], kind: "feature", name: "unset", spec: ["https://drafts.csswg.org/css-cascade-3/#inherit-initial"], status: { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", by_compat_key: { "css.types.global_keywords.unset": { baseline: "high", baseline_high_date: "2018-09-21", baseline_low_date: "2016-03-21", support: { chrome: "41", chrome_android: "41", edge: "13", firefox: "27", firefox_android: "27", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "41",
    chrome_android: "41", edge: "13", firefox: "27", firefox_android: "27", safari: "9.1", safari_ios: "9.3" } } }, update: { compat_features: ["css.at-rules.media.update"], description: "The update CSS media query sets styles based on whether and how fast the user's device can modify display after it has been rendered. For example, you can avoid animations on devices that aren't fast enough to display them smoothly.", description_html: "The <code>update</code> CSS media query sets styles based on whether and how fast the user's device can modify display after it has been rendered. For example, you can avoid animations on devices that aren't fast enough to display them smoothly.", group: ["media-queries"], kind: "feature", name: "Update frequency media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#update"], status: { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", by_compat_key: { "css.at-rules.media.update": { baseline: "high", baseline_high_date: "\
2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "102", firefox_android: "102", safari: "17", safari_ios: "17" } } }, support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "102", firefox_android: "102", safari: "17", safari_ios: "17" } } }, "upgrade-insecure-requests": { compat_features: ["http.headers.Content-Security-Policy.upgrade-insecure-requests", "http.headers.Upgrade-Insecure-Requests"], description: "The Upgrade-Insecure-Requests HTTP request header tells the server that the response should redirect to a secure (HTTPS) resource.", description_html: "The <code>Upgrade-Insecure-Requests</code> HTTP request header tells the server that the response should redirect to a secure (HTTPS) resource.", group: ["security"], kind: "feature", name: "Upgrade insecure requests", spec: ["https://w3c.github.io/webappsec-upgrade-insecure-requests/"], status: { baseline: "high", baseline_high_date: "2020-10-30",
    baseline_low_date: "2018-04-30", by_compat_key: { "http.headers.Content-Security-Policy.upgrade-insecure-requests": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "43", chrome_android: "43", edge: "17", firefox: "42", firefox_android: "42", safari: "10.1", safari_ios: "10.3" } }, "http.headers.Upgrade-Insecure-Requests": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "44", chrome_android: "44", edge: "17", firefox: "48", firefox_android: "48", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "44", chrome_android: "44", edge: "17", firefox: "48", firefox_android: "48", safari: "10.1", safari_ios: "10.3" } } }, url: { caniuse: ["url"], compat_features: ["api.URL", "api.URL.URL", "api.URL.hash", "api.URL.host", "api.URL.hostname", "api.URL.href", "api.URL.origin", "api.URL.parse_static", "api.URL.password", "api.URL.pathname", "api.URL.port", "api.URL.proto\
col", "api.URL.search", "api.URL.searchParams", "api.URL.toJSON", "api.URL.toString", "api.URL.username", "api.URLSearchParams", "api.URLSearchParams.@@iterator", "api.URLSearchParams.URLSearchParams", "api.URLSearchParams.URLSearchParams.USVString", "api.URLSearchParams.URLSearchParams.record", "api.URLSearchParams.URLSearchParams.sequence", "api.URLSearchParams.append", "api.URLSearchParams.delete", "api.URLSearchParams.delete.value_parameter", "api.URLSearchParams.entries", "api.URLSearchParams.forEach", "api.URLSearchParams.get", "api.URLSearchParams.getAll", "api.URLSearchParams.has", "api.URLSearchParams.has.value_parameter", "api.URLSearchParams.keys", "api.URLSearchParams.set", "api.URLSearchParams.size", "api.URLSearchParams.sort", "api.URLSearchParams.toString", "api.URLSearchParams.values"], description: "A URL object represents a web address, like https://example.com/, and parts of the address, such as the domain, path, and query string (as URLSearchParams).", description_html: "\
A <code>URL</code> object represents a web address, like <code>https://example.com/</code>, and parts of the address, such as the domain, path, and query string (as <code>URLSearchParams</code>).", kind: "feature", name: "URL", spec: ["https://url.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.URL": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } }, "api.URL.URL": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "26", firefox_android: "26", safari: "14.1", safari_ios: "14.5" } }, "api.URL.hash": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "32", chrome_android: "32", edge: "\
13", firefox: "22", firefox_android: "22", safari: "7", safari_ios: "7" } }, "api.URL.host": { baseline: "high", baseline_high_date: "2018-05-12", baseline_low_date: "2015-11-12", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "7", safari_ios: "7" } }, "api.URL.hostname": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.URL.href": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.URL.origin": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "26", firefox_android: "26", safari: "10",
    safari_ios: "10" } }, "api.URL.parse_static": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "126", firefox_android: "126", safari: "18", safari_ios: "18" } }, "api.URL.password": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "api.URL.pathname": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.URL.port": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.URL.protocol": { baseline: "high", baseline_high_date: "\
2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.URL.search": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.URL.searchParams": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "51", chrome_android: "51", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URL.toJSON": { baseline: "high", baseline_high_date: "2021-06-04", baseline_low_date: "2018-12-04", support: { chrome: "71", chrome_android: "71", edge: "17", firefox: "54", firefox_android: "54", safari: "11", safari_ios: "11" } }, "api.URL.toString": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "201\
8-04-30", support: { chrome: "32", chrome_android: "32", edge: "17", firefox: "54", firefox_android: "54", safari: "7", safari_ios: "7" } }, "api.URL.username": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "26", firefox_android: "26", safari: "10", safari_ios: "10" } }, "api.URLSearchParams": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.@@iterator": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.URLSearchParams": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2\
018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.URLSearchParams.USVString": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.URLSearchParams.record": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "61", chrome_android: "61", edge: "17", firefox: "54", firefox_android: "54", safari: "11", safari_ios: "11" } }, "api.URLSearchParams.URLSearchParams.sequence": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "58", chrome_android: "58", edge: "17", firefox: "53", firefox_android: "53", safari: "11", safari_ios: "11" } }, "api.URLSearchParams.append": { baseline: "h\
igh", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.delete": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "14", safari_ios: "14" } }, "api.URLSearchParams.delete.value_parameter": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } }, "api.URLSearchParams.entries": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearch\
Params.forEach": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.get": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.getAll": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.has": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "ap\
i.URLSearchParams.has.value_parameter": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "117", chrome_android: "117", edge: "117", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } }, "api.URLSearchParams.keys": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.set": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.size": { baseline: "high", baseline_high_date: "2026-03-18", baseline_low_date: "2023-09-18", support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "112", firefox_android: "112", safari: "17", safari_ios: "\
17" } }, "api.URLSearchParams.sort": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "61", chrome_android: "61", edge: "17", firefox: "54", firefox_android: "54", safari: "11", safari_ios: "11" } }, "api.URLSearchParams.toString": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "29", firefox_android: "29", safari: "10.1", safari_ios: "10.3" } }, "api.URLSearchParams.values": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "49", chrome_android: "49", edge: "17", firefox: "44", firefox_android: "44", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "32", chrome_android: "32", edge: "12", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } } }, "url-canparse": { compat_features: ["api.URL.canParse_static"], description: "The URL.canParse() s\
tatic method checks whether a URL can be parsed into a valid URL object. It's an alternative to calling new URL() in a try … catch statement.", description_html: "The <code>URL.canParse()</code> static method checks whether a URL can be parsed into a valid <code>URL</code> object. It's an alternative to calling <code>new URL()</code> in a <code>try … catch</code> statement.", kind: "feature", name: "URL.canParse()", spec: ["https://url.spec.whatwg.org/#dom-url-canparse"], status: { baseline: "low", baseline_low_date: "2023-12-07", by_compat_key: { "api.URL.canParse_static": { baseline: "low", baseline_low_date: "2023-12-07", support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "115", firefox_android: "115", safari: "17", safari_ios: "17" } } }, "url-cross-origin": { compat_features: ["css.types.url.cross-origin"], description: '\
The url() CSS function accepts a cross-origin() modifier to control cross-origin resource sharing (CORS) when requesting the URL. For example, url("https://example.com" cross-origin(anonymous))) does not send credentials to the URL.', description_html: 'The <code>url()</code> CSS function accepts a <code>cross-origin()</code> modifier to control cross-origin resource sharing (CORS) when requesting the URL. For example, <code>url("https://example.com" cross-origin(anonymous))</code>) does not send credentials to the URL.', kind: "feature", name: "cross-origin() for url()", spec: ["https://drafts.csswg.org/css-values-5/#typedef-request-url-modifier-cross-origin-modifier"], status: { baseline: false, by_compat_key: { "css.types.url.cross-origin": { baseline: false, support: { safari: "26.2", safari_ios: "26.2" } } }, support: { safari: "26.2", safari_ios: "26.2" } } }, "url-integrity": { description: "The url() CSS function accepts an integrity() modifier to use subresource integrity to v\
erify the response from the requested URL.", description_html: "The <code>url()</code> CSS function accepts an <code>integrity()</code> modifier to use subresource integrity to verify the response from the requested URL.", kind: "feature", name: "integrity() for url()", spec: ["https://drafts.csswg.org/css-values-5/#typedef-request-url-modifier-integrity-modifier"], status: { baseline: false, support: {} } }, "url-referrer-policy": { compat_features: ["css.types.url.referrer-policy"], description: 'The url() CSS function accepts a referrer-policy() modifier to choose which referrer to send when requesting the URL.  For example, `url("https://example.com" referrer-policy(no-referrer)) does not send a referrer to the URL.', description_html: 'The <code>url()</code> CSS function accepts a <code>referrer-policy()</code> modifier to choose which referrer to send when requesting the URL.  For example, `url("https://example.com" referrer-policy(no-referrer)) does not send a referrer to the UR\
L.', kind: "feature", name: "referrer-policy() for url()", spec: ["https://drafts.csswg.org/css-values-5/#typedef-request-url-modifier-referrer-policy-modifier"], status: { baseline: false, by_compat_key: { "css.types.url.referrer-policy": { baseline: false, support: { safari: "26.2", safari_ios: "26.2" } } }, support: { safari: "26.2", safari_ios: "26.2" } } }, urlpattern: { compat_features: ["api.URLPattern", "api.URLPattern.URLPattern", "api.URLPattern.URLPattern.ignoreCase_option", "api.URLPattern.exec", "api.URLPattern.hasRegExpGroups", "api.URLPattern.hash", "api.URLPattern.hostname", "api.URLPattern.password", "api.URLPattern.pathname", "api.URLPattern.port", "api.URLPattern.protocol", "api.URLPattern.search", "api.URLPattern.test", "api.URLPattern.username"], description: "The URLPattern API creates patterns that can be matched against URLs or URL components.", description_html: "The <code>URLPattern</code> API creates patterns that can be matched against URLs or URL components\
.", kind: "feature", name: "URLPattern", spec: ["https://urlpattern.spec.whatwg.org/"], status: { baseline: "low", baseline_low_date: "2025-09-15", by_compat_key: { "api.URLPattern": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.URLPattern": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.URLPattern.ignoreCase_option": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "107", chrome_android: "107", edge: "107", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.exec": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "\
26", safari_ios: "26" } }, "api.URLPattern.hasRegExpGroups": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "122", chrome_android: "122", edge: "122", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.hash": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.hostname": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.password": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.pathname": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "\
95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.port": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.protocol": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.search": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.test": { baseline: "low", baseline_low_date: "2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } }, "api.URLPattern.username": { baseline: "low", baseline_low_date: "\
2025-09-15", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } } }, support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "142", firefox_android: "142", safari: "26", safari_ios: "26" } } }, "user-action-pseudos": { compat_features: ["css.selectors.active", "css.selectors.active.non_a_elements", "css.selectors.focus", "css.selectors.hover", "css.selectors.hover.a_elements", "css.selectors.hover.all_elements"], description: "The :active, :focus, and :hover CSS pseudo-classes match elements based on how users are interacting with them.", description_html: "The <code>:active</code>, <code>:focus</code>, and <code>:hover</code> CSS pseudo-classes match elements based on how users are interacting with them.", group: ["selectors"], kind: "feature", name: "User action pseudo-classes", spec: ["https://drafts.csswg.org/selectors-4/#the-hover-pseudo", "https://drafts.csswg.org/selectors-4/#the-active-\
pseudo", "https://drafts.csswg.org/selectors-4/#the-focus-pseudo"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.selectors.active": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.active.non_a_elements": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.focus": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.selectors.hover": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } }, "css.selectors.hover.a_elements": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } }, "css.selectors.hover.all_elements": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "2", safari_ios: "1" } } }, "user-activation": { compat_features: ["api.Navigator.userActivation", "api.UserActivation", "api.UserActivation.hasBeenActive", "api.UserActivation.isActive"], description: 'The navigator.userActivation API reveals whether the\
 user has interacted with the page through an "activation" gesture such as a click, tap, or key press. User activation gated APIs (such as the fullscreen API) fail without user interaction, and this API allows you to predict such a failure.', description_html: 'The <code>navigator.userActivation</code> API reveals whether the user has interacted with the page through an "activation" gesture such as a click, tap, or key press. User activation gated APIs (such as the fullscreen API) fail without user interaction, and this API allows you to predict such a failure.', group: ["security"], kind: "feature", name: "User activation", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#the-useractivation-interface"], status: { baseline: "low", baseline_low_date: "2023-11-21", by_compat_key: { "api.Navigator.userActivation": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "120", firefox_android: "120", safari: "16\
.4", safari_ios: "16.4" } }, "api.UserActivation": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } }, "api.UserActivation.hasBeenActive": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } }, "api.UserActivation.isActive": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "120", firefox_android: "120", safari: "16.4", safari_ios: "16.4" } } }, "user-agent-sniffing": { compat_features: ["api.Navigator.appCodeName", "api.Navigator.appName", "api.Navigator.appVersion", "api.Navigator.javaEnabled", "api.Navigat\
or.platform", "api.Navigator.plugins", "api.Navigator.product", "api.Navigator.productSub", "api.Navigator.userAgent", "api.Navigator.vendor", "api.WorkerNavigator.appCodeName", "api.WorkerNavigator.appName", "api.WorkerNavigator.appVersion", "api.WorkerNavigator.platform", "api.WorkerNavigator.product", "api.WorkerNavigator.userAgent"], description: "The navigator.userAgent property and several others loosely identify a browser. Selectively showing content based on the user agent string, also known as user agent sniffing, is unreliable. Consider using feature detection or user agent client hints instead.", description_html: "The <code>navigator.userAgent</code> property and several others loosely identify a browser. Selectively showing content based on the user agent string, also known as user agent sniffing, is unreliable. Consider using feature detection or user agent client hints instead.", kind: "feature", name: "User agent sniffing", spec: ["https://html.spec.whatwg.org/multipage\
/system-state.html#the-navigator-object"], status: { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", by_compat_key: { "api.Navigator.appCodeName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.appName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.appVersion": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.javaEnabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.platform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.plugins": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.product": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.productSub": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18",
    edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.userAgent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Navigator.vendor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.WorkerNavigator.appCodeName": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "10", safari_ios: "10" } }, "api.WorkerNavigator.appName": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "\
3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerNavigator.appVersion": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerNavigator.platform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.WorkerNavigator.product": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "10", safari_ios: "10" } }, "api.WorkerNavigator.userAgent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "\
3.5", firefox_android: "4", safari: "4", safari_ios: "5" } } }, support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "10", safari_ios: "10" } } }, "user-pseudos": { compat_features: ["css.selectors.user-invalid", "css.selectors.user-valid"], description: "The :user-valid and :user-invalid pseudo-classes match form controls that have been marked as valid or invalid based on their validation constraints.", description_html: "The <code>:user-valid</code> and <code>:user-invalid</code> pseudo-classes match form controls that have been marked as valid or invalid based on their validation constraints.", group: ["selectors"], kind: "feature", name: ":user-valid and :user-invalid", spec: ["https://drafts.csswg.org/selectors-4/#user-pseudos"], status: { baseline: "low", baseline_low_date: "2023-11-02", by_compat_key: { "css.selectors.user-invalid": { baseline: "low", baseline_low_date: "2023-11-02", support: { chrome: "119", chrome_android: "11\
9", edge: "119", firefox: "88", firefox_android: "88", safari: "16.5", safari_ios: "16.5" } }, "css.selectors.user-valid": { baseline: "low", baseline_low_date: "2023-11-02", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "88", firefox_android: "88", safari: "16.5", safari_ios: "16.5" } } }, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "88", firefox_android: "88", safari: "16.5", safari_ios: "16.5" } } }, "user-select": { caniuse: ["user-select-none"], compat_features: ["css.properties.user-select", "css.properties.user-select.all", "css.properties.user-select.auto", "css.properties.user-select.none", "css.properties.user-select.text"], description: "The user-select CSS property controls which elements can be selected by the user.", description_html: "The <code>user-select</code> CSS property controls which elements can be selected by the user.", group: ["css"], kind: "feature", name: "user-select", spec: ["https://drafts.csswg.org/css-\
ui-4/#content-selection"], status: { baseline: false, by_compat_key: { "css.properties.user-select": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "69", firefox_android: "79" } }, "css.properties.user-select.all": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "69", firefox_android: "79" } }, "css.properties.user-select.auto": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "69", firefox_android: "79" } }, "css.properties.user-select.none": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "69", firefox_android: "79" } }, "css.properties.user-select.text": { baseline: false, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "69", firefox_android: "79" } } }, support: { chrome: "54", chrome_android: "54", edge: "79", firefox: "69", firefox_android: "79" } } }, var: { compat_features: ["html.elements.var"], description: "\
The <var> element represents the name of a variable in a mathematical expression or a programming context.", description_html: "The <code>&#x3C;var></code> element represents the name of a variable in a mathematical expression or a programming context.", group: ["html-elements"], kind: "feature", name: "<var>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-var-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.elements.var": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "≤4", safari_ios: "≤3.2" } } }, "vertical-align": { compat_features: ["css.properties.vertical-align", "css.properties.vertical-ali\
gn.baseline", "css.properties.vertical-align.bottom", "css.properties.vertical-align.middle", "css.properties.vertical-align.sub", "css.properties.vertical-align.super", "css.properties.vertical-align.text-bottom", "css.properties.vertical-align.text-top", "css.properties.vertical-align.top"], description: "The vertical-align CSS property sets the vertical alignment of inline, inline-block, and table cell elements. It has no effect on block-level elements.", description_html: "The <code>vertical-align</code> CSS property sets the vertical alignment of inline, inline-block, and table cell elements. It has no effect on block-level elements.", group: ["css"], kind: "feature", name: "vertical-align", spec: ["https://drafts.csswg.org/css2/#propdef-vertical-align"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.vertical-align": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.baseline": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.bottom": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.middle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.sub": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.super": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.text-bottom": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.text-top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.vertical-align.top": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "vertical-form-controls": { compat_features: ["css.properties.direction.vertical_slider_direction", "css.properties.writing-mode.vertical_oriented_form_controls"], description: "The writing-mode CSS property orients form elements (such as radio buttons, progress bars, or select menus) vertically when the writing mode is vertical-lr or vertical-rl. The direction CSS property sets whether inputs flow from top to bottom or bottom to top.", description_html: "The <code>writing-mode</code> CSS property orients form elements (such as radio buttons, progress bars, or select menus) vertically when the writing mode is <code>vertical-lr</code> or <code>vertical-rl</code>. The <code>direction</code> CSS p\
roperty sets whether inputs flow from top to bottom or bottom to top.", group: ["css"], kind: "feature", name: "Vertical form controls", spec: ["https://drafts.csswg.org/css-writing-modes-4/#vertical-modes"], status: { baseline: "low", baseline_low_date: "2024-04-18", by_compat_key: { "css.properties.direction.vertical_slider_direction": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "css.properties.writing-mode.vertical_oriented_form_controls": { baseline: "low", baseline_low_date: "2024-04-18", support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "120", firefox_android: "120", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "120", firefox_android: "120", safari: "17.4", safari_ios: "17.4" } } }, vibration: { compat_features: ["api.Navigator.vibrate"], description: "The navigator.vibrate() method makes a tactile alert, if the device is equipped with a haptic motor.",
    description_html: "The <code>navigator.vibrate()</code> method makes a tactile alert, if the device is equipped with a haptic motor.", kind: "feature", name: "Vibration", spec: ["https://w3c.github.io/vibration/"], status: { baseline: false, by_compat_key: { "api.Navigator.vibrate": { baseline: false, support: { chrome: "32", chrome_android: "32", edge: "79" } } }, support: { chrome: "32", chrome_android: "32", edge: "79" } } }, video: { caniuse: ["video"], compat_features: ["api.HTMLMediaElement", "api.HTMLMediaElement.abort_event", "api.HTMLMediaElement.autoplay", "api.HTMLMediaElement.buffered", "api.HTMLMediaElement.canPlayType", "api.HTMLMediaElement.canplay_event", "api.HTMLMediaElement.canplaythrough_event", "api.HTMLMediaElement.controls", "api.HTMLMediaElement.crossOrigin", "api.HTMLMediaElement.currentSrc", "api.HTMLMediaElement.currentTime", "api.HTMLMediaElement.defaultMuted", "api.HTMLMediaElement.defaultPlaybackRate", "api.HTMLMediaElement.duration", "api.HTMLMediaEle\
ment.durationchange_event", "api.HTMLMediaElement.emptied_event", "api.HTMLMediaElement.ended", "api.HTMLMediaElement.ended_event", "api.HTMLMediaElement.error", "api.HTMLMediaElement.error_event", "api.HTMLMediaElement.load", "api.HTMLMediaElement.loadeddata_event", "api.HTMLMediaElement.loadedmetadata_event", "api.HTMLMediaElement.loadstart_event", "api.HTMLMediaElement.loop", "api.HTMLMediaElement.muted", "api.HTMLMediaElement.networkState", "api.HTMLMediaElement.pause", "api.HTMLMediaElement.pause_event", "api.HTMLMediaElement.paused", "api.HTMLMediaElement.play", "api.HTMLMediaElement.play.returns_promise", "api.HTMLMediaElement.play_event", "api.HTMLMediaElement.playbackRate", "api.HTMLMediaElement.played", "api.HTMLMediaElement.playing_event", "api.HTMLMediaElement.preload", "api.HTMLMediaElement.progress_event", "api.HTMLMediaElement.ratechange_event", "api.HTMLMediaElement.readyState", "api.HTMLMediaElement.seekable", "api.HTMLMediaElement.seeked_event", "api.HTMLMediaElement.\
seeking", "api.HTMLMediaElement.seeking_event", "api.HTMLMediaElement.src", "api.HTMLMediaElement.stalled_event", "api.HTMLMediaElement.suspend_event", "api.HTMLMediaElement.timeupdate_event", "api.HTMLMediaElement.volume", "api.HTMLMediaElement.volumechange_event", "api.HTMLMediaElement.waiting_event", "api.HTMLVideoElement", "api.HTMLVideoElement.height", "api.HTMLVideoElement.playsInline", "api.HTMLVideoElement.poster", "api.HTMLVideoElement.resize_event", "api.HTMLVideoElement.videoHeight", "api.HTMLVideoElement.videoWidth", "api.HTMLVideoElement.width", "api.MediaError", "api.MediaError.code", "api.MediaError.message", "api.TimeRanges", "api.TimeRanges.end", "api.TimeRanges.length", "api.TimeRanges.start", "html.elements.video", "html.elements.video.autoplay", "html.elements.video.controls", "html.elements.video.crossorigin", "html.elements.video.height", "html.elements.video.loop", "html.elements.video.muted", "html.elements.video.playsinline", "html.elements.video.poster", "html\
.elements.video.preload", "html.elements.video.src", "html.elements.video.width"], description: "The <video> element plays videos or movies, optionally with controls provided by the browser.", description_html: "The <code>&#x3C;video></code> element plays videos or movies, optionally with controls provided by the browser.", group: ["media-elements", "html-elements"], kind: "feature", name: "<video>", spec: ["https://html.spec.whatwg.org/multipage/media.html#video"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.HTMLMediaElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.abort_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "\
12", firefox: "9", firefox_android: "9", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.autoplay": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.buffered": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.canPlayType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.HTMLMediaElement.canplay_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18",
    edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.canplaythrough_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.controls": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.crossOrigin": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "33", chrome_android: "33", edge: "13", firefox: "22", firefox_android: "22", safari: "10", safari_ios: "10" } }, "api.HTMLMediaElement.currentSrc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "\
3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.currentTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.defaultMuted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.HTMLMediaElement.defaultPlaybackRate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.duration": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-\
29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.durationchange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.emptied_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.ended": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.ended_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.error": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.load": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.loadeddata_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.loadedmetadata_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.loadstart_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "4", safari_ios: "3" } }, "api.HTMLMediaElement.loop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "4", safari_ios: "3" } }, "api.HTMLMediaElement.muted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.networkState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.pause": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.pause_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.paused": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.play": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.play.returns_promise": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "50", chrome_android: "50", edge: "17", firefox: "53", firefox_android: "53", safari: "10", safari_ios: "10" } }, "api.HTMLMediaElement.play_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.playbackRate": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "20", firefox_android: "20", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.played": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.playing_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.preload": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.HTMLMediaElement.progress_event": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.ratechange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.seekable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.seeked_event": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.seeking": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.seeking_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.stalled_event": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.suspend_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.timeupdate_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.volume": { baseline: false, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1" } }, "api.HTMLMediaElement.volumechange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "3" } }, "api.HTMLMediaElement.waiting_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "3.1", safari_ios: "3" } }, "api.HTMLVideoElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLVideoElement.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLVideoElement.playsInline": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "79", safari: "10", safari_ios: "\
10" } }, "api.HTMLVideoElement.poster": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.6", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLVideoElement.resize_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "3", chrome_android: "18", edge: "79", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLVideoElement.videoHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.HTMLVideoElement.videoWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1",
    safari_ios: "3" } }, "api.HTMLVideoElement.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "api.MediaError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.MediaError.code": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.MediaError.message": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "52", firefox_android: "52", safari: "15", safari_ios: "15" } }, "api.\
TimeRanges": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.TimeRanges.end": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.TimeRanges.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.TimeRanges.start": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "html.elements.video": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.video.autoplay": { baseline: "high", baseline_high_date: "2019-03-13", baseline_low_date: "2016-09-13", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "10" } }, "html.elements.video.controls": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.video.crossorigin": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "33", chrome_android: "33", edge: "≤18", firefox: "74", firefox_android: "79", safari: "10", safari_ios: "10" } }, "html.elements.video.height": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.video.loop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "3.1", safari_ios: "6" } }, "html.elements.video.muted": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "html.elements.video.playsinline": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "79", safari: "10", safari_ios: "10" } }, "html.elements.video.poster": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "\
3.6", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.video.preload": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.video.src": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } }, "html.elements.video.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } } }, support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "3" } } }, "video-dynamic-range": { compat_features: ["css.at-rules.m\
edia.video-dynamic-range"], description: "The video-dynamic-range CSS media query sets styles based on whether a device can display video with at least standard range colors or at least high range colors. Non-visual devices will match neither.", description_html: "The <code>video-dynamic-range</code> CSS media query sets styles based on whether a device can display video with at least <code>standard</code> range colors or at least <code>high</code> range colors. Non-visual devices will match neither.", group: ["media-queries"], kind: "feature", name: "video-dynamic-range media query", spec: ["https://drafts.csswg.org/mediaqueries-5/#dynamic-range"], status: { baseline: false, by_compat_key: { "css.at-rules.media.video-dynamic-range": { baseline: false, support: { firefox: "100", firefox_android: "100" } } }, support: { firefox: "100", firefox_android: "100" } } }, "view-transition-class": { compat_features: ["css.properties.view-transition-class", "css.properties.view-transition-class.\
none"], description: "The view-transition-class CSS property sets a name that can be used to apply styles to multiple named view transition pseudo-elements.", description_html: "The <code>view-transition-class</code> CSS property sets a name that can be used to apply styles to multiple named view transition pseudo-elements.", group: ["view-transitions"], kind: "feature", name: "view-transition-class", spec: ["https://drafts.csswg.org/css-view-transitions-2/#propdef-view-transition-class"], status: { baseline: "low", baseline_low_date: "2025-10-14", by_compat_key: { "css.properties.view-transition-class": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "144", firefox_android: "144", safari: "18.2", safari_ios: "18.2" } }, "css.properties.view-transition-class.none": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "144", firefox_android: "1\
44", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "144", firefox_android: "144", safari: "18.2", safari_ios: "18.2" } } }, "view-transitions": { caniuse: ["view-transitions"], compat_features: ["api.Document.startViewTransition", "api.Document.startViewTransition.options_parameter", "api.Document.startViewTransition.options_parameter.types_parameter", "api.Document.startViewTransition.options_parameter.update_parameter", "api.Document.startViewTransition.updateCallback_parameter", "api.PageRevealEvent", "api.PageRevealEvent.PageRevealEvent", "api.PageRevealEvent.viewTransition", "api.PageSwapEvent", "api.PageSwapEvent.PageSwapEvent", "api.PageSwapEvent.activation", "api.PageSwapEvent.viewTransition", "api.ViewTransition", "api.ViewTransition.finished", "api.ViewTransition.ready", "api.ViewTransition.skipTransition", "api.ViewTransition.updateCallbackDone", "api.Window.pagereveal_event", "api.Window.pageswap_event", "cs\
s.properties.view-transition-name", "css.properties.view-transition-name.match-element", "css.properties.view-transition-name.none", "css.selectors.view-transition", "css.selectors.view-transition-group", "css.selectors.view-transition-image-pair", "css.selectors.view-transition-new", "css.selectors.view-transition-old"], description: "View transitions allow you to create animated visual transitions between different states of a document.", description_html: "View transitions allow you to create animated visual transitions between different states of a document.", group: ["view-transitions"], kind: "feature", name: "View transitions", spec: ["https://drafts.csswg.org/css-view-transitions-1/"], status: { baseline: "low", baseline_low_date: "2025-10-14", by_compat_key: { "api.Document.startViewTransition": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } },
    "api.Document.startViewTransition.options_parameter": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.Document.startViewTransition.options_parameter.types_parameter": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.Document.startViewTransition.options_parameter.update_parameter": { baseline: "low", baseline_low_date: "2026-01-13", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "147", firefox_android: "147", safari: "18.2", safari_ios: "18.2" } }, "api.Document.startViewTransition.updateCallback_parameter": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111", safari: "18", safari_ios: "18" } }, "api.PageRevealEvent": { baseline: false,
    support: { chrome: "123", chrome_android: "123", edge: "123", safari: "18.2", safari_ios: "18.2" } }, "api.PageRevealEvent.PageRevealEvent": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128", safari: "18.2", safari_ios: "18.2" } }, "api.PageRevealEvent.viewTransition": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", safari: "18.2", safari_ios: "18.2" } }, "api.PageSwapEvent": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", safari: "18.2", safari_ios: "18.2" } }, "api.PageSwapEvent.PageSwapEvent": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128", safari: "18.2", safari_ios: "18.2" } }, "api.PageSwapEvent.activation": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", safari: "18.2", safari_ios: "18.2" } }, "api.PageSwapEvent.viewTransition": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", safari: "\
18.2", safari_ios: "18.2" } }, "api.ViewTransition": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "api.ViewTransition.finished": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "api.ViewTransition.ready": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "api.ViewTransition.skipTransition": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "api.ViewTransition.updateCallbackDone": { baseline: "low", baseline_low_date: "2025-10-14",
    support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "api.Window.pagereveal_event": { baseline: false, support: { chrome: "123", chrome_android: "123", edge: "123", safari: "18.2", safari_ios: "18.2" } }, "api.Window.pageswap_event": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "css.properties.view-transition-name": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "css.properties.view-transition-name.match-element": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "144", firefox_android: "144", safari: "18.4", safari_ios: "18.4" } }, "css.properties.view-transition-name.none": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "\
111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "css.selectors.view-transition": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "css.selectors.view-transition-group": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "css.selectors.view-transition-image-pair": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } }, "css.selectors.view-transition-new": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "144", firefox_android: "144", safari: "\
18", safari_ios: "18" } }, "css.selectors.view-transition-old": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } } }, support: { chrome: "111", chrome_android: "111", edge: "111", firefox: "144", firefox_android: "144", safari: "18", safari_ios: "18" } } }, "view-transitions-element-scoped": { description: "The startViewTransition() method of an Element object starts a view transition that affects only that element's DOM tree. The contain: view-transition CSS declaration contains the layout of the tree to be transitioned. You can use this to run separate elements' transitions concurrently.", description_html: "The <code>startViewTransition()</code> method of an <code>Element</code> object starts a view transition that affects only that element's DOM tree. The <code>contain: view-transition</code> CSS declaration contains the layout of the tree to be \
transitioned. You can use this to run separate elements' transitions concurrently.", group: ["view-transitions"], kind: "feature", name: "Element-scoped view transitions", spec: ["https://github.com/WICG/view-transitions/blob/main/scoped-transitions.md"], status: { baseline: false, support: {} } }, "viewport-segments": { compat_features: ["api.Viewport", "api.Viewport.segments", "api.Window.viewport", "css.at-rules.media.horizontal-viewport-segments", "css.at-rules.media.vertical-viewport-segments", "css.types.env.viewport-segment-bottom", "css.types.env.viewport-segment-height", "css.types.env.viewport-segment-left", "css.types.env.viewport-segment-right", "css.types.env.viewport-segment-top", "css.types.env.viewport-segment-width"], description: "The viewport segment CSS environment variables and media features, and the viewport.segments API, allow you to adapt your layout to devices where the display is split, such as on foldable devices.", description_html: "The viewport segment CS\
S environment variables and media features, and the <code>viewport.segments</code> API, allow you to adapt your layout to devices where the display is split, such as on foldable devices.", kind: "feature", name: "Viewport segments", spec: ["https://drafts.csswg.org/css-env-1/#viewport-segments", "https://drafts.csswg.org/css-viewport/#segments", "https://drafts.csswg.org/mediaqueries-5/#mf-horizontal-viewport-segments", "https://drafts.csswg.org/mediaqueries-5/#mf-vertical-viewport-segments"], status: { baseline: false, by_compat_key: { "api.Viewport": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.Viewport.segments": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.Window.viewport": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.at-rules.media.horizontal-viewport-segments": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "c\
ss.at-rules.media.vertical-viewport-segments": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.types.env.viewport-segment-bottom": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.types.env.viewport-segment-height": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.types.env.viewport-segment-left": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.types.env.viewport-segment-right": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.types.env.viewport-segment-top": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "css.types.env.viewport-segment-width": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } } }, support: { chrome: "138", chrome_android: "138", edge: "138" } } }, "viewport-unit-variants": { caniuse: ["viewport-u\
nit-variants"], compat_features: ["css.types.length.vb", "css.types.length.vi", "css.types.length.viewport_percentage_units_dynamic", "css.types.length.viewport_percentage_units_large", "css.types.length.viewport_percentage_units_small"], description: "The sv*, lv*, and dv* CSS viewport units are relative to the smallest, largest, and current (dynamic) viewport size. They are used to size elements in relation to the viewport's dimensions.", description_html: "The <code>sv*</code>, <code>lv*</code>, and <code>dv*</code> CSS viewport units are relative to the smallest, largest, and current (dynamic) viewport size. They are used to size elements in relation to the viewport's dimensions.", kind: "feature", name: "Small, large, and dynamic viewport units", spec: ["https://drafts.csswg.org/css-values-4/#viewport-variants", "https://drafts.csswg.org/css-values-4/#viewport-relative-lengths"], status: { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", by_compat_key: {
    "css.types.length.vb": { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "101", firefox_android: "101", safari: "15.4", safari_ios: "15.4" } }, "css.types.length.vi": { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "101", firefox_android: "101", safari: "15.4", safari_ios: "15.4" } }, "css.types.length.viewport_percentage_units_dynamic": { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "101", firefox_android: "101", safari: "15.4", safari_ios: "15.4" } }, "css.types.length.viewport_percentage_units_large": { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "\
101", firefox_android: "101", safari: "15.4", safari_ios: "15.4" } }, "css.types.length.viewport_percentage_units_small": { baseline: "high", baseline_high_date: "2025-06-05", baseline_low_date: "2022-12-05", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "101", firefox_android: "101", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "101", firefox_android: "101", safari: "15.4", safari_ios: "15.4" } } }, "viewport-units": { caniuse: ["viewport-units"], compat_features: ["css.types.length.vh", "css.types.length.vmax", "css.types.length.vmin", "css.types.length.vw"], description: "The vw, vh, vmin, and vmax CSS viewport units are relative to the size of the viewport, and are used to size elements in relation to the viewport's dimensions.", description_html: "The <code>vw</code>, <code>vh</code>, <code>vmin</code>, and <code>vmax</code> CSS viewport units are relative to the size of the viewport, and \
are used to size elements in relation to the viewport's dimensions.", group: ["units"], kind: "feature", name: "Viewport units", spec: ["https://drafts.csswg.org/css-values-4/#viewport-relative-lengths"], status: { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", by_compat_key: { "css.types.length.vh": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "19", firefox_android: "19", safari: "6", safari_ios: "6" } }, "css.types.length.vmax": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "26", chrome_android: "26", edge: "16", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } }, "css.types.length.vmin": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "19", firefox_android: "\
19", safari: "7", safari_ios: "7" } }, "css.types.length.vw": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "19", firefox_android: "19", safari: "6", safari_ios: "6" } } }, support: { chrome: "26", chrome_android: "26", edge: "16", firefox: "19", firefox_android: "19", safari: "7", safari_ios: "7" } } }, "virtual-keyboard": { compat_features: ["api.HTMLElement.virtualKeyboardPolicy", "api.Navigator.virtualKeyboard", "api.VirtualKeyboard", "api.VirtualKeyboard.boundingRect", "api.VirtualKeyboard.geometrychange_event", "api.VirtualKeyboard.hide", "api.VirtualKeyboard.overlaysContent", "api.VirtualKeyboard.show", "html.global_attributes.virtualkeyboardpolicy"], description: "The navigator.virtualKeyboard API inspects and controls on-screen virtual keyboards. You can use it to programmatically hide or show a virtual keyboard or respond to the keyboard disappearing or appearing.", description_html: "\
The <code>navigator.virtualKeyboard</code> API inspects and controls on-screen virtual keyboards. You can use it to programmatically hide or show a virtual keyboard or respond to the keyboard disappearing or appearing.", kind: "feature", name: "Virtual keyboard", spec: ["https://w3c.github.io/virtual-keyboard/"], status: { baseline: false, by_compat_key: { "api.HTMLElement.virtualKeyboardPolicy": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.Navigator.virtualKeyboard": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.VirtualKeyboard": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.VirtualKeyboard.boundingRect": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.VirtualKeyboard.geometrychange_event": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.VirtualKeyboard.hide": { baseline: false, support: {
    chrome: "94", chrome_android: "94", edge: "94" } }, "api.VirtualKeyboard.overlaysContent": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "api.VirtualKeyboard.show": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } }, "html.global_attributes.virtualkeyboardpolicy": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94" } } }, support: { chrome: "94", chrome_android: "94", edge: "94" } } }, "virtual-pressure-sources": { compat_features: ["webdriver.classic.CreateVirtualPressureSource", "webdriver.classic.DeleteVirtualPressureSource", "webdriver.classic.UpdateVirtualPressureSource"], description: "The CreateVirtualPressureSource WebDriver command creates artificial sources of compute pressure for testing without the need real device sources of compute pressure.", description_html: "The <code>CreateVirtualPressureSource</code> WebDriver command creates artificial sources of compute pressure for test\
ing without the need real device sources of compute pressure.", group: ["compute-pressure", "webdriver"], kind: "feature", name: "Virtual pressure sources", spec: ["https://w3c.github.io/compute-pressure/"], status: { baseline: false, by_compat_key: { "webdriver.classic.CreateVirtualPressureSource": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "webdriver.classic.DeleteVirtualPressureSource": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } }, "webdriver.classic.UpdateVirtualPressureSource": { baseline: false, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, support: { chrome: "129", chrome_android: "129", edge: "129" } } }, "virtual-sensors": { compat_features: ["webdriver.classic.CreateVirtualSensor", "webdriver.classic.DeleteVirtualSensor", "webdriver.classic.GetVirtualSensorInformation", "webdriver.classic.UpdateVirtualSensorReading"], description: "The CreateVirtualSensor WebDriver command c\
reates a virtual sensor for testing applications that use sensor APIs, without the need for real device sensors.", description_html: "The <code>CreateVirtualSensor</code> WebDriver command creates a virtual sensor for testing applications that use sensor APIs, without the need for real device sensors.", group: ["sensors", "webdriver"], kind: "feature", name: "Virtual sensors", spec: ["https://w3c.github.io/sensors/#automation"], status: { baseline: false, by_compat_key: { "webdriver.classic.CreateVirtualSensor": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120" } }, "webdriver.classic.DeleteVirtualSensor": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120" } }, "webdriver.classic.GetVirtualSensorInformation": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120" } }, "webdriver.classic.UpdateVirtualSensorReading": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120" } } }, support: {
    chrome: "120", chrome_android: "120", edge: "120" } } }, visibility: { compat_features: ["css.properties.visibility", "css.properties.visibility.collapse", "css.properties.visibility.hidden", "css.properties.visibility.visible"], description: "The visibility CSS property sets whether an element is shown. Invisible elements still affect the document layout.", description_html: "The <code>visibility</code> CSS property sets whether an element is shown. Invisible elements still affect the document layout.", group: ["css"], kind: "feature", name: "visibility", spec: ["https://drafts.csswg.org/css-display-3/#visibility"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.visibility": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties\
.visibility.collapse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "css.properties.visibility.hidden": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.visibility.visible": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } } }, "visual-viewport": { compat_features: ["api.VisualViewport", "api.VisualViewport.height", "api.VisualViewport.offsetLeft", "\
api.VisualViewport.offsetTop", "api.VisualViewport.pageLeft", "api.VisualViewport.pageTop", "api.VisualViewport.resize_event", "api.VisualViewport.scale", "api.VisualViewport.scroll_event", "api.VisualViewport.scrollend_event", "api.VisualViewport.width", "api.Window.visualViewport"], description: "The visualViewport API provides a way to query and modify the user-visible viewport of a web page.", description_html: "The <code>visualViewport</code> API provides a way to query and modify the user-visible viewport of a web page.", kind: "feature", name: "Visual viewport API", spec: ["https://drafts.csswg.org/cssom-view-1/#visualViewport"], status: { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", by_compat_key: { "api.VisualViewport": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "\
api.VisualViewport.height": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.VisualViewport.offsetLeft": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.VisualViewport.offsetTop": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.VisualViewport.pageLeft": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } },
    "api.VisualViewport.pageTop": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.VisualViewport.resize_event": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.VisualViewport.scale": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.VisualViewport.scroll_event": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "62", chrome_android: "62", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "\
13" } }, "api.VisualViewport.scrollend_event": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126", firefox: "150", firefox_android: "150" } }, "api.VisualViewport.width": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } }, "api.Window.visualViewport": { baseline: "high", baseline_high_date: "2024-02-10", baseline_low_date: "2021-08-10", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } } }, support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "91", firefox_android: "68", safari: "13", safari_ios: "13" } } }, wasm: { caniuse: ["wasm"], compat_features: ["webassembly.api", "webassembly.api.CompileError", "webassembly.api.CompileError.CompileError", "webassembly.api.Global", "webassembly.api.Global.Glo\
bal", "webassembly.api.Global.value", "webassembly.api.Global.valueOf", "webassembly.api.Instance", "webassembly.api.Instance.Instance", "webassembly.api.Instance.exports", "webassembly.api.LinkError", "webassembly.api.LinkError.LinkError", "webassembly.api.Memory", "webassembly.api.Memory.Memory", "webassembly.api.Memory.buffer", "webassembly.api.Memory.grow", "webassembly.api.Module", "webassembly.api.Module.Module", "webassembly.api.Module.customSections_static", "webassembly.api.Module.exports_static", "webassembly.api.Module.imports_static", "webassembly.api.RuntimeError", "webassembly.api.RuntimeError.RuntimeError", "webassembly.api.Table", "webassembly.api.Table.Table", "webassembly.api.Table.get", "webassembly.api.Table.grow", "webassembly.api.Table.length", "webassembly.api.Table.set", "webassembly.api.compileStreaming_static", "webassembly.api.compile_static", "webassembly.api.instantiateStreaming_static", "webassembly.api.instantiate_static", "webassembly.api.validate_static"],
    description: "The WebAssembly.instantiate() and WebAssembly.instantiateStreaming() global static methods load WebAssembly code (also known as Wasm), a portable binary instruction format.", description_html: "The <code>WebAssembly.instantiate()</code> and <code>WebAssembly.instantiateStreaming()</code> global static methods load WebAssembly code (also known as Wasm), a portable binary instruction format.", group: ["webassembly"], kind: "feature", name: "WebAssembly", spec: ["https://webassembly.github.io/gc/core/bikeshed/"], status: { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", by_compat_key: { "webassembly.api": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.CompileError": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-1\
7", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.CompileError.CompileError": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Global": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } }, "webassembly.api.Global.Global": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } }, "webassembly.api.Global.value": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "\
2020-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } }, "webassembly.api.Global.valueOf": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } }, "webassembly.api.Instance": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Instance.Instance": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Instance.exports": { baseline: "high", baseline_high_date: "2020-04-17",
    baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.LinkError": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.LinkError.LinkError": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Memory": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Memory.Memory": { baseline: "high", baseline_high_date: "20\
20-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Memory.buffer": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Memory.grow": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Module": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Module.Module": { baseline: "high", baseline_high_date: "\
2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Module.customSections_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Module.exports_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Module.imports_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.RuntimeError": {
    baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.RuntimeError.RuntimeError": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Table": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Table.Table": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.\
Table.get": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Table.grow": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Table.length": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.Table.set": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.\
compileStreaming_static": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "60", chrome_android: "60", edge: "16", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15" } }, "webassembly.api.compile_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } }, "webassembly.api.instantiateStreaming_static": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "60", chrome_android: "60", edge: "16", firefox: "58", firefox_android: "58", safari: "15", safari_ios: "15" } }, "webassembly.api.instantiate_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11",
    safari_ios: "11" } }, "webassembly.api.validate_static": { baseline: "high", baseline_high_date: "2020-04-17", baseline_low_date: "2017-10-17", support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } } }, support: { chrome: "57", chrome_android: "57", edge: "16", firefox: "52", firefox_android: "52", safari: "11", safari_ios: "11" } } }, "wasm-bigint": { caniuse: ["wasm-bigint"], compat_features: ["webassembly.BigInt-to-i64-integration"], description: "Integer values pass bidirectionally between JavaScript and WebAssembly, converted to i64 values in WebAssembly or BigInt values in JavaScript.", description_html: "Integer values pass bidirectionally between JavaScript and WebAssembly, converted to i64 values in WebAssembly or BigInt values in JavaScript.", group: ["webassembly"], kind: "feature", name: "BigInt to i64 conversion (WebAssembly)", spec: ["https://webassembly.github.io/spec/js-api/#ref-for-syntax-n\
umtype①⓪"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "webassembly.BigInt-to-i64-integration": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "78", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, "wasm-branch-hinting": { compat_features: ["webassembly.branch-hinting"], description: "Branch hints in WebAssembly allows a browser to optimize performance when a branch is a likely to take a specific path.", description_html: "Branch hints in WebAssembly allows a browser to optimize performance when a branch is a likely to take a specific path.", group: ["webassembly"], kind: "feature", name: "Branch hinting (WebAssembly)", spec: ["https://github.com/WebAssemb\
ly/branch-hinting/blob/main/proposals/branch-hinting/Overview.md"], status: { baseline: false, by_compat_key: { "webassembly.branch-hinting": { baseline: false, support: { chrome: "137", chrome_android: "137", edge: "137", safari: "16", safari_ios: "16" } } }, support: { chrome: "137", chrome_android: "137", edge: "137", safari: "16", safari_ios: "16" } } }, "wasm-bulk-memory": { caniuse: ["wasm-bulk-memory"], compat_features: ["webassembly.bulk-memory-operations"], description: "Bulk memory operations, such as copy and init, mirror the efficiency of native memcpy and memmove operations.", description_html: "Bulk memory operations, such as <code>copy</code> and <code>init</code>, mirror the efficiency of native <code>memcpy</code> and <code>memmove</code> operations.", group: ["webassembly"], kind: "feature", name: "Bulk memory operations (WebAssembly)", spec: ["https://github.com/WebAssembly/spec/blob/main/proposals/bulk-memory-operations/Overview.md"], status: { baseline: "high", baseline_high_date: "\
2024-04-25", baseline_low_date: "2021-10-25", by_compat_key: { "webassembly.bulk-memory-operations": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "78", firefox_android: "79", safari: "15.1", safari_ios: "15.1" } } }, support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "78", firefox_android: "79", safari: "15.1", safari_ios: "15.1" } } }, "wasm-exception-handling": { compat_features: ["webassembly.api.Exception", "webassembly.api.Exception.Exception", "webassembly.api.Exception.Exception.options_parameter_traceStack", "webassembly.api.Exception.getArg", "webassembly.api.Exception.is", "webassembly.api.Exception.stack", "webassembly.api.Tag", "webassembly.api.Tag.Tag", "webassembly.api.Tag.type", "webassembly.exception-handling"], description: "Exceptions break the normal control flow of execution to represent exceptional behavior, such as an error. You can respon\
d to the exception in JavaScript code.", description_html: "Exceptions break the normal control flow of execution to represent exceptional behavior, such as an error. You can respond to the exception in JavaScript code.", group: ["webassembly"], kind: "feature", name: "Exception handling (WebAssembly)", spec: ["https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/legacy/Exceptions.md"], status: { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", by_compat_key: { "webassembly.api.Exception": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Exception.Exception": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "\
100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Exception.Exception.options_parameter_traceStack": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Exception.getArg": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Exception.is": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Exception.stack": { baseline: false, support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "\
100" } }, "webassembly.api.Tag": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Tag.Tag": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } }, "webassembly.api.Tag.type": { baseline: false, support: { safari: "15.2", safari_ios: "15.2" } }, "webassembly.exception-handling": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "15.2" } } }, support: { chrome: "95", chrome_android: "95", edge: "95", firefox: "100", firefox_android: "100", safari: "15.2", safari_ios: "\
15.2" } } }, "wasm-exnref-exceptions": { compat_features: ["webassembly.exceptionsFinal"], description: "When caught, an exception is reified into an exception reference, a value of the new type exnref.", description_html: "When caught, an exception is reified into an exception reference, a value of the new type <code>exnref</code>.", group: ["webassembly"], kind: "feature", name: "Exception references with exnref (WebAssembly)", spec: ["https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md"], status: { baseline: false, by_compat_key: { "webassembly.exceptionsFinal": { baseline: false, support: { chrome: "137", chrome_android: "137", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } } }, support: { chrome: "137", chrome_android: "137", firefox: "131", firefox_android: "131", safari: "18.4", safari_ios: "18.4" } } }, "wasm-extended-constant-expressions": { compat_features: ["webassembly.extended-constant-express\
ions"], description: "The i32.add, i32.sub, i32.mul, i64.add, i64.sub, and i64.mul operations extend constant expressions to include arithmetic.", description_html: "The <code>i32.add</code>, <code>i32.sub</code>, <code>i32.mul</code>, <code>i64.add</code>, <code>i64.sub</code>, and <code>i64.mul</code> operations extend constant expressions to include arithmetic.", group: ["webassembly"], kind: "feature", name: "Extended constant expressions (WebAssembly)", spec: ["https://github.com/WebAssembly/extended-const/blob/main/proposals/extended-const/Overview.md"], status: { baseline: "low", baseline_low_date: "2024-03-05", by_compat_key: { "webassembly.extended-constant-expressions": { baseline: "low", baseline_low_date: "2024-03-05", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "112", firefox_android: "112", safari: "17.4", safari_ios: "17.4" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "112", firefox_android: "112", safari: "17.4",
    safari_ios: "17.4" } } }, "wasm-garbage-collection": { compat_features: ["webassembly.garbage-collection"], description: "Garbage collection tracks references for better memory management with garbage-collected languages running in WebAssmbly.", description_html: "Garbage collection tracks references for better memory management with garbage-collected languages running in WebAssmbly.", group: ["webassembly"], kind: "feature", name: "Garbage collection (WebAssembly)", spec: ["https://webassembly.github.io/gc/core/bikeshed/#garbage-collection①"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "webassembly.garbage-collection": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "120", firefox_android: "120", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "120", firefox_android: "120", safari: "18.2", safari_ios: "18.2" } } },
    "wasm-jspi": { compat_features: ["webassembly.jspi"], description: "The JavaScript promise integration (JSPI) suspends a WebAssembly module when it calls a JavaScript method that returns a promise. The module resumes when the promise is resolved. You can use this to call asynchronous Web APIs from synchronous WebAssembly.", description_html: "The JavaScript promise integration (JSPI) suspends a WebAssembly module when it calls a JavaScript method that returns a promise. The module resumes when the promise is resolved. You can use this to call asynchronous Web APIs from synchronous WebAssembly.", group: ["webassembly"], kind: "feature", name: "JavaScript promise integration (WebAssembly)", spec: ["https://github.com/WebAssembly/js-promise-integration/blob/main/proposals/js-promise-integration/Overview.md"], status: { baseline: false, by_compat_key: { "webassembly.jspi": { baseline: false, support: { chrome: "137", edge: "137" } } }, support: { chrome: "137", edge: "137" } } }, "wasm\
-memory64": { compat_features: ["webassembly.memory64"], description: "Instructions accept 64-bit memory indexes.", description_html: "Instructions accept 64-bit memory indexes.", group: ["webassembly"], kind: "feature", name: "Memory64 (WebAssembly)", spec: ["https://github.com/WebAssembly/memory64/blob/main/proposals/memory64/Overview.md"], status: { baseline: false, by_compat_key: { "webassembly.memory64": { baseline: false, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "134", firefox_android: "134" } } }, support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "134", firefox_android: "134" } } }, "wasm-multi-memory": { compat_features: ["webassembly.multiMemory"], description: "A single module in WebAssembly can have multiple memories.", description_html: "A single module in WebAssembly can have multiple memories.", group: ["webassembly"], kind: "feature", name: "Multi-memory (WebAssembly)", spec: ["https://github.com/WebAssembly/multi-memory\
/blob/main/proposals/multi-memory/Overview.md"], status: { baseline: false, by_compat_key: { "webassembly.multiMemory": { baseline: false, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "125", firefox_android: "125" } } }, support: { chrome: "120", chrome_android: "120", edge: "120", firefox: "125", firefox_android: "125" } } }, "wasm-multi-value": { caniuse: ["wasm-multi-value"], compat_features: ["webassembly.multi-value"], description: "Instructions and blocks can produce multiple result values.", description_html: "Instructions and blocks can produce multiple result values.", group: ["webassembly"], kind: "feature", name: "Multi-value (WebAssembly)", spec: ["https://github.com/WebAssembly/spec/blob/main/proposals/multi-value/Overview.md"], status: { baseline: "high", baseline_high_date: "2023-04-20", baseline_low_date: "2020-10-20", by_compat_key: { "webassembly.multi-value": { baseline: "high", baseline_high_date: "2023-04-20", baseline_low_date: "2020-10-2\
0", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "78", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "78", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } } }, "wasm-mutable-globals": { caniuse: ["wasm-mutable-globals"], compat_features: ["webassembly.mutable-globals"], description: "Mutable global variables are importable and exportable.", description_html: "Mutable global variables are importable and exportable.", group: ["webassembly"], kind: "feature", name: "Import and export of mutable globals (WebAssembly)", spec: ["https://webassembly.github.io/spec/js-api/#dom-globaldescriptor-mutable"], status: { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", by_compat_key: { "webassembly.mutable-globals": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "69", chrome_android: "69",
    edge: "79", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "62", firefox_android: "62", safari: "13.1", safari_ios: "13.4" } } }, "wasm-non-trapping-float-to-int": { caniuse: ["wasm-nontrapping-fptoint"], compat_features: ["webassembly.non-trapping-float-to-int-conversions"], description: "Saturating floating-point to integer conversion operators return the maximum or minimum integer value on overflow instead of trapping.", description_html: "Saturating floating-point to integer conversion operators return the maximum or minimum integer value on overflow instead of trapping.", group: ["webassembly"], kind: "feature", name: "Non-trapping float-to-int conversion (WebAssembly)", spec: ["https://github.com/WebAssembly/spec/blob/main/proposals/nontrapping-float-to-int-conversion/Overview.md"], status: { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", by_compat_key: {
    "webassembly.non-trapping-float-to-int-conversions": { baseline: "high", baseline_high_date: "2024-04-25", baseline_low_date: "2021-10-25", support: { chrome: "75", chrome_android: "75", edge: "18", firefox: "64", firefox_android: "64", safari: "15.1", safari_ios: "15.1" } } }, support: { chrome: "75", chrome_android: "75", edge: "18", firefox: "64", firefox_android: "64", safari: "15.1", safari_ios: "15.1" } } }, "wasm-reference-types": { caniuse: ["wasm-reference-types"], compat_features: ["webassembly.reference-types"], description: "The externref type can be both a value type and a table element type, while funcref can be a value type.", description_html: "The <code>externref</code> type can be both a value type and a table element type, while <code>funcref</code> can be a value type.", group: ["webassembly"], kind: "feature", name: "Reference types (WebAssembly)", spec: ["https://github.com/WebAssembly/spec/blob/main/proposals/reference-types/Overview.md"], status: { baseline: "\
high", baseline_high_date: "2024-05-19", baseline_low_date: "2021-11-19", by_compat_key: { "webassembly.reference-types": { baseline: "high", baseline_high_date: "2024-05-19", baseline_low_date: "2021-11-19", support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "79", firefox_android: "79", safari: "15.1", safari_ios: "15.1" } } }, support: { chrome: "96", chrome_android: "96", edge: "96", firefox: "79", firefox_android: "79", safari: "15.1", safari_ios: "15.1" } } }, "wasm-sign-extension-operators": { caniuse: ["wasm-signext"], compat_features: ["webassembly.sign-extension-operations"], description: "Sign-extension operator instructions extend the width of 8-bit, 16-bit, and 32-bit values to 32-bit and 64-bit values.", description_html: "Sign-extension operator instructions extend the width of 8-bit, 16-bit, and 32-bit values to 32-bit and 64-bit values.", group: ["webassembly"], kind: "feature", name: "Sign extension operators (WebAssembly)", spec: ["https://github.com/\
WebAssembly/spec/blob/main/proposals/sign-extension-ops/Overview.md"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "webassembly.sign-extension-operations": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "69", chrome_android: "69", edge: "18", firefox: "62", firefox_android: "62", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "69", chrome_android: "69", edge: "18", firefox: "62", firefox_android: "62", safari: "14.1", safari_ios: "14.5" } } }, "wasm-simd": { caniuse: ["wasm-simd"], compat_features: ["webassembly.fixed-width-SIMD"], description: "128-bit SIMD (Single Instruction Multiple Data) performs one instruction on multiple units of data, when running on hardware that supports such instructions. Also known as vector instructions.", description_html: "128-bit SIMD (Single Instruction Multiple Data) performs one instruction on multiple units of\
 data, when running on hardware that supports such instructions. Also known as vector instructions.", group: ["webassembly"], kind: "feature", name: "Fixed-width SIMD (WebAssembly)", spec: ["https://webassembly.github.io/spec/core/bikeshed/#vector-instructions"], status: { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", by_compat_key: { "webassembly.fixed-width-SIMD": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "89", firefox_android: "89", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "89", firefox_android: "89", safari: "16.4", safari_ios: "16.4" } } }, "wasm-simd-relaxed": { compat_features: ["webassembly.relaxed-SIMD"], description: "Relaxed SIMD (Single Instruction Multiple Data) introduces local non-determinism, where the results of the instructions may vary based on hardw\
are support.", description_html: "Relaxed SIMD (Single Instruction Multiple Data) introduces local non-determinism, where the results of the instructions may vary based on hardware support.", group: ["webassembly"], kind: "feature", name: "Relaxed-width SIMD (WebAssembly)", spec: ["https://github.com/WebAssembly/relaxed-simd/blob/main/proposals/relaxed-simd/Overview.md"], status: { baseline: false, by_compat_key: { "webassembly.relaxed-SIMD": { baseline: false, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "146", firefox_android: "146" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "146", firefox_android: "146" } } }, "wasm-string-builtins": { compat_features: ["webassembly.api.Module.Module.compile_options", "webassembly.api.compileStreaming_static.compile_options", "webassembly.api.compile_static.compile_options", "webassembly.api.instantiateStreaming_static.compile_options", "webassembly.api.instantiate_static.compile_options",
    "webassembly.api.validate_static.compile_options", "webassembly.jsStringBuiltins"], description: "The WebAssembly builtin string functions mirror a subset of the JavaScript String API and adapt it to be efficiently callable without JavaScript glue code.", description_html: "The WebAssembly builtin string functions mirror a subset of the JavaScript <code>String</code> API and adapt it to be efficiently callable without JavaScript glue code.", group: ["webassembly"], kind: "feature", name: "String builtins (WebAssembly)", spec: ["https://github.com/WebAssembly/js-string-builtins/blob/main/proposals/js-string-builtins/Overview.md"], status: { baseline: false, by_compat_key: { "webassembly.api.Module.Module.compile_options": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134" } }, "webassembly.api.compileStreaming_static.compile_options": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "\
134", firefox_android: "134" } }, "webassembly.api.compile_static.compile_options": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134" } }, "webassembly.api.instantiateStreaming_static.compile_options": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134" } }, "webassembly.api.instantiate_static.compile_options": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134" } }, "webassembly.api.validate_static.compile_options": { baseline: false, support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134" } }, "webassembly.jsStringBuiltins": { baseline: "low", baseline_low_date: "2025-12-12", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134", safari: "26.2", safari_ios: "26.2" } } }, support: { chrome: "\
130", chrome_android: "130", edge: "130", firefox: "134", firefox_android: "134" } } }, "wasm-tail-call-optimization": { compat_features: ["webassembly.tail-calls"], description: "Tail call optimization discards a caller frame and replaces the call with a jump instruction.", description_html: "Tail call optimization discards a caller frame and replaces the call with a jump instruction.", group: ["webassembly"], kind: "feature", name: "Tail call optimization (WebAssembly)", spec: ["https://github.com/WebAssembly/tail-call/blob/main/proposals/tail-call/Overview.md"], status: { baseline: "low", baseline_low_date: "2024-12-11", by_compat_key: { "webassembly.tail-calls": { baseline: "low", baseline_low_date: "2024-12-11", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "121", firefox_android: "121", safari: "18.2", safari_ios: "18.2" } } }, support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "121", firefox_android: "121", safari: "18.2", safari_ios: "\
18.2" } } }, "wasm-threads": { caniuse: ["wasm-threads"], compat_features: ["webassembly.api.Memory.Memory.shared", "webassembly.threads-and-atomics"], description: "Threads in WebAssembly run code in parallel, while atomic memory instructions can guarantee that no two threads can read or write to shared memory at the same time.", description_html: "Threads in WebAssembly run code in parallel, while atomic memory instructions can guarantee that no two threads can read or write to shared memory at the same time.", group: ["webassembly"], kind: "feature", name: "Threads and atomics (WebAssembly)", spec: ["https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md"], status: { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", by_compat_key: { "webassembly.api.Memory.Memory.shared": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "74", chrome_android: "88", edge: "79", firefox: "\
78", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } }, "webassembly.threads-and-atomics": { baseline: "high", baseline_high_date: "2024-06-13", baseline_low_date: "2021-12-13", support: { chrome: "74", chrome_android: "88", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } } }, support: { chrome: "74", chrome_android: "88", edge: "79", firefox: "79", firefox_android: "79", safari: "15.2", safari_ios: "15.2" } } }, "wasm-typed-fun-refs": { compat_features: ["webassembly.typedFunctionReferences"], description: "A typed function reference can be called directly.", description_html: "A typed function reference can be called directly.", group: ["webassembly"], kind: "feature", name: "Typed function references (WebAssembly)", spec: ["https://github.com/WebAssembly/function-references/blob/main/proposals/function-references/Overview.md"], status: { baseline: "low", baseline_low_date: "2024-09-16", by_compat_key: { "webassembly.typedFunctionRef\
erences": { baseline: "low", baseline_low_date: "2024-09-16", support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "120", firefox_android: "120", safari: "18", safari_ios: "18" } } }, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "120", firefox_android: "120", safari: "18", safari_ios: "18" } } }, wbr: { caniuse: ["wbr-element"], compat_features: ["html.elements.wbr"], description: "The <wbr> HTML element represents a word break opportunity, to explicitly mark a place within a word where a line might be broken.", description_html: "The <code>&#x3C;wbr></code> HTML element represents a word break opportunity, to explicitly mark a place within a word where a line might be broken.", group: ["html-elements"], kind: "feature", name: "<wbr>", spec: ["https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-wbr-element"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "html.\
elements.wbr": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "4", safari_ios: "3.2" } } }, "weak-references": { compat_features: ["javascript.builtins.FinalizationRegistry", "javascript.builtins.FinalizationRegistry.FinalizationRegistry", "javascript.builtins.FinalizationRegistry.register", "javascript.builtins.FinalizationRegistry.register.symbol_as_target", "javascript.builtins.FinalizationRegistry.unregister", "javascript.builtins.FinalizationRegistry.unregister.symbol_as_target", "javascript.builtins.WeakRef", "javascript.builtins.WeakRef.WeakRef", "javascript.builtins.WeakRef.WeakRef.symbol_as_target", "javascript.builtins.WeakRef.deref"], description: "The WeakRef and FinalizationRegistry objects hold referenc\
es to garbage-collectable objects without creating strong references that prevent their garbage collection.", description_html: "The <code>WeakRef</code> and <code>FinalizationRegistry</code> objects hold references to garbage-collectable objects without creating strong references that prevent their garbage collection.", group: ["javascript"], kind: "feature", name: "Weak references", snapshot: ["ecmascript-2021"], spec: ["https://tc39.es/ecma262/multipage/managing-memory.html#sec-managing-memory"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "javascript.builtins.FinalizationRegistry": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.FinalizationRegistry.FinalizationRegistry": { baseline: "high", baseline_high_date: "2023-10-2\
6", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.FinalizationRegistry.register": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.FinalizationRegistry.register.symbol_as_target": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "146", firefox_android: "146", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.FinalizationRegistry.unregister": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javas\
cript.builtins.FinalizationRegistry.unregister.symbol_as_target": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.WeakRef": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.WeakRef.WeakRef": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "javascript.builtins.WeakRef.WeakRef.symbol_as_target": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "146", firefox_android: "146", safari: "16.4", safari_ios: "16.4" } }, "javascript.builtins.WeakRef.deref": { baseline: "\
high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "79", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } } }, weakmap: { compat_features: ["javascript.builtins.WeakMap", "javascript.builtins.WeakMap.WeakMap", "javascript.builtins.WeakMap.WeakMap.iterable_allowed", "javascript.builtins.WeakMap.WeakMap.null_allowed", "javascript.builtins.WeakMap.delete", "javascript.builtins.WeakMap.get", "javascript.builtins.WeakMap.has", "javascript.builtins.WeakMap.set", "javascript.builtins.WeakMap.symbol_as_keys"], description: "A WeakMap object holds key-value pairs that do not create strong references to its keys, such that value data can be associated with a key without preventing garbage collection of the key.", description_html: "A <code>WeakMap</code> obje\
ct holds key-value pairs that do not create strong references to its keys, such that value data can be associated with a key without preventing garbage collection of the key.", group: ["collections"], kind: "feature", name: "WeakMap", spec: ["https://tc39.es/ecma262/multipage/keyed-collections.html#sec-weakmap-objects"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "javascript.builtins.WeakMap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } }, "javascript.builtins.WeakMap.WeakMap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } }, "javascript.builtins.WeakMap.WeakMap.iterable_allowed": { baseline: "\
high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "36", firefox_android: "36", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakMap.WeakMap.null_allowed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "37", firefox_android: "37", safari: "8", safari_ios: "8" } }, "javascript.builtins.WeakMap.delete": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } }, "javascript.builtins.WeakMap.get": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } }, "javascript.builtins\
.WeakMap.has": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } }, "javascript.builtins.WeakMap.set": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } }, "javascript.builtins.WeakMap.symbol_as_keys": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "146", firefox_android: "146", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "6", firefox_android: "6", safari: "8", safari_ios: "8" } } }, weakset: { compat_features: ["javascript.builtins.WeakSet", "javascript.builtins.WeakSet.WeakSet", "javascript.builtins.WeakSet.WeakSet.iterable_\
allowed", "javascript.builtins.WeakSet.WeakSet.null_allowed", "javascript.builtins.WeakSet.add", "javascript.builtins.WeakSet.delete", "javascript.builtins.WeakSet.has", "javascript.builtins.WeakSet.symbol_as_keys"], description: "A WeakSet object stores unique values of any type without creating strong references to the values, such that membership in the set does not prevent garbage collection of the value.", description_html: "A <code>WeakSet</code> object stores unique values of any type without creating strong references to the values, such that membership in the set does not prevent garbage collection of the value.", group: ["collections"], kind: "feature", name: "WeakSet", spec: ["https://tc39.es/ecma262/multipage/keyed-collections.html#sec-weakset-objects"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "javascript.builtins.WeakSet": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-0\
9-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.WeakSet": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.WeakSet.iterable_allowed": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.WeakSet.null_allowed": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "37", firefox_android: "37", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.add": { baseline: "high", baseline_high_date: "\
2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.delete": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.has": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "34", firefox_android: "34", safari: "9", safari_ios: "9" } }, "javascript.builtins.WeakSet.symbol_as_keys": { baseline: "low", baseline_low_date: "2025-12-09", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "146", firefox_android: "146", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "36", chrome_android: "36", edge: "12", firefox: "34",
    firefox_android: "34", safari: "9", safari_ios: "9" } } }, "web-animations": { caniuse: ["web-animation"], compat_features: ["api.Animation", "api.Animation.Animation", "api.Animation.cancel", "api.Animation.cancel_event", "api.Animation.commitStyles", "api.Animation.currentTime", "api.Animation.effect", "api.Animation.finish", "api.Animation.finish_event", "api.Animation.finished", "api.Animation.id", "api.Animation.pause", "api.Animation.pending", "api.Animation.persist", "api.Animation.play", "api.Animation.playState", "api.Animation.playbackRate", "api.Animation.ready", "api.Animation.remove_event", "api.Animation.remove_filling_animation", "api.Animation.replaceState", "api.Animation.reverse", "api.Animation.startTime", "api.Animation.timeline", "api.Animation.updatePlaybackRate", "api.AnimationEffect", "api.AnimationEffect.getComputedTiming", "api.AnimationEffect.getTiming", "api.AnimationEffect.updateTiming", "api.AnimationPlaybackEvent", "api.AnimationPlaybackEvent.Animatio\
nPlaybackEvent", "api.AnimationPlaybackEvent.currentTime", "api.AnimationPlaybackEvent.timelineTime", "api.AnimationTimeline", "api.AnimationTimeline.currentTime", "api.AnimationTimeline.duration", "api.Document.getAnimations", "api.Document.timeline", "api.DocumentTimeline", "api.DocumentTimeline.DocumentTimeline", "api.Element.animate", "api.Element.animate.implicit_tofrom", "api.Element.animate.options_composite_parameter", "api.Element.animate.options_id_parameter", "api.Element.animate.options_pseudoElement_parameter", "api.Element.animate.options_rangeEnd_parameter", "api.Element.animate.options_rangeStart_parameter", "api.Element.animate.options_timeline_parameter", "api.Element.animationcancel_event", "api.Element.animationend_event", "api.Element.animationiteration_event", "api.Element.animationstart_event", "api.Element.getAnimations", "api.KeyframeEffect", "api.KeyframeEffect.KeyframeEffect", "api.KeyframeEffect.composite", "api.KeyframeEffect.getKeyframes", "api.KeyframeEff\
ect.pseudoElement", "api.KeyframeEffect.setKeyframes", "api.KeyframeEffect.target", "api.ShadowRoot.getAnimations"], description: "The web animation API programmatically creates, inspects, and controls element animations, to change and synchronize appearance over time.", description_html: "The web animation API programmatically creates, inspects, and controls element animations, to change and synchronize appearance over time.", group: ["animation"], kind: "feature", name: "Web animations", spec: ["https://drafts.csswg.org/web-animations-1/"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "api.Animation": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.Animation": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "\
2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.cancel": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.cancel_event": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.commitStyles": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.currentTime": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "\
2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.effect": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.finish": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.finish_event": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.finished": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "\
2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.id": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.pause": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.pending": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "59", firefox_android: "59", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.persist": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28",
    support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.play": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.playState": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.playbackRate": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.ready": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27",
    support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.remove_event": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.remove_filling_animation": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.replaceState": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.reverse": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "\
2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.startTime": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.timeline": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Animation.updatePlaybackRate": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "60", firefox_android: "60", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationEffect": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "\
2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationEffect.getComputedTiming": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationEffect.getTiming": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationEffect.updateTiming": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationPlaybackEvent": { baseline: "high", baseline_high_date: "\
2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationPlaybackEvent.AnimationPlaybackEvent": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationPlaybackEvent.currentTime": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationPlaybackEvent.timelineTime": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.An\
imationTimeline": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationTimeline.currentTime": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.AnimationTimeline.duration": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.Document.getAnimations": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.Document.timeline": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "\
2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.DocumentTimeline": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.DocumentTimeline.DocumentTimeline": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.Element.animate": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Element.animate.implicit_tofrom": { baseline: false, support: { chrome: "84", chrome_android: "\
84", edge: "84", firefox: "75", firefox_android: "79" } }, "api.Element.animate.options_composite_parameter": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "16", safari_ios: "16" } }, "api.Element.animate.options_id_parameter": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "48", firefox_android: "48", safari: "13.1", safari_ios: "13.4" } }, "api.Element.animate.options_pseudoElement_parameter": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.Element.animate.options_rangeEnd_parameter": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "11\
5", safari: "26", safari_ios: "26" } }, "api.Element.animate.options_rangeStart_parameter": { baseline: false, support: { chrome: "115", chrome_android: "115", edge: "115", safari: "26", safari_ios: "26" } }, "api.Element.animate.options_timeline_parameter": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85", safari: "16", safari_ios: "16" } }, "api.Element.animationcancel_event": { baseline: false, support: { firefox: "54", firefox_android: "54", safari: "13.1", safari_ios: "13.4" } }, "api.Element.animationend_event": { baseline: "high", baseline_high_date: "2022-06-17", baseline_low_date: "2019-12-17", support: { chrome: "79", chrome_android: "79", edge: "18", firefox: "51", firefox_android: "51", safari: "9", safari_ios: "9" } }, "api.Element.animationiteration_event": { baseline: "high", baseline_high_date: "2022-06-17", baseline_low_date: "2019-12-17", support: { chrome: "79", chrome_android: "79", edge: "18", firefox: "51", firefox_android: "51", safari: "\
9", safari_ios: "9" } }, "api.Element.animationstart_event": { baseline: "high", baseline_high_date: "2022-06-17", baseline_low_date: "2019-12-17", support: { chrome: "79", chrome_android: "79", edge: "18", firefox: "51", firefox_android: "51", safari: "9", safari_ios: "9" } }, "api.Element.getAnimations": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.KeyframeEffect": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.KeyframeEffect.KeyframeEffect": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "\
13.1", safari_ios: "13.4" } }, "api.KeyframeEffect.composite": { baseline: "high", baseline_high_date: "2025-03-12", baseline_low_date: "2022-09-12", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "80", firefox_android: "80", safari: "16", safari_ios: "16" } }, "api.KeyframeEffect.getKeyframes": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.KeyframeEffect.pseudoElement": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } }, "api.KeyframeEffect.setKeyframes": { baseline: "high", baseline_high_date: "2023-01-27", baseline_low_date: "2020-07-27", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "63", firefox_android: "\
63", safari: "13.1", safari_ios: "13.4" } }, "api.KeyframeEffect.target": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "63", firefox_android: "63", safari: "13.1", safari_ios: "13.4" } }, "api.ShadowRoot.getAnimations": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } } }, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "75", firefox_android: "79", safari: "14", safari_ios: "14" } } }, "web-animations-iterationcomposite": { compat_features: ["api.Element.animate.options_iterationComposite_parameter", "api.KeyframeEffect.iterationComposite"], description: `The iterationComposite property of a KeyframeEffect object sets whether an animation's iterations are calculated independently ("replace") o\
r are accumulated with the value of the previous iteration ("accumulate").`, description_html: `The <code>iterationComposite</code> property of a <code>KeyframeEffect</code> object sets whether an animation's iterations are calculated independently (<code>"replace"</code>) or are accumulated with the value of the previous iteration (<code>"accumulate"</code>).`, kind: "feature", name: "iterationComposite", spec: ["https://drafts.csswg.org/web-animations-2/#the-iterationcompositeoperation-enumeration"], status: { baseline: false, by_compat_key: { "api.Element.animate.options_iterationComposite_parameter": { baseline: false, support: { firefox: "80", firefox_android: "80", safari: "16.4", safari_ios: "16.4" } }, "api.KeyframeEffect.iterationComposite": { baseline: false, support: { firefox: "80", firefox_android: "80", safari: "16.4", safari_ios: "16.4" } } }, support: { firefox: "80", firefox_android: "80", safari: "16.4", safari_ios: "16.4" } } }, "web-audio": { caniuse: ["audio-api"],
    compat_features: ["api.AnalyserNode", "api.AnalyserNode.AnalyserNode", "api.AnalyserNode.fftSize", "api.AnalyserNode.frequencyBinCount", "api.AnalyserNode.getByteFrequencyData", "api.AnalyserNode.getByteTimeDomainData", "api.AnalyserNode.getFloatFrequencyData", "api.AnalyserNode.getFloatTimeDomainData", "api.AnalyserNode.maxDecibels", "api.AnalyserNode.minDecibels", "api.AnalyserNode.smoothingTimeConstant", "api.AudioBuffer", "api.AudioBuffer.AudioBuffer", "api.AudioBuffer.copyFromChannel", "api.AudioBuffer.copyToChannel", "api.AudioBuffer.duration", "api.AudioBuffer.getChannelData", "api.AudioBuffer.length", "api.AudioBuffer.numberOfChannels", "api.AudioBuffer.sampleRate", "api.AudioBufferSourceNode", "api.AudioBufferSourceNode.AudioBufferSourceNode", "api.AudioBufferSourceNode.buffer", "api.AudioBufferSourceNode.detune", "api.AudioBufferSourceNode.loop", "api.AudioBufferSourceNode.loopEnd", "api.AudioBufferSourceNode.loopStart", "api.AudioBufferSourceNode.playbackRate", "api.Audi\
oBufferSourceNode.start", "api.AudioContext", "api.AudioContext.AudioContext", "api.AudioContext.AudioContext.options_latencyHint_parameter", "api.AudioContext.AudioContext.options_sampleRate_parameter", "api.AudioContext.AudioContext.options_sinkId_parameter", "api.AudioContext.baseLatency", "api.AudioContext.close", "api.AudioContext.createMediaElementSource", "api.AudioContext.createMediaStreamDestination", "api.AudioContext.createMediaStreamSource", "api.AudioContext.createMediaStreamTrackSource", "api.AudioContext.error_event", "api.AudioContext.getOutputTimestamp", "api.AudioContext.outputLatency", "api.AudioContext.resume", "api.AudioContext.setSinkId", "api.AudioContext.sinkId", "api.AudioContext.sinkchange_event", "api.AudioContext.suspend", "api.AudioDestinationNode", "api.AudioDestinationNode.maxChannelCount", "api.AudioNode", "api.AudioNode.channelCount", "api.AudioNode.channelCountMode", "api.AudioNode.channelInterpretation", "api.AudioNode.connect", "api.AudioNode.context",
    "api.AudioNode.disconnect", "api.AudioNode.disconnect.destination_parameter", "api.AudioNode.disconnect.input_parameter", "api.AudioNode.numberOfInputs", "api.AudioNode.numberOfOutputs", "api.AudioParam", "api.AudioParam.automationRate", "api.AudioParam.cancelAndHoldAtTime", "api.AudioParam.cancelScheduledValues", "api.AudioParam.defaultValue", "api.AudioParam.exponentialRampToValueAtTime", "api.AudioParam.linearRampToValueAtTime", "api.AudioParam.maxValue", "api.AudioParam.minValue", "api.AudioParam.setTargetAtTime", "api.AudioParam.setValueAtTime", "api.AudioParam.setValueCurveAtTime", "api.AudioParam.value", "api.AudioParamMap", "api.AudioParamMap.@@iterator", "api.AudioParamMap.entries", "api.AudioParamMap.forEach", "api.AudioParamMap.get", "api.AudioParamMap.has", "api.AudioParamMap.keys", "api.AudioParamMap.size", "api.AudioParamMap.values", "api.AudioScheduledSourceNode", "api.AudioScheduledSourceNode.ended_event", "api.AudioScheduledSourceNode.start", "api.AudioScheduledSou\
rceNode.stop", "api.AudioSinkInfo", "api.AudioSinkInfo.type", "api.BaseAudioContext", "api.BaseAudioContext.createAnalyser", "api.BaseAudioContext.createBiquadFilter", "api.BaseAudioContext.createBuffer", "api.BaseAudioContext.createBufferSource", "api.BaseAudioContext.createChannelMerger", "api.BaseAudioContext.createChannelSplitter", "api.BaseAudioContext.createConstantSource", "api.BaseAudioContext.createConvolver", "api.BaseAudioContext.createDelay", "api.BaseAudioContext.createDynamicsCompressor", "api.BaseAudioContext.createGain", "api.BaseAudioContext.createIIRFilter", "api.BaseAudioContext.createOscillator", "api.BaseAudioContext.createPanner", "api.BaseAudioContext.createPeriodicWave", "api.BaseAudioContext.createPeriodicWave.constraints_disableNormalization_parameter", "api.BaseAudioContext.createStereoPanner", "api.BaseAudioContext.createWaveShaper", "api.BaseAudioContext.currentTime", "api.BaseAudioContext.decodeAudioData", "api.BaseAudioContext.decodeAudioData.returns_prom\
ise", "api.BaseAudioContext.destination", "api.BaseAudioContext.listener", "api.BaseAudioContext.sampleRate", "api.BaseAudioContext.state", "api.BaseAudioContext.statechange_event", "api.BiquadFilterNode", "api.BiquadFilterNode.BiquadFilterNode", "api.BiquadFilterNode.Q", "api.BiquadFilterNode.detune", "api.BiquadFilterNode.frequency", "api.BiquadFilterNode.gain", "api.BiquadFilterNode.getFrequencyResponse", "api.BiquadFilterNode.type", "api.ChannelMergerNode", "api.ChannelMergerNode.ChannelMergerNode", "api.ChannelSplitterNode", "api.ChannelSplitterNode.ChannelSplitterNode", "api.ConstantSourceNode", "api.ConstantSourceNode.ConstantSourceNode", "api.ConstantSourceNode.offset", "api.ConvolverNode", "api.ConvolverNode.ConvolverNode", "api.ConvolverNode.buffer", "api.ConvolverNode.normalize", "api.DelayNode", "api.DelayNode.DelayNode", "api.DelayNode.delayTime", "api.DynamicsCompressorNode", "api.DynamicsCompressorNode.DynamicsCompressorNode", "api.DynamicsCompressorNode.attack", "api.Dy\
namicsCompressorNode.knee", "api.DynamicsCompressorNode.ratio", "api.DynamicsCompressorNode.reduction", "api.DynamicsCompressorNode.release", "api.DynamicsCompressorNode.threshold", "api.GainNode", "api.GainNode.GainNode", "api.GainNode.gain", "api.IIRFilterNode", "api.IIRFilterNode.IIRFilterNode", "api.IIRFilterNode.getFrequencyResponse", "api.MediaElementAudioSourceNode", "api.MediaElementAudioSourceNode.MediaElementAudioSourceNode", "api.MediaElementAudioSourceNode.mediaElement", "api.MediaStreamAudioDestinationNode", "api.MediaStreamAudioDestinationNode.MediaStreamAudioDestinationNode", "api.MediaStreamAudioDestinationNode.stream", "api.MediaStreamAudioSourceNode", "api.MediaStreamAudioSourceNode.MediaStreamAudioSourceNode", "api.MediaStreamAudioSourceNode.mediaStream", "api.MediaStreamTrackAudioSourceNode", "api.MediaStreamTrackAudioSourceNode.MediaStreamTrackAudioSourceNode", "api.OscillatorNode", "api.OscillatorNode.OscillatorNode", "api.OscillatorNode.detune", "api.OscillatorNo\
de.frequency", "api.OscillatorNode.setPeriodicWave", "api.OscillatorNode.type", "api.PannerNode", "api.PannerNode.PannerNode", "api.PannerNode.coneInnerAngle", "api.PannerNode.coneOuterAngle", "api.PannerNode.coneOuterGain", "api.PannerNode.distanceModel", "api.PannerNode.maxDistance", "api.PannerNode.orientationX", "api.PannerNode.orientationY", "api.PannerNode.orientationZ", "api.PannerNode.panningModel", "api.PannerNode.positionX", "api.PannerNode.positionY", "api.PannerNode.positionZ", "api.PannerNode.refDistance", "api.PannerNode.rolloffFactor", "api.PeriodicWave", "api.PeriodicWave.PeriodicWave", "api.StereoPannerNode", "api.StereoPannerNode.StereoPannerNode", "api.StereoPannerNode.pan", "api.WaveShaperNode", "api.WaveShaperNode.WaveShaperNode", "api.WaveShaperNode.curve", "api.WaveShaperNode.oversample"], description: "The Web Audio API creates graphs of audio nodes that handle sound inputs, synthesize sounds, apply effects, create visualizations, and output to audio devices.", description_html: "\
The Web Audio API creates graphs of audio nodes that handle sound inputs, synthesize sounds, apply effects, create visualizations, and output to audio devices.", group: ["web-audio"], kind: "feature", name: "Web Audio", spec: ["https://webaudio.github.io/web-audio-api/"], status: { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", by_compat_key: { "api.AnalyserNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.AnalyserNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.AnalyserNode.fftSize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.frequencyBinCount": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.getByteFrequencyData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.getByteTimeDomainData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.getFloatFrequencyData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.getFloatTimeDomainData": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "30", firefox_android: "30", safari: "14.1", safari_ios: "14.5" } }, "api.AnalyserNode.maxDecibels": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.minDecibels": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AnalyserNode.smoothingTimeConstant": { baseline: "high", baseline_high_date: "2018-0\
1-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBuffer.AudioBuffer": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.AudioBuffer.copyFromChannel": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "43", chrome_android: "43", edge: "13", firefox: "27", firefox_android: "27", safari: "14.1", safari_ios: "14.5" } }, "api.AudioBuffer.copyToChannel": { baseline: "high", baseline_high_date: "2023\
-10-26", baseline_low_date: "2021-04-26", support: { chrome: "43", chrome_android: "43", edge: "13", firefox: "27", firefox_android: "27", safari: "14.1", safari_ios: "14.5" } }, "api.AudioBuffer.duration": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBuffer.getChannelData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBuffer.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBuffer.numberOfChannels": { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBuffer.sampleRate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBufferSourceNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBufferSourceNode.AudioBufferSourceNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.AudioBufferSourceNode.buffer": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBufferSourceNode.detune": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "44", chrome_android: "44", edge: "13", firefox: "40", firefox_android: "40", safari: "14.1", safari_ios: "14.5" } }, "api.AudioBufferSourceNode.loop": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBufferSourceNode.loopEnd": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.AudioBufferSourceNode.loop\
Start": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.AudioBufferSourceNode.playbackRate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioBufferSourceNode.start": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.AudioContext": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext\
.AudioContext": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.AudioContext.options_latencyHint_parameter": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.AudioContext.options_sampleRate_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "61", firefox_android: "61", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.AudioContext.options_sinkId_parameter": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.AudioContext.baseLatency": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "58", chrome_android: "\
58", edge: "79", firefox: "70", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.close": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "42", chrome_android: "42", edge: "14", firefox: "40", firefox_android: "40", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.createMediaElementSource": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.createMediaStreamDestination": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "79", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.createMediaStreamSource": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "\
2021-04-26", support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.createMediaStreamTrackSource": { baseline: false, support: { firefox: "68", firefox_android: "68" } }, "api.AudioContext.error_event": { baseline: false, support: { chrome: "128", chrome_android: "128", edge: "128" } }, "api.AudioContext.getOutputTimestamp": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "70", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.outputLatency": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "102", chrome_android: "102", edge: "102", firefox: "70", firefox_android: "79", safari: "18.4", safari_ios: "18.4" } }, "api.AudioContext.resume": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: {
    chrome: "41", chrome_android: "41", edge: "14", firefox: "40", firefox_android: "40", safari: "14.1", safari_ios: "14.5" } }, "api.AudioContext.setSinkId": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.AudioContext.sinkId": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.AudioContext.sinkchange_event": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.AudioContext.suspend": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "41", chrome_android: "41", edge: "14", firefox: "40", firefox_android: "40", safari: "14.1", safari_ios: "14.5" } }, "api.AudioDestinationNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioDestinationNo\
de.maxChannelCount": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } }, "api.AudioNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioNode.channelCount": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.AudioNode.channelCountMode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.AudioNode.chann\
elInterpretation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.AudioNode.connect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioNode.context": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioNode.disconnect": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioNode.disconnect.desti\
nation_parameter": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "≤18" } }, "api.AudioNode.disconnect.input_parameter": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "≤18" } }, "api.AudioNode.numberOfInputs": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioNode.numberOfOutputs": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParam": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParam.automationRate": {
    baseline: false, support: { chrome: "68", chrome_android: "68", edge: "79", safari: "14", safari_ios: "14" } }, "api.AudioParam.cancelAndHoldAtTime": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParam.cancelScheduledValues": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParam.defaultValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParam.exponentialRampToValueAtTime": { baseline: false, support: { chrome: "14", edge: "12", safari: "6", safari_ios: "6" } }, "api.AudioParam.linearRampToValueAtTime": { baseline: false, support: { chrome: "14", edge: "12", safari: "6", safari_ios: "6" } }, "api.AudioParam.maxValue": { baseline: "high", baseline_high_date: "\
2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "53", firefox_android: "53", safari: "6", safari_ios: "6" } }, "api.AudioParam.minValue": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "53", firefox_android: "53", safari: "6", safari_ios: "6" } }, "api.AudioParam.setTargetAtTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParam.setValueAtTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParam.setValueCurveAtTime": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParam.value": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.AudioParamMap": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.@@iterator": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.entries": { baseline: "high", baseline_high_date: "2023-10-26",
    baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.forEach": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.get": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.has": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.keys": { baseline: "high", baseline_high_date: "2023-10-\
26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.size": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioParamMap.values": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "76", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.AudioScheduledSourceNode": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "14", safari_ios: "14" } }, "api.AudioScheduledSourceNode.ended_event": { baseline: "high", baseline_high_date: "\
2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "14", safari_ios: "14" } }, "api.AudioScheduledSourceNode.start": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "14", safari_ios: "14" } }, "api.AudioScheduledSourceNode.stop": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "14", safari_ios: "14" } }, "api.AudioSinkInfo": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.AudioSinkInfo.type": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.BaseAudioContext": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "\
2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createAnalyser": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createBiquadFilter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createBuffer": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createBufferSource": { baseline: "hig\
h", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createChannelMerger": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createChannelSplitter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createConstantSource": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "\
14.5" } }, "api.BaseAudioContext.createConvolver": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createDelay": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createDynamicsCompressor": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createGain": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "5\
3", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createIIRFilter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createOscillator": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createPanner": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createPeriodicWave": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "\
56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createPeriodicWave.constraints_disableNormalization_parameter": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createStereoPanner": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.createWaveShaper": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.currentTime": { baseline: "\
high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.decodeAudioData": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.decodeAudioData.returns_promise": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.destination": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "\
14.5" } }, "api.BaseAudioContext.listener": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.sampleRate": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.state": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BaseAudioContext.statechange_event": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "53", firefox_android: "\
53", safari: "14.1", safari_ios: "14.5" } }, "api.BiquadFilterNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.BiquadFilterNode.BiquadFilterNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.BiquadFilterNode.Q": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.BiquadFilterNode.detune": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "25", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "\
25", safari: "7", safari_ios: "7" } }, "api.BiquadFilterNode.frequency": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.BiquadFilterNode.gain": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.BiquadFilterNode.getFrequencyResponse": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "17", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.BiquadFilterNode.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "\
25", safari: "6", safari_ios: "6" } }, "api.ChannelMergerNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.ChannelMergerNode.ChannelMergerNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.ChannelSplitterNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.ChannelSplitterNode.ChannelSplitterNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53",
    firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.ConstantSourceNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "52", firefox_android: "52", safari: "14.1", safari_ios: "14.5" } }, "api.ConstantSourceNode.ConstantSourceNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "52", firefox_android: "52", safari: "14.1", safari_ios: "14.5" } }, "api.ConstantSourceNode.offset": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "52", firefox_android: "52", safari: "14.1", safari_ios: "14.5" } }, "api.ConvolverNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "\
12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.ConvolverNode.ConvolverNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.ConvolverNode.buffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.ConvolverNode.normalize": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DelayNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "\
25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.DelayNode.DelayNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.DelayNode.delayTime": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.DynamicsCompressorNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DynamicsCompressorNode.DynamicsCompressorNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "\
79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.DynamicsCompressorNode.attack": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DynamicsCompressorNode.knee": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DynamicsCompressorNode.ratio": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DynamicsCompressorNode.reduction": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "\
25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DynamicsCompressorNode.release": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.DynamicsCompressorNode.threshold": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "19", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.GainNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.GainNode.GainNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "\
79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.GainNode.gain": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "24", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "7", safari_ios: "7" } }, "api.IIRFilterNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49", edge: "14", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.IIRFilterNode.IIRFilterNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.IIRFilterNode.getFrequencyResponse": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "49", chrome_android: "49",
    edge: "14", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.MediaElementAudioSourceNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.MediaElementAudioSourceNode.MediaElementAudioSourceNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.MediaElementAudioSourceNode.mediaElement": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "15", chrome_android: "18", edge: "79", firefox: "70", firefox_android: "79", safari: "6", safari_ios: "6" } }, "api.MediaStreamAudioDestinationNode": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "\
2018-10-02", support: { chrome: "25", chrome_android: "25", edge: "18", firefox: "25", firefox_android: "25", safari: "11", safari_ios: "11" } }, "api.MediaStreamAudioDestinationNode.MediaStreamAudioDestinationNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.MediaStreamAudioDestinationNode.stream": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "25", chrome_android: "25", edge: "18", firefox: "25", firefox_android: "25", safari: "11", safari_ios: "11" } }, "api.MediaStreamAudioSourceNode": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "11", safari_ios: "11" } }, "api.MediaStreamAudioSourceNode.MediaSt\
reamAudioSourceNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.MediaStreamAudioSourceNode.mediaStream": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "22", chrome_android: "25", edge: "79", firefox: "70", firefox_android: "79", safari: "11", safari_ios: "11" } }, "api.MediaStreamTrackAudioSourceNode": { baseline: false, support: { firefox: "68", firefox_android: "68" } }, "api.MediaStreamTrackAudioSourceNode.MediaStreamTrackAudioSourceNode": { baseline: false, support: { firefox: "68", firefox_android: "68" } }, "api.OscillatorNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } },
    "api.OscillatorNode.OscillatorNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.OscillatorNode.detune": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.OscillatorNode.frequency": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.OscillatorNode.setPeriodicWave": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "25", firefox_android: "25", safari: "8", safari_ios: "\
8" } }, "api.OscillatorNode.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "20", chrome_android: "25", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.PannerNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.PannerNode.PannerNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.coneInnerAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.Pa\
nnerNode.coneOuterAngle": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.PannerNode.coneOuterGain": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.PannerNode.distanceModel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.PannerNode.maxDistance": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.Pan\
nerNode.orientationX": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.orientationY": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.orientationZ": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.panningModel": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } },
    "api.PannerNode.positionX": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.positionY": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.positionZ": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "52", chrome_android: "52", edge: "79", firefox: "50", firefox_android: "50", safari: "14.1", safari_ios: "14.5" } }, "api.PannerNode.refDistance": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "\
6" } }, "api.PannerNode.rolloffFactor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "14", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.PeriodicWave": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "30", chrome_android: "30", edge: "12", firefox: "25", firefox_android: "26", safari: "8", safari_ios: "8" } }, "api.PeriodicWave.PeriodicWave": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.StereoPannerNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "37", firefox_android: "37", safari: "14.1", safari_ios: "14.5" } },
    "api.StereoPannerNode.StereoPannerNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "14.5" } }, "api.StereoPannerNode.pan": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "41", chrome_android: "41", edge: "12", firefox: "37", firefox_android: "37", safari: "14.1", safari_ios: "14.5" } }, "api.WaveShaperNode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.WaveShaperNode.WaveShaperNode": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "55", chrome_android: "55", edge: "79", firefox: "53", firefox_android: "53", safari: "14.1", safari_ios: "\
14.5" } }, "api.WaveShaperNode.curve": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "25", firefox_android: "25", safari: "6", safari_ios: "6" } }, "api.WaveShaperNode.oversample": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "26", firefox_android: "26", safari: "6", safari_ios: "6" } } }, support: { chrome: "35", chrome_android: "35", edge: "12", firefox: "25", firefox_android: "25", safari: "14.1", safari_ios: "14.5" } } }, "web-bluetooth": { caniuse: ["web-bluetooth"], compat_features: ["api.Bluetooth", "api.Bluetooth.getAvailability", "api.Bluetooth.getDevices", "api.Bluetooth.requestDevice", "api.Bluetooth.requestDevice.options_exclusionFilters_parameter", "api.Bluetooth.requestDevice.options_filter_manufacturerData_parameter", "api.BluetoothCharacteristicProperties",
    "api.BluetoothCharacteristicProperties.authenticatedSignedWrites", "api.BluetoothCharacteristicProperties.broadcast", "api.BluetoothCharacteristicProperties.indicate", "api.BluetoothCharacteristicProperties.notify", "api.BluetoothCharacteristicProperties.read", "api.BluetoothCharacteristicProperties.reliableWrite", "api.BluetoothCharacteristicProperties.writableAuxiliaries", "api.BluetoothCharacteristicProperties.write", "api.BluetoothCharacteristicProperties.writeWithoutResponse", "api.BluetoothDevice", "api.BluetoothDevice.gatt", "api.BluetoothDevice.gattserverdisconnected_event", "api.BluetoothDevice.id", "api.BluetoothDevice.name", "api.BluetoothRemoteGATTCharacteristic", "api.BluetoothRemoteGATTCharacteristic.characteristicvaluechanged_event", "api.BluetoothRemoteGATTCharacteristic.getDescriptor", "api.BluetoothRemoteGATTCharacteristic.getDescriptors", "api.BluetoothRemoteGATTCharacteristic.properties", "api.BluetoothRemoteGATTCharacteristic.readValue", "api.BluetoothRemoteGAT\
TCharacteristic.service", "api.BluetoothRemoteGATTCharacteristic.startNotifications", "api.BluetoothRemoteGATTCharacteristic.stopNotifications", "api.BluetoothRemoteGATTCharacteristic.uuid", "api.BluetoothRemoteGATTCharacteristic.value", "api.BluetoothRemoteGATTCharacteristic.writeValueWithResponse", "api.BluetoothRemoteGATTCharacteristic.writeValueWithoutResponse", "api.BluetoothRemoteGATTDescriptor", "api.BluetoothRemoteGATTDescriptor.characteristic", "api.BluetoothRemoteGATTDescriptor.readValue", "api.BluetoothRemoteGATTDescriptor.uuid", "api.BluetoothRemoteGATTDescriptor.value", "api.BluetoothRemoteGATTDescriptor.writeValue", "api.BluetoothRemoteGATTServer", "api.BluetoothRemoteGATTServer.connect", "api.BluetoothRemoteGATTServer.connected", "api.BluetoothRemoteGATTServer.device", "api.BluetoothRemoteGATTServer.disconnect", "api.BluetoothRemoteGATTServer.getPrimaryService", "api.BluetoothRemoteGATTServer.getPrimaryServices", "api.BluetoothRemoteGATTService", "api.BluetoothRemoteGATT\
Service.device", "api.BluetoothRemoteGATTService.getCharacteristic", "api.BluetoothRemoteGATTService.getCharacteristics", "api.BluetoothRemoteGATTService.isPrimary", "api.BluetoothRemoteGATTService.uuid", "api.BluetoothUUID", "api.BluetoothUUID.canonicalUUID_static", "api.BluetoothUUID.getCharacteristic_static", "api.BluetoothUUID.getDescriptor_static", "api.BluetoothUUID.getService_static", "api.Navigator.bluetooth", "html.elements.iframe.allow.bluetooth", "http.headers.Permissions-Policy.bluetooth"], description: "The Web Bluetooth API enables selecting and communicating with nearby Bluetooth devices.", description_html: "The Web Bluetooth API enables selecting and communicating with nearby Bluetooth devices.", kind: "feature", name: "Web Bluetooth", spec: ["https://webbluetoothcg.github.io/web-bluetooth/"], status: { baseline: false, by_compat_key: { "api.Bluetooth": { baseline: false, support: { chrome_android: "56" } }, "api.Bluetooth.getAvailability": { baseline: false, support: {
    chrome_android: "78" } }, "api.Bluetooth.getDevices": { baseline: false, support: {} }, "api.Bluetooth.requestDevice": { baseline: false, support: { chrome_android: "56" } }, "api.Bluetooth.requestDevice.options_exclusionFilters_parameter": { baseline: false, support: { chrome_android: "114" } }, "api.Bluetooth.requestDevice.options_filter_manufacturerData_parameter": { baseline: false, support: { chrome_android: "92" } }, "api.BluetoothCharacteristicProperties": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.authenticatedSignedWrites": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.broadcast": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.indicate": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.notify": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProp\
erties.read": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.reliableWrite": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.writableAuxiliaries": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.write": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothCharacteristicProperties.writeWithoutResponse": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothDevice": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothDevice.gatt": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothDevice.gattserverdisconnected_event": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothDevice.id": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothDevice.name": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic": { baseline: false,
    support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.characteristicvaluechanged_event": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.getDescriptor": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTCharacteristic.getDescriptors": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTCharacteristic.properties": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.readValue": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.service": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.startNotifications": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.stopNotifications": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.uuid": { baseline: false,
    support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.value": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTCharacteristic.writeValueWithResponse": { baseline: false, support: { chrome_android: "85" } }, "api.BluetoothRemoteGATTCharacteristic.writeValueWithoutResponse": { baseline: false, support: { chrome_android: "85" } }, "api.BluetoothRemoteGATTDescriptor": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTDescriptor.characteristic": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTDescriptor.readValue": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTDescriptor.uuid": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTDescriptor.value": { baseline: false, support: { chrome_android: "57" } }, "api.BluetoothRemoteGATTDescriptor.writeValue": { baseline: false, support: { chrome_android: "57" } }, "api.Blu\
etoothRemoteGATTServer": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTServer.connect": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTServer.connected": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTServer.device": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTServer.disconnect": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTServer.getPrimaryService": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTServer.getPrimaryServices": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTService": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTService.device": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTService.getCharacteristic": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRem\
oteGATTService.getCharacteristics": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTService.isPrimary": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothRemoteGATTService.uuid": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothUUID": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothUUID.canonicalUUID_static": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothUUID.getCharacteristic_static": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothUUID.getDescriptor_static": { baseline: false, support: { chrome_android: "56" } }, "api.BluetoothUUID.getService_static": { baseline: false, support: { chrome_android: "56" } }, "api.Navigator.bluetooth": { baseline: false, support: { chrome_android: "56" } }, "html.elements.iframe.allow.bluetooth": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104" } }, "http.headers.Permissions-Policy.bl\
uetooth": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104" } } }, support: { chrome: "70", chrome_android: "56", edge: "79" } } }, "web-cryptography": { caniuse: ["cryptography"], compat_features: ["api.Crypto", "api.Crypto.getRandomValues", "api.Crypto.randomUUID", "api.Crypto.subtle", "api.Crypto.subtle.secure_context_required", "api.CryptoKey", "api.CryptoKey.algorithm", "api.CryptoKey.extractable", "api.CryptoKey.type", "api.CryptoKey.usages", "api.SubtleCrypto", "api.SubtleCrypto.decrypt", "api.SubtleCrypto.deriveBits", "api.SubtleCrypto.deriveBits.x25519", "api.SubtleCrypto.deriveKey", "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_aes", "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_hkdf", "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_hmac", "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_pbkdf2", "api.SubtleCrypto.deriveKey.x25519", "api.SubtleCrypto.digest", "api.SubtleCrypto.encrypt", "api.SubtleCrypto.exportKey",
    "api.SubtleCrypto.exportKey.ed25519", "api.SubtleCrypto.exportKey.x25519", "api.SubtleCrypto.generateKey", "api.SubtleCrypto.generateKey.ed25519", "api.SubtleCrypto.generateKey.x25519", "api.SubtleCrypto.importKey", "api.SubtleCrypto.importKey.ed25519", "api.SubtleCrypto.importKey.x25519", "api.SubtleCrypto.secure_context_required", "api.SubtleCrypto.sign", "api.SubtleCrypto.sign.ed25519", "api.SubtleCrypto.unwrapKey", "api.SubtleCrypto.verify", "api.SubtleCrypto.verify.ed25519", "api.SubtleCrypto.worker_support", "api.SubtleCrypto.wrapKey", "api.crypto", "api.crypto.worker_support"], description: "The Web Cryptography API performs low-level cryptographic operations, such as encryption, decryption, and signature verification. Also known as the Web Crypto API.", description_html: "The Web Cryptography API performs low-level cryptographic operations, such as encryption, decryption, and signature verification. Also known as the Web Crypto API.", group: ["security"], kind: "feature", name: "\
Web Cryptography", spec: ["https://w3c.github.io/webcrypto/", "https://wicg.github.io/webcrypto-secure-curves/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Crypto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "21", firefox_android: "21", safari: "5", safari_ios: "5" } }, "api.Crypto.getRandomValues": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "11", chrome_android: "18", edge: "12", firefox: "21", firefox_android: "21", safari: "5", safari_ios: "5" } }, "api.Crypto.randomUUID": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "92", chrome_android: "92", edge: "92", firefox: "95", firefox_android: "95", safari: "15.4", safari_ios: "15.4" } }, "api.Crypto.subtle": { baseline: "high", baseline_high_date: "\
2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.Crypto.subtle.secure_context_required": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "75", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.CryptoKey": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "api.CryptoKey.algorithm": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "api.CryptoKey.extractable": { baseline: "high", baseline_high_date: "2018-0\
1-29", baseline_low_date: "2015-07-29", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "api.CryptoKey.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "api.CryptoKey.usages": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "7", safari_ios: "7" } }, "api.SubtleCrypto": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.decrypt": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-\
01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.deriveBits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.deriveBits.x25519": { baseline: "low", baseline_low_date: "2025-02-06", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.deriveKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_aes": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_hkdf": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "119", firefox_android: "119", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_hmac": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.deriveKey.derivedKeyAlgorithm_option_pbkdf2": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "119", firefox_android: "119", safari: "11", safari_ios: "11" } }, "a\
pi.SubtleCrypto.deriveKey.x25519": { baseline: "low", baseline_low_date: "2025-02-06", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.digest": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "41", chrome_android: "41", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.encrypt": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.exportKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.exportKey.ed\
25519": { baseline: "low", baseline_low_date: "2025-05-29", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "129", firefox_android: "129", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.exportKey.x25519": { baseline: "low", baseline_low_date: "2025-02-06", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.generateKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.generateKey.ed25519": { baseline: "low", baseline_low_date: "2025-05-29", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "129", firefox_android: "129", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.generateKey.x25519": { baseline: "low", baseline_low_date: "2025-02-06", support: {
    chrome: "133", chrome_android: "133", edge: "133", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.importKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.importKey.ed25519": { baseline: "low", baseline_low_date: "2025-05-29", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "129", firefox_android: "129", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.importKey.x25519": { baseline: "low", baseline_low_date: "2025-02-06", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.secure_context_required": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "60", chrome_android: "\
60", edge: "79", firefox: "75", firefox_android: "79", safari: "15", safari_ios: "15" } }, "api.SubtleCrypto.sign": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.sign.ed25519": { baseline: "low", baseline_low_date: "2025-05-29", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "129", firefox_android: "129", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.unwrapKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.verify": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "\
34", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.verify.ed25519": { baseline: "low", baseline_low_date: "2025-05-29", support: { chrome: "137", chrome_android: "137", edge: "137", firefox: "129", firefox_android: "129", safari: "17", safari_ios: "17" } }, "api.SubtleCrypto.worker_support": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "api.SubtleCrypto.wrapKey": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.crypto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "1", firefox_android: "4", safari: "5", safari_ios: "5" } }, "\
api.crypto.worker_support": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "37", chrome_android: "37", edge: "79", firefox: "48", firefox_android: "48", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "37", chrome_android: "37", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } } }, "web-install": { kind: "moved", redirect_target: "navigator-install" }, "web-locks": { compat_features: ["api.Lock", "api.Lock.mode", "api.Lock.name", "api.LockManager", "api.LockManager.query", "api.LockManager.request", "api.Navigator.locks", "api.WorkerNavigator.locks"], description: "The navigator.locks API coordinates work with shared resources through mutually exclusive ownership of a resource's name. Also known as web locks.", description_html: "The <code>navigator.locks</code> API coordinates work with shared resources through mutually exclusive ownership of a resource's name. Also known as web l\
ocks.", kind: "feature", name: "Locks", spec: ["https://w3c.github.io/web-locks/"], status: { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", by_compat_key: { "api.Lock": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.Lock.mode": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.Lock.name": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.LockManager": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "\
2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.LockManager.query": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.LockManager.request": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.Navigator.locks": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.WorkerNavigator.locks": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "\
2022-03-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } } }, "web-midi": { caniuse: ["midi"], compat_features: ["api.MIDIAccess", "api.MIDIAccess.inputs", "api.MIDIAccess.outputs", "api.MIDIAccess.statechange_event", "api.MIDIAccess.sysexEnabled", "api.MIDIConnectionEvent", "api.MIDIConnectionEvent.MIDIConnectionEvent", "api.MIDIConnectionEvent.port", "api.MIDIInput", "api.MIDIInput.midimessage_event", "api.MIDIInputMap", "api.MIDIInputMap.@@iterator", "api.MIDIInputMap.entries", "api.MIDIInputMap.forEach", "api.MIDIInputMap.get", "api.MIDIInputMap.has", "api.MIDIInputMap.keys", "api.MIDIInputMap.size", "api.MIDIInputMap.values", "api.MIDIMessageEvent", "api.MIDIMessageEvent.MIDIMessageEvent", "api.MIDIMessageEvent.data", "api.MIDIOutput", "api.MIDIOutput.clea\
r", "api.MIDIOutput.send", "api.MIDIOutputMap", "api.MIDIOutputMap.@@iterator", "api.MIDIOutputMap.entries", "api.MIDIOutputMap.forEach", "api.MIDIOutputMap.get", "api.MIDIOutputMap.has", "api.MIDIOutputMap.keys", "api.MIDIOutputMap.size", "api.MIDIOutputMap.values", "api.MIDIPort", "api.MIDIPort.close", "api.MIDIPort.connection", "api.MIDIPort.id", "api.MIDIPort.manufacturer", "api.MIDIPort.name", "api.MIDIPort.open", "api.MIDIPort.state", "api.MIDIPort.statechange_event", "api.MIDIPort.type", "api.MIDIPort.version", "api.Navigator.requestMIDIAccess", "api.Navigator.requestMIDIAccess.secure_context_required", "api.Permissions.permission_midi", "html.elements.iframe.allow.midi", "http.headers.Permissions-Policy.midi"], description: "The Web MIDI API enables selecting MIDI input and output devices and sending and receiving MIDI messages.", description_html: "The Web MIDI API enables selecting MIDI input and output devices and sending and receiving MIDI messages.", kind: "feature", name: "\
Web MIDI", spec: ["https://webaudio.github.io/web-midi-api/"], status: { baseline: false, by_compat_key: { "api.MIDIAccess": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIAccess.inputs": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIAccess.outputs": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIAccess.statechange_event": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79" } }, "api.MIDIAccess.sysexEnabled": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIConnectionEvent": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIConnectionEvent.MIDIConnectionEvent": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIConn\
ectionEvent.port": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInput": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInput.midimessage_event": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.@@iterator": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.entries": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.forEach": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.get": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInput\
Map.has": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.keys": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.size": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIInputMap.values": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIMessageEvent": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIMessageEvent.MIDIMessageEvent": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIMessageEvent.data": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutput": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutput.c\
lear": { baseline: false, support: { firefox: "108" } }, "api.MIDIOutput.send": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.@@iterator": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.entries": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.forEach": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.get": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.has": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.keys": { baseline: false, support: { chrome: "43", chrome_android: "\
43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.size": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIOutputMap.values": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.close": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.connection": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.id": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.manufacturer": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.name": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "1\
08" } }, "api.MIDIPort.open": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.state": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.statechange_event": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.type": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.MIDIPort.version": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.Navigator.requestMIDIAccess": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.Navigator.requestMIDIAccess.secure_context_required": { baseline: false, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } }, "api.Permissions.permission_midi": { baseline: false, support: { chrome: "43", chrome_android: "\
43", edge: "79", firefox: "110", firefox_android: "110" } }, "html.elements.iframe.allow.midi": { baseline: false, support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "74", firefox_android: "79" } }, "http.headers.Permissions-Policy.midi": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "43", chrome_android: "43", edge: "79", firefox: "108" } } }, "web-nfc": { caniuse: ["webnfc"], compat_features: ["api.NDEFMessage", "api.NDEFMessage.NDEFMessage", "api.NDEFMessage.records", "api.NDEFMessage.secure_context_required", "api.NDEFReader", "api.NDEFReader.NDEFReader", "api.NDEFReader.makeReadOnly", "api.NDEFReader.reading_event", "api.NDEFReader.readingerror_event", "api.NDEFReader.scan", "api.NDEFReader.secure_context_required", "api.NDEFReader.write", "api.NDEFReadingEvent", "api.NDEFReadingEvent.NDEFReadingEvent", "api.NDEFReadingEvent.message", "api.NDEFReadingEvent.secure_context_required", "api.NDEFReadingEvent.seri\
alNumber", "api.NDEFRecord", "api.NDEFRecord.NDEFRecord", "api.NDEFRecord.data", "api.NDEFRecord.encoding", "api.NDEFRecord.id", "api.NDEFRecord.lang", "api.NDEFRecord.mediaType", "api.NDEFRecord.recordType", "api.NDEFRecord.secure_context_required", "api.NDEFRecord.toRecords"], description: "The NDEFReader API reads and writes messages to near-field communication (NFC) tags.", description_html: "The <code>NDEFReader</code> API reads and writes messages to near-field communication (NFC) tags.", kind: "feature", name: "Web NFC", spec: ["https://w3c.github.io/web-nfc/"], status: { baseline: false, by_compat_key: { "api.NDEFMessage": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFMessage.NDEFMessage": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFMessage.records": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFMessage.secure_context_required": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReader": { baseline: false,
    support: { chrome_android: "89" } }, "api.NDEFReader.NDEFReader": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReader.makeReadOnly": { baseline: false, support: { chrome_android: "100" } }, "api.NDEFReader.reading_event": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReader.readingerror_event": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReader.scan": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReader.secure_context_required": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReader.write": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReadingEvent": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReadingEvent.NDEFReadingEvent": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReadingEvent.message": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFReadingEvent.secure_context_required": { baseline: false, support: { chrome_android: "\
89" } }, "api.NDEFReadingEvent.serialNumber": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.NDEFRecord": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.data": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.encoding": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.id": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.lang": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.mediaType": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.recordType": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.secure_context_required": { baseline: false, support: { chrome_android: "89" } }, "api.NDEFRecord.toRecords": { baseline: false, support: { chrome_android: "89" } } }, support: { chrome_android: "100" } } }, "web-otp": { compat_features: [
    "api.CredentialsContainer.get.otp_option", "api.OTPCredential", "api.OTPCredential.code", "html.elements.iframe.allow.otp-credentials", "http.headers.Permissions-Policy.otp-credentials"], description: "The OTPCredential API represents a one-time-password (OTP).", description_html: "The <code>OTPCredential</code> API represents a one-time-password (OTP).", group: ["credential-management"], kind: "feature", name: "WebOTP", spec: ["https://wicg.github.io/web-otp/"], status: { baseline: false, by_compat_key: { "api.CredentialsContainer.get.otp_option": { baseline: false, support: { chrome: "93", chrome_android: "84", edge: "93" } }, "api.OTPCredential": { baseline: false, support: { chrome: "93", chrome_android: "84", edge: "93" } }, "api.OTPCredential.code": { baseline: false, support: { chrome: "93", chrome_android: "84", edge: "93" } }, "html.elements.iframe.allow.otp-credentials": { baseline: false, support: { chrome: "93", chrome_android: "84", edge: "93" } }, "http.headers.Permis\
sions-Policy.otp-credentials": { baseline: false, support: { chrome: "93", chrome_android: "88", edge: "93" } } }, support: { chrome: "93", chrome_android: "84", edge: "93" } } }, webauthn: { caniuse: ["webauthn"], compat_features: ["api.AuthenticatorAssertionResponse", "api.AuthenticatorAssertionResponse.authenticatorData", "api.AuthenticatorAssertionResponse.signature", "api.AuthenticatorAssertionResponse.userHandle", "api.AuthenticatorAttestationResponse", "api.AuthenticatorAttestationResponse.attestationObject", "api.AuthenticatorAttestationResponse.getTransports", "api.AuthenticatorResponse", "api.AuthenticatorResponse.clientDataJSON", "api.CredentialsContainer.create.publicKey_option", "api.CredentialsContainer.create.publicKey_option.attestation", "api.CredentialsContainer.create.publicKey_option.attestation.direct", "api.CredentialsContainer.create.publicKey_option.attestation.enterprise", "api.CredentialsContainer.create.publicKey_option.attestation.indirect", "api.Credentials\
Container.create.publicKey_option.attestation.none", "api.CredentialsContainer.create.publicKey_option.extensions", "api.CredentialsContainer.create.publicKey_option.extensions.appidExclude", "api.CredentialsContainer.create.publicKey_option.extensions.credProps", "api.CredentialsContainer.create.publicKey_option.extensions.credProtect", "api.CredentialsContainer.create.publicKey_option.extensions.largeBlob", "api.CredentialsContainer.create.publicKey_option.extensions.minPinLength", "api.CredentialsContainer.create.publicKey_option.requireResidentKey", "api.CredentialsContainer.create.publicKey_option.residentKey", "api.CredentialsContainer.get.publicKey_option", "api.CredentialsContainer.get.publicKey_option.extensions", "api.CredentialsContainer.get.publicKey_option.extensions.appid", "api.CredentialsContainer.get.publicKey_option.extensions.largeBlob", "api.PublicKeyCredential", "api.PublicKeyCredential.authenticatorAttachment", "api.PublicKeyCredential.getClientCapabilities_static",
    "api.PublicKeyCredential.getClientExtensionResults", "api.PublicKeyCredential.isConditionalMediationAvailable_static", "api.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable_static", "api.PublicKeyCredential.parseCreationOptionsFromJSON_static", "api.PublicKeyCredential.parseRequestOptionsFromJSON_static", "api.PublicKeyCredential.rawId", "api.PublicKeyCredential.response", "api.PublicKeyCredential.toJSON", "html.elements.iframe.allow.publickey-credentials-create", "html.elements.iframe.allow.publickey-credentials-get", "http.headers.Permissions-Policy.publickey-credentials-create", "http.headers.Permissions-Policy.publickey-credentials-get"], description: "The web authentication API allows you to create public key-based credentials and use them for authentication, such as when signing in. Also known as WebAuthn.", description_html: "The web authentication API allows you to create public key-based credentials and use them for authentication, such as when signing in.\
 Also known as WebAuthn.", group: ["webauthn"], kind: "feature", name: "Web authentication", spec: ["https://w3c.github.io/webauthn/"], status: { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", by_compat_key: { "api.AuthenticatorAssertionResponse": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorAssertionResponse.authenticatorData": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorAssertionResponse.signature": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "\
92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorAssertionResponse.userHandle": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorAttestationResponse": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorAttestationResponse.attestationObject": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorAttestationResponse.getTransports": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "\
74", chrome_android: "74", edge: "79", firefox: "119", firefox_android: "119", safari: "16", safari_ios: "16" } }, "api.AuthenticatorResponse": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.AuthenticatorResponse.clientDataJSON": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.attestation": { baseline: "high", baseline_high_date: "\
2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.attestation.direct": { baseline: false, support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.attestation.enterprise": { baseline: false, support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.attestation.indirect": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.attestation.none": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "\
2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.extensions": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.extensions.appidExclude": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.create.publicKey_option.extensions.credProps": { baseline: false, support: { chrome: "89", chrome_android: "108", edge: "89", firefox: "119", firefox_android: "119" } }, "api.CredentialsContainer.create.publicKey_option.extensions.credProtect": { baseline: false,
    support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "139", firefox_android: "139" } }, "api.CredentialsContainer.create.publicKey_option.extensions.largeBlob": { baseline: false, support: { chrome: "113", edge: "113", firefox: "139", firefox_android: "139", safari: "17", safari_ios: "17" } }, "api.CredentialsContainer.create.publicKey_option.extensions.minPinLength": { baseline: false, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "120", firefox_android: "120" } }, "api.CredentialsContainer.create.publicKey_option.requireResidentKey": { baseline: false, support: { chrome: "89", chrome_android: "108", edge: "89" } }, "api.CredentialsContainer.create.publicKey_option.residentKey": { baseline: false, support: { chrome: "89", chrome_android: "108", edge: "89", firefox: "114", firefox_android: "128" } }, "api.CredentialsContainer.get.publicKey_option": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "\
67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.get.publicKey_option.extensions": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.get.publicKey_option.extensions.appid": { baseline: "high", baseline_high_date: "2022-03-19", baseline_low_date: "2019-09-19", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "60", safari: "13", safari_ios: "13" } }, "api.CredentialsContainer.get.publicKey_option.extensions.largeBlob": { baseline: false, support: { chrome: "113", chrome_android: "113", edge: "113", firefox: "139", firefox_android: "139" } }, "api.PublicKeyCredential": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "\
67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.PublicKeyCredential.authenticatorAttachment": { baseline: "low", baseline_low_date: "2023-11-21", support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "120", firefox_android: "120", safari: "15.5", safari_ios: "15.5" } }, "api.PublicKeyCredential.getClientCapabilities_static": { baseline: "low", baseline_low_date: "2025-02-06", support: { chrome: "133", chrome_android: "133", edge: "133", firefox: "135", firefox_android: "135", safari: "17.4", safari_ios: "17.4" } }, "api.PublicKeyCredential.getClientExtensionResults": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.PublicKeyCredential.isConditionalMediationAvailable_static": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "\
2023-10-24", support: { chrome: "108", chrome_android: "108", edge: "108", firefox: "119", firefox_android: "119", safari: "16", safari_ios: "16" } }, "api.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable_static": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.PublicKeyCredential.parseCreationOptionsFromJSON_static": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "119", firefox_android: "119", safari: "18.4", safari_ios: "18.4" } }, "api.PublicKeyCredential.parseRequestOptionsFromJSON_static": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "119", firefox_android: "119", safari: "18.4", safari_ios: "18.4" } }, "api.PublicKeyCredential.rawId": { baseline: "\
high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.PublicKeyCredential.response": { baseline: "high", baseline_high_date: "2024-03-07", baseline_low_date: "2021-09-07", support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } }, "api.PublicKeyCredential.toJSON": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "119", firefox_android: "119", safari: "18.4", safari_ios: "18.4" } }, "html.elements.iframe.allow.publickey-credentials-create": { baseline: false, support: { firefox: "123", firefox_android: "123" } }, "html.elements.iframe.allow.publickey-credentials-get": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "118", firefox_android: "118" } },
    "http.headers.Permissions-Policy.publickey-credentials-create": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } }, "http.headers.Permissions-Policy.publickey-credentials-get": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "67", chrome_android: "70", edge: "18", firefox: "60", firefox_android: "92", safari: "13", safari_ios: "13" } } }, "webauthn-public-key-easy": { compat_features: ["api.AuthenticatorAttestationResponse.getAuthenticatorData", "api.AuthenticatorAttestationResponse.getPublicKey", "api.AuthenticatorAttestationResponse.getPublicKeyAlgorithm"], description: "The getAuthenticatorData(), getPublicKey(), and getPublicKeyAlgorithm() methods of AuthenticatorAttestationResponse access credential data inside attestationObject without the need to parse it.", description_html: "The <code>getAuthenticatorData()</code>, <code>getPublicKey()</code>, and <code>getPublicKeyAlgorithm()</code> metho\
ds of <code>AuthenticatorAttestationResponse</code> access credential data inside <code>attestationObject</code> without the need to parse it.", group: ["webauthn"], kind: "feature", name: "Web authentication easy public key access", spec: ["https://w3c.github.io/webauthn/#sctn-public-key-easy"], status: { baseline: "low", baseline_low_date: "2023-10-24", by_compat_key: { "api.AuthenticatorAttestationResponse.getAuthenticatorData": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "119", firefox_android: "119", safari: "16", safari_ios: "16" } }, "api.AuthenticatorAttestationResponse.getPublicKey": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "119", firefox_android: "119" } }, "api.AuthenticatorAttestationResponse.getPublicKeyAlgorithm": { baseline: "high", baseline_high_date: "2026-04-24", baseline_low_date: "2023-10-24", support: { chrome: "\
85", chrome_android: "85", edge: "85", firefox: "119", firefox_android: "119", safari: "16", safari_ios: "16" } } }, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "119", firefox_android: "119", safari: "16", safari_ios: "16" } } }, "webauthn-signals": { compat_features: ["api.PublicKeyCredential.signalAllAcceptedCredentials_static", "api.PublicKeyCredential.signalCurrentUserDetails_static", "api.PublicKeyCredential.signalUnknownCredential_static"], description: "The signalUnknownCredential(), signalAllAcceptedCredentials(), and signalCurrentUserDetails() methods of PublicKeyCredential inform authenticators of the state of public key credentials, so that incorrect or revoked credentials may be updated, removed, or hidden.", description_html: "The <code>signalUnknownCredential()</code>, <code>signalAllAcceptedCredentials()</code>, and <code>signalCurrentUserDetails()</code> methods of <code>PublicKeyCredential</code> inform authenticators of the state of public key \
credentials, so that incorrect or revoked credentials may be updated, removed, or hidden.", group: ["webauthn"], kind: "feature", name: "Web authentication signal methods", spec: ["https://w3c.github.io/webauthn/#sctn-signal-methods"], status: { baseline: false, by_compat_key: { "api.PublicKeyCredential.signalAllAcceptedCredentials_static": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132", safari: "26", safari_ios: "26" } }, "api.PublicKeyCredential.signalCurrentUserDetails_static": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132", safari: "26", safari_ios: "26" } }, "api.PublicKeyCredential.signalUnknownCredential_static": { baseline: false, support: { chrome: "132", chrome_android: "132", edge: "132", safari: "26", safari_ios: "26" } } }, support: { chrome: "132", chrome_android: "132", edge: "132", safari: "26", safari_ios: "26" } } }, webcodecs: { caniuse: ["webcodecs"], compat_features: ["api.AudioData", "api.AudioData.\
AudioData", "api.AudioData.allocationSize", "api.AudioData.clone", "api.AudioData.close", "api.AudioData.copyTo", "api.AudioData.duration", "api.AudioData.format", "api.AudioData.numberOfChannels", "api.AudioData.numberOfFrames", "api.AudioData.sampleRate", "api.AudioData.timestamp", "api.AudioDecoder", "api.AudioDecoder.AudioDecoder", "api.AudioDecoder.close", "api.AudioDecoder.configure", "api.AudioDecoder.decode", "api.AudioDecoder.decodeQueueSize", "api.AudioDecoder.dequeue_event", "api.AudioDecoder.flush", "api.AudioDecoder.isConfigSupported_static", "api.AudioDecoder.reset", "api.AudioDecoder.state", "api.AudioEncoder", "api.AudioEncoder.AudioEncoder", "api.AudioEncoder.close", "api.AudioEncoder.configure", "api.AudioEncoder.configure.bitrateMode", "api.AudioEncoder.configure.opus", "api.AudioEncoder.configure.opus.opus_application", "api.AudioEncoder.configure.opus.opus_signal", "api.AudioEncoder.dequeue_event", "api.AudioEncoder.encode", "api.AudioEncoder.encodeQueueSize", "api\
.AudioEncoder.flush", "api.AudioEncoder.isConfigSupported_static", "api.AudioEncoder.reset", "api.AudioEncoder.state", "api.EncodedAudioChunk", "api.EncodedAudioChunk.EncodedAudioChunk", "api.EncodedAudioChunk.byteLength", "api.EncodedAudioChunk.copyTo", "api.EncodedAudioChunk.duration", "api.EncodedAudioChunk.timestamp", "api.EncodedAudioChunk.type", "api.EncodedVideoChunk", "api.EncodedVideoChunk.EncodedVideoChunk", "api.EncodedVideoChunk.byteLength", "api.EncodedVideoChunk.copyTo", "api.EncodedVideoChunk.duration", "api.EncodedVideoChunk.timestamp", "api.EncodedVideoChunk.type", "api.ImageDecoder", "api.ImageDecoder.ImageDecoder", "api.ImageDecoder.close", "api.ImageDecoder.complete", "api.ImageDecoder.completed", "api.ImageDecoder.decode", "api.ImageDecoder.isTypeSupported_static", "api.ImageDecoder.reset", "api.ImageDecoder.tracks", "api.ImageDecoder.type", "api.ImageTrack", "api.ImageTrack.animated", "api.ImageTrack.frameCount", "api.ImageTrack.repetitionCount", "api.ImageTrack.s\
elected", "api.ImageTrackList", "api.ImageTrackList.length", "api.ImageTrackList.ready", "api.ImageTrackList.selectedIndex", "api.ImageTrackList.selectedTrack", "api.VideoColorSpace", "api.VideoColorSpace.VideoColorSpace", "api.VideoColorSpace.fullRange", "api.VideoColorSpace.matrix", "api.VideoColorSpace.primaries", "api.VideoColorSpace.toJSON", "api.VideoColorSpace.transfer", "api.VideoDecoder", "api.VideoDecoder.VideoDecoder", "api.VideoDecoder.close", "api.VideoDecoder.configure", "api.VideoDecoder.configure.flip_option", "api.VideoDecoder.configure.rotation_option", "api.VideoDecoder.decode", "api.VideoDecoder.decodeQueueSize", "api.VideoDecoder.dequeue_event", "api.VideoDecoder.flush", "api.VideoDecoder.isConfigSupported_static", "api.VideoDecoder.isConfigSupported_static.flip_option", "api.VideoDecoder.isConfigSupported_static.rotation_option", "api.VideoDecoder.reset", "api.VideoDecoder.state", "api.VideoEncoder", "api.VideoEncoder.VideoEncoder", "api.VideoEncoder.close", "api.\
VideoEncoder.configure", "api.VideoEncoder.dequeue_event", "api.VideoEncoder.encode", "api.VideoEncoder.encodeQueueSize", "api.VideoEncoder.flush", "api.VideoEncoder.isConfigSupported_static", "api.VideoEncoder.reset", "api.VideoEncoder.state", "api.VideoFrame", "api.VideoFrame.VideoFrame", "api.VideoFrame.VideoFrame.flip_option", "api.VideoFrame.VideoFrame.rotation_option", "api.VideoFrame.allocationSize", "api.VideoFrame.clone", "api.VideoFrame.close", "api.VideoFrame.codedHeight", "api.VideoFrame.codedRect", "api.VideoFrame.codedWidth", "api.VideoFrame.colorSpace", "api.VideoFrame.copyTo", "api.VideoFrame.displayHeight", "api.VideoFrame.displayWidth", "api.VideoFrame.duration", "api.VideoFrame.flip", "api.VideoFrame.format", "api.VideoFrame.rotation", "api.VideoFrame.timestamp", "api.VideoFrame.visibleRect"], description: "The WebCodecs API provides low-level access to individual video frames and chunks of audio samples, for full control over the way media is processed.", description_html: "\
The WebCodecs API provides low-level access to individual video frames and chunks of audio samples, for full control over the way media is processed.", kind: "feature", name: "WebCodecs", spec: ["https://w3c.github.io/webcodecs/"], status: { baseline: false, by_compat_key: { "api.AudioData": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.AudioData": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.allocationSize": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.clone": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.close": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "\
130", safari: "26", safari_ios: "26" } }, "api.AudioData.copyTo": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.duration": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.format": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.numberOfChannels": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.numberOfFrames": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioData.sampleRate": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.Audio\
Data.timestamp": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.AudioDecoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.close": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.configure": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.decode": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.decodeQueueSize": { baseline: false, support: { chrome: "\
94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.dequeue_event": { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.flush": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.isConfigSupported_static": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.reset": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioDecoder.state": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "\
130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.AudioEncoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.close": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.configure": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.configure.bitrateMode": { baseline: false, support: { chrome: "119", chrome_android: "119", edge: "119", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.configure.opus": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.configure.opus.opus_application": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } },
    "api.AudioEncoder.configure.opus.opus_signal": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.AudioEncoder.dequeue_event": { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.encode": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.encodeQueueSize": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.flush": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.isConfigSupported_static": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.reset": { baseline: false,
    support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.AudioEncoder.state": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk.EncodedAudioChunk": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk.byteLength": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk.copyTo": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk.duration": { baseline: false, support: { chrome: "\
94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk.timestamp": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedAudioChunk.type": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } }, "api.EncodedVideoChunk": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.EncodedVideoChunk.EncodedVideoChunk": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.EncodedVideoChunk.byteLength": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.EncodedVideoChunk.copyTo": { baseline: false, support: { chrome: "94", chrome_android: "\
94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.EncodedVideoChunk.duration": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.EncodedVideoChunk.timestamp": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.EncodedVideoChunk.type": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.ImageDecoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.ImageDecoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.close": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "\
133" } }, "api.ImageDecoder.complete": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.completed": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.decode": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.isTypeSupported_static": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.reset": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.tracks": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageDecoder.type": { baseline: false, support: { chrome: "94", chrome_android: "\
94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrack": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrack.animated": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrack.frameCount": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrack.repetitionCount": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrack.selected": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrackList": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrackList.length": { baseline: false, support: {
    chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrackList.ready": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrackList.selectedIndex": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.ImageTrackList.selectedTrack": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "133", firefox_android: "133" } }, "api.VideoColorSpace": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "15.4", safari_ios: "15.4" } }, "api.VideoColorSpace.VideoColorSpace": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "17", safari_ios: "17" } },
    "api.VideoColorSpace.fullRange": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "15.4", safari_ios: "15.4" } }, "api.VideoColorSpace.matrix": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "15.4", safari_ios: "15.4" } }, "api.VideoColorSpace.primaries": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "15.4", safari_ios: "15.4" } }, "api.VideoColorSpace.toJSON": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "15.4", safari_ios: "15.4" } }, "api.VideoColorSpace.transfer": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94",
    chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "15.4", safari_ios: "15.4" } }, "api.VideoDecoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.VideoDecoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.close": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.configure": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.configure.flip_option": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.VideoDecoder.configure.rotation_option": { baseline: false, support: { chrome: "138", chrome_android: "13\
8", edge: "138" } }, "api.VideoDecoder.decode": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.decodeQueueSize": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.dequeue_event": { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.flush": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.isConfigSupported_static": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.isConfigSupported_static.flip_option": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } },
    "api.VideoDecoder.isConfigSupported_static.rotation_option": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.VideoDecoder.reset": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoDecoder.state": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.VideoEncoder": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.close": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.configure": { baseline: false, support: {
    chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.dequeue_event": { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.encode": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.encodeQueueSize": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.flush": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.isConfigSupported_static": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.reset": { baseline: false, support: {
    chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoEncoder.state": { baseline: false, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.VideoFrame": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.VideoFrame.flip_option": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.VideoFrame.VideoFrame.rotation_option": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.VideoFrame.allocationSize": { baseline: "l\
ow", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.clone": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.close": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.codedHeight": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.codedRect": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "\
130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.codedWidth": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.colorSpace": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.copyTo": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.displayHeight": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.displayWidth": { baseline: "low", baseline_low_date: "2024-\
09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.duration": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.flip": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.VideoFrame.format": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } }, "api.VideoFrame.rotation": { baseline: false, support: { chrome: "138", chrome_android: "138", edge: "138" } }, "api.VideoFrame.timestamp": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "\
16.4" } }, "api.VideoFrame.visibleRect": { baseline: "low", baseline_low_date: "2024-09-03", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", firefox_android: "130", safari: "16.4", safari_ios: "16.4" } } }, support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "130", safari: "26", safari_ios: "26" } } }, webdriver: { compat_features: ["api.Navigator.webdriver", "webdriver.classic.AcceptAlert", "webdriver.classic.AddCookie", "webdriver.classic.Back", "webdriver.classic.CloseWindow", "webdriver.classic.DeleteAllCookies", "webdriver.classic.DeleteCookie", "webdriver.classic.DeleteSession", "webdriver.classic.DismissAlert", "webdriver.classic.ElementClear", "webdriver.classic.ElementClick", "webdriver.classic.ElementSendKeys", "webdriver.classic.ExecuteAsyncScript", "webdriver.classic.ExecuteScript", "webdriver.classic.FindElement", "webdriver.classic.FindElementFromElement", "webdriver.classic.FindElements", "webdriver.classic.FindElementsFromEleme\
nt", "webdriver.classic.Forward", "webdriver.classic.FullscreenWindow", "webdriver.classic.GetActiveElement", "webdriver.classic.GetAlertText", "webdriver.classic.GetAllCookies", "webdriver.classic.GetCurrentURL", "webdriver.classic.GetElementAttribute", "webdriver.classic.GetElementCSSValue", "webdriver.classic.GetElementProperty", "webdriver.classic.GetElementRect", "webdriver.classic.GetElementTagName", "webdriver.classic.GetElementText", "webdriver.classic.GetNamedCookie", "webdriver.classic.GetPageSource", "webdriver.classic.GetTimeouts", "webdriver.classic.GetTitle", "webdriver.classic.GetWindowHandle", "webdriver.classic.GetWindowHandles", "webdriver.classic.GetWindowRect", "webdriver.classic.IsElementEnabled", "webdriver.classic.IsElementSelected", "webdriver.classic.MaximizeWindow", "webdriver.classic.MinimizeWindow", "webdriver.classic.NavigateTo", "webdriver.classic.NewSession", "webdriver.classic.NewWindow", "webdriver.classic.PerformActions", "webdriver.classic.Refresh", "\
webdriver.classic.ReleaseActions", "webdriver.classic.SendAlertText", "webdriver.classic.SetTimeouts", "webdriver.classic.SetWindowRect", "webdriver.classic.Status", "webdriver.classic.SwitchToFrame", "webdriver.classic.SwitchToParentFrame", "webdriver.classic.SwitchToWindow", "webdriver.classic.TakeElementScreenshot", "webdriver.classic.TakeScreenshot"], description: "The WebDriver protocol allows out-of-process programs to inspect and control browsers to, for example, run tests of web applications. Also known as WebDriver classic.", description_html: "The WebDriver protocol allows out-of-process programs to inspect and control browsers to, for example, run tests of web applications. Also known as WebDriver classic.", group: ["webdriver"], kind: "feature", name: "WebDriver", spec: ["https://w3c.github.io/webdriver/"], status: { baseline: false, by_compat_key: { "api.Navigator.webdriver": { baseline: "high", baseline_high_date: "2020-11-09", baseline_low_date: "2018-05-09", support: { chrome: "\
63", chrome_android: "63", edge: "12", firefox: "60", firefox_android: "60", safari: "10.1", safari_ios: "10.3" } }, "webdriver.classic.AcceptAlert": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.AddCookie": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.Back": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.CloseWindow": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.DeleteAllCookies": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.DeleteCookie": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.DeleteSession": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.DismissAlert": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.\
ElementClear": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.ElementClick": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.ElementSendKeys": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.ExecuteAsyncScript": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.ExecuteScript": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.FindElement": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.FindElementFromElement": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.FindElements": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.FindElementsFromElement": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriv\
er.classic.Forward": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.FullscreenWindow": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetActiveElement": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetAlertText": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetAllCookies": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetCurrentURL": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetElementAttribute": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetElementCSSValue": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetElementProperty": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "we\
bdriver.classic.GetElementRect": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetElementTagName": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetElementText": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetNamedCookie": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetPageSource": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetTimeouts": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetTitle": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetWindowHandle": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.GetWindowHandles": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriv\
er.classic.GetWindowRect": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.IsElementEnabled": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.IsElementSelected": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.MaximizeWindow": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.MinimizeWindow": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.NavigateTo": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.NewSession": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.NewWindow": { baseline: false, support: { firefox: "66", firefox_android: "66" } }, "webdriver.classic.PerformActions": { baseline: false, support: { firefox: "55" } }, "webdriver.classic.Refresh": { baseline: false,
    support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.ReleaseActions": { baseline: false, support: { firefox: "55" } }, "webdriver.classic.SendAlertText": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.SetTimeouts": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.SetWindowRect": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.Status": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.SwitchToFrame": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.SwitchToParentFrame": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.SwitchToWindow": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } }, "webdriver.classic.TakeElementScreenshot": { baseline: false, support: { chrome: "65", edge: "\
79", firefox: "55" } }, "webdriver.classic.TakeScreenshot": { baseline: false, support: { chrome: "65", edge: "79", firefox: "55" } } }, support: { firefox: "66" } } }, "webdriver-bidi": { description: "WebDriver BiDi is a bidirectional protocol that allows a WebDriver client and a browser to communicate with each other.", description_html: "WebDriver BiDi is a bidirectional protocol that allows a WebDriver client and a browser to communicate with each other.", group: ["webdriver"], kind: "feature", name: "WebDriver BiDi", spec: ["https://w3c.github.io/webdriver-bidi/"], status: { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106", firefox: "102", firefox_android: "102" } } }, webgl: { caniuse: ["webgl"], compat_features: ["api.HTMLCanvasElement.getContext.webgl_context", "api.HTMLCanvasElement.getContext.webgl_context.options_alpha_parameter", "api.HTMLCanvasElement.getContext.webgl_context.options_failIfMajorPerformanceCaveat_parameter", "api.HTMLCanvasElem\
ent.getContext.webgl_context.options_powerPreference_parameter", "api.HTMLCanvasElement.webglcontextcreationerror_event", "api.HTMLCanvasElement.webglcontextlost_event", "api.HTMLCanvasElement.webglcontextrestored_event", "api.WebGLActiveInfo", "api.WebGLActiveInfo.name", "api.WebGLActiveInfo.size", "api.WebGLActiveInfo.type", "api.WebGLActiveInfo.worker_support", "api.WebGLBuffer", "api.WebGLBuffer.worker_support", "api.WebGLContextEvent", "api.WebGLContextEvent.WebGLContextEvent", "api.WebGLContextEvent.statusMessage", "api.WebGLContextEvent.worker_support", "api.WebGLFramebuffer", "api.WebGLFramebuffer.worker_support", "api.WebGLObject", "api.WebGLProgram", "api.WebGLProgram.worker_support", "api.WebGLRenderbuffer", "api.WebGLRenderbuffer.worker_support", "api.WebGLRenderingContext", "api.WebGLRenderingContext.activeTexture", "api.WebGLRenderingContext.attachShader", "api.WebGLRenderingContext.bindAttribLocation", "api.WebGLRenderingContext.bindBuffer", "api.WebGLRenderingContext.bi\
ndFramebuffer", "api.WebGLRenderingContext.bindRenderbuffer", "api.WebGLRenderingContext.bindTexture", "api.WebGLRenderingContext.blendColor", "api.WebGLRenderingContext.blendEquation", "api.WebGLRenderingContext.blendEquationSeparate", "api.WebGLRenderingContext.blendFunc", "api.WebGLRenderingContext.blendFuncSeparate", "api.WebGLRenderingContext.bufferData", "api.WebGLRenderingContext.bufferSubData", "api.WebGLRenderingContext.canvas", "api.WebGLRenderingContext.checkFramebufferStatus", "api.WebGLRenderingContext.clear", "api.WebGLRenderingContext.clearColor", "api.WebGLRenderingContext.clearDepth", "api.WebGLRenderingContext.clearStencil", "api.WebGLRenderingContext.colorMask", "api.WebGLRenderingContext.compileShader", "api.WebGLRenderingContext.compressedTexImage2D", "api.WebGLRenderingContext.compressedTexSubImage2D", "api.WebGLRenderingContext.copyTexImage2D", "api.WebGLRenderingContext.copyTexSubImage2D", "api.WebGLRenderingContext.createBuffer", "api.WebGLRenderingContext.crea\
teFramebuffer", "api.WebGLRenderingContext.createProgram", "api.WebGLRenderingContext.createRenderbuffer", "api.WebGLRenderingContext.createShader", "api.WebGLRenderingContext.createTexture", "api.WebGLRenderingContext.cullFace", "api.WebGLRenderingContext.deleteBuffer", "api.WebGLRenderingContext.deleteFramebuffer", "api.WebGLRenderingContext.deleteProgram", "api.WebGLRenderingContext.deleteRenderbuffer", "api.WebGLRenderingContext.deleteShader", "api.WebGLRenderingContext.deleteTexture", "api.WebGLRenderingContext.depthFunc", "api.WebGLRenderingContext.depthMask", "api.WebGLRenderingContext.depthRange", "api.WebGLRenderingContext.detachShader", "api.WebGLRenderingContext.disable", "api.WebGLRenderingContext.disableVertexAttribArray", "api.WebGLRenderingContext.drawArrays", "api.WebGLRenderingContext.drawElements", "api.WebGLRenderingContext.drawingBufferFormat", "api.WebGLRenderingContext.drawingBufferHeight", "api.WebGLRenderingContext.drawingBufferStorage", "api.WebGLRenderingConte\
xt.drawingBufferWidth", "api.WebGLRenderingContext.enable", "api.WebGLRenderingContext.enableVertexAttribArray", "api.WebGLRenderingContext.finish", "api.WebGLRenderingContext.flush", "api.WebGLRenderingContext.framebufferRenderbuffer", "api.WebGLRenderingContext.framebufferTexture2D", "api.WebGLRenderingContext.frontFace", "api.WebGLRenderingContext.generateMipmap", "api.WebGLRenderingContext.getActiveAttrib", "api.WebGLRenderingContext.getActiveUniform", "api.WebGLRenderingContext.getAttachedShaders", "api.WebGLRenderingContext.getAttribLocation", "api.WebGLRenderingContext.getBufferParameter", "api.WebGLRenderingContext.getContextAttributes", "api.WebGLRenderingContext.getError", "api.WebGLRenderingContext.getExtension", "api.WebGLRenderingContext.getFramebufferAttachmentParameter", "api.WebGLRenderingContext.getParameter", "api.WebGLRenderingContext.getProgramInfoLog", "api.WebGLRenderingContext.getProgramParameter", "api.WebGLRenderingContext.getRenderbufferParameter", "api.WebGLR\
enderingContext.getShaderInfoLog", "api.WebGLRenderingContext.getShaderParameter", "api.WebGLRenderingContext.getShaderPrecisionFormat", "api.WebGLRenderingContext.getShaderSource", "api.WebGLRenderingContext.getSupportedExtensions", "api.WebGLRenderingContext.getTexParameter", "api.WebGLRenderingContext.getUniform", "api.WebGLRenderingContext.getUniformLocation", "api.WebGLRenderingContext.getVertexAttrib", "api.WebGLRenderingContext.getVertexAttribOffset", "api.WebGLRenderingContext.hint", "api.WebGLRenderingContext.isBuffer", "api.WebGLRenderingContext.isContextLost", "api.WebGLRenderingContext.isEnabled", "api.WebGLRenderingContext.isFramebuffer", "api.WebGLRenderingContext.isProgram", "api.WebGLRenderingContext.isRenderbuffer", "api.WebGLRenderingContext.isShader", "api.WebGLRenderingContext.isTexture", "api.WebGLRenderingContext.lineWidth", "api.WebGLRenderingContext.linkProgram", "api.WebGLRenderingContext.pixelStorei", "api.WebGLRenderingContext.polygonOffset", "api.WebGLRender\
ingContext.readPixels", "api.WebGLRenderingContext.renderbufferStorage", "api.WebGLRenderingContext.sampleCoverage", "api.WebGLRenderingContext.scissor", "api.WebGLRenderingContext.shaderSource", "api.WebGLRenderingContext.stencilFunc", "api.WebGLRenderingContext.stencilFuncSeparate", "api.WebGLRenderingContext.stencilMask", "api.WebGLRenderingContext.stencilMaskSeparate", "api.WebGLRenderingContext.stencilOp", "api.WebGLRenderingContext.stencilOpSeparate", "api.WebGLRenderingContext.texImage2D", "api.WebGLRenderingContext.texParameterf", "api.WebGLRenderingContext.texParameteri", "api.WebGLRenderingContext.texSubImage2D", "api.WebGLRenderingContext.uniform1f", "api.WebGLRenderingContext.uniform1fv", "api.WebGLRenderingContext.uniform1i", "api.WebGLRenderingContext.uniform1iv", "api.WebGLRenderingContext.uniform2f", "api.WebGLRenderingContext.uniform2fv", "api.WebGLRenderingContext.uniform2i", "api.WebGLRenderingContext.uniform2iv", "api.WebGLRenderingContext.uniform3f", "api.WebGLRend\
eringContext.uniform3fv", "api.WebGLRenderingContext.uniform3i", "api.WebGLRenderingContext.uniform3iv", "api.WebGLRenderingContext.uniform4f", "api.WebGLRenderingContext.uniform4fv", "api.WebGLRenderingContext.uniform4i", "api.WebGLRenderingContext.uniform4iv", "api.WebGLRenderingContext.uniformMatrix2fv", "api.WebGLRenderingContext.uniformMatrix3fv", "api.WebGLRenderingContext.uniformMatrix4fv", "api.WebGLRenderingContext.useProgram", "api.WebGLRenderingContext.validateProgram", "api.WebGLRenderingContext.vertexAttrib1f", "api.WebGLRenderingContext.vertexAttrib1fv", "api.WebGLRenderingContext.vertexAttrib2f", "api.WebGLRenderingContext.vertexAttrib2fv", "api.WebGLRenderingContext.vertexAttrib3f", "api.WebGLRenderingContext.vertexAttrib3fv", "api.WebGLRenderingContext.vertexAttrib4f", "api.WebGLRenderingContext.vertexAttrib4fv", "api.WebGLRenderingContext.vertexAttribPointer", "api.WebGLRenderingContext.viewport", "api.WebGLRenderingContext.worker_support", "api.WebGLShader", "api.Web\
GLShader.worker_support", "api.WebGLShaderPrecisionFormat", "api.WebGLShaderPrecisionFormat.precision", "api.WebGLShaderPrecisionFormat.rangeMax", "api.WebGLShaderPrecisionFormat.rangeMin", "api.WebGLShaderPrecisionFormat.worker_support", "api.WebGLTexture", "api.WebGLTexture.worker_support", "api.WebGLUniformLocation", "api.WebGLUniformLocation.worker_support"], description: 'The WebGLRenderingContext API is the "webgl" rendering context for the <canvas> element. It represents a space for drawing two- and three-dimensional graphics and animations.', description_html: 'The <code>WebGLRenderingContext</code> API is the <code>"webgl"</code> rendering context for the <code>&#x3C;canvas></code> element. It represents a space for drawing two- and three-dimensional graphics and animations.', group: ["webgl"], kind: "feature", name: "WebGL", spec: ["https://registry.khronos.org/webgl/specs/latest/1.0/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07\
-29", by_compat_key: { "api.HTMLCanvasElement.getContext.webgl_context": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "24", firefox_android: "24", safari: "8", safari_ios: "8" } }, "api.HTMLCanvasElement.getContext.webgl_context.options_alpha_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "30", firefox_android: "30", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLCanvasElement.getContext.webgl_context.options_failIfMajorPerformanceCaveat_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "41", firefox_android: "41", safari: "10.1", safari_ios: "10.3" } }, "api.HTMLCanvasElement.getContext.webgl_context.options_powerPreference_parameter": { baseline: false,
    support: { safari: "10.1", safari_ios: "10.3" } }, "api.HTMLCanvasElement.webglcontextcreationerror_event": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "49", firefox_android: "49", safari: "5.1", safari_ios: "8" } }, "api.HTMLCanvasElement.webglcontextlost_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.HTMLCanvasElement.webglcontextrestored_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLActiveInfo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "\
25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLActiveInfo.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLActiveInfo.size": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLActiveInfo.type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLActiveInfo.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLBuffer": { baseline: "high", baseline_high_date: "2\
018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLBuffer.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLContextEvent": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "49", firefox_android: "49", safari: "5.1", safari_ios: "8" } }, "api.WebGLContextEvent.WebGLContextEvent": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "17", chrome_android: "25", edge: "12", firefox: "49", firefox_android: "49", safari: "6", safari_ios: "8" } }, "api.WebGLContextEvent.statusMessage": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "49", firefox_android: "\
49", safari: "5.1", safari_ios: "8" } }, "api.WebGLContextEvent.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLFramebuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLFramebuffer.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLObject": { baseline: false, support: { chrome: "126", chrome_android: "126", edge: "126" } }, "api.WebGLProgram": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLProgram.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLRenderbuffer": { baseline: "h\
igh", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderbuffer.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLRenderingContext": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.activeTexture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.attachShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bindAttribLocation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bindBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bindFramebuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bindRenderbuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bindTexture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.blendColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.blendEquation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.blendEquationSeparate": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.blendFunc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.blendFuncSeparate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bufferData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.bufferSubData": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.canvas": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.checkFramebufferStatus": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.clear": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingCon\
text.clearColor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.clearDepth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.clearStencil": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.colorMask": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } },
    "api.WebGLRenderingContext.compileShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.compressedTexImage2D": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.compressedTexSubImage2D": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.copyTexImage2D": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "\
4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.copyTexSubImage2D": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.createBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.createFramebuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.createProgram": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9",
    chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.createRenderbuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.createShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.createTexture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.cullFace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.deleteBuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.deleteFramebuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.deleteProgram": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.deleteRenderbuffer": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.deleteShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.deleteTexture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.depthFunc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.depthMask": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.depthRange": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.detachShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.disable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext\
.disableVertexAttribArray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.drawArrays": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.drawElements": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.drawingBufferFormat": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.WebGLRenderingContext.drawingBufferHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.drawingBufferStorage": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.WebGLRenderingContext.drawingBufferWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.enable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.enableVertexAttribArray": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "\
4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.finish": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.flush": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.framebufferRenderbuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.framebufferTexture2D": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "\
25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.frontFace": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.generateMipmap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getActiveAttrib": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getActiveUniform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getAttachedShaders": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getAttribLocation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getBufferParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getContextAttributes": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getError": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getExtension": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getFramebufferAttachmentParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.get\
Parameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getProgramInfoLog": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getProgramParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getRenderbufferParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "\
5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getShaderInfoLog": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getShaderParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getShaderPrecisionFormat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getShaderSource": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "2\
5", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getSupportedExtensions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getTexParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getUniform": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getUniformLocation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "20\
15-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getVertexAttrib": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.getVertexAttribOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.hint": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isBuffer": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isContextLost": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isEnabled": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isFramebuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isProgram": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isRenderbuffer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.isTexture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingConte\
xt.lineWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.linkProgram": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.pixelStorei": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.polygonOffset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "\
8" } }, "api.WebGLRenderingContext.readPixels": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.renderbufferStorage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.sampleCoverage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.scissor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "\
4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.shaderSource": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.stencilFunc": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.stencilFuncSeparate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.stencilMask": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.stencilMaskSeparate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.stencilOp": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.stencilOpSeparate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.texImage2D": { baseline: false, support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", safari: "\
5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.texParameterf": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.texParameteri": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.texSubImage2D": { baseline: false, support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform1f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.\
uniform1fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform1i": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform1iv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform2f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "\
api.WebGLRenderingContext.uniform2fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform2i": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform2iv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform3f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.\
1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform3fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform3i": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform3iv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform4f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "\
4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform4fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform4i": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniform4iv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniformMatrix2fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12",
    firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniformMatrix3fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.uniformMatrix4fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.useProgram": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.validateProgram": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib1f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib1fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib2f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib2fv": { baseline: "high", baseline_high_date: "2018-01\
-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib3f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib3fv": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib4f": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttrib4fv": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.vertexAttribPointer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.viewport": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLRenderingContext.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLShader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLShader.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLShaderPrecisionFormat": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLShaderPrecisionFormat.precision": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLShaderPrecisionFormat.rangeMax": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLShaderPrecisionFormat.rangeMin": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLShaderPrecisionFormat.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLTexture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLTexture.worker_support": { baseline: false, support: { firefox: "105", firefox_android: "105" } }, "api.WebGLUniformLocation": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } }, "api.WebGLUniformLocation.worker_support": { baseline: false, support: {
    firefox: "105", firefox_android: "105" } } }, support: { chrome: "9", chrome_android: "25", edge: "12", firefox: "4", firefox_android: "4", safari: "5.1", safari_ios: "8" } } }, "webgl-color-buffer-float": { compat_features: ["api.WEBGL_color_buffer_float"], description: "The WEBGL_color_buffer_float extension for WebGL 1.0 contexts adds the 32-bit floating-point type RGBA32F as a color-renderable format.", description_html: "The <code>WEBGL_color_buffer_float</code> extension for WebGL 1.0 contexts adds the 32-bit floating-point type <code>RGBA32F</code> as a color-renderable format.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_color_buffer_float WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_color_buffer_float/"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "api.WEBGL_color_buffer_float": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-\
09-20", support: { chrome: "63", chrome_android: "63", edge: "17", firefox: "30", firefox_android: "30", safari: "14", safari_ios: "15" } } }, support: { chrome: "63", chrome_android: "63", edge: "17", firefox: "30", firefox_android: "30", safari: "14", safari_ios: "15" } } }, "webgl-color-management": { compat_features: ["api.WebGLRenderingContext.drawingBufferColorSpace", "api.WebGLRenderingContext.unpackColorSpace"], description: 'The drawingBufferColorSpace and unpackColorSpace properties of WebGLRenderingContext sets the color representation for the buffer and imported textures, such as "srgb" or "display-p3".', description_html: 'The <code>drawingBufferColorSpace</code> and <code>unpackColorSpace</code> properties of <code>WebGLRenderingContext</code> sets the color representation for the buffer and imported textures, such as <code>"srgb"</code> or <code>"display-p3"</code>.', group: ["webgl"], kind: "feature", name: "Color management for WebGL", spec: ["https://registry.khronos.\
org/webgl/specs/latest/1.0/#DOM-WebGLRenderingContext-drawingBufferColorSpace", "https://registry.khronos.org/webgl/specs/latest/1.0/#DOM-WebGLRenderingContext-unpackColorSpace"], status: { baseline: "low", baseline_low_date: "2024-10-29", by_compat_key: { "api.WebGLRenderingContext.drawingBufferColorSpace": { baseline: "low", baseline_low_date: "2024-10-29", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "132", firefox_android: "132", safari: "16.4", safari_ios: "16.4" } }, "api.WebGLRenderingContext.unpackColorSpace": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "132", firefox_android: "132" } } }, support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "132", firefox_android: "132", safari: "16.4", safari_ios: "16.4" } } }, "webgl-compressed-texture-astc": { compat_features: ["api.WEBGL_compressed_texture_astc", "api.WEBGL_compressed_texture_astc.getSupportedProfiles"], description: "The WEBGL_compre\
ssed_texture_astc extension for WebGL 1.0 and 2.0 contexts adds the Adaptive Scalable Texture Compression format to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>WEBGL_compressed_texture_astc</code> extension for WebGL 1.0 and 2.0 contexts adds the Adaptive Scalable Texture Compression format to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()</code>.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_compressed_texture_astc WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.WEBGL_compressed_texture_astc": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "53", firefox_android: "53", safari: "12", safari_ios: "12" } }, "api.WEBGL_compressed_te\
xture_astc.getSupportedProfiles": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "53", firefox_android: "53", safari: "12", safari_ios: "12" } } }, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "53", firefox_android: "53", safari: "12", safari_ios: "12" } } }, "webgl-compressed-texture-etc": { compat_features: ["api.WEBGL_compressed_texture_etc"], description: "The WEBGL_compressed_texture_etc extension for WebGL 1.0 and 2.0 contexts adds many ETC2 and EAC compressed texture formats to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>WEBGL_compressed_texture_etc</code> extension for WebGL 1.0 and 2.0 contexts adds many ETC2 and EAC compressed texture formats to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()</code>.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_compressed_texture_etc \
WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/"], status: { baseline: false, by_compat_key: { "api.WEBGL_compressed_texture_etc": { baseline: false, support: { chrome: "63", chrome_android: "63", edge: "79", firefox_android: "51", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "63", chrome_android: "63", edge: "79", firefox_android: "51", safari: "13.1", safari_ios: "13.4" } } }, "webgl-compressed-texture-etc1": { compat_features: ["api.WEBGL_compressed_texture_etc1"], description: "The WEBGL_compressed_texture_etc1 extension for WebGL 1.0 and 2.0 contexts adds the ETC1 compressed texture format to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>WEBGL_compressed_texture_etc1</code> extension for WebGL 1.0 and 2.0 contexts adds the ETC1 compressed texture format to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()</code>.", group: ["webgl-extensions"], kind: "f\
eature", name: "WEBGL_compressed_texture_etc1 WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc1/"], status: { baseline: false, by_compat_key: { "api.WEBGL_compressed_texture_etc1": { baseline: false, support: { chrome: "49", chrome_android: "49", edge: "79", firefox_android: "30", safari: "13.1", safari_ios: "13.4" } } }, support: { chrome: "49", chrome_android: "49", edge: "79", firefox_android: "30", safari: "13.1", safari_ios: "13.4" } } }, "webgl-compressed-texture-pvrtc": { compat_features: ["api.WEBGL_compressed_texture_pvrtc"], description: "The WEBGL_compressed_texture_pvrtc extension for WebGL 1.0 and 2.0 contexts adds PVRTC compressed texture formats to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>WEBGL_compressed_texture_pvrtc</code> extension for WebGL 1.0 and 2.0 contexts adds PVRTC compressed texture formats to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()\
</code>.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_compressed_texture_pvrtc WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/"], status: { baseline: false, by_compat_key: { "api.WEBGL_compressed_texture_pvrtc": { baseline: false, support: { chrome_android: "28", safari: "7", safari_ios: "7" } } }, support: { chrome_android: "28", safari: "7", safari_ios: "7" } } }, "webgl-compressed-texture-s3tc": { compat_features: ["api.WEBGL_compressed_texture_s3tc"], description: "The WEBGL_compressed_texture_s3tc extension for WebGL 1.0 and 2.0 contexts adds S3TC compressed texture formats to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>WEBGL_compressed_texture_s3tc</code> extension for WebGL 1.0 and 2.0 contexts adds S3TC compressed texture formats to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()</code>.", group: ["webgl-extensions"], kind: "feature", name: "W\
EBGL_compressed_texture_s3tc WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc/"], status: { baseline: false, by_compat_key: { "api.WEBGL_compressed_texture_s3tc": { baseline: false, support: { chrome: "26", edge: "12", firefox: "22", safari: "8" } } }, support: { chrome: "26", edge: "12", firefox: "22", safari: "8" } } }, "webgl-compressed-texture-s3tc-srgb": { compat_features: ["api.WEBGL_compressed_texture_s3tc_srgb"], description: "The WEBGL_compressed_texture_s3tc_srgb extension for WebGL 1.0 and 2.0 contexts adds S3TC compressed texture formats for the sRGB colorspace to compressedTexImage2D() and compressedTexSubImage2D().", description_html: "The <code>WEBGL_compressed_texture_s3tc_srgb</code> extension for WebGL 1.0 and 2.0 contexts adds S3TC compressed texture formats for the sRGB colorspace to <code>compressedTexImage2D()</code> and <code>compressedTexSubImage2D()</code>.", group: ["webgl-extensions"], kind: "feature", name: "\
WEBGL_compressed_texture_s3tc_srgb WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/"], status: { baseline: false, by_compat_key: { "api.WEBGL_compressed_texture_s3tc_srgb": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "80", firefox: "55", safari: "14.1", safari_ios: "14.5" } } }, support: { chrome: "60", chrome_android: "60", edge: "80", firefox: "55", safari: "14.1", safari_ios: "14.5" } } }, "webgl-debug-renderer-info": { compat_features: ["api.WEBGL_debug_renderer_info"], description: "The WEBGL_debug_renderer_info extension for WebGL 1.0 and 2.0 contexts exposes information about the graphics driver for debugging purposes.", description_html: "The <code>WEBGL_debug_renderer_info</code> extension for WebGL 1.0 and 2.0 contexts exposes information about the graphics driver for debugging purposes.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_debug_renderer_info WebGL extension", spec: [
    "https://registry.khronos.org/webgl/extensions/WEBGL_debug_renderer_info/"], status: { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", by_compat_key: { "api.WEBGL_debug_renderer_info": { baseline: "high", baseline_high_date: "2019-10-19", baseline_low_date: "2017-04-19", support: { chrome: "33", chrome_android: "33", edge: "12", firefox: "53", firefox_android: "53", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "33", chrome_android: "33", edge: "12", firefox: "53", firefox_android: "53", safari: "9.1", safari_ios: "9.3" } } }, "webgl-debug-shaders": { compat_features: ["api.WEBGL_debug_shaders", "api.WEBGL_debug_shaders.getTranslatedShaderSource"], description: "The WEBGL_debug_shaders extension for WebGL 1.0 and 2.0 contexts adds the getTranslatedShaderSource() method to debug shaders from privileged contexts.", description_html: "The <code>WEBGL_debug_shaders</code> extension for WebGL 1.0 and 2.0 contexts adds the <code>getTransl\
atedShaderSource()</code> method to debug shaders from privileged contexts.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_debug_shaders WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_debug_shaders/"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "api.WEBGL_debug_shaders": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "56", firefox_android: "56", safari: "14", safari_ios: "14" } }, "api.WEBGL_debug_shaders.getTranslatedShaderSource": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "56", firefox_android: "56", safari: "14", safari_ios: "14" } } }, support: { chrome: "47", chrome_android: "47", edge: "79", firefox: "56", firefox_android: "56", safari: "14", safari_ios: "\
14" } } }, "webgl-depth-texture": { compat_features: ["api.WEBGL_depth_texture"], description: "The WEBGL_depth_texture extension for WebGL 1.0 contexts defines 2D depth and depth-stencil textures.", description_html: "The <code>WEBGL_depth_texture</code> extension for WebGL 1.0 contexts defines 2D depth and depth-stencil textures.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_depth_texture WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_depth_texture/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.WEBGL_depth_texture": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } } }, support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } } }, "we\
bgl-desynchronized": { compat_features: ["api.HTMLCanvasElement.getContext.webgl_context.options_desynchronized_parameter"], description: "The optional desynchronized parameter of a canvas's getContext() method permits the browser to draw a WebGL canvas independently of the event loop. This can reduce drawing latency.", description_html: "The optional <code>desynchronized</code> parameter of a canvas's <code>getContext()</code> method permits the browser to draw a WebGL canvas independently of the event loop. This can reduce drawing latency.", group: ["webgl"], kind: "feature", name: "Desynchronized WebGL canvas", spec: ["https://registry.khronos.org/webgl/specs/latest/1.0/#5.2.1"], status: { baseline: false, by_compat_key: { "api.HTMLCanvasElement.getContext.webgl_context.options_desynchronized_parameter": { baseline: false, support: { chrome: "81", chrome_android: "75", edge: "79" } } }, support: { chrome: "81", chrome_android: "75", edge: "79" } } }, "webgl-draw-buffers": { compat_features: [
    "api.WEBGL_draw_buffers", "api.WEBGL_draw_buffers.drawBuffersWEBGL"], description: "The WEBGL_draw_buffers extension for WebGL 1.0 contexts enables a fragment shader to write to several textures, which is useful for deferred shading, for example.", description_html: "The <code>WEBGL_draw_buffers</code> extension for WebGL 1.0 contexts enables a fragment shader to write to several textures, which is useful for deferred shading, for example.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_draw_buffers WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_draw_buffers/"], status: { baseline: false, by_compat_key: { "api.WEBGL_draw_buffers": { baseline: false, support: { chrome: "36", edge: "17", firefox: "28", safari: "9", safari_ios: "15" } }, "api.WEBGL_draw_buffers.drawBuffersWEBGL": { baseline: false, support: { chrome: "36", edge: "17", firefox: "28", safari: "9", safari_ios: "15" } } }, support: { chrome: "36", edge: "17", firefox: "28", safari: "\
9", safari_ios: "15" } } }, "webgl-lose-context": { compat_features: ["api.WEBGL_lose_context", "api.WEBGL_lose_context.loseContext", "api.WEBGL_lose_context.restoreContext"], description: "The WEBGL_lose_context extension for WebGL 1.0 and 2.0 contexts simulates losing and restoring a WebGLRenderingContext or WebGL2RenderingContext.", description_html: "The <code>WEBGL_lose_context</code> extension for WebGL 1.0 and 2.0 contexts simulates losing and restoring a <code>WebGLRenderingContext</code> or <code>WebGL2RenderingContext</code>.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_lose_context WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_lose_context/"], status: { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", by_compat_key: { "api.WEBGL_lose_context": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "26", chrome_android: "26", edge: "17", firefox: "\
22", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.WEBGL_lose_context.loseContext": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "26", chrome_android: "26", edge: "17", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } }, "api.WEBGL_lose_context.restoreContext": { baseline: "high", baseline_high_date: "2020-10-30", baseline_low_date: "2018-04-30", support: { chrome: "26", chrome_android: "26", edge: "17", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } } }, support: { chrome: "26", chrome_android: "26", edge: "17", firefox: "22", firefox_android: "22", safari: "8", safari_ios: "8" } } }, "webgl-multi-draw": { compat_features: ["api.WEBGL_multi_draw", "api.WEBGL_multi_draw.multiDrawArraysInstancedWEBGL", "api.WEBGL_multi_draw.multiDrawArraysWEBGL", "api.WEBGL_multi_draw.multiDrawElementsInstancedWEBGL", "api.WEBGL_multi_draw.multiDrawElementsWEBGL"], description: "The WEB\
GL_multi_draw extension for WebGL 1.0 and 2.0 contexts renders more than one primitive with a single function call.", description_html: "The <code>WEBGL_multi_draw</code> extension for WebGL 1.0 and 2.0 contexts renders more than one primitive with a single function call.", group: ["webgl-extensions"], kind: "feature", name: "WEBGL_multi_draw WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/WEBGL_multi_draw/"], status: { baseline: false, by_compat_key: { "api.WEBGL_multi_draw": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", safari: "15", safari_ios: "15" } }, "api.WEBGL_multi_draw.multiDrawArraysInstancedWEBGL": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", safari: "15", safari_ios: "15" } }, "api.WEBGL_multi_draw.multiDrawArraysWEBGL": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", safari: "15", safari_ios: "15" } }, "api.WEBGL_multi_draw.multiDrawElementsInstancedWEBGL": {
    baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", safari: "15", safari_ios: "15" } }, "api.WEBGL_multi_draw.multiDrawElementsWEBGL": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", safari: "15", safari_ios: "15" } } }, support: { chrome: "86", chrome_android: "86", edge: "86", safari: "15", safari_ios: "15" } } }, "webgl-oes-draw-buffers-indexed": { compat_features: ["api.OES_draw_buffers_indexed", "api.OES_draw_buffers_indexed.blendEquationSeparateiOES", "api.OES_draw_buffers_indexed.blendEquationiOES", "api.OES_draw_buffers_indexed.blendFuncSeparateiOES", "api.OES_draw_buffers_indexed.blendFunciOES", "api.OES_draw_buffers_indexed.colorMaskiOES", "api.OES_draw_buffers_indexed.disableiOES", "api.OES_draw_buffers_indexed.enableiOES"], description: "The OES_draw_buffers_indexed extension for WebGL 2.0 contexts allows you to control blending on a per-color basis when writing to multiple color buffers simultaneously.", description_html: "\
The <code>OES_draw_buffers_indexed</code> extension for WebGL 2.0 contexts allows you to control blending on a per-color basis when writing to multiple color buffers simultaneously.", group: ["webgl-extensions"], kind: "feature", name: "OES_draw_buffers_indexed WebGL extension", spec: ["https://registry.khronos.org/webgl/extensions/OES_draw_buffers_indexed/"], status: { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", by_compat_key: { "api.OES_draw_buffers_indexed": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } }, "api.OES_draw_buffers_indexed.blendEquationSeparateiOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "\
16" } }, "api.OES_draw_buffers_indexed.blendEquationiOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } }, "api.OES_draw_buffers_indexed.blendFuncSeparateiOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } }, "api.OES_draw_buffers_indexed.blendFunciOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } }, "api.OES_draw_buffers_indexed.colorMaskiOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "\
100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } }, "api.OES_draw_buffers_indexed.disableiOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } }, "api.OES_draw_buffers_indexed.enableiOES": { baseline: "high", baseline_high_date: "2025-06-13", baseline_low_date: "2022-12-13", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } } }, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "108", firefox_android: "108", safari: "16", safari_ios: "16" } } }, "webgl-sab": { compat_features: ["api.WebGL2RenderingContext.bufferData.srcData_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.bufferSubData.srcData_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.\
clearBufferfv.values_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.clearBufferiv.values_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.clearBufferuiv.values_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.compressedTexImage2D.pixels_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.compressedTexImage3D.pixels_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.compressedTexSubImage2D.srcData_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.getBufferSubData.dstData_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.readPixels.pixels_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.texImage3D.srcData_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.texSubImage3D.srcData_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix2fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix2x3fv.data_param_accepts_SharedArrayBuffer", "\
api.WebGL2RenderingContext.uniformMatrix2x4fv.data_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix3fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix3x2fv.data_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix3x4fv.data_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix4fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix4x2fv.data_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.uniformMatrix4x3fv.data_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.vertexAttrib1fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.vertexAttrib2fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.vertexAttrib3fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.vertexAttrib4fv.value_param_accepts_SharedArrayBuffer", "api.WebGL2RenderingContext.vertexAttribI4iv.value_param_accepts_\
SharedArrayBuffer", "api.WebGL2RenderingContext.vertexAttribI4uiv.value_param_accepts_SharedArrayBuffer", "api.WebGLRenderingContext.compressedTexImage2D.pixels_param_accepts_SharedArrayBuffer", "api.WebGLRenderingContext.vertexAttrib1fv.value_param_accepts_SharedArrayBuffer", "api.WebGLRenderingContext.vertexAttrib2fv.value_param_accepts_SharedArrayBuffer", "api.WebGLRenderingContext.vertexAttrib3fv.value_param_accepts_SharedArrayBuffer", "api.WebGLRenderingContext.vertexAttrib4fv.value_param_accepts_SharedArrayBuffer"], description: "SharedArrayBuffer objects can be used in WebGL APIs that previously only worked with ArrayBuffer objects.", description_html: "<code>SharedArrayBuffer</code> objects can be used in WebGL APIs that previously only worked with <code>ArrayBuffer</code> objects.", group: ["webgl"], kind: "feature", name: "SharedArrayBuffer in WebGL", spec: ["https://registry.khronos.org/webgl/specs/latest/1.0/", "https://registry.khronos.org/webgl/specs/latest/2.0/"], status: {
    baseline: false, by_compat_key: { "api.WebGL2RenderingContext.bufferData.srcData_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.bufferSubData.srcData_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.clearBufferfv.values_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.clearBufferiv.values_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.clearBufferuiv.values_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "\
79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.compressedTexImage2D.pixels_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.compressedTexImage3D.pixels_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.compressedTexSubImage2D.srcData_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.getBufferSubData.dstData_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.readPixels.pixels_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "\
60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.texImage3D.srcData_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.texSubImage3D.srcData_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix2fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix2x3fv.data_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix2x4fv.data_param_accepts_SharedArrayBuffer": { baseline: false,
    support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix3fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix3x2fv.data_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix3x4fv.data_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix4fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix4x2fv.data_param_accepts_SharedA\
rrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.uniformMatrix4x3fv.data_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.vertexAttrib1fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.vertexAttrib2fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.vertexAttrib3fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.vertexAttrib4fv.value\
_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.vertexAttribI4iv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGL2RenderingContext.vertexAttribI4uiv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGLRenderingContext.compressedTexImage2D.pixels_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGLRenderingContext.vertexAttrib1fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGLRenderingCon\
text.vertexAttrib2fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGLRenderingContext.vertexAttrib3fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } }, "api.WebGLRenderingContext.vertexAttrib4fv.value_param_accepts_SharedArrayBuffer": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } } }, support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "79", firefox_android: "79" } } }, webgl2: { caniuse: ["webgl2"], compat_features: ["api.HTMLCanvasElement.getContext.webgl2_context", "api.HTMLCanvasElement.getContext.webgl2_context.options_alpha_parameter", "api.HTMLCanvasElement.getContext.webgl2_context.options_failIfMajorPerformanceCaveat_parameter", "api.HTMLCanvasElement.getContext.w\
ebgl2_context.options_powerPreference_parameter", "api.WebGL2RenderingContext", "api.WebGL2RenderingContext.activeTexture", "api.WebGL2RenderingContext.attachShader", "api.WebGL2RenderingContext.beginQuery", "api.WebGL2RenderingContext.beginTransformFeedback", "api.WebGL2RenderingContext.bindAttribLocation", "api.WebGL2RenderingContext.bindBuffer", "api.WebGL2RenderingContext.bindBufferBase", "api.WebGL2RenderingContext.bindBufferRange", "api.WebGL2RenderingContext.bindFramebuffer", "api.WebGL2RenderingContext.bindRenderbuffer", "api.WebGL2RenderingContext.bindSampler", "api.WebGL2RenderingContext.bindTexture", "api.WebGL2RenderingContext.bindTransformFeedback", "api.WebGL2RenderingContext.bindVertexArray", "api.WebGL2RenderingContext.blendColor", "api.WebGL2RenderingContext.blendEquation", "api.WebGL2RenderingContext.blendEquationSeparate", "api.WebGL2RenderingContext.blendFunc", "api.WebGL2RenderingContext.blendFuncSeparate", "api.WebGL2RenderingContext.blitFramebuffer", "api.WebGL2R\
enderingContext.bufferData", "api.WebGL2RenderingContext.bufferSubData", "api.WebGL2RenderingContext.canvas", "api.WebGL2RenderingContext.checkFramebufferStatus", "api.WebGL2RenderingContext.clear", "api.WebGL2RenderingContext.clearBufferfi", "api.WebGL2RenderingContext.clearBufferfv", "api.WebGL2RenderingContext.clearBufferiv", "api.WebGL2RenderingContext.clearBufferuiv", "api.WebGL2RenderingContext.clearColor", "api.WebGL2RenderingContext.clearDepth", "api.WebGL2RenderingContext.clearStencil", "api.WebGL2RenderingContext.clientWaitSync", "api.WebGL2RenderingContext.colorMask", "api.WebGL2RenderingContext.compileShader", "api.WebGL2RenderingContext.compressedTexImage2D", "api.WebGL2RenderingContext.compressedTexImage3D", "api.WebGL2RenderingContext.compressedTexSubImage2D", "api.WebGL2RenderingContext.compressedTexSubImage3D", "api.WebGL2RenderingContext.copyBufferSubData", "api.WebGL2RenderingContext.copyTexImage2D", "api.WebGL2RenderingContext.copyTexSubImage2D", "api.WebGL2Renderin\
gContext.copyTexSubImage3D", "api.WebGL2RenderingContext.createBuffer", "api.WebGL2RenderingContext.createFramebuffer", "api.WebGL2RenderingContext.createProgram", "api.WebGL2RenderingContext.createQuery", "api.WebGL2RenderingContext.createRenderbuffer", "api.WebGL2RenderingContext.createSampler", "api.WebGL2RenderingContext.createShader", "api.WebGL2RenderingContext.createTexture", "api.WebGL2RenderingContext.createTransformFeedback", "api.WebGL2RenderingContext.createVertexArray", "api.WebGL2RenderingContext.cullFace", "api.WebGL2RenderingContext.deleteBuffer", "api.WebGL2RenderingContext.deleteFramebuffer", "api.WebGL2RenderingContext.deleteProgram", "api.WebGL2RenderingContext.deleteQuery", "api.WebGL2RenderingContext.deleteRenderbuffer", "api.WebGL2RenderingContext.deleteSampler", "api.WebGL2RenderingContext.deleteShader", "api.WebGL2RenderingContext.deleteSync", "api.WebGL2RenderingContext.deleteTexture", "api.WebGL2RenderingContext.deleteTransformFeedback", "api.WebGL2RenderingC\
ontext.deleteVertexArray", "api.WebGL2RenderingContext.depthFunc", "api.WebGL2RenderingContext.depthMask", "api.WebGL2RenderingContext.depthRange", "api.WebGL2RenderingContext.detachShader", "api.WebGL2RenderingContext.disable", "api.WebGL2RenderingContext.disableVertexAttribArray", "api.WebGL2RenderingContext.drawArrays", "api.WebGL2RenderingContext.drawArraysInstanced", "api.WebGL2RenderingContext.drawBuffers", "api.WebGL2RenderingContext.drawElements", "api.WebGL2RenderingContext.drawElementsInstanced", "api.WebGL2RenderingContext.drawRangeElements", "api.WebGL2RenderingContext.drawingBufferFormat", "api.WebGL2RenderingContext.drawingBufferHeight", "api.WebGL2RenderingContext.drawingBufferStorage", "api.WebGL2RenderingContext.drawingBufferWidth", "api.WebGL2RenderingContext.enable", "api.WebGL2RenderingContext.enableVertexAttribArray", "api.WebGL2RenderingContext.endQuery", "api.WebGL2RenderingContext.endTransformFeedback", "api.WebGL2RenderingContext.fenceSync", "api.WebGL2Renderin\
gContext.finish", "api.WebGL2RenderingContext.flush", "api.WebGL2RenderingContext.framebufferRenderbuffer", "api.WebGL2RenderingContext.framebufferTexture2D", "api.WebGL2RenderingContext.framebufferTextureLayer", "api.WebGL2RenderingContext.frontFace", "api.WebGL2RenderingContext.generateMipmap", "api.WebGL2RenderingContext.getActiveAttrib", "api.WebGL2RenderingContext.getActiveUniform", "api.WebGL2RenderingContext.getActiveUniformBlockName", "api.WebGL2RenderingContext.getActiveUniformBlockParameter", "api.WebGL2RenderingContext.getActiveUniforms", "api.WebGL2RenderingContext.getAttachedShaders", "api.WebGL2RenderingContext.getAttribLocation", "api.WebGL2RenderingContext.getBufferParameter", "api.WebGL2RenderingContext.getBufferSubData", "api.WebGL2RenderingContext.getContextAttributes", "api.WebGL2RenderingContext.getError", "api.WebGL2RenderingContext.getExtension", "api.WebGL2RenderingContext.getFragDataLocation", "api.WebGL2RenderingContext.getFramebufferAttachmentParameter", "api\
.WebGL2RenderingContext.getIndexedParameter", "api.WebGL2RenderingContext.getInternalformatParameter", "api.WebGL2RenderingContext.getParameter", "api.WebGL2RenderingContext.getProgramInfoLog", "api.WebGL2RenderingContext.getProgramParameter", "api.WebGL2RenderingContext.getQuery", "api.WebGL2RenderingContext.getQueryParameter", "api.WebGL2RenderingContext.getRenderbufferParameter", "api.WebGL2RenderingContext.getSamplerParameter", "api.WebGL2RenderingContext.getShaderInfoLog", "api.WebGL2RenderingContext.getShaderParameter", "api.WebGL2RenderingContext.getShaderPrecisionFormat", "api.WebGL2RenderingContext.getShaderSource", "api.WebGL2RenderingContext.getSupportedExtensions", "api.WebGL2RenderingContext.getSyncParameter", "api.WebGL2RenderingContext.getTexParameter", "api.WebGL2RenderingContext.getTransformFeedbackVarying", "api.WebGL2RenderingContext.getUniform", "api.WebGL2RenderingContext.getUniformBlockIndex", "api.WebGL2RenderingContext.getUniformIndices", "api.WebGL2RenderingCon\
text.getUniformLocation", "api.WebGL2RenderingContext.getVertexAttrib", "api.WebGL2RenderingContext.getVertexAttribOffset", "api.WebGL2RenderingContext.hint", "api.WebGL2RenderingContext.invalidateFramebuffer", "api.WebGL2RenderingContext.invalidateSubFramebuffer", "api.WebGL2RenderingContext.isBuffer", "api.WebGL2RenderingContext.isContextLost", "api.WebGL2RenderingContext.isEnabled", "api.WebGL2RenderingContext.isFramebuffer", "api.WebGL2RenderingContext.isProgram", "api.WebGL2RenderingContext.isQuery", "api.WebGL2RenderingContext.isRenderbuffer", "api.WebGL2RenderingContext.isSampler", "api.WebGL2RenderingContext.isShader", "api.WebGL2RenderingContext.isSync", "api.WebGL2RenderingContext.isTexture", "api.WebGL2RenderingContext.isTransformFeedback", "api.WebGL2RenderingContext.isVertexArray", "api.WebGL2RenderingContext.lineWidth", "api.WebGL2RenderingContext.linkProgram", "api.WebGL2RenderingContext.pauseTransformFeedback", "api.WebGL2RenderingContext.pixelStorei", "api.WebGL2Render\
ingContext.polygonOffset", "api.WebGL2RenderingContext.readBuffer", "api.WebGL2RenderingContext.readPixels", "api.WebGL2RenderingContext.renderbufferStorage", "api.WebGL2RenderingContext.renderbufferStorageMultisample", "api.WebGL2RenderingContext.resumeTransformFeedback", "api.WebGL2RenderingContext.sampleCoverage", "api.WebGL2RenderingContext.samplerParameterf", "api.WebGL2RenderingContext.samplerParameteri", "api.WebGL2RenderingContext.scissor", "api.WebGL2RenderingContext.shaderSource", "api.WebGL2RenderingContext.stencilFunc", "api.WebGL2RenderingContext.stencilFuncSeparate", "api.WebGL2RenderingContext.stencilMask", "api.WebGL2RenderingContext.stencilMaskSeparate", "api.WebGL2RenderingContext.stencilOp", "api.WebGL2RenderingContext.stencilOpSeparate", "api.WebGL2RenderingContext.texImage2D", "api.WebGL2RenderingContext.texImage3D", "api.WebGL2RenderingContext.texParameterf", "api.WebGL2RenderingContext.texParameteri", "api.WebGL2RenderingContext.texStorage2D", "api.WebGL2Renderin\
gContext.texStorage3D", "api.WebGL2RenderingContext.texSubImage2D", "api.WebGL2RenderingContext.texSubImage3D", "api.WebGL2RenderingContext.transformFeedbackVaryings", "api.WebGL2RenderingContext.uniform1f", "api.WebGL2RenderingContext.uniform1fv", "api.WebGL2RenderingContext.uniform1i", "api.WebGL2RenderingContext.uniform1iv", "api.WebGL2RenderingContext.uniform1ui", "api.WebGL2RenderingContext.uniform1uiv", "api.WebGL2RenderingContext.uniform2f", "api.WebGL2RenderingContext.uniform2fv", "api.WebGL2RenderingContext.uniform2i", "api.WebGL2RenderingContext.uniform2iv", "api.WebGL2RenderingContext.uniform2ui", "api.WebGL2RenderingContext.uniform2uiv", "api.WebGL2RenderingContext.uniform3f", "api.WebGL2RenderingContext.uniform3fv", "api.WebGL2RenderingContext.uniform3i", "api.WebGL2RenderingContext.uniform3iv", "api.WebGL2RenderingContext.uniform3ui", "api.WebGL2RenderingContext.uniform3uiv", "api.WebGL2RenderingContext.uniform4f", "api.WebGL2RenderingContext.uniform4fv", "api.WebGL2Rende\
ringContext.uniform4i", "api.WebGL2RenderingContext.uniform4iv", "api.WebGL2RenderingContext.uniform4ui", "api.WebGL2RenderingContext.uniform4uiv", "api.WebGL2RenderingContext.uniformBlockBinding", "api.WebGL2RenderingContext.uniformMatrix2fv", "api.WebGL2RenderingContext.uniformMatrix2x3fv", "api.WebGL2RenderingContext.uniformMatrix2x4fv", "api.WebGL2RenderingContext.uniformMatrix3fv", "api.WebGL2RenderingContext.uniformMatrix3x2fv", "api.WebGL2RenderingContext.uniformMatrix3x4fv", "api.WebGL2RenderingContext.uniformMatrix4fv", "api.WebGL2RenderingContext.uniformMatrix4x2fv", "api.WebGL2RenderingContext.uniformMatrix4x3fv", "api.WebGL2RenderingContext.useProgram", "api.WebGL2RenderingContext.validateProgram", "api.WebGL2RenderingContext.vertexAttrib1f", "api.WebGL2RenderingContext.vertexAttrib1fv", "api.WebGL2RenderingContext.vertexAttrib2f", "api.WebGL2RenderingContext.vertexAttrib2fv", "api.WebGL2RenderingContext.vertexAttrib3f", "api.WebGL2RenderingContext.vertexAttrib3fv", "api.We\
bGL2RenderingContext.vertexAttrib4f", "api.WebGL2RenderingContext.vertexAttrib4fv", "api.WebGL2RenderingContext.vertexAttribDivisor", "api.WebGL2RenderingContext.vertexAttribI4i", "api.WebGL2RenderingContext.vertexAttribI4iv", "api.WebGL2RenderingContext.vertexAttribI4ui", "api.WebGL2RenderingContext.vertexAttribI4uiv", "api.WebGL2RenderingContext.vertexAttribIPointer", "api.WebGL2RenderingContext.vertexAttribPointer", "api.WebGL2RenderingContext.viewport", "api.WebGL2RenderingContext.waitSync", "api.WebGLQuery", "api.WebGLSampler", "api.WebGLSync", "api.WebGLTransformFeedback", "api.WebGLVertexArrayObject"], description: 'The WebGL2RenderingContext API is the "webgl2" rendering context for the <canvas> element. It represents a space for drawing two- and three-dimensional graphics and animations. It corresponds to OpenGL ES 3.0.', description_html: 'The <code>WebGL2RenderingContext</code> API is the <code>"webgl2"</code> rendering context for the <code>&#x3C;canvas></code> element. It \
represents a space for drawing two- and three-dimensional graphics and animations. It corresponds to OpenGL ES 3.0.', kind: "feature", name: "WebGL2", spec: ["https://registry.khronos.org/webgl/specs/latest/2.0/"], status: { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", by_compat_key: { "api.HTMLCanvasElement.getContext.webgl2_context": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.HTMLCanvasElement.getContext.webgl2_context.options_alpha_parameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.HTMLCanvasElement.getContext.webgl2_context.options_failIfMajorPerformanceCaveat_parameter": { baseline: "\
high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.HTMLCanvasElement.getContext.webgl2_context.options_powerPreference_parameter": { baseline: false, support: { safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.activeTexture": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.attachShader": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20",
    support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.beginQuery": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.beginTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindAttribLocation": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindBuffer": { baseline: "high",
    baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindBufferBase": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindBufferRange": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } },
    "api.WebGL2RenderingContext.bindRenderbuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindSampler": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindTexture": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "\
51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bindVertexArray": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.blendColor": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.blendEquation": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.blendEquationSeparate": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: {
    chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.blendFunc": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.blendFuncSeparate": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.blitFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bufferData": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.bufferSubData": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.canvas": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.checkFramebufferStatus": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext\
.clear": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clearBufferfi": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clearBufferfv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clearBufferiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "\
15" } }, "api.WebGL2RenderingContext.clearBufferuiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clearColor": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clearDepth": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clearStencil": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "\
51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.clientWaitSync": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.colorMask": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.compileShader": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.compressedTexImage2D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "\
58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.compressedTexImage3D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.compressedTexSubImage2D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.compressedTexSubImage3D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.copyBufferSubData": { baseline: "high", baseline_high_date: "2\
024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.copyTexImage2D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.copyTexSubImage2D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.copyTexSubImage3D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingC\
ontext.createBuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createProgram": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createQuery": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "\
15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createRenderbuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createSampler": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createShader": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createTexture": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58",
    edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.createVertexArray": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.cullFace": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteBuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "\
2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteProgram": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteQuery": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteRenderbuffer": { baseline: "\
high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteSampler": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteShader": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteSync": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.\
WebGL2RenderingContext.deleteTexture": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.deleteVertexArray": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.depthFunc": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51",
    firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.depthMask": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.depthRange": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.detachShader": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.disable": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "\
58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.disableVertexAttribArray": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawArrays": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawArraysInstanced": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawBuffers": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "\
2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawElements": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawElementsInstanced": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawRangeElements": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawingBufferFormat": {
    baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.WebGL2RenderingContext.drawingBufferHeight": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.drawingBufferStorage": { baseline: false, support: { chrome: "122", chrome_android: "122", edge: "122" } }, "api.WebGL2RenderingContext.drawingBufferWidth": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.enable": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "\
15" } }, "api.WebGL2RenderingContext.enableVertexAttribArray": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.endQuery": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.endTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.fenceSync": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "\
51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.finish": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.flush": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.framebufferRenderbuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.framebufferTexture2D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "\
56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.framebufferTextureLayer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.frontFace": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.generateMipmap": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getActiveAttrib": { baseline: "high", baseline_high_date: "2\
024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getActiveUniform": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getActiveUniformBlockName": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getActiveUniformBlockParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } },
    "api.WebGL2RenderingContext.getActiveUniforms": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getAttachedShaders": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getAttribLocation": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getBufferParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "7\
9", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getBufferSubData": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getContextAttributes": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getError": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getExtension": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-\
20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getFragDataLocation": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getFramebufferAttachmentParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getIndexedParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getInterna\
lformatParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getProgramInfoLog": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getProgramParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "5\
1", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getQuery": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getQueryParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getRenderbufferParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getSamplerParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "5\
6", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getShaderInfoLog": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getShaderParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getShaderPrecisionFormat": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getShaderSource": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getSupportedExtensions": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getSyncParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getTexParameter": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2Rend\
eringContext.getTransformFeedbackVarying": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getUniform": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getUniformBlockIndex": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getUniformIndices": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "5\
1", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getUniformLocation": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getVertexAttrib": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.getVertexAttribOffset": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.hint": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: {
    chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.invalidateFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.invalidateSubFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isBuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isContextLost": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isEnabled": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isFramebuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isProgram": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isQuery": {
    baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isRenderbuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isSampler": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isShader": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } },
    "api.WebGL2RenderingContext.isSync": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isTexture": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.isVertexArray": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "\
51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.lineWidth": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.linkProgram": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.pauseTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.pixelStorei": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "\
58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.polygonOffset": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.readBuffer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.readPixels": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.renderbufferStorage": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "\
2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.renderbufferStorageMultisample": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.resumeTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.sampleCoverage": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.sample\
rParameterf": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.samplerParameteri": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.scissor": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.shaderSource": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15",
    safari_ios: "15" } }, "api.WebGL2RenderingContext.stencilFunc": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.stencilFuncSeparate": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.stencilMask": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.stencilMaskSeparate": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "5\
8", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.stencilOp": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.stencilOpSeparate": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texImage2D": { baseline: false, support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texImage3D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "\
51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texParameterf": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texParameteri": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texStorage2D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texStorage3D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "\
58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texSubImage2D": { baseline: false, support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.texSubImage3D": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.transformFeedbackVaryings": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform1f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "\
51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform1fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform1i": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform1iv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform1ui": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "\
58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform1uiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform2f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform2fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform2i": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20",
    support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform2iv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform2ui": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform2uiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform3f": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform3fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform3i": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform3iv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform3ui": {
    baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform3uiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform4f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform4fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } },
    "api.WebGL2RenderingContext.uniform4i": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform4iv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform4ui": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniform4uiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "\
51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformBlockBinding": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix2fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix2x3fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix2x4fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "\
56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix3fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix3x2fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix3x4fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix4fv": { baseline: "high", baseline_high_date: "\
2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix4x2fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.uniformMatrix4x3fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.useProgram": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingCo\
ntext.validateProgram": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib1f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib1fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib2f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "5\
1", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib2fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib3f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib3fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib4f": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "\
58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttrib4fv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribDivisor": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribI4i": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribI4iv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "\
2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribI4ui": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribI4uiv": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribIPointer": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.vertexAttribPointer": {
    baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.viewport": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGL2RenderingContext.waitSync": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGLQuery": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGLSampler": { baseline: "\
high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGLSync": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGLTransformFeedback": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } }, "api.WebGLVertexArrayObject": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "56", chrome_android: "58", edge: "79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } } }, support: { chrome: "56", chrome_android: "58", edge: "\
79", firefox: "51", firefox_android: "51", safari: "15", safari_ios: "15" } } }, "webgl2-color-management": { compat_features: ["api.WebGL2RenderingContext.drawingBufferColorSpace", "api.WebGL2RenderingContext.unpackColorSpace"], description: 'The drawingBufferColorSpace and unpackColorSpace properties of WebGL2RenderingContext sets the color representation for the buffer and imported textures, such as "srgb" or "display-p3".', description_html: 'The <code>drawingBufferColorSpace</code> and <code>unpackColorSpace</code> properties of <code>WebGL2RenderingContext</code> sets the color representation for the buffer and imported textures, such as <code>"srgb"</code> or <code>"display-p3"</code>.', kind: "feature", name: "Color management for WebGL2", spec: ["https://registry.khronos.org/webgl/specs/latest/2.0/"], status: { baseline: "low", baseline_low_date: "2024-10-29", by_compat_key: { "api.WebGL2RenderingContext.drawingBufferColorSpace": { baseline: "low", baseline_low_date: "2024-10-\
29", support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "132", firefox_android: "132", safari: "16.4", safari_ios: "16.4" } }, "api.WebGL2RenderingContext.unpackColorSpace": { baseline: false, support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "132", firefox_android: "132" } } }, support: { chrome: "104", chrome_android: "104", edge: "104", firefox: "132", firefox_android: "132", safari: "16.4", safari_ios: "16.4" } } }, "webgl2-desynchronized": { compat_features: ["api.HTMLCanvasElement.getContext.webgl2_context.options_desynchronized_parameter"], description: "The optional desynchronized parameter of a canvas's getContext() method permits the browser to draw a WebGL2 canvas independently of the event loop. This can reduce drawing latency.", description_html: "The optional <code>desynchronized</code> parameter of a canvas's <code>getContext()</code> method permits the browser to draw a WebGL2 canvas independently of the event loop. This can redu\
ce drawing latency.", kind: "feature", name: "Desynchronized WebGL2 canvas", spec: ["https://registry.khronos.org/webgl/specs/latest/2.0/"], status: { baseline: false, by_compat_key: { "api.HTMLCanvasElement.getContext.webgl2_context.options_desynchronized_parameter": { baseline: false, support: { chrome: "81", chrome_android: "75", edge: "79" } } }, support: { chrome: "81", chrome_android: "75", edge: "79" } } }, webgpu: { caniuse: ["webgpu"], compat_features: ["api.GPU", "api.GPU.getPreferredCanvasFormat", "api.GPU.requestAdapter", "api.GPU.requestAdapter.discrete_adapter_default_ac", "api.GPU.wgslLanguageFeatures", "api.GPUAdapter", "api.GPUAdapter.features", "api.GPUAdapter.info", "api.GPUAdapter.limits", "api.GPUAdapter.requestDevice", "api.GPUAdapter.requestDevice.handles_duplicate_calls", "api.GPUAdapter.requestDevice.undefined_limits", "api.GPUAdapterInfo", "api.GPUAdapterInfo.architecture", "api.GPUAdapterInfo.description", "api.GPUAdapterInfo.device", "api.GPUAdapterInfo.subg\
roupMaxSize", "api.GPUAdapterInfo.subgroupMinSize", "api.GPUAdapterInfo.vendor", "api.GPUBindGroup", "api.GPUBindGroup.label", "api.GPUBindGroupLayout", "api.GPUBindGroupLayout.label", "api.GPUBuffer", "api.GPUBuffer.destroy", "api.GPUBuffer.getMappedRange", "api.GPUBuffer.label", "api.GPUBuffer.mapAsync", "api.GPUBuffer.mapState", "api.GPUBuffer.size", "api.GPUBuffer.unmap", "api.GPUBuffer.usage", "api.GPUCanvasContext", "api.GPUCanvasContext.canvas", "api.GPUCanvasContext.configure", "api.GPUCanvasContext.configure.toneMapping", "api.GPUCanvasContext.getConfiguration", "api.GPUCanvasContext.getCurrentTexture", "api.GPUCanvasContext.unconfigure", "api.GPUCommandBuffer", "api.GPUCommandBuffer.label", "api.GPUCommandEncoder", "api.GPUCommandEncoder.beginComputePass", "api.GPUCommandEncoder.beginComputePass.timestampWrites", "api.GPUCommandEncoder.beginRenderPass", "api.GPUCommandEncoder.beginRenderPass.depthSlice_option", "api.GPUCommandEncoder.beginRenderPass.separate_depth_stencil_rea\
d-only", "api.GPUCommandEncoder.beginRenderPass.timestampWrites", "api.GPUCommandEncoder.clearBuffer", "api.GPUCommandEncoder.copyBufferToBuffer", "api.GPUCommandEncoder.copyBufferToTexture", "api.GPUCommandEncoder.copyTextureToBuffer", "api.GPUCommandEncoder.copyTextureToTexture", "api.GPUCommandEncoder.finish", "api.GPUCommandEncoder.insertDebugMarker", "api.GPUCommandEncoder.label", "api.GPUCommandEncoder.popDebugGroup", "api.GPUCommandEncoder.pushDebugGroup", "api.GPUCommandEncoder.resolveQuerySet", "api.GPUCompilationInfo", "api.GPUCompilationInfo.messages", "api.GPUCompilationMessage", "api.GPUCompilationMessage.length", "api.GPUCompilationMessage.lineNum", "api.GPUCompilationMessage.linePos", "api.GPUCompilationMessage.message", "api.GPUCompilationMessage.offset", "api.GPUCompilationMessage.type", "api.GPUComputePassEncoder", "api.GPUComputePassEncoder.dispatchWorkgroups", "api.GPUComputePassEncoder.dispatchWorkgroupsIndirect", "api.GPUComputePassEncoder.end", "api.GPUComputePas\
sEncoder.insertDebugMarker", "api.GPUComputePassEncoder.label", "api.GPUComputePassEncoder.popDebugGroup", "api.GPUComputePassEncoder.pushDebugGroup", "api.GPUComputePassEncoder.setBindGroup", "api.GPUComputePassEncoder.setBindGroup.unset_bind_group", "api.GPUComputePassEncoder.setPipeline", "api.GPUComputePipeline", "api.GPUComputePipeline.getBindGroupLayout", "api.GPUComputePipeline.label", "api.GPUDevice", "api.GPUDevice.adapterInfo", "api.GPUDevice.createBindGroup", "api.GPUDevice.createBindGroupLayout", "api.GPUDevice.createBindGroupLayout.storageTexture_access_read-write_read-only", "api.GPUDevice.createBindGroupLayout.texture_rgb10a2uint", "api.GPUDevice.createBuffer", "api.GPUDevice.createCommandEncoder", "api.GPUDevice.createComputePipeline", "api.GPUDevice.createComputePipeline.optional_entryPoint", "api.GPUDevice.createComputePipelineAsync", "api.GPUDevice.createComputePipelineAsync.optional_entryPoint", "api.GPUDevice.createPipelineLayout", "api.GPUDevice.createQuerySet", "\
api.GPUDevice.createQuerySet.timestamp", "api.GPUDevice.createRenderBundleEncoder", "api.GPUDevice.createRenderPipeline", "api.GPUDevice.createRenderPipeline.dual-source-blending", "api.GPUDevice.createRenderPipeline.optional_depthcompare_depthwriteenabled", "api.GPUDevice.createRenderPipeline.optional_entryPoint", "api.GPUDevice.createRenderPipeline.texture_rgb10a2uint", "api.GPUDevice.createRenderPipeline.validates_depth_bias_for_line_and_point_topologies", "api.GPUDevice.createRenderPipeline.vertex_unorm10-10-10-2", "api.GPUDevice.createRenderPipelineAsync", "api.GPUDevice.createRenderPipelineAsync.dual-source-blending", "api.GPUDevice.createRenderPipelineAsync.optional_depthcompare_depthwriteenabled", "api.GPUDevice.createRenderPipelineAsync.optional_entryPoint", "api.GPUDevice.createRenderPipelineAsync.texture_rgb10a2uint", "api.GPUDevice.createRenderPipelineAsync.validates_depth_bias_for_line_and_point_topologies", "api.GPUDevice.createRenderPipelineAsync.vertex_unorm10-10-10-2",
    "api.GPUDevice.createSampler", "api.GPUDevice.createShaderModule", "api.GPUDevice.createTexture", "api.GPUDevice.createTexture.texture_rgb10a2uint", "api.GPUDevice.destroy", "api.GPUDevice.features", "api.GPUDevice.importExternalTexture", "api.GPUDevice.importExternalTexture.color_space_display-p3", "api.GPUDevice.importExternalTexture.videoframe_source", "api.GPUDevice.label", "api.GPUDevice.limits", "api.GPUDevice.lost", "api.GPUDevice.popErrorScope", "api.GPUDevice.pushErrorScope", "api.GPUDevice.queue", "api.GPUDevice.uncapturederror_event", "api.GPUDeviceLostInfo", "api.GPUDeviceLostInfo.message", "api.GPUDeviceLostInfo.reason", "api.GPUError", "api.GPUError.message", "api.GPUExternalTexture", "api.GPUExternalTexture.label", "api.GPUInternalError", "api.GPUInternalError.GPUInternalError", "api.GPUOutOfMemoryError", "api.GPUOutOfMemoryError.GPUOutOfMemoryError", "api.GPUPipelineError", "api.GPUPipelineError.GPUPipelineError", "api.GPUPipelineError.GPUPipelineError.message_optio\
nal", "api.GPUPipelineError.reason", "api.GPUPipelineLayout", "api.GPUPipelineLayout.label", "api.GPUQuerySet", "api.GPUQuerySet.count", "api.GPUQuerySet.destroy", "api.GPUQuerySet.label", "api.GPUQuerySet.type", "api.GPUQuerySet.type.timestamp", "api.GPUQueue", "api.GPUQueue.copyExternalImageToTexture", "api.GPUQueue.copyExternalImageToTexture.htmlimageelement_imagedata_source", "api.GPUQueue.copyExternalImageToTexture.videoframe_source", "api.GPUQueue.label", "api.GPUQueue.onSubmittedWorkDone", "api.GPUQueue.submit", "api.GPUQueue.submit.validates_command_buffer_uniqueness", "api.GPUQueue.writeBuffer", "api.GPUQueue.writeTexture", "api.GPURenderBundle", "api.GPURenderBundle.label", "api.GPURenderBundleEncoder", "api.GPURenderBundleEncoder.draw", "api.GPURenderBundleEncoder.drawIndexed", "api.GPURenderBundleEncoder.drawIndexedIndirect", "api.GPURenderBundleEncoder.drawIndirect", "api.GPURenderBundleEncoder.finish", "api.GPURenderBundleEncoder.insertDebugMarker", "api.GPURenderBundleEn\
coder.label", "api.GPURenderBundleEncoder.popDebugGroup", "api.GPURenderBundleEncoder.pushDebugGroup", "api.GPURenderBundleEncoder.setBindGroup", "api.GPURenderBundleEncoder.setBindGroup.unset_bind_group", "api.GPURenderBundleEncoder.setIndexBuffer", "api.GPURenderBundleEncoder.setPipeline", "api.GPURenderBundleEncoder.setVertexBuffer", "api.GPURenderBundleEncoder.setVertexBuffer.unset_vertex_buffer", "api.GPURenderPassEncoder", "api.GPURenderPassEncoder.beginOcclusionQuery", "api.GPURenderPassEncoder.draw", "api.GPURenderPassEncoder.drawIndexed", "api.GPURenderPassEncoder.drawIndexedIndirect", "api.GPURenderPassEncoder.drawIndirect", "api.GPURenderPassEncoder.end", "api.GPURenderPassEncoder.endOcclusionQuery", "api.GPURenderPassEncoder.executeBundles", "api.GPURenderPassEncoder.insertDebugMarker", "api.GPURenderPassEncoder.label", "api.GPURenderPassEncoder.popDebugGroup", "api.GPURenderPassEncoder.pushDebugGroup", "api.GPURenderPassEncoder.setBindGroup", "api.GPURenderPassEncoder.setB\
indGroup.unset_bind_group", "api.GPURenderPassEncoder.setBlendConstant", "api.GPURenderPassEncoder.setIndexBuffer", "api.GPURenderPassEncoder.setPipeline", "api.GPURenderPassEncoder.setScissorRect", "api.GPURenderPassEncoder.setStencilReference", "api.GPURenderPassEncoder.setVertexBuffer", "api.GPURenderPassEncoder.setVertexBuffer.unset_vertex_buffer", "api.GPURenderPassEncoder.setViewport", "api.GPURenderPipeline", "api.GPURenderPipeline.getBindGroupLayout", "api.GPURenderPipeline.label", "api.GPUSampler", "api.GPUSampler.label", "api.GPUShaderModule", "api.GPUShaderModule.getCompilationInfo", "api.GPUShaderModule.label", "api.GPUSupportedFeatures", "api.GPUSupportedFeatures.@@iterator", "api.GPUSupportedFeatures.entries", "api.GPUSupportedFeatures.feature_bgra8unorm-storage", "api.GPUSupportedFeatures.feature_clip-distances", "api.GPUSupportedFeatures.feature_depth-clip-control", "api.GPUSupportedFeatures.feature_depth32float-stencil8", "api.GPUSupportedFeatures.feature_dual-source-b\
lending", "api.GPUSupportedFeatures.feature_float32-blendable", "api.GPUSupportedFeatures.feature_float32-filterable", "api.GPUSupportedFeatures.feature_indirect-first-instance", "api.GPUSupportedFeatures.feature_rg11b10ufloat-renderable", "api.GPUSupportedFeatures.feature_shader-f16", "api.GPUSupportedFeatures.feature_texture-compression-astc", "api.GPUSupportedFeatures.feature_texture-compression-bc", "api.GPUSupportedFeatures.feature_texture-compression-etc2", "api.GPUSupportedFeatures.feature_timestamp-query", "api.GPUSupportedFeatures.forEach", "api.GPUSupportedFeatures.has", "api.GPUSupportedFeatures.keys", "api.GPUSupportedFeatures.size", "api.GPUSupportedFeatures.values", "api.GPUSupportedLimits", "api.GPUSupportedLimits.maxBindGroups", "api.GPUSupportedLimits.maxBindGroupsPlusVertexBuffers", "api.GPUSupportedLimits.maxBindingsPerBindGroup", "api.GPUSupportedLimits.maxBufferSize", "api.GPUSupportedLimits.maxColorAttachmentBytesPerSample", "api.GPUSupportedLimits.maxColorAttachm\
ents", "api.GPUSupportedLimits.maxComputeInvocationsPerWorkgroup", "api.GPUSupportedLimits.maxComputeWorkgroupSizeX", "api.GPUSupportedLimits.maxComputeWorkgroupSizeY", "api.GPUSupportedLimits.maxComputeWorkgroupSizeZ", "api.GPUSupportedLimits.maxComputeWorkgroupStorageSize", "api.GPUSupportedLimits.maxComputeWorkgroupsPerDimension", "api.GPUSupportedLimits.maxDynamicStorageBuffersPerPipelineLayout", "api.GPUSupportedLimits.maxDynamicUniformBuffersPerPipelineLayout", "api.GPUSupportedLimits.maxInterStageShaderVariables", "api.GPUSupportedLimits.maxSampledTexturesPerShaderStage", "api.GPUSupportedLimits.maxSamplersPerShaderStage", "api.GPUSupportedLimits.maxStorageBufferBindingSize", "api.GPUSupportedLimits.maxStorageBuffersPerShaderStage", "api.GPUSupportedLimits.maxStorageTexturesPerShaderStage", "api.GPUSupportedLimits.maxTextureArrayLayers", "api.GPUSupportedLimits.maxTextureDimension1D", "api.GPUSupportedLimits.maxTextureDimension2D", "api.GPUSupportedLimits.maxTextureDimension3D",
    "api.GPUSupportedLimits.maxUniformBufferBindingSize", "api.GPUSupportedLimits.maxUniformBuffersPerShaderStage", "api.GPUSupportedLimits.maxVertexAttributes", "api.GPUSupportedLimits.maxVertexBufferArrayStride", "api.GPUSupportedLimits.maxVertexBuffers", "api.GPUSupportedLimits.minStorageBufferOffsetAlignment", "api.GPUSupportedLimits.minUniformBufferOffsetAlignment", "api.GPUTexture", "api.GPUTexture.createView", "api.GPUTexture.createView.descriptor_format_parameter_accepts_rgb10a2uint", "api.GPUTexture.createView.descriptor_usage_parameter", "api.GPUTexture.depthOrArrayLayers", "api.GPUTexture.destroy", "api.GPUTexture.dimension", "api.GPUTexture.format", "api.GPUTexture.format.texture_rgb10a2uint", "api.GPUTexture.height", "api.GPUTexture.label", "api.GPUTexture.mipLevelCount", "api.GPUTexture.sampleCount", "api.GPUTexture.usage", "api.GPUTexture.width", "api.GPUTextureView", "api.GPUTextureView.label", "api.GPUUncapturedErrorEvent", "api.GPUUncapturedErrorEvent.GPUUncapturedErr\
orEvent", "api.GPUUncapturedErrorEvent.error", "api.GPUValidationError", "api.GPUValidationError.GPUValidationError", "api.HTMLCanvasElement.getContext.webgpu_context", "api.Navigator.gpu", "api.OffscreenCanvas.getContext.webgpu_context", "api.WGSLLanguageFeatures", "api.WGSLLanguageFeatures.@@iterator", "api.WGSLLanguageFeatures.entries", "api.WGSLLanguageFeatures.extension_packed_4x8_integer_dot_product", "api.WGSLLanguageFeatures.extension_readonly_and_readwrite_storage_textures", "api.WGSLLanguageFeatures.extension_unrestricted_pointer_parameters", "api.WGSLLanguageFeatures.forEach", "api.WGSLLanguageFeatures.has", "api.WGSLLanguageFeatures.keys", "api.WGSLLanguageFeatures.size", "api.WGSLLanguageFeatures.values", "api.WorkerNavigator.gpu"], description: "The navigator.gpu API performs operations such as rendering and computation on dedicated graphics hardware (also known as a Graphics Processing Unit).", description_html: "The <code>navigator.gpu</code> API performs operations suc\
h as rendering and computation on dedicated graphics hardware (also known as a Graphics Processing Unit).", group: ["webgpu"], kind: "feature", name: "WebGPU", spec: ["https://gpuweb.github.io/gpuweb/"], status: { baseline: false, by_compat_key: { "api.GPU": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPU.getPreferredCanvasFormat": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPU.requestAdapter": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPU.requestAdapter.discrete_adapter_default_ac": { baseline: false, support: { chrome_android: "121" } }, "api.GPU.wgslLanguageFeatures": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapter": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapter.features": { baseline: false, support: { chrome_android: "\
121", safari: "26", safari_ios: "26" } }, "api.GPUAdapter.info": { baseline: false, support: { safari: "26", safari_ios: "26" } }, "api.GPUAdapter.limits": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapter.requestDevice": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapter.requestDevice.handles_duplicate_calls": { baseline: false, support: { chrome_android: "140" } }, "api.GPUAdapter.requestDevice.undefined_limits": { baseline: false, support: {} }, "api.GPUAdapterInfo": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapterInfo.architecture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapterInfo.description": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUAdapterInfo.device": { baseline: false, support: { chrome_android: "121",
    safari: "26", safari_ios: "26" } }, "api.GPUAdapterInfo.subgroupMaxSize": { baseline: false, support: {} }, "api.GPUAdapterInfo.subgroupMinSize": { baseline: false, support: {} }, "api.GPUAdapterInfo.vendor": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBindGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBindGroup.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBindGroupLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBindGroupLayout.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.destroy": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.get\
MappedRange": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.mapAsync": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.mapState": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.size": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.unmap": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUBuffer.usage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCanvasContext": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCanvasContext.canvas": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "\
26" } }, "api.GPUCanvasContext.configure": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCanvasContext.configure.toneMapping": { baseline: false, support: {} }, "api.GPUCanvasContext.getConfiguration": { baseline: false, support: { safari: "26", safari_ios: "26" } }, "api.GPUCanvasContext.getCurrentTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCanvasContext.unconfigure": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandBuffer.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.beginComputePass": { baseline: false, support: { chrome_android: "\
121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.beginComputePass.timestampWrites": { baseline: false, support: {} }, "api.GPUCommandEncoder.beginRenderPass": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.beginRenderPass.depthSlice_option": { baseline: false, support: {} }, "api.GPUCommandEncoder.beginRenderPass.separate_depth_stencil_read-only": { baseline: false, support: {} }, "api.GPUCommandEncoder.beginRenderPass.timestampWrites": { baseline: false, support: {} }, "api.GPUCommandEncoder.clearBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.copyBufferToBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.copyBufferToTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.copyTextureToBuffer": { baseline: false,
    support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.copyTextureToTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.finish": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.insertDebugMarker": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.popDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.pushDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCommandEncoder.resolveQuerySet": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationInfo": { baseline: false,
    support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationInfo.messages": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage.length": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage.lineNum": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage.linePos": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage.message": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage.offset": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUCompilationMessage.type": { baseline: false, support: {
    chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.dispatchWorkgroups": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.dispatchWorkgroupsIndirect": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.end": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.insertDebugMarker": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.popDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEnco\
der.pushDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.setBindGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePassEncoder.setBindGroup.unset_bind_group": { baseline: false, support: { chrome_android: "121" } }, "api.GPUComputePassEncoder.setPipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePipeline.getBindGroupLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUComputePipeline.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.adapterInfo": { baseline: false,
    support: {} }, "api.GPUDevice.createBindGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createBindGroupLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createBindGroupLayout.storageTexture_access_read-write_read-only": { baseline: false, support: {} }, "api.GPUDevice.createBindGroupLayout.texture_rgb10a2uint": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDevice.createBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createCommandEncoder": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createComputePipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createComputePipeline.optional_entryPoint": { baseline: false, support: {} }, "api.GPUDevice.createComputePipe\
lineAsync": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createComputePipelineAsync.optional_entryPoint": { baseline: false, support: {} }, "api.GPUDevice.createPipelineLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createQuerySet": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createQuerySet.timestamp": { baseline: false, support: {} }, "api.GPUDevice.createRenderBundleEncoder": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createRenderPipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createRenderPipeline.dual-source-blending": { baseline: false, support: {} }, "api.GPUDevice.createRenderPipeline.optional_depthcompare_depthwriteenabled": { baseline: false, support: { chrome_android: "\
121" } }, "api.GPUDevice.createRenderPipeline.optional_entryPoint": { baseline: false, support: {} }, "api.GPUDevice.createRenderPipeline.texture_rgb10a2uint": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDevice.createRenderPipeline.validates_depth_bias_for_line_and_point_topologies": { baseline: false, support: {} }, "api.GPUDevice.createRenderPipeline.vertex_unorm10-10-10-2": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDevice.createRenderPipelineAsync": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createRenderPipelineAsync.dual-source-blending": { baseline: false, support: {} }, "api.GPUDevice.createRenderPipelineAsync.optional_depthcompare_depthwriteenabled": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDevice.createRenderPipelineAsync.optional_entryPoint": { baseline: false, support: {} }, "api.GPUDevice.createRenderPipelineAsync.texture_rgb10a2uint": { baseline: false,
    support: { chrome_android: "121" } }, "api.GPUDevice.createRenderPipelineAsync.validates_depth_bias_for_line_and_point_topologies": { baseline: false, support: {} }, "api.GPUDevice.createRenderPipelineAsync.vertex_unorm10-10-10-2": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDevice.createSampler": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createShaderModule": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.createTexture.texture_rgb10a2uint": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDevice.destroy": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.features": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.\
GPUDevice.importExternalTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.importExternalTexture.color_space_display-p3": { baseline: false, support: {} }, "api.GPUDevice.importExternalTexture.videoframe_source": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.limits": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.lost": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.popErrorScope": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.pushErrorScope": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.queue": { baseline: false, support: { chrome_android: "\
121", safari: "26", safari_ios: "26" } }, "api.GPUDevice.uncapturederror_event": { baseline: false, support: { chrome_android: "121" } }, "api.GPUDeviceLostInfo": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDeviceLostInfo.message": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUDeviceLostInfo.reason": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUError": { baseline: false, support: { chrome_android: "121" } }, "api.GPUError.message": { baseline: false, support: { chrome_android: "121" } }, "api.GPUExternalTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUExternalTexture.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUInternalError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "a\
pi.GPUInternalError.GPUInternalError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUOutOfMemoryError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUOutOfMemoryError.GPUOutOfMemoryError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUPipelineError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUPipelineError.GPUPipelineError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUPipelineError.GPUPipelineError.message_optional": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUPipelineError.reason": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUPipelineLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } },
    "api.GPUPipelineLayout.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQuerySet": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQuerySet.count": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQuerySet.destroy": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQuerySet.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQuerySet.type": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQuerySet.type.timestamp": { baseline: false, support: {} }, "api.GPUQueue": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQueue.copyExternalImageToTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.G\
PUQueue.copyExternalImageToTexture.htmlimageelement_imagedata_source": { baseline: false, support: { chrome_android: "121" } }, "api.GPUQueue.copyExternalImageToTexture.videoframe_source": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQueue.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQueue.onSubmittedWorkDone": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQueue.submit": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQueue.submit.validates_command_buffer_uniqueness": { baseline: false, support: {} }, "api.GPUQueue.writeBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUQueue.writeTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundle": { baseline: false, support: {
    chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundle.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.draw": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.drawIndexed": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.drawIndexedIndirect": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.drawIndirect": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.finish": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.insertDebugMarker": {
    baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.popDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.pushDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.setBindGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.setBindGroup.unset_bind_group": { baseline: false, support: { chrome_android: "121" } }, "api.GPURenderBundleEncoder.setIndexBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.setPipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "ap\
i.GPURenderBundleEncoder.setVertexBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderBundleEncoder.setVertexBuffer.unset_vertex_buffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.beginOcclusionQuery": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.draw": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.drawIndexed": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.drawIndexedIndirect": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.drawIndirect": { baseline: false, support: { chrome_android: "\
121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.end": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.endOcclusionQuery": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.executeBundles": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.insertDebugMarker": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.popDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.pushDebugGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setBindGroup": { baseline: false,
    support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setBindGroup.unset_bind_group": { baseline: false, support: { chrome_android: "121" } }, "api.GPURenderPassEncoder.setBlendConstant": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setIndexBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setPipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setScissorRect": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setStencilReference": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setVertexBuffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURender\
PassEncoder.setVertexBuffer.unset_vertex_buffer": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPassEncoder.setViewport": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPipeline": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPipeline.getBindGroupLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPURenderPipeline.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSampler": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSampler.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUShaderModule": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUShaderModule.getCompilati\
onInfo": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUShaderModule.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.@@iterator": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.entries": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_bgra8unorm-storage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_clip-distances": { baseline: false, support: {} }, "api.GPUSupportedFeatures.feature_depth-clip-control": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_depth32\
float-stencil8": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_dual-source-blending": { baseline: false, support: {} }, "api.GPUSupportedFeatures.feature_float32-blendable": { baseline: false, support: { safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_float32-filterable": { baseline: false, support: { chrome_android: "121" } }, "api.GPUSupportedFeatures.feature_indirect-first-instance": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_rg11b10ufloat-renderable": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_shader-f16": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_texture-compression-astc": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "\
26" } }, "api.GPUSupportedFeatures.feature_texture-compression-bc": { baseline: false, support: { chrome_android: "121" } }, "api.GPUSupportedFeatures.feature_texture-compression-etc2": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.feature_timestamp-query": { baseline: false, support: { safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.forEach": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.has": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.keys": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.size": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedFeatures.values": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } },
    "api.GPUSupportedLimits": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxBindGroups": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxBindGroupsPlusVertexBuffers": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxBindingsPerBindGroup": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxBufferSize": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxColorAttachmentBytesPerSample": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxColorAttachments": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxComputeInvocationsPerWorkgro\
up": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxComputeWorkgroupSizeX": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxComputeWorkgroupSizeY": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxComputeWorkgroupSizeZ": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxComputeWorkgroupStorageSize": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxComputeWorkgroupsPerDimension": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxDynamicStorageBuffersPerPipelineLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxDynamicU\
niformBuffersPerPipelineLayout": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxInterStageShaderVariables": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxSampledTexturesPerShaderStage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxSamplersPerShaderStage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxStorageBufferBindingSize": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxStorageBuffersPerShaderStage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxStorageTexturesPerShaderStage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GP\
USupportedLimits.maxTextureArrayLayers": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxTextureDimension1D": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxTextureDimension2D": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxTextureDimension3D": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxUniformBufferBindingSize": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxUniformBuffersPerShaderStage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxVertexAttributes": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxVertexB\
ufferArrayStride": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.maxVertexBuffers": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.minStorageBufferOffsetAlignment": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUSupportedLimits.minUniformBufferOffsetAlignment": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.createView": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.createView.descriptor_format_parameter_accepts_rgb10a2uint": { baseline: false, support: { chrome_android: "121" } }, "api.GPUTexture.createView.descriptor_usage_parameter": { baseline: false, support: {} }, "api.GPUTexture.d\
epthOrArrayLayers": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.destroy": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.dimension": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.format": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.format.texture_rgb10a2uint": { baseline: false, support: { chrome_android: "121" } }, "api.GPUTexture.height": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.mipLevelCount": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.sampleCount": { baseline: false, support: { chrome_android: "121", safari: "26",
    safari_ios: "26" } }, "api.GPUTexture.usage": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTexture.width": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTextureView": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUTextureView.label": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUUncapturedErrorEvent": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUUncapturedErrorEvent.GPUUncapturedErrorEvent": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUUncapturedErrorEvent.error": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUValidationError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.GPUValidat\
ionError.GPUValidationError": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.HTMLCanvasElement.getContext.webgpu_context": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.Navigator.gpu": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.OffscreenCanvas.getContext.webgpu_context": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.@@iterator": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.entries": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.extension_packed_4x8_integer_dot_product": { baseline: false, support: {} }, "api.WGSLLanguageFea\
tures.extension_readonly_and_readwrite_storage_textures": { baseline: false, support: {} }, "api.WGSLLanguageFeatures.extension_unrestricted_pointer_parameters": { baseline: false, support: {} }, "api.WGSLLanguageFeatures.forEach": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.has": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.keys": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.size": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WGSLLanguageFeatures.values": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } }, "api.WorkerNavigator.gpu": { baseline: false, support: { chrome_android: "121", safari: "26", safari_ios: "26" } } }, support: { chrome_android: "121", safari: "26", safari_ios: "26" } } }, "\
webgpu-subgroups": { compat_features: ["api.GPUSupportedFeatures.feature_subgroups"], description: "The subgroups extension for the WebGPU Shading Language (WGSL) enables SIMD parallelism. Using subgroups, threads in a workgroup can efficiently communicate and perform collective operations.", description_html: "The subgroups extension for the WebGPU Shading Language (WGSL) enables SIMD parallelism. Using subgroups, threads in a workgroup can efficiently communicate and perform collective operations.", group: ["webgpu"], kind: "feature", name: "WebGPU subgroups", spec: ["https://gpuweb.github.io/gpuweb/#subgroups", "https://gpuweb.github.io/gpuweb/wgsl/#extension-subgroups"], status: { baseline: false, by_compat_key: { "api.GPUSupportedFeatures.feature_subgroups": { baseline: false, support: {} } }, support: {} } }, webhid: { caniuse: ["webhid"], compat_features: ["api.HID", "api.HID.connect_event", "api.HID.disconnect_event", "api.HID.getDevices", "api.HID.requestDevice", "api.HID.work\
er_support", "api.HIDConnectionEvent", "api.HIDConnectionEvent.HIDConnectionEvent", "api.HIDConnectionEvent.device", "api.HIDConnectionEvent.worker_support", "api.HIDDevice", "api.HIDDevice.close", "api.HIDDevice.collections", "api.HIDDevice.forget", "api.HIDDevice.inputreport_event", "api.HIDDevice.open", "api.HIDDevice.opened", "api.HIDDevice.productId", "api.HIDDevice.productName", "api.HIDDevice.receiveFeatureReport", "api.HIDDevice.sendFeatureReport", "api.HIDDevice.sendReport", "api.HIDDevice.vendorId", "api.HIDDevice.worker_support", "api.HIDInputReportEvent", "api.HIDInputReportEvent.data", "api.HIDInputReportEvent.device", "api.HIDInputReportEvent.reportId", "api.HIDInputReportEvent.worker_support", "api.Navigator.hid", "api.WorkerNavigator.hid", "html.elements.iframe.allow.hid", "http.headers.Permissions-Policy.hid"], description: "The WebHID API provides access to Human Interface Devices (HID) that are connected to the user's device.", description_html: "The WebHID API provi\
des access to Human Interface Devices (HID) that are connected to the user's device.", kind: "feature", name: "WebHID", spec: ["https://wicg.github.io/webhid/"], status: { baseline: false, by_compat_key: { "api.HID": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HID.connect_event": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HID.disconnect_event": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HID.getDevices": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HID.requestDevice": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HID.worker_support": { baseline: false, support: {} }, "api.HIDConnectionEvent": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDConnectionEvent.HIDConnectionEvent": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDConnectionEvent.device": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDConnectionEvent.worker_support": {
    baseline: false, support: {} }, "api.HIDDevice": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.close": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.collections": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.forget": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.HIDDevice.inputreport_event": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.open": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.opened": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.productId": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.productName": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.receiveFeatureReport": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.sendFeatureReport": { baseline: false, support: { chrome: "89", edge: "89" } },
    "api.HIDDevice.sendReport": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.vendorId": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDDevice.worker_support": { baseline: false, support: {} }, "api.HIDInputReportEvent": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDInputReportEvent.data": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDInputReportEvent.device": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDInputReportEvent.reportId": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.HIDInputReportEvent.worker_support": { baseline: false, support: {} }, "api.Navigator.hid": { baseline: false, support: { chrome: "89", edge: "89" } }, "api.WorkerNavigator.hid": { baseline: false, support: { chrome: "131", edge: "131" } }, "html.elements.iframe.allow.hid": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "http.headers.Permissions\
-Policy.hid": { baseline: false, support: { chrome: "89", edge: "89" } } }, support: { chrome: "89", edge: "89" } } }, webnn: { compat_features: ["api.ML", "api.ML.createContext", "api.MLContext", "api.MLContext.dispatch", "api.MLContext.opSupportLimits", "api.MLGraph", "api.MLGraphBuilder", "api.MLGraphBuilder.MLGraphBuilder", "api.MLGraphBuilder.abs", "api.MLGraphBuilder.add", "api.MLGraphBuilder.argMax", "api.MLGraphBuilder.argMin", "api.MLGraphBuilder.averagePool2d", "api.MLGraphBuilder.batchNormalization", "api.MLGraphBuilder.build", "api.MLGraphBuilder.cast", "api.MLGraphBuilder.ceil", "api.MLGraphBuilder.clamp", "api.MLGraphBuilder.concat", "api.MLGraphBuilder.constant", "api.MLGraphBuilder.conv2d", "api.MLGraphBuilder.convTranspose2d", "api.MLGraphBuilder.cos", "api.MLGraphBuilder.cumulativeSum", "api.MLGraphBuilder.dequantizeLinear", "api.MLGraphBuilder.div", "api.MLGraphBuilder.elu", "api.MLGraphBuilder.equal", "api.MLGraphBuilder.erf", "api.MLGraphBuilder.exp", "api.MLGraphB\
uilder.expand", "api.MLGraphBuilder.floor", "api.MLGraphBuilder.gather", "api.MLGraphBuilder.gatherElements", "api.MLGraphBuilder.gatherND", "api.MLGraphBuilder.gemm", "api.MLGraphBuilder.greater", "api.MLGraphBuilder.greaterOrEqual", "api.MLGraphBuilder.gru", "api.MLGraphBuilder.gruCell", "api.MLGraphBuilder.hardSigmoid", "api.MLGraphBuilder.hardSwish", "api.MLGraphBuilder.identity", "api.MLGraphBuilder.input", "api.MLGraphBuilder.instanceNormalization", "api.MLGraphBuilder.l2Pool2d", "api.MLGraphBuilder.layerNormalization", "api.MLGraphBuilder.leakyRelu", "api.MLGraphBuilder.lesser", "api.MLGraphBuilder.lesserOrEqual", "api.MLGraphBuilder.linear", "api.MLGraphBuilder.log", "api.MLGraphBuilder.logicalAnd", "api.MLGraphBuilder.logicalNot", "api.MLGraphBuilder.logicalOr", "api.MLGraphBuilder.logicalXor", "api.MLGraphBuilder.lstm", "api.MLGraphBuilder.lstmCell", "api.MLGraphBuilder.matmul", "api.MLGraphBuilder.max", "api.MLGraphBuilder.maxPool2d", "api.MLGraphBuilder.min", "api.MLGraphBu\
ilder.mul", "api.MLGraphBuilder.neg", "api.MLGraphBuilder.pad", "api.MLGraphBuilder.pow", "api.MLGraphBuilder.prelu", "api.MLGraphBuilder.quantizeLinear", "api.MLGraphBuilder.reciprocal", "api.MLGraphBuilder.reduceL1", "api.MLGraphBuilder.reduceL2", "api.MLGraphBuilder.reduceLogSum", "api.MLGraphBuilder.reduceLogSumExp", "api.MLGraphBuilder.reduceMax", "api.MLGraphBuilder.reduceMean", "api.MLGraphBuilder.reduceMin", "api.MLGraphBuilder.reduceProduct", "api.MLGraphBuilder.reduceSum", "api.MLGraphBuilder.reduceSumSquare", "api.MLGraphBuilder.relu", "api.MLGraphBuilder.resample2d", "api.MLGraphBuilder.reshape", "api.MLGraphBuilder.scatterElements", "api.MLGraphBuilder.scatterND", "api.MLGraphBuilder.sigmoid", "api.MLGraphBuilder.sign", "api.MLGraphBuilder.sin", "api.MLGraphBuilder.slice", "api.MLGraphBuilder.softmax", "api.MLGraphBuilder.softplus", "api.MLGraphBuilder.softsign", "api.MLGraphBuilder.split", "api.MLGraphBuilder.sqrt", "api.MLGraphBuilder.sub", "api.MLGraphBuilder.tan", "api\
.MLGraphBuilder.tanh", "api.MLGraphBuilder.tile", "api.MLGraphBuilder.transpose", "api.MLGraphBuilder.triangular", "api.MLGraphBuilder.where", "api.MLOperand", "api.Navigator.ml", "api.WorkerNavigator.ml"], description: "The WebNN API constructs and executes computational graphs of neural networks by making use of the various machine learning capabilities and hardware accelerators available on the device. Also known as Web Neural Network API.", description_html: "The WebNN API constructs and executes computational graphs of neural networks by making use of the various machine learning capabilities and hardware accelerators available on the device. Also known as Web Neural Network API.", kind: "feature", name: "WebNN", spec: ["https://www.w3.org/TR/webnn/"], status: { baseline: false, by_compat_key: { "api.ML": { baseline: false, support: {} }, "api.ML.createContext": { baseline: false, support: {} }, "api.MLContext": { baseline: false, support: {} }, "api.MLContext.dispatch": { baseline: false,
    support: {} }, "api.MLContext.opSupportLimits": { baseline: false, support: {} }, "api.MLGraph": { baseline: false, support: {} }, "api.MLGraphBuilder": { baseline: false, support: {} }, "api.MLGraphBuilder.MLGraphBuilder": { baseline: false, support: {} }, "api.MLGraphBuilder.abs": { baseline: false, support: {} }, "api.MLGraphBuilder.add": { baseline: false, support: {} }, "api.MLGraphBuilder.argMax": { baseline: false, support: {} }, "api.MLGraphBuilder.argMin": { baseline: false, support: {} }, "api.MLGraphBuilder.averagePool2d": { baseline: false, support: {} }, "api.MLGraphBuilder.batchNormalization": { baseline: false, support: {} }, "api.MLGraphBuilder.build": { baseline: false, support: {} }, "api.MLGraphBuilder.cast": { baseline: false, support: {} }, "api.MLGraphBuilder.ceil": { baseline: false, support: {} }, "api.MLGraphBuilder.clamp": { baseline: false, support: {} }, "api.MLGraphBuilder.concat": { baseline: false, support: {} }, "api.MLGraphBuilder.constant": { baseline: false,
    support: {} }, "api.MLGraphBuilder.conv2d": { baseline: false, support: {} }, "api.MLGraphBuilder.convTranspose2d": { baseline: false, support: {} }, "api.MLGraphBuilder.cos": { baseline: false, support: {} }, "api.MLGraphBuilder.cumulativeSum": { baseline: false, support: {} }, "api.MLGraphBuilder.dequantizeLinear": { baseline: false, support: {} }, "api.MLGraphBuilder.div": { baseline: false, support: {} }, "api.MLGraphBuilder.elu": { baseline: false, support: {} }, "api.MLGraphBuilder.equal": { baseline: false, support: {} }, "api.MLGraphBuilder.erf": { baseline: false, support: {} }, "api.MLGraphBuilder.exp": { baseline: false, support: {} }, "api.MLGraphBuilder.expand": { baseline: false, support: {} }, "api.MLGraphBuilder.floor": { baseline: false, support: {} }, "api.MLGraphBuilder.gather": { baseline: false, support: {} }, "api.MLGraphBuilder.gatherElements": { baseline: false, support: {} }, "api.MLGraphBuilder.gatherND": { baseline: false, support: {} }, "api.MLGraphBuild\
er.gemm": { baseline: false, support: {} }, "api.MLGraphBuilder.greater": { baseline: false, support: {} }, "api.MLGraphBuilder.greaterOrEqual": { baseline: false, support: {} }, "api.MLGraphBuilder.gru": { baseline: false, support: {} }, "api.MLGraphBuilder.gruCell": { baseline: false, support: {} }, "api.MLGraphBuilder.hardSigmoid": { baseline: false, support: {} }, "api.MLGraphBuilder.hardSwish": { baseline: false, support: {} }, "api.MLGraphBuilder.identity": { baseline: false, support: {} }, "api.MLGraphBuilder.input": { baseline: false, support: {} }, "api.MLGraphBuilder.instanceNormalization": { baseline: false, support: {} }, "api.MLGraphBuilder.l2Pool2d": { baseline: false, support: {} }, "api.MLGraphBuilder.layerNormalization": { baseline: false, support: {} }, "api.MLGraphBuilder.leakyRelu": { baseline: false, support: {} }, "api.MLGraphBuilder.lesser": { baseline: false, support: {} }, "api.MLGraphBuilder.lesserOrEqual": { baseline: false, support: {} }, "api.MLGraphBuilder\
.linear": { baseline: false, support: {} }, "api.MLGraphBuilder.log": { baseline: false, support: {} }, "api.MLGraphBuilder.logicalAnd": { baseline: false, support: {} }, "api.MLGraphBuilder.logicalNot": { baseline: false, support: {} }, "api.MLGraphBuilder.logicalOr": { baseline: false, support: {} }, "api.MLGraphBuilder.logicalXor": { baseline: false, support: {} }, "api.MLGraphBuilder.lstm": { baseline: false, support: {} }, "api.MLGraphBuilder.lstmCell": { baseline: false, support: {} }, "api.MLGraphBuilder.matmul": { baseline: false, support: {} }, "api.MLGraphBuilder.max": { baseline: false, support: {} }, "api.MLGraphBuilder.maxPool2d": { baseline: false, support: {} }, "api.MLGraphBuilder.min": { baseline: false, support: {} }, "api.MLGraphBuilder.mul": { baseline: false, support: {} }, "api.MLGraphBuilder.neg": { baseline: false, support: {} }, "api.MLGraphBuilder.pad": { baseline: false, support: {} }, "api.MLGraphBuilder.pow": { baseline: false, support: {} }, "api.MLGraphBu\
ilder.prelu": { baseline: false, support: {} }, "api.MLGraphBuilder.quantizeLinear": { baseline: false, support: {} }, "api.MLGraphBuilder.reciprocal": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceL1": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceL2": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceLogSum": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceLogSumExp": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceMax": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceMean": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceMin": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceProduct": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceSum": { baseline: false, support: {} }, "api.MLGraphBuilder.reduceSumSquare": { baseline: false, support: {} }, "api.MLGraphBuilder.relu": { baseline: false, support: {} }, "api.MLGraphBuilder.resample2d": { baseline: false, support: {} }, "api.MLG\
raphBuilder.reshape": { baseline: false, support: {} }, "api.MLGraphBuilder.scatterElements": { baseline: false, support: {} }, "api.MLGraphBuilder.scatterND": { baseline: false, support: {} }, "api.MLGraphBuilder.sigmoid": { baseline: false, support: {} }, "api.MLGraphBuilder.sign": { baseline: false, support: {} }, "api.MLGraphBuilder.sin": { baseline: false, support: {} }, "api.MLGraphBuilder.slice": { baseline: false, support: {} }, "api.MLGraphBuilder.softmax": { baseline: false, support: {} }, "api.MLGraphBuilder.softplus": { baseline: false, support: {} }, "api.MLGraphBuilder.softsign": { baseline: false, support: {} }, "api.MLGraphBuilder.split": { baseline: false, support: {} }, "api.MLGraphBuilder.sqrt": { baseline: false, support: {} }, "api.MLGraphBuilder.sub": { baseline: false, support: {} }, "api.MLGraphBuilder.tan": { baseline: false, support: {} }, "api.MLGraphBuilder.tanh": { baseline: false, support: {} }, "api.MLGraphBuilder.tile": { baseline: false, support: {} }, "\
api.MLGraphBuilder.transpose": { baseline: false, support: {} }, "api.MLGraphBuilder.triangular": { baseline: false, support: {} }, "api.MLGraphBuilder.where": { baseline: false, support: {} }, "api.MLOperand": { baseline: false, support: {} }, "api.Navigator.ml": { baseline: false, support: {} }, "api.WorkerNavigator.ml": { baseline: false, support: {} } }, support: {} } }, webp: { caniuse: ["webp"], compat_features: ["mediatypes.image.webp", "mediatypes.image.webp.alpha", "mediatypes.image.webp.animation", "mediatypes.image.webp.lossless", "mediatypes.image.webp.lossy"], description: "The WebP image format is a raster graphics file format that supports animation, alpha transparency, and lossy as well as lossless compression.", description_html: "The WebP image format is a raster graphics file format that supports animation, alpha transparency, and lossy as well as lossless compression.", group: ["image-formats"], kind: "feature", name: "WebP", spec: ["https://www.rfc-editor.org/rfc/r\
fc9649"], status: { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", by_compat_key: { "mediatypes.image.webp": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "17", chrome_android: "18", edge: "18", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "mediatypes.image.webp.alpha": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "23", chrome_android: "25", edge: "18", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "mediatypes.image.webp.animation": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "32", chrome_android: "32", edge: "18", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "mediatypes.image.webp.lossless": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: {
    chrome: "23", chrome_android: "25", edge: "18", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } }, "mediatypes.image.webp.lossy": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "17", chrome_android: "18", edge: "18", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } } }, support: { chrome: "32", chrome_android: "32", edge: "18", firefox: "65", firefox_android: "65", safari: "14", safari_ios: "14" } } }, webrtc: { caniuse: ["rtcpeerconnection"], compat_features: ["api.RTCCertificate", "api.RTCCertificate.expires", "api.RTCCertificate.getFingerprints", "api.RTCDTMFSender", "api.RTCDTMFSender.canInsertDTMF", "api.RTCDTMFSender.insertDTMF", "api.RTCDTMFSender.toneBuffer", "api.RTCDTMFSender.tonechange_event", "api.RTCDTMFToneChangeEvent", "api.RTCDTMFToneChangeEvent.RTCDTMFToneChangeEvent", "api.RTCDTMFToneChangeEvent.tone", "api.RTCDataChannel", "api.RTCDataChannel.binaryType", "api.\
RTCDataChannel.binaryType.arraybuffer_value", "api.RTCDataChannel.binaryType.blob_value", "api.RTCDataChannel.bufferedAmount", "api.RTCDataChannel.bufferedAmountLowThreshold", "api.RTCDataChannel.bufferedamountlow_event", "api.RTCDataChannel.close", "api.RTCDataChannel.close_event", "api.RTCDataChannel.closing_event", "api.RTCDataChannel.error_event", "api.RTCDataChannel.id", "api.RTCDataChannel.label", "api.RTCDataChannel.maxPacketLifeTime", "api.RTCDataChannel.maxRetransmits", "api.RTCDataChannel.message_event", "api.RTCDataChannel.negotiated", "api.RTCDataChannel.open_event", "api.RTCDataChannel.ordered", "api.RTCDataChannel.protocol", "api.RTCDataChannel.readyState", "api.RTCDataChannel.sctp_sdp_21", "api.RTCDataChannel.send", "api.RTCDataChannel.transferable", "api.RTCDataChannelEvent", "api.RTCDataChannelEvent.RTCDataChannelEvent", "api.RTCDataChannelEvent.channel", "api.RTCDtlsTransport", "api.RTCDtlsTransport.error_event", "api.RTCDtlsTransport.getRemoteCertificates", "api.RTCD\
tlsTransport.iceTransport", "api.RTCDtlsTransport.state", "api.RTCDtlsTransport.statechange_event", "api.RTCError", "api.RTCError.RTCError", "api.RTCError.errorDetail", "api.RTCError.receivedAlert", "api.RTCError.sctpCauseCode", "api.RTCError.sdpLineNumber", "api.RTCError.sentAlert", "api.RTCErrorEvent", "api.RTCErrorEvent.RTCErrorEvent", "api.RTCErrorEvent.error", "api.RTCIceCandidate", "api.RTCIceCandidate.RTCIceCandidate", "api.RTCIceCandidate.address", "api.RTCIceCandidate.candidate", "api.RTCIceCandidate.component", "api.RTCIceCandidate.foundation", "api.RTCIceCandidate.port", "api.RTCIceCandidate.priority", "api.RTCIceCandidate.protocol", "api.RTCIceCandidate.relatedAddress", "api.RTCIceCandidate.relatedPort", "api.RTCIceCandidate.relayProtocol", "api.RTCIceCandidate.sdpMLineIndex", "api.RTCIceCandidate.sdpMid", "api.RTCIceCandidate.tcpType", "api.RTCIceCandidate.toJSON", "api.RTCIceCandidate.type", "api.RTCIceCandidate.url", "api.RTCIceCandidate.usernameFragment", "api.RTCIceTra\
nsport", "api.RTCIceTransport.gatheringState", "api.RTCIceTransport.gatheringstatechange_event", "api.RTCIceTransport.getLocalCandidates", "api.RTCIceTransport.getLocalParameters", "api.RTCIceTransport.getRemoteCandidates", "api.RTCIceTransport.getRemoteParameters", "api.RTCIceTransport.getSelectedCandidatePair", "api.RTCIceTransport.role", "api.RTCIceTransport.selectedcandidatepairchange_event", "api.RTCIceTransport.state", "api.RTCIceTransport.statechange_event", "api.RTCPeerConnection", "api.RTCPeerConnection.RTCPeerConnection", "api.RTCPeerConnection.RTCPeerConnection.configuration_bundlePolicy_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_certificates_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_iceCandidatePoolSize_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_iceServers_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_iceServers_parameter.credential_parameter", "api.RTCPeerConnection.RTCPeerConnect\
ion.configuration_iceServers_parameter.urls_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_iceServers_parameter.username_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_iceTransportPolicy_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_peerIdentity_parameter", "api.RTCPeerConnection.RTCPeerConnection.configuration_rtcpMuxPolicy_parameter", "api.RTCPeerConnection.addIceCandidate", "api.RTCPeerConnection.addIceCandidate.returns_promise", "api.RTCPeerConnection.addTrack", "api.RTCPeerConnection.addTransceiver", "api.RTCPeerConnection.addTransceiver.init_direction_parameter", "api.RTCPeerConnection.addTransceiver.init_sendEncodings_parameter", "api.RTCPeerConnection.addTransceiver.init_streams_parameter", "api.RTCPeerConnection.canTrickleIceCandidates", "api.RTCPeerConnection.close", "api.RTCPeerConnection.connectionState", "api.RTCPeerConnection.connectionstatechange_event", "api.RTCPeerConnection.createAnswer", "api.RTCPeerConnect\
ion.createAnswer.returns_promise", "api.RTCPeerConnection.createDataChannel", "api.RTCPeerConnection.createOffer", "api.RTCPeerConnection.createOffer.returns_promise", "api.RTCPeerConnection.currentLocalDescription", "api.RTCPeerConnection.currentRemoteDescription", "api.RTCPeerConnection.datachannel_event", "api.RTCPeerConnection.generateCertificate_static", "api.RTCPeerConnection.getConfiguration", "api.RTCPeerConnection.getReceivers", "api.RTCPeerConnection.getReceivers.stopped_transceivers_removed", "api.RTCPeerConnection.getSenders", "api.RTCPeerConnection.getSenders.stopped_transceivers_removed", "api.RTCPeerConnection.getTransceivers", "api.RTCPeerConnection.getTransceivers.stopped_transceivers_removed", "api.RTCPeerConnection.iceConnectionState", "api.RTCPeerConnection.iceGatheringState", "api.RTCPeerConnection.icecandidate_event", "api.RTCPeerConnection.icecandidateerror_event", "api.RTCPeerConnection.iceconnectionstatechange_event", "api.RTCPeerConnection.icegatheringstatecha\
nge_event", "api.RTCPeerConnection.localDescription", "api.RTCPeerConnection.negotiationneeded_event", "api.RTCPeerConnection.pendingLocalDescription", "api.RTCPeerConnection.pendingRemoteDescription", "api.RTCPeerConnection.remoteDescription", "api.RTCPeerConnection.removeTrack", "api.RTCPeerConnection.restartIce", "api.RTCPeerConnection.setConfiguration", "api.RTCPeerConnection.setLocalDescription", "api.RTCPeerConnection.setLocalDescription.description_parameter_optional", "api.RTCPeerConnection.setLocalDescription.returns_promise", "api.RTCPeerConnection.setRemoteDescription", "api.RTCPeerConnection.setRemoteDescription.implicit_rollback", "api.RTCPeerConnection.setRemoteDescription.returns_promise", "api.RTCPeerConnection.signalingState", "api.RTCPeerConnection.signalingstatechange_event", "api.RTCPeerConnection.track_event", "api.RTCPeerConnectionIceErrorEvent", "api.RTCPeerConnectionIceErrorEvent.RTCPeerConnectionIceErrorEvent", "api.RTCPeerConnectionIceErrorEvent.address", "api\
.RTCPeerConnectionIceErrorEvent.errorCode", "api.RTCPeerConnectionIceErrorEvent.errorText", "api.RTCPeerConnectionIceErrorEvent.port", "api.RTCPeerConnectionIceErrorEvent.url", "api.RTCPeerConnectionIceEvent", "api.RTCPeerConnectionIceEvent.RTCPeerConnectionIceEvent", "api.RTCPeerConnectionIceEvent.candidate", "api.RTCRtpReceiver", "api.RTCRtpReceiver.createEncodedStreams", "api.RTCRtpReceiver.getCapabilities_static", "api.RTCRtpReceiver.getContributingSources", "api.RTCRtpReceiver.getContributingSources.audioLevel", "api.RTCRtpReceiver.getContributingSources.audio_tracks_supported", "api.RTCRtpReceiver.getContributingSources.rtpTimestamp", "api.RTCRtpReceiver.getContributingSources.source", "api.RTCRtpReceiver.getContributingSources.timestamp", "api.RTCRtpReceiver.getContributingSources.video_tracks_supported", "api.RTCRtpReceiver.getParameters", "api.RTCRtpReceiver.getParameters.return_object_property_codecs", "api.RTCRtpReceiver.getParameters.return_object_property_headerExtensions",
    "api.RTCRtpReceiver.getParameters.return_object_property_rtcp", "api.RTCRtpReceiver.getSynchronizationSources", "api.RTCRtpReceiver.getSynchronizationSources.audio_tracks_supported", "api.RTCRtpReceiver.getSynchronizationSources.video_tracks_supported", "api.RTCRtpReceiver.jitterBufferTarget", "api.RTCRtpReceiver.track", "api.RTCRtpReceiver.transport", "api.RTCRtpSender", "api.RTCRtpSender.createEncodedStreams", "api.RTCRtpSender.dtmf", "api.RTCRtpSender.getCapabilities_static", "api.RTCRtpSender.getParameters", "api.RTCRtpSender.getParameters.return_object_property_codecs", "api.RTCRtpSender.getParameters.return_object_property_encodings", "api.RTCRtpSender.getParameters.return_object_property_headerExtensions", "api.RTCRtpSender.getParameters.return_object_property_rtcp", "api.RTCRtpSender.getParameters.return_object_property_transactionId", "api.RTCRtpSender.replaceTrack", "api.RTCRtpSender.setParameters", "api.RTCRtpSender.setParameters.parameters_codecs_parameter", "api.RTCRtp\
Sender.setParameters.parameters_encodings_parameter", "api.RTCRtpSender.setParameters.parameters_encodings_parameter.active", "api.RTCRtpSender.setParameters.parameters_encodings_parameter.maxBitrate", "api.RTCRtpSender.setParameters.parameters_encodings_parameter.maxFramerate", "api.RTCRtpSender.setParameters.parameters_encodings_parameter.rid", "api.RTCRtpSender.setParameters.parameters_encodings_parameter.scaleResolutionDownBy", "api.RTCRtpSender.setParameters.parameters_headerExtensions_parameter", "api.RTCRtpSender.setParameters.parameters_rtcp_parameter", "api.RTCRtpSender.setParameters.parameters_transactionId_parameter", "api.RTCRtpSender.setStreams", "api.RTCRtpSender.track", "api.RTCRtpSender.transport", "api.RTCRtpTransceiver", "api.RTCRtpTransceiver.currentDirection", "api.RTCRtpTransceiver.currentDirection.stopped_value", "api.RTCRtpTransceiver.direction", "api.RTCRtpTransceiver.direction.value_stopped", "api.RTCRtpTransceiver.getHeaderExtensionsToNegotiate", "api.RTCRtpTr\
ansceiver.getNegotiatedHeaderExtensions", "api.RTCRtpTransceiver.mid", "api.RTCRtpTransceiver.receiver", "api.RTCRtpTransceiver.sender", "api.RTCRtpTransceiver.setCodecPreferences", "api.RTCRtpTransceiver.setHeaderExtensionsToNegotiate", "api.RTCRtpTransceiver.stop", "api.RTCSessionDescription", "api.RTCSessionDescription.sdp", "api.RTCSessionDescription.toJSON", "api.RTCSessionDescription.type", "api.RTCTrackEvent", "api.RTCTrackEvent.RTCTrackEvent", "api.RTCTrackEvent.receiver", "api.RTCTrackEvent.streams", "api.RTCTrackEvent.track", "api.RTCTrackEvent.transceiver"], description: "The WebRTC API establishes real-time communication channels directly between browsers. It is commonly used in video conferencing applications.", description_html: "The WebRTC API establishes real-time communication channels directly between browsers. It is commonly used in video conferencing applications.", group: ["webrtc"], kind: "feature", name: "WebRTC", spec: ["https://w3c.github.io/webrtc-pc/"], status: {
    baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.RTCCertificate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "42", firefox_android: "42", safari: "12.1", safari_ios: "12.2" } }, "api.RTCCertificate.expires": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "49", chrome_android: "49", edge: "79", firefox: "42", firefox_android: "42", safari: "12.1", safari_ios: "12.2" } }, "api.RTCCertificate.getFingerprints": { baseline: "low", baseline_low_date: "2025-04-29", support: { chrome: "61", chrome_android: "61", edge: "79", firefox: "138", firefox_android: "138", safari: "12.1", safari_ios: "12.2" } }, "api.RTCDTMFSender": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "79",
    firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFSender.canInsertDTMF": { baseline: "low", baseline_low_date: "2024-08-06", support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "129", firefox_android: "129", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFSender.insertDTMF": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFSender.toneBuffer": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "79", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFSender.tonechange_event": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "7\
9", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFToneChangeEvent": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFToneChangeEvent.RTCDTMFToneChangeEvent": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "13", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDTMFToneChangeEvent.tone": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "27", chrome_android: "27", edge: "12", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCDataChannel": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.binaryType": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.binaryType.arraybuffer_value": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.binaryType.blob_value": { baseline: "low", baseline_low_date: "2024-09-19", support: { chrome: "129", chrome_android: "129", edge: "129", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.bufferedAmount": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.bufferedAmountLowThreshold": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "46", chrome_android: "46", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.bufferedamountlow_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "57", chrome_android: "57", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.close": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.close_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.closing_event": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "144", firefox_android: "144", safari: "15.4", safari_ios: "15.4" } }, "api.RTCDataChannel.error_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.id": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.label": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.maxPacketLifeTime": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.maxRetransmits": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "62", firefox_android: "62", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.message_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.negotiated": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01\
-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "68", firefox_android: "68", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.open_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.ordered": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.protocol": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "30", chrome_android: "30", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.readyState": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.sctp_sdp_21": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "63", firefox_android: "63" } }, "api.RTCDataChannel.send": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannel.transferable": { baseline: "low", baseline_low_date: "2025-10-14", support: { chrome: "130", chrome_android: "130", edge: "130", firefox: "144", firefox_android: "144", safari: "15", safari_ios: "15" } }, "api.RTCDataChannelEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "\
11" } }, "api.RTCDataChannelEvent.RTCDataChannelEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDataChannelEvent.channel": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "24", chrome_android: "25", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCDtlsTransport": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "72", chrome_android: "72", edge: "12", firefox: "82", firefox_android: "82", safari: "15.4", safari_ios: "15.4" } }, "api.RTCDtlsTransport.error_event": { baseline: false, support: { chrome: "72", chrome_android: "72", edge: "12", safari: "15.4", safari_ios: "15.4" } }, "api.RTCDtlsTransport.getRemoteCertificates": { baseline: false, support: {
    chrome: "72", chrome_android: "72", edge: "12", safari: "15.4", safari_ios: "15.4" } }, "api.RTCDtlsTransport.iceTransport": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "125", firefox_android: "125", safari: "15.4", safari_ios: "15.4" } }, "api.RTCDtlsTransport.state": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "72", chrome_android: "72", edge: "12", firefox: "82", firefox_android: "82", safari: "15.4", safari_ios: "15.4" } }, "api.RTCDtlsTransport.statechange_event": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "82", firefox_android: "82", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "\
150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError.RTCError": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError.errorDetail": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError.receivedAlert": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError.sctpCauseCode": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError.sdpLineNumber": { baseline: "low", baseline_low_date: "2026-04-\
21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCError.sentAlert": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCErrorEvent": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCErrorEvent.RTCErrorEvent": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "15.4" } }, "api.RTCErrorEvent.error": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "150", firefox_android: "150", safari: "15.4", safari_ios: "\
15.4" } }, "api.RTCIceCandidate": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCIceCandidate.RTCIceCandidate": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCIceCandidate.address": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.candidate": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCIceC\
andidate.component": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.foundation": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.port": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.priority": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.protocol": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "\
74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.relatedAddress": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.relatedPort": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.relayProtocol": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "api.RTCIceCandidate.sdpMLineIndex": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCIceCandidate.sdpMid": { baseline: "high", baseline_high_date: "\
2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCIceCandidate.tcpType": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.toJSON": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCIceCandidate.type": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "126", firefox_android: "126", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceCandidate.url": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "api.RTCIceCandida\
te.usernameFragment": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "67", firefox_android: "67", safari: "14.1", safari_ios: "14.5" } }, "api.RTCIceTransport": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "75", chrome_android: "75", edge: "13", firefox: "125", firefox_android: "125", safari: "11", safari_ios: "11" } }, "api.RTCIceTransport.gatheringState": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "125", firefox_android: "125", safari: "11", safari_ios: "11" } }, "api.RTCIceTransport.gatheringstatechange_event": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "125", firefox_android: "125", safari: "15.4", safari_ios: "15.4" } }, "api.RTCIceTransport.getLocalCandidates": { baseline: false, support: { chrome: "\
75", chrome_android: "75", edge: "79" } }, "api.RTCIceTransport.getLocalParameters": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "79" } }, "api.RTCIceTransport.getRemoteCandidates": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "13" } }, "api.RTCIceTransport.getRemoteParameters": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "13" } }, "api.RTCIceTransport.getSelectedCandidatePair": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.RTCIceTransport.role": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "13", firefox: "150", firefox_android: "150" } }, "api.RTCIceTransport.selectedcandidatepairchange_event": { baseline: false, support: { chrome: "75", chrome_android: "75", edge: "79", safari: "16.4", safari_ios: "16.4" } }, "api.RTCIceTransport.state": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "\
75", chrome_android: "75", edge: "13", firefox: "125", firefox_android: "125", safari: "11", safari_ios: "11" } }, "api.RTCIceTransport.statechange_event": { baseline: "low", baseline_low_date: "2024-04-16", support: { chrome: "75", chrome_android: "75", edge: "79", firefox: "125", firefox_android: "125", safari: "15.4", safari_ios: "15.4" } }, "api.RTCPeerConnection": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_bundlePolicy_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_certificates_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "12.1", safari_ios: "12.2" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_iceCandidatePoolSize_parameter": { baseline: false, support: { chrome: "59", chrome_android: "59", edge: "79", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_iceServers_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configura\
tion_iceServers_parameter.credential_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_iceServers_parameter.urls_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_iceServers_parameter.username_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_iceTransportPolicy_parameter": { baseline: "hi\
gh", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_peerIdentity_parameter": { baseline: false, support: { firefox: "44", firefox_android: "44" } }, "api.RTCPeerConnection.RTCPeerConnection.configuration_rtcpMuxPolicy_parameter": { baseline: false, support: { chrome: "57", chrome_android: "57", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "api.RTCPeerConnection.addIceCandidate": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.addIceCandidate.returns_promise": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "\
56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.addTrack": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.addTransceiver": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.addTransceiver.init_direction_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.addTransceiver.init_sendEncodings_parameter": { baseline: "high", baseline_high_date: "\
2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "110", firefox_android: "110", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnection.addTransceiver.init_streams_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.RTCPeerConnection.canTrickleIceCandidates": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "47", firefox_android: "47", safari: "15.4", safari_ios: "15.4" } }, "api.RTCPeerConnection.close": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api\
.RTCPeerConnection.connectionState": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "113", firefox_android: "113", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.connectionstatechange_event": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "72", chrome_android: "72", edge: "79", firefox: "113", firefox_android: "113", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.createAnswer": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.createAnswer.returns_promise": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "\
44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.createDataChannel": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.createOffer": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.createOffer.returns_promise": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.currentLocalDescription": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: {
    chrome: "70", chrome_android: "70", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.currentRemoteDescription": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "57", firefox_android: "57", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.datachannel_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.generateCertificate_static": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "12.1", safari_ios: "12.2" } }, "api.RTCPeerConnection.getConfiguration": { baseline: "high", baseline_high_date: "\
2021-04-17", baseline_low_date: "2018-10-17", support: { chrome: "70", chrome_android: "70", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.getReceivers": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.getReceivers.stopped_transceivers_removed": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "118", firefox_android: "118" } }, "api.RTCPeerConnection.getSenders": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.getSenders.stopped_transceivers_removed": { baseline: false, support: { chrome: "88", chrome_android: "\
88", edge: "88", firefox: "118", firefox_android: "118" } }, "api.RTCPeerConnection.getTransceivers": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.getTransceivers.stopped_transceivers_removed": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "118", firefox_android: "118" } }, "api.RTCPeerConnection.iceConnectionState": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.iceGatheringState": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "\
44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.icecandidate_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.icecandidateerror_event": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnection.iceconnectionstatechange_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.icegatheringstatechange_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "\
59", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.localDescription": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.negotiationneeded_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.pendingLocalDescription": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.pendingRemoteDescription": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "\
2020-01-15", support: { chrome: "70", chrome_android: "70", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.remoteDescription": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.removeTrack": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.restartIce": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "70", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnection.setConfiguration": { baseline: "high", baseline_high_date: "\
2024-10-05", baseline_low_date: "2022-04-05", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "99", firefox_android: "99", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.setLocalDescription": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.setLocalDescription.description_parameter_optional": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "75", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnection.setLocalDescription.returns_promise": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11",
    safari_ios: "11" } }, "api.RTCPeerConnection.setRemoteDescription": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.setRemoteDescription.implicit_rollback": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "70", firefox_android: "79", safari: "15.4", safari_ios: "15.4" } }, "api.RTCPeerConnection.setRemoteDescription.returns_promise": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.signalingState": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "\
56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.signalingstatechange_event": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.track_event": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnectionIceErrorEvent": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceErrorEvent.RTCPeerConnectionIceErrorEvent": { baseline: "low", baseline_low_date: "2026-04-21", support: {
    chrome: "77", chrome_android: "77", edge: "79", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceErrorEvent.address": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceErrorEvent.errorCode": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceErrorEvent.errorText": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceErrorEvent.port": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "81", chrome_android: "81", edge: "81",
    firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceErrorEvent.url": { baseline: "low", baseline_low_date: "2026-04-21", support: { chrome: "77", chrome_android: "77", edge: "79", firefox: "150", firefox_android: "150", safari: "14.1", safari_ios: "14.5" } }, "api.RTCPeerConnectionIceEvent": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "24", firefox_android: "24", safari: "12", safari_ios: "12" } }, "api.RTCPeerConnectionIceEvent.RTCPeerConnectionIceEvent": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "24", firefox_android: "24", safari: "12", safari_ios: "12" } }, "api.RTCPeerConnectionIceEvent.candidate": { baseline: "high", baseline_high_date: "2021-03-17", baseline_low_date: "2018-09-17", support: { chrome: "5\
6", chrome_android: "56", edge: "15", firefox: "24", firefox_android: "24", safari: "12", safari_ios: "12" } }, "api.RTCRtpReceiver": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.RTCRtpReceiver.createEncodedStreams": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86" } }, "api.RTCRtpReceiver.getCapabilities_static": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "113", firefox_android: "113", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getContributingSources": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "\
12.2" } }, "api.RTCRtpReceiver.getContributingSources.audioLevel": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getContributingSources.audio_tracks_supported": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getContributingSources.rtpTimestamp": { baseline: false, support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "72", firefox_android: "79" } }, "api.RTCRtpReceiver.getContributingSources.source": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "59", firefox_android: "59", safari: "\
12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getContributingSources.timestamp": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getContributingSources.video_tracks_supported": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "68", firefox_android: "68", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getParameters": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "128", firefox_android: "128", safari: "11", safari_ios: "11" } }, "api.RTCRtpReceiver.getParameters.return_object_property_codecs": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "69", chrome_android: "69", edge: "79",
    firefox: "128", firefox_android: "128", safari: "11", safari_ios: "11" } }, "api.RTCRtpReceiver.getParameters.return_object_property_headerExtensions": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "11", safari_ios: "11" } }, "api.RTCRtpReceiver.getParameters.return_object_property_rtcp": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "15", safari_ios: "15" } }, "api.RTCRtpReceiver.getSynchronizationSources": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.getSynchronizationSources.audio_tracks_supported": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "\
12.2" } }, "api.RTCRtpReceiver.getSynchronizationSources.video_tracks_supported": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "73", chrome_android: "73", edge: "79", firefox: "68", firefox_android: "68", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpReceiver.jitterBufferTarget": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", firefox: "115", firefox_android: "115" } }, "api.RTCRtpReceiver.track": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.RTCRtpReceiver.transport": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "59", chrome_android: "59", edge: "12", firefox: "82", firefox_android: "82", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpSender": { baseline: "\
high", baseline_high_date: "2020-07-23", baseline_low_date: "2018-01-23", support: { chrome: "64", chrome_android: "64", edge: "13", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.createEncodedStreams": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86" } }, "api.RTCRtpSender.dtmf": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "66", chrome_android: "66", edge: "79", firefox: "52", firefox_android: "52", safari: "13.1", safari_ios: "13.4" } }, "api.RTCRtpSender.getCapabilities_static": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "69", chrome_android: "69", edge: "13", firefox: "113", firefox_android: "113", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.getParameters": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "68", chrome_android: "\
68", edge: "79", firefox: "46", firefox_android: "46", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.getParameters.return_object_property_codecs": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "128", firefox_android: "128", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.getParameters.return_object_property_encodings": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "46", firefox_android: "46", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.getParameters.return_object_property_headerExtensions": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.getParameters.return_object_property_rtcp": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "15", safari_ios: "15" } }, "ap\
i.RTCRtpSender.getParameters.return_object_property_transactionId": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "110", firefox_android: "110", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.replaceTrack": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "65", chrome_android: "65", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.setParameters": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "68", chrome_android: "68", edge: "79", firefox: "64", firefox_android: "64", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.setParameters.parameters_codecs_parameter": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "128", firefox_android: "\
128", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.setParameters.parameters_encodings_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "64", firefox_android: "64", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.setParameters.parameters_encodings_parameter.active": { baseline: "high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "110", firefox_android: "110", safari: "11.1", safari_ios: "11.3" } }, "api.RTCRtpSender.setParameters.parameters_encodings_parameter.maxBitrate": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "64", firefox_android: "64", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.setParameters.parameters_encodings_parameter.maxFramerate": {
    baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.setParameters.parameters_encodings_parameter.rid": { baseline: false, support: { firefox: "64", firefox_android: "64" } }, "api.RTCRtpSender.setParameters.parameters_encodings_parameter.scaleResolutionDownBy": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "74", chrome_android: "74", edge: "79", firefox: "64", firefox_android: "64", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.setParameters.parameters_headerExtensions_parameter": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.setParameters.parameters_rtcp_parameter": { baseline: false, support: { chrome: "69", chrome_android: "69", edge: "79", safari: "15", safari_ios: "15" } }, "api.RTCRtpSender.setParameters.parameters_transactionId_parameter": { baseline: "\
high", baseline_high_date: "2025-08-14", baseline_low_date: "2023-02-14", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "110", firefox_android: "110", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.setStreams": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCRtpSender.track": { baseline: "high", baseline_high_date: "2020-07-23", baseline_low_date: "2018-01-23", support: { chrome: "64", chrome_android: "64", edge: "13", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.RTCRtpSender.transport": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "75", chrome_android: "75", edge: "13", firefox: "82", firefox_android: "82", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpTransceiver": { baseline: "\
high", baseline_high_date: "≤2021-04-02", baseline_low_date: "≤2018-10-02", support: { chrome: "69", chrome_android: "69", edge: "≤18", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCRtpTransceiver.currentDirection": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpTransceiver.currentDirection.stopped_value": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "118", firefox_android: "118" } }, "api.RTCRtpTransceiver.direction": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCRtpTransceiver.direction.value_stopped": { baseline: false, support: { chrome: "\
103", chrome_android: "103", edge: "103", firefox: "118", firefox_android: "118" } }, "api.RTCRtpTransceiver.getHeaderExtensionsToNegotiate": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "api.RTCRtpTransceiver.getNegotiatedHeaderExtensions": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "api.RTCRtpTransceiver.mid": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCRtpTransceiver.receiver": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCRtpTransceiver.sender": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCRtpTransceiver.setCodecPreferences": { baseline: "low", baseline_low_date: "2024-07-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "128", firefox_android: "128", safari: "13.1", safari_ios: "13.4" } }, "api.RTCRtpTransceiver.setHeaderExtensionsToNegotiate": { baseline: false, support: { chrome: "117", chrome_android: "117", edge: "117" } }, "api.RTCRtpTransceiver.stop": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } }, "api.RTCSessionDescription": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCSes\
sionDescription.sdp": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCSessionDescription.toJSON": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "43", chrome_android: "43", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCSessionDescription.type": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "23", chrome_android: "25", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCTrackEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RT\
CTrackEvent.RTCTrackEvent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "64", chrome_android: "64", edge: "79", firefox: "46", firefox_android: "46", safari: "11", safari_ios: "11" } }, "api.RTCTrackEvent.receiver": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "34", firefox_android: "34", safari: "11", safari_ios: "11" } }, "api.RTCTrackEvent.streams": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.RTCTrackEvent.track": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } }, "api.R\
TCTrackEvent.transceiver": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "69", chrome_android: "69", edge: "79", firefox: "59", firefox_android: "59", safari: "11", safari_ios: "11" } } }, support: { chrome: "56", chrome_android: "56", edge: "79", firefox: "22", firefox_android: "24", safari: "11", safari_ios: "11" } } }, "webrtc-encoded-transform": { compat_features: ["api.DedicatedWorkerGlobalScope.rtctransform_event", "api.RTCEncodedAudioFrame", "api.RTCEncodedAudioFrame.RTCEncodedAudioFrame", "api.RTCEncodedAudioFrame.data", "api.RTCEncodedAudioFrame.getMetadata", "api.RTCEncodedVideoFrame", "api.RTCEncodedVideoFrame.RTCEncodedVideoFrame", "api.RTCEncodedVideoFrame.data", "api.RTCEncodedVideoFrame.getMetadata", "api.RTCEncodedVideoFrame.type", "api.RTCRtpReceiver.transform", "api.RTCRtpScriptTransform", "api.RTCRtpScriptTransform.RTCRtpScriptTransform", "api.RTCRtpScriptTransformer", "api.RTCRtpScriptTransformer.generateKe\
yFrame", "api.RTCRtpScriptTransformer.options", "api.RTCRtpScriptTransformer.readable", "api.RTCRtpScriptTransformer.sendKeyFrameRequest", "api.RTCRtpScriptTransformer.writable", "api.RTCRtpSender.transform", "api.RTCTransformEvent", "api.RTCTransformEvent.transformer"], description: "The WebRTC encoded transform API allows you to modify audio and video streams in WebRTC connections. For example, it can be used for visual effects or custom codecs.", description_html: "The WebRTC encoded transform API allows you to modify audio and video streams in WebRTC connections. For example, it can be used for visual effects or custom codecs.", group: ["webrtc"], kind: "feature", name: "WebRTC encoded transform", spec: ["https://w3c.github.io/webrtc-encoded-transform/"], status: { baseline: "low", baseline_low_date: "2025-10-03", by_compat_key: { "api.DedicatedWorkerGlobalScope.rtctransform_event": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141",
    edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedAudioFrame": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedAudioFrame.RTCEncodedAudioFrame": { baseline: "low", baseline_low_date: "2025-11-11", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "145", firefox_android: "145", safari: "26", safari_ios: "26" } }, "api.RTCEncodedAudioFrame.data": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedAudioFrame.getMetadata": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "86",
    chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedVideoFrame": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedVideoFrame.RTCEncodedVideoFrame": { baseline: "low", baseline_low_date: "2025-11-11", support: { chrome: "127", chrome_android: "127", edge: "127", firefox: "145", firefox_android: "145", safari: "26", safari_ios: "26" } }, "api.RTCEncodedVideoFrame.data": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedVideoFrame.getMetadata": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: {
    chrome: "86", chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCEncodedVideoFrame.type": { baseline: "high", baseline_high_date: "2026-02-28", baseline_low_date: "2023-08-29", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpReceiver.transform": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransform": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransform.RTCRtpScriptTransform": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "1\
41", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransformer": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransformer.generateKeyFrame": { baseline: false, support: { firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransformer.options": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransformer.readable": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransformer.sendKeyFrameRequest": { baseline: "l\
ow", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpScriptTransformer.writable": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCRtpSender.transform": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCTransformEvent": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } }, "api.RTCTransformEvent.transformer": { baseline: "low", baseline_low_date: "2025-10-03", support: { chrome: "141", chrome_android: "141", edge: "\
141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "141", chrome_android: "141", edge: "141", firefox: "117", firefox_android: "117", safari: "15.4", safari_ios: "15.4" } } }, "webrtc-sctp": { compat_features: ["api.RTCPeerConnection.sctp", "api.RTCSctpTransport", "api.RTCSctpTransport.maxChannels", "api.RTCSctpTransport.maxMessageSize", "api.RTCSctpTransport.state", "api.RTCSctpTransport.statechange_event", "api.RTCSctpTransport.transport"], description: "The sctp object on RTCPeerConnection represents the negotiated SCTP transport. SCTP (Stream Control Transmission Protocol) is the protocol that RTCDataChannel uses.", description_html: "The <code>sctp</code> object on <code>RTCPeerConnection</code> represents the negotiated SCTP transport. SCTP (Stream Control Transmission Protocol) is the protocol that <code>RTCDataChannel</code> uses.", group: ["webrtc"], kind: "feature", name: "WebRTC SCTP information", spec: ["https://w3c.gi\
thub.io/webrtc-pc/#rtcsctptransport-interface"], status: { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", by_compat_key: { "api.RTCPeerConnection.sctp": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "api.RTCSctpTransport": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "api.RTCSctpTransport.maxChannels": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "api.RTCSctpTransport.maxMessageSize": { baseline: "high", baseline_high_date: "\
2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "api.RTCSctpTransport.state": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "api.RTCSctpTransport.statechange_event": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } }, "api.RTCSctpTransport.transport": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } } }, support: { chrome: "76", chrome_android: "\
76", edge: "79", firefox: "113", firefox_android: "113", safari: "15.4", safari_ios: "15.4" } } }, "webrtc-stats": { compat_features: ["api.RTCPeerConnection.getStats", "api.RTCPeerConnection.getStats.returns_promise", "api.RTCPeerConnection.getStats.selector_parameter", "api.RTCRtpReceiver.getStats", "api.RTCRtpSender.getStats", "api.RTCStatsReport", "api.RTCStatsReport.@@iterator", "api.RTCStatsReport.entries", "api.RTCStatsReport.forEach", "api.RTCStatsReport.get", "api.RTCStatsReport.has", "api.RTCStatsReport.keys", "api.RTCStatsReport.size", "api.RTCStatsReport.type_candidate-pair", "api.RTCStatsReport.type_candidate-pair.availableOutgoingBitrate", "api.RTCStatsReport.type_candidate-pair.bytesDiscardedOnSend", "api.RTCStatsReport.type_candidate-pair.bytesReceived", "api.RTCStatsReport.type_candidate-pair.bytesSent", "api.RTCStatsReport.type_candidate-pair.consentRequestsSent", "api.RTCStatsReport.type_candidate-pair.currentRoundTripTime", "api.RTCStatsReport.type_candidate-pair.id",
    "api.RTCStatsReport.type_candidate-pair.lastPacketReceivedTimestamp", "api.RTCStatsReport.type_candidate-pair.lastPacketSentTimestamp", "api.RTCStatsReport.type_candidate-pair.localCandidateId", "api.RTCStatsReport.type_candidate-pair.nominated", "api.RTCStatsReport.type_candidate-pair.packetsDiscardedOnSend", "api.RTCStatsReport.type_candidate-pair.packetsReceived", "api.RTCStatsReport.type_candidate-pair.packetsSent", "api.RTCStatsReport.type_candidate-pair.remoteCandidateId", "api.RTCStatsReport.type_candidate-pair.requestsReceived", "api.RTCStatsReport.type_candidate-pair.requestsSent", "api.RTCStatsReport.type_candidate-pair.responsesReceived", "api.RTCStatsReport.type_candidate-pair.responsesSent", "api.RTCStatsReport.type_candidate-pair.state", "api.RTCStatsReport.type_candidate-pair.timestamp", "api.RTCStatsReport.type_candidate-pair.totalRoundTripTime", "api.RTCStatsReport.type_candidate-pair.transportId", "api.RTCStatsReport.type_candidate-pair.type", "api.RTCStatsReport.\
type_certificate", "api.RTCStatsReport.type_certificate.base64Certificate", "api.RTCStatsReport.type_certificate.fingerprint", "api.RTCStatsReport.type_certificate.fingerprintAlgorithm", "api.RTCStatsReport.type_certificate.id", "api.RTCStatsReport.type_certificate.timestamp", "api.RTCStatsReport.type_certificate.type", "api.RTCStatsReport.type_codec", "api.RTCStatsReport.type_codec.channels", "api.RTCStatsReport.type_codec.clockRate", "api.RTCStatsReport.type_codec.id", "api.RTCStatsReport.type_codec.mimeType", "api.RTCStatsReport.type_codec.payloadType", "api.RTCStatsReport.type_codec.sdpFmtpLine", "api.RTCStatsReport.type_codec.timestamp", "api.RTCStatsReport.type_codec.transportId", "api.RTCStatsReport.type_codec.type", "api.RTCStatsReport.type_data-channel", "api.RTCStatsReport.type_data-channel.bytesReceived", "api.RTCStatsReport.type_data-channel.bytesSent", "api.RTCStatsReport.type_data-channel.dataChannelIdentifier", "api.RTCStatsReport.type_data-channel.id", "api.RTCStatsRepo\
rt.type_data-channel.label", "api.RTCStatsReport.type_data-channel.messagesReceived", "api.RTCStatsReport.type_data-channel.messagesSent", "api.RTCStatsReport.type_data-channel.protocol", "api.RTCStatsReport.type_data-channel.state", "api.RTCStatsReport.type_data-channel.timestamp", "api.RTCStatsReport.type_data-channel.type", "api.RTCStatsReport.type_inbound-rtp", "api.RTCStatsReport.type_inbound-rtp.audioLevel", "api.RTCStatsReport.type_inbound-rtp.bytesReceived", "api.RTCStatsReport.type_inbound-rtp.codecId", "api.RTCStatsReport.type_inbound-rtp.concealedSamples", "api.RTCStatsReport.type_inbound-rtp.concealmentEvents", "api.RTCStatsReport.type_inbound-rtp.estimatedPlayoutTimestamp", "api.RTCStatsReport.type_inbound-rtp.fecPacketsDiscarded", "api.RTCStatsReport.type_inbound-rtp.fecPacketsReceived", "api.RTCStatsReport.type_inbound-rtp.frameHeight", "api.RTCStatsReport.type_inbound-rtp.frameWidth", "api.RTCStatsReport.type_inbound-rtp.framesAssembledFromMultiplePackets", "api.RTCStat\
sReport.type_inbound-rtp.framesDecoded", "api.RTCStatsReport.type_inbound-rtp.framesPerSecond", "api.RTCStatsReport.type_inbound-rtp.framesReceived", "api.RTCStatsReport.type_inbound-rtp.freezeCount", "api.RTCStatsReport.type_inbound-rtp.headerBytesReceived", "api.RTCStatsReport.type_inbound-rtp.id", "api.RTCStatsReport.type_inbound-rtp.insertedSamplesForDeceleration", "api.RTCStatsReport.type_inbound-rtp.jitter", "api.RTCStatsReport.type_inbound-rtp.jitterBufferDelay", "api.RTCStatsReport.type_inbound-rtp.jitterBufferEmittedCount", "api.RTCStatsReport.type_inbound-rtp.jitterBufferMinimumDelay", "api.RTCStatsReport.type_inbound-rtp.jitterBufferTargetDelay", "api.RTCStatsReport.type_inbound-rtp.keyFramesDecoded", "api.RTCStatsReport.type_inbound-rtp.kind", "api.RTCStatsReport.type_inbound-rtp.lastPacketReceivedTimestamp", "api.RTCStatsReport.type_inbound-rtp.mid", "api.RTCStatsReport.type_inbound-rtp.nackCount", "api.RTCStatsReport.type_inbound-rtp.packetsDiscarded", "api.RTCStatsReport\
.type_inbound-rtp.packetsLost", "api.RTCStatsReport.type_inbound-rtp.packetsReceived", "api.RTCStatsReport.type_inbound-rtp.pauseCount", "api.RTCStatsReport.type_inbound-rtp.playoutId", "api.RTCStatsReport.type_inbound-rtp.qpSum", "api.RTCStatsReport.type_inbound-rtp.remoteId", "api.RTCStatsReport.type_inbound-rtp.removedSamplesForAcceleration", "api.RTCStatsReport.type_inbound-rtp.silentConcealedSamples", "api.RTCStatsReport.type_inbound-rtp.ssrc", "api.RTCStatsReport.type_inbound-rtp.timestamp", "api.RTCStatsReport.type_inbound-rtp.totalAssemblyTime", "api.RTCStatsReport.type_inbound-rtp.totalAudioEnergy", "api.RTCStatsReport.type_inbound-rtp.totalDecodeTime", "api.RTCStatsReport.type_inbound-rtp.totalFreezesDuration", "api.RTCStatsReport.type_inbound-rtp.totalInterFrameDelay", "api.RTCStatsReport.type_inbound-rtp.totalPausesDuration", "api.RTCStatsReport.type_inbound-rtp.totalProcessingDelay", "api.RTCStatsReport.type_inbound-rtp.totalSamplesDuration", "api.RTCStatsReport.type_inbou\
nd-rtp.totalSamplesReceived", "api.RTCStatsReport.type_inbound-rtp.totalSquaredInterFrameDelay", "api.RTCStatsReport.type_inbound-rtp.trackIdentifier", "api.RTCStatsReport.type_inbound-rtp.transportId", "api.RTCStatsReport.type_inbound-rtp.type", "api.RTCStatsReport.type_local-candidate", "api.RTCStatsReport.type_local-candidate.address", "api.RTCStatsReport.type_local-candidate.candidateType", "api.RTCStatsReport.type_local-candidate.foundation", "api.RTCStatsReport.type_local-candidate.id", "api.RTCStatsReport.type_local-candidate.port", "api.RTCStatsReport.type_local-candidate.priority", "api.RTCStatsReport.type_local-candidate.protocol", "api.RTCStatsReport.type_local-candidate.timestamp", "api.RTCStatsReport.type_local-candidate.transportId", "api.RTCStatsReport.type_local-candidate.type", "api.RTCStatsReport.type_local-candidate.usernameFragment", "api.RTCStatsReport.type_media-playout", "api.RTCStatsReport.type_media-playout.id", "api.RTCStatsReport.type_media-playout.kind", "ap\
i.RTCStatsReport.type_media-playout.synthesizedSamplesDuration", "api.RTCStatsReport.type_media-playout.synthesizedSamplesEvents", "api.RTCStatsReport.type_media-playout.timestamp", "api.RTCStatsReport.type_media-playout.totalPlayoutDelay", "api.RTCStatsReport.type_media-playout.totalSamplesCount", "api.RTCStatsReport.type_media-playout.totalSamplesDuration", "api.RTCStatsReport.type_media-playout.type", "api.RTCStatsReport.type_media-source", "api.RTCStatsReport.type_media-source.audioLevel", "api.RTCStatsReport.type_media-source.frames", "api.RTCStatsReport.type_media-source.framesPerSecond", "api.RTCStatsReport.type_media-source.height", "api.RTCStatsReport.type_media-source.id", "api.RTCStatsReport.type_media-source.kind", "api.RTCStatsReport.type_media-source.timestamp", "api.RTCStatsReport.type_media-source.totalAudioEnergy", "api.RTCStatsReport.type_media-source.totalSamplesDuration", "api.RTCStatsReport.type_media-source.trackIdentifier", "api.RTCStatsReport.type_media-source.t\
ype", "api.RTCStatsReport.type_media-source.width", "api.RTCStatsReport.type_outbound-rtp", "api.RTCStatsReport.type_outbound-rtp.active", "api.RTCStatsReport.type_outbound-rtp.bytesSent", "api.RTCStatsReport.type_outbound-rtp.codecId", "api.RTCStatsReport.type_outbound-rtp.frameHeight", "api.RTCStatsReport.type_outbound-rtp.frameWidth", "api.RTCStatsReport.type_outbound-rtp.framesEncoded", "api.RTCStatsReport.type_outbound-rtp.framesPerSecond", "api.RTCStatsReport.type_outbound-rtp.framesSent", "api.RTCStatsReport.type_outbound-rtp.headerBytesSent", "api.RTCStatsReport.type_outbound-rtp.id", "api.RTCStatsReport.type_outbound-rtp.keyFramesEncoded", "api.RTCStatsReport.type_outbound-rtp.kind", "api.RTCStatsReport.type_outbound-rtp.mediaSourceId", "api.RTCStatsReport.type_outbound-rtp.mid", "api.RTCStatsReport.type_outbound-rtp.nackCount", "api.RTCStatsReport.type_outbound-rtp.packetsSent", "api.RTCStatsReport.type_outbound-rtp.qpSum", "api.RTCStatsReport.type_outbound-rtp.qualityLimitat\
ionDurations", "api.RTCStatsReport.type_outbound-rtp.qualityLimitationReason", "api.RTCStatsReport.type_outbound-rtp.remoteId", "api.RTCStatsReport.type_outbound-rtp.retransmittedBytesSent", "api.RTCStatsReport.type_outbound-rtp.retransmittedPacketsSent", "api.RTCStatsReport.type_outbound-rtp.rid", "api.RTCStatsReport.type_outbound-rtp.scalabilityMode", "api.RTCStatsReport.type_outbound-rtp.ssrc", "api.RTCStatsReport.type_outbound-rtp.targetBitrate", "api.RTCStatsReport.type_outbound-rtp.timestamp", "api.RTCStatsReport.type_outbound-rtp.totalEncodeTime", "api.RTCStatsReport.type_outbound-rtp.totalEncodedBytesTarget", "api.RTCStatsReport.type_outbound-rtp.totalPacketSendDelay", "api.RTCStatsReport.type_outbound-rtp.transportId", "api.RTCStatsReport.type_outbound-rtp.type", "api.RTCStatsReport.type_peer-connection", "api.RTCStatsReport.type_peer-connection.dataChannelsClosed", "api.RTCStatsReport.type_peer-connection.dataChannelsOpened", "api.RTCStatsReport.type_peer-connection.id", "api\
.RTCStatsReport.type_peer-connection.timestamp", "api.RTCStatsReport.type_peer-connection.type", "api.RTCStatsReport.type_remote-candidate", "api.RTCStatsReport.type_remote-candidate.address", "api.RTCStatsReport.type_remote-candidate.candidateType", "api.RTCStatsReport.type_remote-candidate.foundation", "api.RTCStatsReport.type_remote-candidate.id", "api.RTCStatsReport.type_remote-candidate.port", "api.RTCStatsReport.type_remote-candidate.priority", "api.RTCStatsReport.type_remote-candidate.protocol", "api.RTCStatsReport.type_remote-candidate.timestamp", "api.RTCStatsReport.type_remote-candidate.transportId", "api.RTCStatsReport.type_remote-candidate.type", "api.RTCStatsReport.type_remote-candidate.usernameFragment", "api.RTCStatsReport.type_remote-inbound-rtp", "api.RTCStatsReport.type_remote-inbound-rtp.codecId", "api.RTCStatsReport.type_remote-inbound-rtp.fractionLost", "api.RTCStatsReport.type_remote-inbound-rtp.id", "api.RTCStatsReport.type_remote-inbound-rtp.jitter", "api.RTCSta\
tsReport.type_remote-inbound-rtp.kind", "api.RTCStatsReport.type_remote-inbound-rtp.localId", "api.RTCStatsReport.type_remote-inbound-rtp.packetsLost", "api.RTCStatsReport.type_remote-inbound-rtp.packetsReceived", "api.RTCStatsReport.type_remote-inbound-rtp.roundTripTime", "api.RTCStatsReport.type_remote-inbound-rtp.roundTripTimeMeasurements", "api.RTCStatsReport.type_remote-inbound-rtp.ssrc", "api.RTCStatsReport.type_remote-inbound-rtp.timestamp", "api.RTCStatsReport.type_remote-inbound-rtp.totalRoundTripTime", "api.RTCStatsReport.type_remote-inbound-rtp.transportId", "api.RTCStatsReport.type_remote-inbound-rtp.type", "api.RTCStatsReport.type_remote-outbound-rtp", "api.RTCStatsReport.type_remote-outbound-rtp.bytesSent", "api.RTCStatsReport.type_remote-outbound-rtp.codecId", "api.RTCStatsReport.type_remote-outbound-rtp.id", "api.RTCStatsReport.type_remote-outbound-rtp.kind", "api.RTCStatsReport.type_remote-outbound-rtp.localId", "api.RTCStatsReport.type_remote-outbound-rtp.packetsSent",
    "api.RTCStatsReport.type_remote-outbound-rtp.remoteTimestamp", "api.RTCStatsReport.type_remote-outbound-rtp.reportsSent", "api.RTCStatsReport.type_remote-outbound-rtp.roundTripTimeMeasurements", "api.RTCStatsReport.type_remote-outbound-rtp.ssrc", "api.RTCStatsReport.type_remote-outbound-rtp.timestamp", "api.RTCStatsReport.type_remote-outbound-rtp.totalRoundTripTime", "api.RTCStatsReport.type_remote-outbound-rtp.transportId", "api.RTCStatsReport.type_remote-outbound-rtp.type", "api.RTCStatsReport.type_transport", "api.RTCStatsReport.type_transport.bytesReceived", "api.RTCStatsReport.type_transport.bytesSent", "api.RTCStatsReport.type_transport.dtlsCipher", "api.RTCStatsReport.type_transport.dtlsRole", "api.RTCStatsReport.type_transport.dtlsState", "api.RTCStatsReport.type_transport.iceLocalUsernameFragment", "api.RTCStatsReport.type_transport.iceRole", "api.RTCStatsReport.type_transport.iceState", "api.RTCStatsReport.type_transport.id", "api.RTCStatsReport.type_transport.localCertif\
icateId", "api.RTCStatsReport.type_transport.packetsReceived", "api.RTCStatsReport.type_transport.packetsSent", "api.RTCStatsReport.type_transport.remoteCertificateId", "api.RTCStatsReport.type_transport.selectedCandidatePairChanges", "api.RTCStatsReport.type_transport.selectedCandidatePairId", "api.RTCStatsReport.type_transport.srtpCipher", "api.RTCStatsReport.type_transport.timestamp", "api.RTCStatsReport.type_transport.tlsVersion", "api.RTCStatsReport.type_transport.type", "api.RTCStatsReport.values"], description: "The RTCPeerConnection.getStats(), RTCRtpSender.getStats(), and RTCRtpReceiver.getStats() methods return detailed information about the status, performance, network, and media for a given WebRTC connection.", description_html: "The <code>RTCPeerConnection.getStats()</code>, <code>RTCRtpSender.getStats()</code>, and <code>RTCRtpReceiver.getStats()</code> methods return detailed information about the status, performance, network, and media for a given WebRTC connection.", group: [
    "webrtc"], kind: "feature", name: "WebRTC statistics", spec: ["https://w3c.github.io/webrtc-stats/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.RTCPeerConnection.getStats": { baseline: "high", baseline_high_date: "2020-03-19", baseline_low_date: "2017-09-19", support: { chrome: "56", chrome_android: "56", edge: "15", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.getStats.returns_promise": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } }, "api.RTCPeerConnection.getStats.selector_parameter": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "67", chrome_android: "67", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "\
11" } }, "api.RTCRtpReceiver.getStats": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "67", chrome_android: "67", edge: "13", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.RTCRtpSender.getStats": { baseline: "high", baseline_high_date: "2021-09-25", baseline_low_date: "2019-03-25", support: { chrome: "67", chrome_android: "67", edge: "13", firefox: "55", firefox_android: "55", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.@@iterator": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "\
11" } }, "api.RTCStatsReport.entries": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.forEach": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.get": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.has": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } },
    "api.RTCStatsReport.keys": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "59", chrome_android: "59", edge: "79", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "29", firefox_android: "29", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.availableOutgoingBitrate": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79" } }, "api.RTCStatsReport.type_candidate-pair.bytesDiscardedOnSend": { baseline: false, support: {
    chrome: "96", chrome_android: "96", edge: "96" } }, "api.RTCStatsReport.type_candidate-pair.bytesReceived": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "56", firefox_android: "56", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.bytesSent": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "56", firefox_android: "56", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.consentRequestsSent": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_candidate-pair.currentRoundTripTime": { baseline: false, support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_candidate-pair.id": { baseline: "high", baseline_high_date: "\
2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_candidate-pair.lastPacketReceivedTimestamp": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "56", firefox_android: "56" } }, "api.RTCStatsReport.type_candidate-pair.lastPacketSentTimestamp": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "56", firefox_android: "56" } }, "api.RTCStatsReport.type_candidate-pair.localCandidateId": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "29", firefox_android: "29", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.nominated": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "\
58", chrome_android: "58", edge: "79", firefox: "56", firefox_android: "56", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.packetsDiscardedOnSend": { baseline: false, support: { chrome: "96", chrome_android: "96", edge: "96" } }, "api.RTCStatsReport.type_candidate-pair.packetsReceived": { baseline: false, support: { chrome: "96", chrome_android: "96", edge: "96" } }, "api.RTCStatsReport.type_candidate-pair.packetsSent": { baseline: false, support: { chrome: "96", chrome_android: "96", edge: "96" } }, "api.RTCStatsReport.type_candidate-pair.remoteCandidateId": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "29", firefox_android: "29", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.requestsReceived": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "11", safari_ios: "11" } }, "api.RTCSta\
tsReport.type_candidate-pair.requestsSent": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.responsesReceived": { baseline: "low", baseline_low_date: "2025-08-19", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "142", firefox_android: "142", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.responsesSent": { baseline: false, support: { chrome: "58", chrome_android: "58", edge: "79", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.state": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "29", firefox_android: "29", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.timestamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "\
80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_candidate-pair.totalRoundTripTime": { baseline: "low", baseline_low_date: "2025-08-19", support: { chrome: "71", chrome_android: "71", edge: "79", firefox: "142", firefox_android: "142", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.transportId": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "56", firefox_android: "56", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_candidate-pair.type": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate": { baseline: false, support: { chrome: "80", chrome_android: "\
80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate.base64Certificate": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate.fingerprint": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate.fingerprintAlgorithm": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate.id": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate.timestamp": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_certificate.type": { baseline: false, support: { chrome: "80", chrome_android: "\
80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec.channels": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "98", firefox_android: "98", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_codec.clockRate": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec.id": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "\
80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec.mimeType": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec.payloadType": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec.sdpFmtpLine": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "83", chrome_android: "83", edge: "83", firefox: "98", firefox_android: "98", safari: "14", safari_ios: "14" } }, "api.RTCStatsReport.type_codec.timestamp": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "\
2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_codec.transportId": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89", firefox: "98", firefox_android: "98" } }, "api.RTCStatsReport.type_codec.type": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.bytesReceived": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.bytesSent": { baseline: false,
    support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.dataChannelIdentifier": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85", firefox: "79" } }, "api.RTCStatsReport.type_data-channel.id": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.label": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.messagesReceived": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.messagesSent": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.\
4" } }, "api.RTCStatsReport.type_data-channel.protocol": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.state": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.timestamp": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_data-channel.type": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCSta\
tsReport.type_inbound-rtp.audioLevel": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.bytesReceived": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "27", firefox_android: "27", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp.codecId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98" } }, "api.RTCStatsReport.type_inbound-rtp.concealedSamples": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "104", firefox_android: "104", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.concealmentEvents": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "\
2022-10-18", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.estimatedPlayoutTimestamp": { baseline: false, support: { firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.fecPacketsDiscarded": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.fecPacketsReceived": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.frameHeight": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "1\
01", firefox_android: "101" } }, "api.RTCStatsReport.type_inbound-rtp.frameWidth": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "101", firefox_android: "101" } }, "api.RTCStatsReport.type_inbound-rtp.framesAssembledFromMultiplePackets": { baseline: false, support: { firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.framesDecoded": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "56", firefox_android: "56" } }, "api.RTCStatsReport.type_inbound-rtp.framesPerSecond": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "101", firefox_android: "101" } }, "api.RTCStatsReport.type_inbound-rtp.framesReceived": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "101", firefox_android: "101" } }, "api.RTCStatsReport.type_inbound-rtp.freezeCount": { baseline: false, support: { firefox: "142", firefox_android: "142" } },
    "api.RTCStatsReport.type_inbound-rtp.headerBytesReceived": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.id": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp.insertedSamplesForDeceleration": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.jitter": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "\
80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp.jitterBufferDelay": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "104", firefox_android: "104", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.jitterBufferEmittedCount": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "104", firefox_android: "104", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.jitterBufferMinimumDelay": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.jitterBufferTargetDelay": { baseline: false, support: { chrome: "105", chrome_android: "\
105", edge: "105", firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.keyFramesDecoded": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.kind": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "63", firefox_android: "63", safari: "14", safari_ios: "14" } }, "api.RTCStatsReport.type_inbound-rtp.lastPacketReceivedTimestamp": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.mid": { baseline: "low", baseline_low_date: "2025-02-04", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "135", firefox_android: "135", safari: "17", safari_ios: "17" } }, "api.RTCStatsReport.type_inbound-rtp.nackCount": { baseline: false, support: {
    chrome: "80", chrome_android: "80", edge: "80", firefox: "55" } }, "api.RTCStatsReport.type_inbound-rtp.packetsDiscarded": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "94", chrome_android: "94", edge: "94", firefox: "96", firefox_android: "96", safari: "15.4", safari_ios: "15.4" } }, "api.RTCStatsReport.type_inbound-rtp.packetsLost": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp.packetsReceived": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp.pauseCount": { baseline: false, support: { firefox: "142",
    firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.playoutId": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_inbound-rtp.qpSum": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.remoteId": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "68", firefox_android: "68" } }, "api.RTCStatsReport.type_inbound-rtp.removedSamplesForAcceleration": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.silentConcealedSamples": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "86", chrome_android: "86", edge: "8\
6", firefox: "104", firefox_android: "104", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.ssrc": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_inbound-rtp.timestamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_inbound-rtp.totalAssemblyTime": { baseline: false, support: { firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.totalAudioEnergy": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "106", firefox_android: "106", safari: "\
14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.totalDecodeTime": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.totalFreezesDuration": { baseline: false, support: { firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.totalInterFrameDelay": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.totalPausesDuration": { baseline: false, support: { firefox: "142", firefox_android: "142" } }, "api.RTCStatsReport.type_inbound-rtp.totalProcessingDelay": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.totalSamplesDuration": { baseline: "high", baseline_high_date: "2025-04-18", baseline_low_date: "2022-10-18", support: { chrome: "\
86", chrome_android: "86", edge: "86", firefox: "106", firefox_android: "106", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.totalSamplesReceived": { baseline: "high", baseline_high_date: "2025-02-23", baseline_low_date: "2022-08-23", support: { chrome: "86", chrome_android: "86", edge: "86", firefox: "104", firefox_android: "104", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_inbound-rtp.totalSquaredInterFrameDelay": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_inbound-rtp.trackIdentifier": { baseline: "high", baseline_high_date: "2025-09-27", baseline_low_date: "2023-03-27", support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.RTCStatsReport.type_inbound-rtp.transportId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "\
80", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_inbound-rtp.type": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_local-candidate": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_local-candidate.address": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "65", firefox_android: "65" } }, "api.RTCStatsReport.type_local-candidate.candidateType": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "12.\
1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_local-candidate.foundation": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.RTCStatsReport.type_local-candidate.id": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_local-candidate.port": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_local-candidate.priority": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsRe\
port.type_local-candidate.protocol": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_local-candidate.timestamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_local-candidate.transportId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_local-candidate.type": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsRepo\
rt.type_local-candidate.usernameFragment": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.RTCStatsReport.type_media-playout": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.id": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.kind": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.synthesizedSamplesDuration": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.synthesizedSamplesEvents": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.timestamp": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.totalPl\
ayoutDelay": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.totalSamplesCount": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.totalSamplesDuration": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-playout.type": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.RTCStatsReport.type_media-source": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_media-source.audioLevel": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_media-source.frames": { baseline: false, support: { chrome: "\
90", chrome_android: "90", edge: "90", firefox: "116", firefox_android: "116" } }, "api.RTCStatsReport.type_media-source.framesPerSecond": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "116", firefox_android: "116" } }, "api.RTCStatsReport.type_media-source.height": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "116", firefox_android: "116" } }, "api.RTCStatsReport.type_media-source.id": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_media-source.kind": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_media\
-source.timestamp": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_media-source.totalAudioEnergy": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_media-source.totalSamplesDuration": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_media-source.trackIdentifier": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_media-source.type": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80",
    firefox: "113", firefox_android: "113", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_media-source.width": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "116", firefox_android: "116" } }, "api.RTCStatsReport.type_outbound-rtp": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_outbound-rtp.active": { baseline: false, support: { chrome: "106", chrome_android: "106", edge: "106" } }, "api.RTCStatsReport.type_outbound-rtp.bytesSent": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_outbound-rtp.codecId": { baseline: "high", baseline_high_date: "\
2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_outbound-rtp.frameHeight": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "101", firefox_android: "101" } }, "api.RTCStatsReport.type_outbound-rtp.frameWidth": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "101", firefox_android: "101" } }, "api.RTCStatsReport.type_outbound-rtp.framesEncoded": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "55", firefox_android: "55" } }, "api.RTCStatsReport.type_outbound-rtp.framesPerSecond": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84", firefox: "115", firefox_android: "115" } }, "api.RTCStatsReport.type_outbound-rtp.framesSent": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "\
84", firefox: "101", firefox_android: "101" } }, "api.RTCStatsReport.type_outbound-rtp.headerBytesSent": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_outbound-rtp.id": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_outbound-rtp.keyFramesEncoded": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_outbound-rtp.kind": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "63", firefox_android: "63", safari: "14", safari_ios: "14" } },
    "api.RTCStatsReport.type_outbound-rtp.mediaSourceId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_outbound-rtp.mid": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "135", firefox_android: "135" } }, "api.RTCStatsReport.type_outbound-rtp.nackCount": { baseline: "high", baseline_high_date: "2024-09-14", baseline_low_date: "2022-03-14", support: { chrome: "93", chrome_android: "93", edge: "93", firefox: "55", firefox_android: "55", safari: "15.4", safari_ios: "15.4" } }, "api.RTCStatsReport.type_outbound-rtp.packetsSent": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_outbound-rtp.qpSum": { baseline: false, support: { chrome: "80", chrome_android: "\
80", edge: "80", firefox: "66", firefox_android: "66" } }, "api.RTCStatsReport.type_outbound-rtp.qualityLimitationDurations": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "api.RTCStatsReport.type_outbound-rtp.qualityLimitationReason": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_outbound-rtp.remoteId": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81", firefox: "27" } }, "api.RTCStatsReport.type_outbound-rtp.retransmittedBytesSent": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_outbound-rtp.retransmittedPacketsSent": { baseline: "high", baseline_high_date: "2024-11-03", baseline_low_date: "2022-05-03", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "\
100", firefox_android: "100", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_outbound-rtp.rid": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105", firefox: "135", firefox_android: "135" } }, "api.RTCStatsReport.type_outbound-rtp.scalabilityMode": { baseline: false, support: { chrome: "110", chrome_android: "110", edge: "110" } }, "api.RTCStatsReport.type_outbound-rtp.ssrc": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_outbound-rtp.targetBitrate": { baseline: false, support: { chrome: "98", chrome_android: "98", edge: "98", safari: "16.4", safari_ios: "16.4" } }, "api.RTCStatsReport.type_outbound-rtp.timestamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80",
    edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_outbound-rtp.totalEncodeTime": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "102", firefox_android: "102" } }, "api.RTCStatsReport.type_outbound-rtp.totalEncodedBytesTarget": { baseline: false, support: { firefox: "102", firefox_android: "102" } }, "api.RTCStatsReport.type_outbound-rtp.totalPacketSendDelay": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_outbound-rtp.transportId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_outbound-rtp.type": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStat\
sReport.type_peer-connection": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_peer-connection.dataChannelsClosed": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_peer-connection.dataChannelsOpened": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_peer-connection.id": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "\
80", edge: "80", firefox: "113", firefox_android: "113", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_peer-connection.timestamp": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_peer-connection.type": { baseline: "high", baseline_high_date: "2025-11-09", baseline_low_date: "2023-05-09", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "113", firefox_android: "113", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_remote-candidate": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_remote-candidate.address": { baseline: false, support: { chrome: "\
91", chrome_android: "91", edge: "91", firefox: "65", firefox_android: "65" } }, "api.RTCStatsReport.type_remote-candidate.candidateType": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_remote-candidate.foundation": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.RTCStatsReport.type_remote-candidate.id": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_remote-candidate.port": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "\
79", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_remote-candidate.priority": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_remote-candidate.protocol": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "64", firefox_android: "64", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_remote-candidate.timestamp": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_remote-candidate.transportId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "\
80", safari: "12.1", safari_ios: "12.2" } }, "api.RTCStatsReport.type_remote-candidate.type": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_remote-candidate.usernameFragment": { baseline: false, support: { chrome: "108", chrome_android: "108", edge: "108" } }, "api.RTCStatsReport.type_remote-inbound-rtp": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-inbound-rtp.codecId": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "98", firefox_android: "98", safari: "11", safari_ios: "11" } },
    "api.RTCStatsReport.type_remote-inbound-rtp.fractionLost": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_remote-inbound-rtp.id": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_remote-inbound-rtp.jitter": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-inbound-rtp.kind": { baseline: "high", baseline_high_date: "2023-03-16", baseline_low_date: "2020-09-16", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "63", firefox_android: "63", safari: "14", safari_ios: "14" } }, "api.RTCStatsReport.type_remote-inbound-rtp.localId": { baseline: "high", baseline_high_date: "202\
3-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_remote-inbound-rtp.packetsLost": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-inbound-rtp.packetsReceived": { baseline: false, support: { firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-inbound-rtp.roundTripTime": { baseline: "high", baseline_high_date: "2024-07-11", baseline_low_date: "2022-01-11", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "96", firefox_android: "96", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_remote-inbound-rtp.roundTripTimeMeasurements": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_remot\
e-inbound-rtp.ssrc": { baseline: "high", baseline_high_date: "2022-08-07", baseline_low_date: "2020-02-07", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-inbound-rtp.timestamp": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_remote-inbound-rtp.totalRoundTripTime": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "106", firefox_android: "106" } }, "api.RTCStatsReport.type_remote-inbound-rtp.transportId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-inbound-rtp.type": { baseline: "high", baseline_high_date: "2023-10-26", baseline_low_date: "\
2021-04-26", support: { chrome: "80", chrome_android: "80", edge: "80", firefox: "72", firefox_android: "79", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_remote-outbound-rtp": { baseline: "high", baseline_high_date: "2023-11-27", baseline_low_date: "2021-05-27", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-outbound-rtp.bytesSent": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-outbound-rtp.codecId": { baseline: "high", baseline_high_date: "2024-09-08", baseline_low_date: "2022-03-08", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "98", firefox_android: "98", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-outbound-rtp.id": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "\
72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-outbound-rtp.kind": { baseline: "high", baseline_high_date: "2023-11-27", baseline_low_date: "2021-05-27", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "63", firefox_android: "63", safari: "14", safari_ios: "14" } }, "api.RTCStatsReport.type_remote-outbound-rtp.localId": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "68", firefox_android: "68" } }, "api.RTCStatsReport.type_remote-outbound-rtp.packetsSent": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-outbound-rtp.remoteTimestamp": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "79", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-outbound-rtp.reportsSent": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91" } }, "api.RTCStatsRepor\
t.type_remote-outbound-rtp.roundTripTimeMeasurements": { baseline: false, support: { chrome: "96", chrome_android: "96", edge: "96" } }, "api.RTCStatsReport.type_remote-outbound-rtp.ssrc": { baseline: "high", baseline_high_date: "2023-11-27", baseline_low_date: "2021-05-27", support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "27", firefox_android: "27", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-outbound-rtp.timestamp": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_remote-outbound-rtp.totalRoundTripTime": { baseline: false, support: { chrome: "96", chrome_android: "96", edge: "96" } }, "api.RTCStatsReport.type_remote-outbound-rtp.transportId": { baseline: false, support: { chrome: "91", chrome_android: "91", edge: "91", safari: "11", safari_ios: "11" } }, "api.RTCStatsReport.type_remote-outbound-rtp.type": { baseline: false, support: { chrome: "91",
    chrome_android: "91", edge: "91", firefox: "72", firefox_android: "79" } }, "api.RTCStatsReport.type_transport": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.bytesReceived": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.bytesSent": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.dtlsCipher": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_transport.dtlsRole": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103" } }, "api.RTCStatsReport.type_transport.dtlsState": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "\
14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_transport.iceLocalUsernameFragment": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103" } }, "api.RTCStatsReport.type_transport.iceRole": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103" } }, "api.RTCStatsReport.type_transport.iceState": { baseline: false, support: { chrome: "103", chrome_android: "103", edge: "103" } }, "api.RTCStatsReport.type_transport.id": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.localCertificateId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.packetsReceived": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86" } }, "api.RTCStatsReport.type_transport.packetsSent": { baseline: false, support: { chrome: "86", chrome_android: "\
86", edge: "86" } }, "api.RTCStatsReport.type_transport.remoteCertificateId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.selectedCandidatePairChanges": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80" } }, "api.RTCStatsReport.type_transport.selectedCandidatePairId": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.srtpCipher": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "14.1", safari_ios: "14.5" } }, "api.RTCStatsReport.type_transport.timestamp": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.type_transport.tlsVersion": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "14.1", safari_ios: "\
14.5" } }, "api.RTCStatsReport.type_transport.type": { baseline: false, support: { chrome: "80", chrome_android: "80", edge: "80", safari: "13.1", safari_ios: "13.4" } }, "api.RTCStatsReport.values": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "48", firefox_android: "48", safari: "11", safari_ios: "11" } } }, support: { chrome: "58", chrome_android: "58", edge: "79", firefox: "44", firefox_android: "44", safari: "11", safari_ios: "11" } } }, websockets: { caniuse: ["websockets"], compat_features: ["api.CloseEvent", "api.CloseEvent.CloseEvent", "api.CloseEvent.code", "api.CloseEvent.reason", "api.CloseEvent.wasClean", "api.WebSocket", "api.WebSocket.WebSocket", "api.WebSocket.WebSocket.url_parameter_http_https_relative", "api.WebSocket.binaryType", "api.WebSocket.bufferedAmount", "api.WebSocket.close", "api.WebSocket.close_event", "api.WebSocket.error_event", "api.WebSocket.ext\
ensions", "api.WebSocket.message_event", "api.WebSocket.open_event", "api.WebSocket.protocol", "api.WebSocket.protocol_rfc_6455", "api.WebSocket.readyState", "api.WebSocket.send", "api.WebSocket.url", "api.WebSocket.worker_support", "api.WebSocketError", "api.WebSocketError.WebSocketError", "api.WebSocketError.closeCode", "api.WebSocketError.reason", "http.headers.Sec-WebSocket-Accept", "http.headers.Sec-WebSocket-Extensions", "http.headers.Sec-WebSocket-Key", "http.headers.Sec-WebSocket-Protocol", "http.headers.Sec-WebSocket-Version"], description: "The WebSocket API opens a two-way communication channel between the user's browser and a server.", description_html: "The <code>WebSocket</code> API opens a two-way communication channel between the user's browser and a server.", kind: "feature", name: "WebSockets", spec: ["https://websockets.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.CloseEvent": {
    baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.CloseEvent.CloseEvent": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "16", chrome_android: "18", edge: "14", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.CloseEvent.code": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.CloseEvent.reason": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.CloseEvent.wasClean": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "8", firefox_android: "8", safari: "6", safari_ios: "6" } }, "api.WebSocket": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.WebSocket": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.WebSocket.url_parameter_http_https_relative": { baseline: "low", baseline_low_date: "2024-05-17", support: { chrome: "125", chrome_android: "125", edge: "125", firefox: "124", firefox_android: "124", safari: "17.3", safari_ios: "17.3" } }, "api.WebSocket.binaryType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "15", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.WebSocket.bufferedAmount": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.close": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.close_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29",
    support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.extensions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.WebSocket.message_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.open_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.protocol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "15", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.WebSocket.protocol_rfc_6455": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.WebSocket.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.send": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } }, "api.WebSocket.url": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "18", chrome_android: "\
18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "api.WebSocket.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "37", firefox_android: "37", safari: "5", safari_ios: "5" } }, "api.WebSocketError": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "api.WebSocketError.WebSocketError": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "api.WebSocketError.closeCode": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "api.WebSocketError.reason": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124" } }, "http.headers.Sec-WebSocket-Accept": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "\
14", safari: "6", safari_ios: "6" } }, "http.headers.Sec-WebSocket-Extensions": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "http.headers.Sec-WebSocket-Key": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "http.headers.Sec-WebSocket-Protocol": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "6", safari_ios: "6" } }, "http.headers.Sec-WebSocket-Version": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "\
11", firefox_android: "14", safari: "6", safari_ios: "6" } } }, support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "11", firefox_android: "14", safari: "5", safari_ios: "4.2" } } }, webtransport: { caniuse: ["webtransport"], compat_features: ["api.WebTransport", "api.WebTransport.WebTransport", "api.WebTransport.WebTransport.options_allowPooling_parameter", "api.WebTransport.WebTransport.options_congestionControl_parameter", "api.WebTransport.WebTransport.options_requireUnreliable_parameter", "api.WebTransport.WebTransport.options_serverCertificateHashes_parameter", "api.WebTransport.byob_readers", "api.WebTransport.close", "api.WebTransport.closed", "api.WebTransport.congestionControl", "api.WebTransport.createBidirectionalStream", "api.WebTransport.createBidirectionalStream.options_sendOrder_parameter", "api.WebTransport.createUnidirectionalStream", "api.WebTransport.createUnidirectionalStream.byob_readers", "api.WebTransport.createUnidirectionalStream.options_sendOrd\
er_parameter", "api.WebTransport.datagrams", "api.WebTransport.getStats", "api.WebTransport.incomingBidirectionalStreams", "api.WebTransport.incomingUnidirectionalStreams", "api.WebTransport.ready", "api.WebTransport.reliability", "api.WebTransportBidirectionalStream", "api.WebTransportBidirectionalStream.readable", "api.WebTransportBidirectionalStream.readable.returns_WebTransportReceiveStream", "api.WebTransportBidirectionalStream.writable", "api.WebTransportBidirectionalStream.writable.returns_WebTransportSendStream", "api.WebTransportDatagramDuplexStream", "api.WebTransportDatagramDuplexStream.byob_readers", "api.WebTransportDatagramDuplexStream.incomingHighWaterMark", "api.WebTransportDatagramDuplexStream.incomingMaxAge", "api.WebTransportDatagramDuplexStream.maxDatagramSize", "api.WebTransportDatagramDuplexStream.outgoingHighWaterMark", "api.WebTransportDatagramDuplexStream.outgoingMaxAge", "api.WebTransportDatagramDuplexStream.readable", "api.WebTransportError", "api.WebTranspor\
tError.WebTransportError", "api.WebTransportError.source", "api.WebTransportError.streamErrorCode", "api.WebTransportReceiveStream", "api.WebTransportReceiveStream.getStats", "api.WebTransportSendStream", "api.WebTransportSendStream.getStats", "api.WebTransportSendStream.getWriter", "api.WebTransportSendStream.sendOrder"], description: "The WebTransport API transmits data between a client and a server, by using the HTTP/3 protocol.", description_html: "The <code>WebTransport</code> API transmits data between a client and a server, by using the HTTP/3 protocol.", kind: "feature", name: "WebTransport", spec: ["https://w3c.github.io/webtransport/"], status: { baseline: "low", baseline_low_date: "2026-03-24", by_compat_key: { "api.WebTransport": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.WebTransport": { baseline: "low", baseline_low_date: "\
2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.WebTransport.options_allowPooling_parameter": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.WebTransport.options_congestionControl_parameter": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.WebTransport.options_requireUnreliable_parameter": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.WebTransport.options_serverCertificateHashes_parameter": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "125", firefox_android: "125", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.byob_readers": { baseline: "l\
ow", baseline_low_date: "2026-03-24", support: { chrome: "109", chrome_android: "109", edge: "109", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.close": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.closed": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.congestionControl": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.createBidirectionalStream": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "\
api.WebTransport.createBidirectionalStream.options_sendOrder_parameter": { baseline: false, support: { firefox: "119", firefox_android: "119", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.createUnidirectionalStream": { baseline: false, support: { chrome: "97", chrome_android: "97", edge: "97", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.createUnidirectionalStream.byob_readers": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.createUnidirectionalStream.options_sendOrder_parameter": { baseline: false, support: { safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.datagrams": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.getStats": { baseline: false, support: { safari: "26.4", safari_ios: "26.4" } }, "api.W\
ebTransport.incomingBidirectionalStreams": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.incomingUnidirectionalStreams": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.ready": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransport.reliability": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportBidirectionalStream": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "\
114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportBidirectionalStream.readable": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportBidirectionalStream.readable.returns_WebTransportReceiveStream": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportBidirectionalStream.writable": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportBidirectionalStream.writable.returns_WebTransportSendStream": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream": { baseline: "low", baseline_low_date: "2026-03-24", support: {
    chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.byob_readers": { baseline: false, support: { chrome: "109", chrome_android: "109", edge: "109", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.incomingHighWaterMark": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.incomingMaxAge": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.maxDatagramSize": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "\
114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.outgoingHighWaterMark": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.outgoingMaxAge": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportDatagramDuplexStream.readable": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportError": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } },
    "api.WebTransportError.WebTransportError": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportError.source": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportError.streamErrorCode": { baseline: "low", baseline_low_date: "2026-03-24", support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportReceiveStream": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportReceiveStream.getStats": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTran\
sportSendStream": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportSendStream.getStats": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportSendStream.getWriter": { baseline: false, support: { firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } }, "api.WebTransportSendStream.sendOrder": { baseline: false, support: { firefox: "121", firefox_android: "121", safari: "26.4", safari_ios: "26.4" } } }, support: { chrome: "97", chrome_android: "97", edge: "97", firefox: "114", firefox_android: "114", safari: "26.4", safari_ios: "26.4" } } }, webusb: { caniuse: ["webusb"], compat_features: ["api.Navigator.usb", "api.USB", "api.USB.connect_event", "api.USB.disconnect_event", "api.USB.getDevices", "api.USB.requestDevice", "api.USB.worker_support", "api.USBAlternateInterface", "api.USBAlternateInterface.USBAlternateInter\
face", "api.USBAlternateInterface.alternateSetting", "api.USBAlternateInterface.endpoints", "api.USBAlternateInterface.interfaceClass", "api.USBAlternateInterface.interfaceName", "api.USBAlternateInterface.interfaceProtocol", "api.USBAlternateInterface.interfaceSubclass", "api.USBAlternateInterface.worker_support", "api.USBConfiguration", "api.USBConfiguration.USBConfiguration", "api.USBConfiguration.configurationName", "api.USBConfiguration.configurationValue", "api.USBConfiguration.interfaces", "api.USBConfiguration.worker_support", "api.USBConnectionEvent", "api.USBConnectionEvent.USBConnectionEvent", "api.USBConnectionEvent.device", "api.USBConnectionEvent.worker_support", "api.USBDevice", "api.USBDevice.claimInterface", "api.USBDevice.clearHalt", "api.USBDevice.close", "api.USBDevice.configuration", "api.USBDevice.configurations", "api.USBDevice.controlTransferIn", "api.USBDevice.controlTransferOut", "api.USBDevice.deviceClass", "api.USBDevice.deviceProtocol", "api.USBDevice.devic\
eSubclass", "api.USBDevice.deviceVersionMajor", "api.USBDevice.deviceVersionMinor", "api.USBDevice.deviceVersionSubminor", "api.USBDevice.forget", "api.USBDevice.isochronousTransferIn", "api.USBDevice.isochronousTransferOut", "api.USBDevice.manufacturerName", "api.USBDevice.open", "api.USBDevice.opened", "api.USBDevice.productId", "api.USBDevice.productName", "api.USBDevice.releaseInterface", "api.USBDevice.reset", "api.USBDevice.selectAlternateInterface", "api.USBDevice.selectConfiguration", "api.USBDevice.serialNumber", "api.USBDevice.transferIn", "api.USBDevice.transferOut", "api.USBDevice.usbVersionMajor", "api.USBDevice.usbVersionMinor", "api.USBDevice.usbVersionSubminor", "api.USBDevice.vendorId", "api.USBDevice.worker_support", "api.USBEndpoint", "api.USBEndpoint.USBEndpoint", "api.USBEndpoint.direction", "api.USBEndpoint.endpointNumber", "api.USBEndpoint.packetSize", "api.USBEndpoint.type", "api.USBEndpoint.worker_support", "api.USBInTransferResult", "api.USBInTransferResult.US\
BInTransferResult", "api.USBInTransferResult.data", "api.USBInTransferResult.status", "api.USBInTransferResult.worker_support", "api.USBInterface", "api.USBInterface.USBInterface", "api.USBInterface.alternate", "api.USBInterface.alternates", "api.USBInterface.claimed", "api.USBInterface.interfaceNumber", "api.USBInterface.worker_support", "api.USBIsochronousInTransferPacket", "api.USBIsochronousInTransferPacket.USBIsochronousInTransferPacket", "api.USBIsochronousInTransferPacket.data", "api.USBIsochronousInTransferPacket.status", "api.USBIsochronousInTransferPacket.worker_support", "api.USBIsochronousInTransferResult", "api.USBIsochronousInTransferResult.USBIsochronousInTransferResult", "api.USBIsochronousInTransferResult.data", "api.USBIsochronousInTransferResult.packets", "api.USBIsochronousInTransferResult.worker_support", "api.USBIsochronousOutTransferPacket", "api.USBIsochronousOutTransferPacket.USBIsochronousOutTransferPacket", "api.USBIsochronousOutTransferPacket.bytesWritten", "\
api.USBIsochronousOutTransferPacket.status", "api.USBIsochronousOutTransferPacket.worker_support", "api.USBIsochronousOutTransferResult", "api.USBIsochronousOutTransferResult.USBIsochronousOutTransferResult", "api.USBIsochronousOutTransferResult.packets", "api.USBIsochronousOutTransferResult.worker_support", "api.USBOutTransferResult", "api.USBOutTransferResult.USBOutTransferResult", "api.USBOutTransferResult.bytesWritten", "api.USBOutTransferResult.status", "api.USBOutTransferResult.worker_support", "api.WorkerNavigator.usb", "html.elements.iframe.allow.usb", "http.headers.Permissions-Policy.usb"], description: "The WebUSB API exposes USB compatible devices to web pages.", description_html: "The WebUSB API exposes USB compatible devices to web pages.", kind: "feature", name: "WebUSB", spec: ["https://wicg.github.io/webusb/"], status: { baseline: false, by_compat_key: { "api.Navigator.usb": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USB": { baseline: false,
    support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USB.connect_event": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USB.disconnect_event": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USB.getDevices": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USB.requestDevice": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USB.worker_support": { baseline: false, support: {} }, "api.USBAlternateInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.USBAlternateInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.alternateSetting": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.endpoints": { baseline: false, support: { chrome: "\
61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.interfaceClass": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.interfaceName": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.interfaceProtocol": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.interfaceSubclass": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBAlternateInterface.worker_support": { baseline: false, support: {} }, "api.USBConfiguration": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConfiguration.USBConfiguration": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConfiguration.configurationName": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConfigura\
tion.configurationValue": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConfiguration.interfaces": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConfiguration.worker_support": { baseline: false, support: {} }, "api.USBConnectionEvent": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConnectionEvent.USBConnectionEvent": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConnectionEvent.device": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBConnectionEvent.worker_support": { baseline: false, support: {} }, "api.USBDevice": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.claimInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.clearHalt": { baseline: false, support: { chrome: "\
61", chrome_android: "61", edge: "79" } }, "api.USBDevice.close": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.configuration": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.configurations": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.controlTransferIn": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.controlTransferOut": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.deviceClass": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.deviceProtocol": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.deviceSubclass": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.deviceVersionMajor": { baseline: false,
    support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.deviceVersionMinor": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.deviceVersionSubminor": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.forget": { baseline: false, support: { chrome: "101", chrome_android: "101", edge: "101" } }, "api.USBDevice.isochronousTransferIn": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.isochronousTransferOut": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.manufacturerName": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.open": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.opened": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.p\
roductId": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.productName": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.releaseInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.reset": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.selectAlternateInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.selectConfiguration": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.serialNumber": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.transferIn": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.transferOut": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } },
    "api.USBDevice.usbVersionMajor": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.usbVersionMinor": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.usbVersionSubminor": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.vendorId": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBDevice.worker_support": { baseline: false, support: {} }, "api.USBEndpoint": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBEndpoint.USBEndpoint": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBEndpoint.direction": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBEndpoint.endpointNumber": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBEndpoint.packetSize": { baseline: false,
    support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBEndpoint.type": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBEndpoint.worker_support": { baseline: false, support: {} }, "api.USBInTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInTransferResult.USBInTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInTransferResult.data": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInTransferResult.status": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInTransferResult.worker_support": { baseline: false, support: {} }, "api.USBInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInterface.USBInterface": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } },
    "api.USBInterface.alternate": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInterface.alternates": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInterface.claimed": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInterface.interfaceNumber": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBInterface.worker_support": { baseline: false, support: {} }, "api.USBIsochronousInTransferPacket": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferPacket.USBIsochronousInTransferPacket": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferPacket.data": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferPacket.status": { baseline: false, support: { chrome: "\
61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferPacket.worker_support": { baseline: false, support: {} }, "api.USBIsochronousInTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferResult.USBIsochronousInTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferResult.data": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferResult.packets": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousInTransferResult.worker_support": { baseline: false, support: {} }, "api.USBIsochronousOutTransferPacket": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousOutTransferPacket.USBIsochronousOutTransferPacket": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "\
79" } }, "api.USBIsochronousOutTransferPacket.bytesWritten": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousOutTransferPacket.status": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousOutTransferPacket.worker_support": { baseline: false, support: {} }, "api.USBIsochronousOutTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousOutTransferResult.USBIsochronousOutTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousOutTransferResult.packets": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBIsochronousOutTransferResult.worker_support": { baseline: false, support: {} }, "api.USBOutTransferResult": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBOutTransferResult.USBOutTransfer\
Result": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBOutTransferResult.bytesWritten": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBOutTransferResult.status": { baseline: false, support: { chrome: "61", chrome_android: "61", edge: "79" } }, "api.USBOutTransferResult.worker_support": { baseline: false, support: {} }, "api.WorkerNavigator.usb": { baseline: false, support: {} }, "html.elements.iframe.allow.usb": { baseline: false, support: { chrome: "60", chrome_android: "60", edge: "79" } }, "http.headers.Permissions-Policy.usb": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "61", chrome_android: "61", edge: "79" } } }, webvr: { caniuse: ["webvr"], compat_features: ["api.Gamepad.displayId", "api.Navigator.activeVRDisplays", "api.Navigator.activeVRDisplays.secure_context_required", "api.Navigator.getVRDisplays", "api.PositionSensorVRDevice", "a\
pi.PositionSensorVRDevice.getImmediateState", "api.PositionSensorVRDevice.getState", "api.PositionSensorVRDevice.resetSensor", "api.VRDisplay", "api.VRDisplay.cancelAnimationFrame", "api.VRDisplay.capabilities", "api.VRDisplay.depthFar", "api.VRDisplay.depthNear", "api.VRDisplay.displayId", "api.VRDisplay.displayName", "api.VRDisplay.exitPresent", "api.VRDisplay.getEyeParameters", "api.VRDisplay.getFrameData", "api.VRDisplay.getImmediatePose", "api.VRDisplay.getLayers", "api.VRDisplay.getPose", "api.VRDisplay.isConnected", "api.VRDisplay.isPresenting", "api.VRDisplay.requestAnimationFrame", "api.VRDisplay.requestPresent", "api.VRDisplay.resetPose", "api.VRDisplay.stageParameters", "api.VRDisplay.submitFrame", "api.VRDisplayCapabilities", "api.VRDisplayCapabilities.canPresent", "api.VRDisplayCapabilities.hasExternalDisplay", "api.VRDisplayCapabilities.hasOrientation", "api.VRDisplayCapabilities.hasPosition", "api.VRDisplayCapabilities.maxLayers", "api.VRDisplayEvent", "api.VRDisplayEven\
t.VRDisplayEvent", "api.VRDisplayEvent.display", "api.VRDisplayEvent.reason", "api.VREyeParameters", "api.VREyeParameters.fieldOfView", "api.VREyeParameters.maximumFieldOfView", "api.VREyeParameters.minimumFieldOfView", "api.VREyeParameters.offset", "api.VREyeParameters.renderHeight", "api.VREyeParameters.renderWidth", "api.VRFieldOfView", "api.VRFieldOfView.downDegrees", "api.VRFieldOfView.leftDegrees", "api.VRFieldOfView.rightDegrees", "api.VRFieldOfView.upDegrees", "api.VRFrameData", "api.VRFrameData.VRFrameData", "api.VRFrameData.leftProjectionMatrix", "api.VRFrameData.leftViewMatrix", "api.VRFrameData.pose", "api.VRFrameData.rightProjectionMatrix", "api.VRFrameData.rightViewMatrix", "api.VRFrameData.timestamp", "api.VRPose", "api.VRPose.angularAcceleration", "api.VRPose.angularVelocity", "api.VRPose.linearAcceleration", "api.VRPose.linearVelocity", "api.VRPose.orientation", "api.VRPose.position", "api.VRStageParameters", "api.VRStageParameters.sittingToStandingTransform", "api.VRS\
tageParameters.sizeX", "api.VRStageParameters.sizeY", "api.Window.vrdisplayactivate_event", "api.Window.vrdisplayconnect_event", "api.Window.vrdisplaydeactivate_event", "api.Window.vrdisplaydisconnect_event", "api.Window.vrdisplaypresentchange_event"], description: "The navigator.getVRDisplays() API represents virtual reality (VR) devices, including sensors and head-mounted displays.", description_html: "The <code>navigator.getVRDisplays()</code> API represents virtual reality (VR) devices, including sensors and head-mounted displays.", discouraged: { according_to: ["https://immersive-web.github.io/webvr/spec/1.1/#abstract"], alternatives: ["webxr-device"], reason: "Development of the WebVR API halted in favor of WebXR.", reason_html: "Development of the WebVR API halted in favor of WebXR." }, kind: "feature", name: "WebVR", spec: ["https://immersive-web.github.io/webvr/spec/1.1/"], status: { baseline: false, by_compat_key: { "api.Gamepad.displayId": { baseline: false, support: {} }, "\
api.Navigator.activeVRDisplays": { baseline: false, support: {} }, "api.Navigator.activeVRDisplays.secure_context_required": { baseline: false, support: {} }, "api.Navigator.getVRDisplays": { baseline: false, support: {} }, "api.PositionSensorVRDevice": { baseline: false, support: {} }, "api.PositionSensorVRDevice.getImmediateState": { baseline: false, support: {} }, "api.PositionSensorVRDevice.getState": { baseline: false, support: {} }, "api.PositionSensorVRDevice.resetSensor": { baseline: false, support: {} }, "api.VRDisplay": { baseline: false, support: {} }, "api.VRDisplay.cancelAnimationFrame": { baseline: false, support: {} }, "api.VRDisplay.capabilities": { baseline: false, support: {} }, "api.VRDisplay.depthFar": { baseline: false, support: {} }, "api.VRDisplay.depthNear": { baseline: false, support: {} }, "api.VRDisplay.displayId": { baseline: false, support: {} }, "api.VRDisplay.displayName": { baseline: false, support: {} }, "api.VRDisplay.exitPresent": { baseline: false, support: {} },
    "api.VRDisplay.getEyeParameters": { baseline: false, support: {} }, "api.VRDisplay.getFrameData": { baseline: false, support: {} }, "api.VRDisplay.getImmediatePose": { baseline: false, support: {} }, "api.VRDisplay.getLayers": { baseline: false, support: {} }, "api.VRDisplay.getPose": { baseline: false, support: {} }, "api.VRDisplay.isConnected": { baseline: false, support: {} }, "api.VRDisplay.isPresenting": { baseline: false, support: {} }, "api.VRDisplay.requestAnimationFrame": { baseline: false, support: {} }, "api.VRDisplay.requestPresent": { baseline: false, support: {} }, "api.VRDisplay.resetPose": { baseline: false, support: {} }, "api.VRDisplay.stageParameters": { baseline: false, support: {} }, "api.VRDisplay.submitFrame": { baseline: false, support: {} }, "api.VRDisplayCapabilities": { baseline: false, support: {} }, "api.VRDisplayCapabilities.canPresent": { baseline: false, support: {} }, "api.VRDisplayCapabilities.hasExternalDisplay": { baseline: false, support: {} }, "\
api.VRDisplayCapabilities.hasOrientation": { baseline: false, support: {} }, "api.VRDisplayCapabilities.hasPosition": { baseline: false, support: {} }, "api.VRDisplayCapabilities.maxLayers": { baseline: false, support: {} }, "api.VRDisplayEvent": { baseline: false, support: {} }, "api.VRDisplayEvent.VRDisplayEvent": { baseline: false, support: {} }, "api.VRDisplayEvent.display": { baseline: false, support: {} }, "api.VRDisplayEvent.reason": { baseline: false, support: {} }, "api.VREyeParameters": { baseline: false, support: {} }, "api.VREyeParameters.fieldOfView": { baseline: false, support: {} }, "api.VREyeParameters.maximumFieldOfView": { baseline: false, support: {} }, "api.VREyeParameters.minimumFieldOfView": { baseline: false, support: {} }, "api.VREyeParameters.offset": { baseline: false, support: {} }, "api.VREyeParameters.renderHeight": { baseline: false, support: {} }, "api.VREyeParameters.renderWidth": { baseline: false, support: {} }, "api.VRFieldOfView": { baseline: false, support: {} },
    "api.VRFieldOfView.downDegrees": { baseline: false, support: {} }, "api.VRFieldOfView.leftDegrees": { baseline: false, support: {} }, "api.VRFieldOfView.rightDegrees": { baseline: false, support: {} }, "api.VRFieldOfView.upDegrees": { baseline: false, support: {} }, "api.VRFrameData": { baseline: false, support: {} }, "api.VRFrameData.VRFrameData": { baseline: false, support: {} }, "api.VRFrameData.leftProjectionMatrix": { baseline: false, support: {} }, "api.VRFrameData.leftViewMatrix": { baseline: false, support: {} }, "api.VRFrameData.pose": { baseline: false, support: {} }, "api.VRFrameData.rightProjectionMatrix": { baseline: false, support: {} }, "api.VRFrameData.rightViewMatrix": { baseline: false, support: {} }, "api.VRFrameData.timestamp": { baseline: false, support: {} }, "api.VRPose": { baseline: false, support: {} }, "api.VRPose.angularAcceleration": { baseline: false, support: {} }, "api.VRPose.angularVelocity": { baseline: false, support: {} }, "api.VRPose.linearAccele\
ration": { baseline: false, support: {} }, "api.VRPose.linearVelocity": { baseline: false, support: {} }, "api.VRPose.orientation": { baseline: false, support: {} }, "api.VRPose.position": { baseline: false, support: {} }, "api.VRStageParameters": { baseline: false, support: {} }, "api.VRStageParameters.sittingToStandingTransform": { baseline: false, support: {} }, "api.VRStageParameters.sizeX": { baseline: false, support: {} }, "api.VRStageParameters.sizeY": { baseline: false, support: {} }, "api.Window.vrdisplayactivate_event": { baseline: false, support: {} }, "api.Window.vrdisplayconnect_event": { baseline: false, support: {} }, "api.Window.vrdisplaydeactivate_event": { baseline: false, support: {} }, "api.Window.vrdisplaydisconnect_event": { baseline: false, support: {} }, "api.Window.vrdisplaypresentchange_event": { baseline: false, support: {} } }, support: {} } }, webvtt: { caniuse: ["webvtt"], compat_features: ["api.VTTCue", "api.VTTCue.VTTCue", "api.VTTCue.getCueAsHTML", "api\
.VTTCue.text", "api.VTTCue.text.all_html_character_references", "css.selectors.cue", "css.selectors.cue.selector_argument"], description: "WebVTT is a captions and subtitles format. WebVTT files are loaded using the <track> element, and the VTTCue API can be used to create or update cues dynamically.", description_html: "WebVTT is a captions and subtitles format. WebVTT files are loaded using the <code>&#x3C;track></code> element, and the <code>VTTCue</code> API can be used to create or update cues dynamically.", kind: "feature", name: "WebVTT", spec: ["https://w3c.github.io/webvtt/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.VTTCue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.VTTCue": { baseline: "high", baseline_high_date: "2\
022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "33", chrome_android: "33", edge: "79", firefox: "31", firefox_android: "31", safari: "8", safari_ios: "8" } }, "api.VTTCue.getCueAsHTML": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.text": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.text.all_html_character_references": { baseline: "low", baseline_low_date: "2024-06-11", support: { chrome: "63", chrome_android: "63", edge: "79", firefox: "127", firefox_android: "127", safari: "17.5", safari_ios: "17.5" } }, "css.selectors.cue": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01\
-15", support: { chrome: "26", chrome_android: "26", edge: "79", firefox: "55", firefox_android: "55", safari: "7", safari_ios: "7" } }, "css.selectors.cue.selector_argument": { baseline: false, support: { chrome: "26", chrome_android: "26", edge: "79", safari: "7", safari_ios: "7" } } }, support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } } }, "webvtt-cue-alignment": { compat_features: ["api.VTTCue.lineAlign", "api.VTTCue.positionAlign"], description: "The WebVTT cue alignment settings control which part of the cue is aligned with the given line and position. Cue alignment is set using line and position settings in WebVTT files or the lineAlign and positionAlign properties of VTTCue using JavaScript.", description_html: "The WebVTT cue alignment settings control which part of the cue is aligned with the given line and position. Cue alignment is set using <code>line</code> and <code>position</code> settings in \
WebVTT files or the <code>lineAlign</code> and <code>positionAlign</code> properties of <code>VTTCue</code> using JavaScript.", kind: "feature", name: "WebVTT cue alignment", spec: ["https://w3c.github.io/webvtt/#dom-vttcue-linealign", "https://w3c.github.io/webvtt/#dom-vttcue-positionalign"], status: { baseline: false, by_compat_key: { "api.VTTCue.lineAlign": { baseline: false, support: { firefox: "31", firefox_android: "31", safari: "14.1", safari_ios: "14.5" } }, "api.VTTCue.positionAlign": { baseline: false, support: { firefox: "31", firefox_android: "31", safari: "14.1", safari_ios: "14.5" } } }, support: { firefox: "31", firefox_android: "31", safari: "14.1", safari_ios: "14.5" } } }, "webvtt-cue-settings": { compat_features: ["api.VTTCue.align", "api.VTTCue.line", "api.VTTCue.position", "api.VTTCue.size", "api.VTTCue.snapToLines", "api.VTTCue.vertical"], description: "The VTTCue API updates various aspects of cues dynamically, such as alignment, size and position.", description_html: "\
The <code>VTTCue</code> API updates various aspects of cues dynamically, such as alignment, size and position.", kind: "feature", name: "WebVTT cue settings", spec: ["https://w3c.github.io/webvtt/#the-vttcue-interface"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "api.VTTCue.align": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.line": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.position": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "\
31", safari: "6", safari_ios: "8" } }, "api.VTTCue.size": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.snapToLines": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } }, "api.VTTCue.vertical": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } } }, support: { chrome: "23", chrome_android: "25", edge: "79", firefox: "31", firefox_android: "31", safari: "6", safari_ios: "8" } } }, "webvtt-regions": { compat_features: ["api.VTTCue.region", "api.VTTRegion", "api.VTTRegion.VTTRegion", "\
api.VTTRegion.id", "api.VTTRegion.lines", "api.VTTRegion.regionAnchorX", "api.VTTRegion.regionAnchorY", "api.VTTRegion.scroll", "api.VTTRegion.viewportAnchorX", "api.VTTRegion.viewportAnchorY", "api.VTTRegion.width"], description: "WebVTT regions set the areas of the video where captions or subtitles should be rendered, such as placing roll-up captions used for live captions.", description_html: "WebVTT regions set the areas of the video where captions or subtitles should be rendered, such as placing roll-up captions used for live captions.", kind: "feature", name: "WebVTT regions", spec: ["https://w3c.github.io/webvtt/#regions"], status: { baseline: false, by_compat_key: { "api.VTTCue.region": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "14.1", safari_ios: "14.5" } }, "api.VTTRegion": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.VTTRegion": { baseline: false, support: { firefox: "59",
    firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.id": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.lines": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "12.1", safari_ios: "12.2" } }, "api.VTTRegion.regionAnchorX": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.regionAnchorY": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.scroll": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.viewportAnchorX": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.viewportAnchorY": { baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } }, "api.VTTRegion.width": {
    baseline: false, support: { firefox: "59", firefox_android: "59", safari: "7", safari_ios: "7" } } }, support: { firefox: "59", firefox_android: "59", safari: "14.1", safari_ios: "14.5" } } }, "webxr-anchors": { compat_features: ["api.XRAnchor", "api.XRAnchor.anchorSpace", "api.XRAnchor.delete", "api.XRAnchorSet", "api.XRAnchorSet.@@iterator", "api.XRAnchorSet.entries", "api.XRAnchorSet.forEach", "api.XRAnchorSet.has", "api.XRAnchorSet.keys", "api.XRAnchorSet.size", "api.XRAnchorSet.values", "api.XRFrame.createAnchor", "api.XRFrame.trackedAnchors", "api.XRHitTestResult.createAnchor"], description: "An XRAnchor object keeps track of a pose that is fixed relative to the real world. Anchors build an illusion that the placed objects are really present in the user's environment.", description_html: "An <code>XRAnchor</code> object keeps track of a pose that is fixed relative to the real world. Anchors build an illusion that the placed objects are really present in the user's environment\
.", group: ["webxr"], kind: "feature", name: "Anchors (WebXR)", spec: ["https://immersive-web.github.io/anchors/"], status: { baseline: false, by_compat_key: { "api.XRAnchor": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchor.anchorSpace": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchor.delete": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet.@@iterator": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet.entries": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet.forEach": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet.has": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "\
85" } }, "api.XRAnchorSet.keys": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet.size": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRAnchorSet.values": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRFrame.createAnchor": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRFrame.trackedAnchors": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } }, "api.XRHitTestResult.createAnchor": { baseline: false, support: { chrome: "85", chrome_android: "85", edge: "85" } } }, support: { chrome: "85", chrome_android: "85", edge: "85" } } }, "webxr-ar": { compat_features: ["api.XRSession.environmentBlendMode", "api.XRSession.interactionMode", "api.XRView.isFirstPersonObserver"], description: 'The "immersive-ar" value for navigator.xr.requestSession() starts an augmented reality WebXR session that rend\
ers content aligned with the visible environment.', description_html: 'The <code>"immersive-ar"</code> value for <code>navigator.xr.requestSession()</code> starts an augmented reality WebXR session that renders content aligned with the visible environment.', group: ["webxr"], kind: "feature", name: "Augmented reality", spec: ["https://immersive-web.github.io/webxr-ar-module/"], status: { baseline: false, by_compat_key: { "api.XRSession.environmentBlendMode": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRSession.interactionMode": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.XRView.isFirstPersonObserver": { baseline: false, support: { chrome: "86", chrome_android: "86", edge: "86" } } }, support: { chrome: "86", chrome_android: "86", edge: "86" } } }, "webxr-camera": { compat_features: ["api.XRCamera", "api.XRCamera.height", "api.XRCamera.width", "api.XRView.camera", "api.XRWebGLBinding.getCameraImage"],
    description: "The XRView.camera property provides direct access to pose-synchronized camera images within a WebXR session.", description_html: "The <code>XRView.camera</code> property provides direct access to pose-synchronized camera images within a WebXR session.", group: ["webxr"], kind: "feature", name: "Raw camera access for WebXR", spec: ["https://immersive-web.github.io/raw-camera-access/"], status: { baseline: false, by_compat_key: { "api.XRCamera": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107" } }, "api.XRCamera.height": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107" } }, "api.XRCamera.width": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107" } }, "api.XRView.camera": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107" } }, "api.XRWebGLBinding.getCameraImage": { baseline: false, support: { chrome: "107", chrome_android: "107", edge: "107" } } }, support: {
    chrome: "107", chrome_android: "107", edge: "107" } } }, "webxr-depth-sensing": { compat_features: ["api.XRCPUDepthInformation", "api.XRCPUDepthInformation.data", "api.XRCPUDepthInformation.getDepthInMeters", "api.XRDepthInformation", "api.XRDepthInformation.height", "api.XRDepthInformation.normDepthBufferFromNormView", "api.XRDepthInformation.rawValueToMeters", "api.XRDepthInformation.width", "api.XRFrame.getDepthInformation", "api.XRSession.depthDataFormat", "api.XRSession.depthUsage", "api.XRWebGLBinding.getDepthInformation", "api.XRWebGLDepthInformation", "api.XRWebGLDepthInformation.texture"], description: "An XRDepthInformation object represents a measurement of the distance from the user's device to the real-world geometry in the user's environment.", description_html: "An <code>XRDepthInformation</code> object represents a measurement of the distance from the user's device to the real-world geometry in the user's environment.", group: ["webxr"], kind: "feature", name: "Dept\
h sensing", spec: ["https://immersive-web.github.io/depth-sensing/"], status: { baseline: false, by_compat_key: { "api.XRCPUDepthInformation": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRCPUDepthInformation.data": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRCPUDepthInformation.getDepthInMeters": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRDepthInformation": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRDepthInformation.height": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRDepthInformation.normDepthBufferFromNormView": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRDepthInformation.rawValueToMeters": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRDepthInformation.width": { baseline: false,
    support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRFrame.getDepthInformation": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRSession.depthDataFormat": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRSession.depthUsage": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRWebGLBinding.getDepthInformation": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRWebGLDepthInformation": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRWebGLDepthInformation.texture": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } } }, support: { chrome: "90", chrome_android: "90", edge: "90" } } }, "webxr-device": { compat_features: ["api.Navigator.xr", "api.WebGL2RenderingContext.makeXRCompatible", "api.WebGLRenderingContext.makeXRCompatible", "api.XRBoundedRef\
erenceSpace", "api.XRBoundedReferenceSpace.boundsGeometry", "api.XRFrame", "api.XRFrame.getPose", "api.XRFrame.getViewerPose", "api.XRFrame.session", "api.XRInputSource", "api.XRInputSource.gripSpace", "api.XRInputSource.handedness", "api.XRInputSource.profiles", "api.XRInputSource.targetRayMode", "api.XRInputSource.targetRaySpace", "api.XRInputSourceArray", "api.XRInputSourceArray.@@iterator", "api.XRInputSourceArray.entries", "api.XRInputSourceArray.forEach", "api.XRInputSourceArray.keys", "api.XRInputSourceArray.length", "api.XRInputSourceArray.values", "api.XRInputSourceEvent", "api.XRInputSourceEvent.XRInputSourceEvent", "api.XRInputSourceEvent.frame", "api.XRInputSourceEvent.inputSource", "api.XRInputSourcesChangeEvent", "api.XRInputSourcesChangeEvent.XRInputSourcesChangeEvent", "api.XRInputSourcesChangeEvent.added", "api.XRInputSourcesChangeEvent.removed", "api.XRInputSourcesChangeEvent.session", "api.XRLayer", "api.XRPose", "api.XRPose.angularVelocity", "api.XRPose.emulatedPosi\
tion", "api.XRPose.linearVelocity", "api.XRPose.transform", "api.XRReferenceSpace", "api.XRReferenceSpace.getOffsetReferenceSpace", "api.XRReferenceSpace.reset_event", "api.XRReferenceSpaceEvent", "api.XRReferenceSpaceEvent.XRReferenceSpaceEvent", "api.XRReferenceSpaceEvent.referenceSpace", "api.XRReferenceSpaceEvent.transform", "api.XRRenderState", "api.XRRenderState.baseLayer", "api.XRRenderState.depthFar", "api.XRRenderState.depthNear", "api.XRRenderState.inlineVerticalFieldOfView", "api.XRRigidTransform", "api.XRRigidTransform.XRRigidTransform", "api.XRRigidTransform.inverse", "api.XRRigidTransform.matrix", "api.XRRigidTransform.orientation", "api.XRRigidTransform.position", "api.XRSession", "api.XRSession.cancelAnimationFrame", "api.XRSession.enabledFeatures", "api.XRSession.end", "api.XRSession.end_event", "api.XRSession.inputSources", "api.XRSession.inputsourceschange_event", "api.XRSession.renderState", "api.XRSession.requestAnimationFrame", "api.XRSession.requestReferenceSpace",
    "api.XRSession.select_event", "api.XRSession.selectend_event", "api.XRSession.selectstart_event", "api.XRSession.squeeze_event", "api.XRSession.squeezeend_event", "api.XRSession.squeezestart_event", "api.XRSession.updateRenderState", "api.XRSession.visibilityState", "api.XRSession.visibilitychange_event", "api.XRSessionEvent", "api.XRSessionEvent.XRSessionEvent", "api.XRSessionEvent.session", "api.XRSpace", "api.XRSystem", "api.XRSystem.devicechange_event", "api.XRSystem.isSessionSupported", "api.XRSystem.requestSession", "api.XRView", "api.XRView.eye", "api.XRView.projectionMatrix", "api.XRView.recommendedViewportScale", "api.XRView.requestViewportScale", "api.XRView.transform", "api.XRViewerPose", "api.XRViewerPose.views", "api.XRViewport", "api.XRViewport.height", "api.XRViewport.width", "api.XRViewport.x", "api.XRViewport.y", "api.XRWebGLLayer", "api.XRWebGLLayer.XRWebGLLayer", "api.XRWebGLLayer.antialias", "api.XRWebGLLayer.fixedFoveation", "api.XRWebGLLayer.framebuffer", "api\
.XRWebGLLayer.framebufferHeight", "api.XRWebGLLayer.framebufferWidth", "api.XRWebGLLayer.getNativeFramebufferScaleFactor_static", "api.XRWebGLLayer.getViewport", "api.XRWebGLLayer.ignoreDepthValues", "html.elements.iframe.allow.xr-spatial-tracking", "http.headers.Permissions-Policy.xr-spatial-tracking"], description: "The navigator.xr API represents the browser's virtual reality or augmented reality system. You can use to request a WebXR session.", description_html: "The <code>navigator.xr</code> API represents the browser's virtual reality or augmented reality system. You can use to request a WebXR session.", group: ["webxr"], kind: "feature", name: "WebXR", spec: ["https://immersive-web.github.io/webxr/"], status: { baseline: false, by_compat_key: { "api.Navigator.xr": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.WebGL2RenderingContext.makeXRCompatible": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.We\
bGLRenderingContext.makeXRCompatible": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRBoundedReferenceSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRBoundedReferenceSpace.boundsGeometry": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRFrame": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRFrame.getPose": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRFrame.getViewerPose": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRFrame.session": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSource": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSource.gripSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api\
.XRInputSource.handedness": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSource.profiles": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSource.targetRayMode": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSource.targetRaySpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceArray": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceArray.@@iterator": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceArray.entries": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceArray.forEach": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceArray.keys": { baseline: false, support: { chrome: "79", chrome_android: "\
79", edge: "79" } }, "api.XRInputSourceArray.length": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceArray.values": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceEvent.XRInputSourceEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceEvent.frame": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourceEvent.inputSource": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourcesChangeEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourcesChangeEvent.XRInputSourcesChangeEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourcesChang\
eEvent.added": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourcesChangeEvent.removed": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRInputSourcesChangeEvent.session": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRLayer": { baseline: false, support: { chrome: "84", chrome_android: "84", edge: "84" } }, "api.XRPose": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRPose.angularVelocity": { baseline: false, support: {} }, "api.XRPose.emulatedPosition": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRPose.linearVelocity": { baseline: false, support: {} }, "api.XRPose.transform": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRReferenceSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRefer\
enceSpace.getOffsetReferenceSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRReferenceSpace.reset_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRReferenceSpaceEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRReferenceSpaceEvent.XRReferenceSpaceEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRReferenceSpaceEvent.referenceSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRReferenceSpaceEvent.transform": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRenderState": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRenderState.baseLayer": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRenderState.depthFar": { baseline: false, support: {
    chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRenderState.depthNear": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRenderState.inlineVerticalFieldOfView": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRigidTransform": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRigidTransform.XRRigidTransform": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRigidTransform.inverse": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRigidTransform.matrix": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRigidTransform.orientation": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRRigidTransform.position": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSessio\
n": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.cancelAnimationFrame": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.enabledFeatures": { baseline: false, support: { chrome: "111", chrome_android: "111", edge: "111" } }, "api.XRSession.end": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.end_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.inputSources": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.inputsourceschange_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.renderState": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.requestAnimationFrame": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } },
    "api.XRSession.requestReferenceSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.select_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.selectend_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.selectstart_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.squeeze_event": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83" } }, "api.XRSession.squeezeend_event": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83" } }, "api.XRSession.squeezestart_event": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83" } }, "api.XRSession.updateRenderState": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSession.visibilityState": { baseline: false, support: { chrome: "\
79", chrome_android: "79", edge: "79" } }, "api.XRSession.visibilitychange_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSessionEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSessionEvent.XRSessionEvent": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSessionEvent.session": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSpace": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSystem": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSystem.devicechange_event": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSystem.isSessionSupported": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRSystem.requestSession": { baseline: false, support: { chrome: "7\
9", chrome_android: "79", edge: "79" } }, "api.XRView": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRView.eye": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRView.projectionMatrix": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRView.recommendedViewportScale": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRView.requestViewportScale": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRView.transform": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRViewerPose": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRViewerPose.views": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRViewport": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } },
    "api.XRViewport.height": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRViewport.width": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRViewport.x": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRViewport.y": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.XRWebGLLayer": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.antialias": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.fixedFoveation": { baseline: false, support: {} }, "api.XRWebGLLayer.framebuffer": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.framebufferHeight": { baseline: false, support: {
    chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.framebufferWidth": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.getNativeFramebufferScaleFactor_static": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.getViewport": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "api.XRWebGLLayer.ignoreDepthValues": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "html.elements.iframe.allow.xr-spatial-tracking": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } }, "http.headers.Permissions-Policy.xr-spatial-tracking": { baseline: false, support: { chrome: "88", chrome_android: "88", edge: "88" } } }, support: { chrome: "79", chrome_android: "79", edge: "79" } } }, "webxr-dom-overlays": { compat_features: ["api.Element.beforexrselect_event", "api.XRSession.domOverlayState", "cs\
s.selectors.xr-overlay"], description: "A DOM overlay shows 2D DOM content as an interactive, transparent layer on top of a WebXR application's WebGL content and camera image.", description_html: "A DOM overlay shows 2D DOM content as an interactive, transparent layer on top of a WebXR application's WebGL content and camera image.", group: ["webxr"], kind: "feature", name: "DOM overlays for WebXR", spec: ["https://immersive-web.github.io/dom-overlays/"], status: { baseline: false, by_compat_key: { "api.Element.beforexrselect_event": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83" } }, "api.XRSession.domOverlayState": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83" } }, "css.selectors.xr-overlay": { baseline: false, support: { chrome: "83", chrome_android: "83", edge: "83" } } }, support: { chrome: "83", chrome_android: "83", edge: "83" } } }, "webxr-gamepads": { compat_features: ["api.XRInputSource.gamepad"], description: "The g\
amepad attribute of an XRInputSource represents an XR input device, such as a motion controller, that reports data from physical inputs (such as buttons, touch pads, and triggers).", description_html: "The <code>gamepad</code> attribute of an <code>XRInputSource</code> represents an XR input device, such as a motion controller, that reports data from physical inputs (such as buttons, touch pads, and triggers).", group: ["webxr"], kind: "feature", name: "Gamepad (WebXR)", spec: ["https://immersive-web.github.io/webxr-gamepads-module/"], status: { baseline: false, by_compat_key: { "api.XRInputSource.gamepad": { baseline: false, support: { chrome: "79", chrome_android: "79", edge: "79" } } }, support: { chrome: "79", chrome_android: "79", edge: "79" } } }, "webxr-hand-input": { compat_features: ["api.XRFrame.fillJointRadii", "api.XRFrame.fillPoses", "api.XRFrame.getJointPose", "api.XRHand", "api.XRHand.@@iterator", "api.XRHand.entries", "api.XRHand.forEach", "api.XRHand.get", "api.XRHand.\
keys", "api.XRHand.size", "api.XRHand.values", "api.XRInputSource.hand", "api.XRJointPose", "api.XRJointPose.radius", "api.XRJointSpace", "api.XRJointSpace.jointName"], description: "An XRHand object, from the hand attribute of an XRInputSource object, represents a WebXR session's fully-articulated hand tracking model.", description_html: "An <code>XRHand</code> object, from the <code>hand</code> attribute of an <code>XRInputSource</code> object, represents a WebXR session's fully-articulated hand tracking model.", group: ["webxr"], kind: "feature", name: "Hand input", spec: ["https://immersive-web.github.io/webxr-hand-input/"], status: { baseline: false, by_compat_key: { "api.XRFrame.fillJointRadii": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRFrame.fillPoses": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRFrame.getJointPose": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand": { baseline: false,
    support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.@@iterator": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.entries": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.forEach": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.get": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.keys": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.size": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRHand.values": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRInputSource.hand": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRJointPose": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRJointPose.radius": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.X\
RJointSpace": { baseline: false, support: { chrome: "131", chrome_android: "131" } }, "api.XRJointSpace.jointName": { baseline: false, support: { chrome: "131", chrome_android: "131" } } }, support: { chrome: "131", chrome_android: "131" } } }, "webxr-hit-test": { compat_features: ["api.XRFrame.getHitTestResults", "api.XRFrame.getHitTestResultsForTransientInput", "api.XRHitTestResult", "api.XRHitTestResult.getPose", "api.XRHitTestSource", "api.XRHitTestSource.cancel", "api.XRRay", "api.XRRay.XRRay", "api.XRRay.direction", "api.XRRay.matrix", "api.XRRay.origin", "api.XRSession.requestHitTestSource", "api.XRSession.requestHitTestSourceForTransientInput", "api.XRTransientInputHitTestResult", "api.XRTransientInputHitTestResult.inputSource", "api.XRTransientInputHitTestResult.results", "api.XRTransientInputHitTestSource", "api.XRTransientInputHitTestSource.cancel"], description: "The getHitTestResults() method of an XRFrame object helps place objects in an augmented reality session by findi\
ng where cast rays intersect with real-world geometry.", description_html: "The <code>getHitTestResults()</code> method of an <code>XRFrame</code> object helps place objects in an augmented reality session by finding where cast rays intersect with real-world geometry.", group: ["webxr"], kind: "feature", name: "Hit test", spec: ["https://immersive-web.github.io/hit-test/"], status: { baseline: false, by_compat_key: { "api.XRFrame.getHitTestResults": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRFrame.getHitTestResultsForTransientInput": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRHitTestResult": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRHitTestResult.getPose": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRHitTestSource": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRHi\
tTestSource.cancel": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRRay": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRRay.XRRay": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRRay.direction": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRRay.matrix": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRRay.origin": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRSession.requestHitTestSource": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRSession.requestHitTestSourceForTransientInput": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRTransientInputHitTestResult": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRTransient\
InputHitTestResult.inputSource": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRTransientInputHitTestResult.results": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRTransientInputHitTestSource": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } }, "api.XRTransientInputHitTestSource.cancel": { baseline: false, support: { chrome: "81", chrome_android: "81", edge: "81" } } }, support: { chrome: "81", chrome_android: "81", edge: "81" } } }, "webxr-layers": { compat_features: ["api.XRCompositionLayer", "api.XRCompositionLayer.blendTextureSourceAlpha", "api.XRCompositionLayer.destroy", "api.XRCompositionLayer.layout", "api.XRCompositionLayer.mipLevels", "api.XRCompositionLayer.needsRedraw", "api.XRCubeLayer", "api.XRCubeLayer.orientation", "api.XRCubeLayer.redraw_event", "api.XRCubeLayer.space", "api.XRCylinderLayer", "api.XRCylinderLayer.aspectRatio", "api.XRCylinderLayer.central\
Angle", "api.XRCylinderLayer.radius", "api.XRCylinderLayer.redraw_event", "api.XRCylinderLayer.space", "api.XRCylinderLayer.transform", "api.XREquirectLayer", "api.XREquirectLayer.centralHorizontalAngle", "api.XREquirectLayer.lowerVerticalAngle", "api.XREquirectLayer.radius", "api.XREquirectLayer.redraw_event", "api.XREquirectLayer.space", "api.XREquirectLayer.transform", "api.XREquirectLayer.upperVerticalAngle", "api.XRLayerEvent", "api.XRLayerEvent.XRLayerEvent", "api.XRLayerEvent.layer", "api.XRMediaBinding", "api.XRMediaBinding.XRMediaBinding", "api.XRMediaBinding.createCylinderLayer", "api.XRMediaBinding.createEquirectLayer", "api.XRMediaBinding.createQuadLayer", "api.XRProjectionLayer", "api.XRProjectionLayer.fixedFoveation", "api.XRProjectionLayer.ignoreDepthValues", "api.XRProjectionLayer.textureArrayLength", "api.XRProjectionLayer.textureHeight", "api.XRProjectionLayer.textureWidth", "api.XRQuadLayer", "api.XRQuadLayer.height", "api.XRQuadLayer.redraw_event", "api.XRQuadLayer.\
space", "api.XRQuadLayer.transform", "api.XRQuadLayer.width", "api.XRRenderState.layers", "api.XRSubImage", "api.XRSubImage.viewport", "api.XRWebGLBinding", "api.XRWebGLBinding.XRWebGLBinding", "api.XRWebGLBinding.createCubeLayer", "api.XRWebGLBinding.createCylinderLayer", "api.XRWebGLBinding.createEquirectLayer", "api.XRWebGLBinding.createProjectionLayer", "api.XRWebGLBinding.createQuadLayer", "api.XRWebGLBinding.getSubImage", "api.XRWebGLBinding.getViewSubImage", "api.XRWebGLBinding.nativeProjectionScaleFactor", "api.XRWebGLSubImage", "api.XRWebGLSubImage.colorTexture", "api.XRWebGLSubImage.colorTextureHeight", "api.XRWebGLSubImage.colorTextureWidth", "api.XRWebGLSubImage.depthStencilTexture", "api.XRWebGLSubImage.imageIndex"], description: "WebXR layer types, such as XRCylinderLayer, XRCylinderLayer, XREquirectLayer, XRProjectionLayer or XRQuadLayer, are managed by the system compositor, to reduce latency or resampling.", description_html: "WebXR layer types, such as <code>XRCylinde\
rLayer</code>, <code>XRCylinderLayer</code>, <code>XREquirectLayer</code>, <code>XRProjectionLayer</code> or <code>XRQuadLayer</code>, are managed by the system compositor, to reduce latency or resampling.", group: ["webxr"], kind: "feature", name: "Layers (WebXR)", spec: ["https://immersive-web.github.io/layers/"], status: { baseline: false, by_compat_key: { "api.XRCompositionLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCompositionLayer.blendTextureSourceAlpha": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCompositionLayer.destroy": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCompositionLayer.layout": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCompositionLayer.mipLevels": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCompositionLayer.needsRedra\
w": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCubeLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCubeLayer.orientation": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCubeLayer.redraw_event": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCubeLayer.space": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCylinderLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCylinderLayer.aspectRatio": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCylinderLayer.centralAngle": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCylinderLayer.radius": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "\
api.XRCylinderLayer.redraw_event": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCylinderLayer.space": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRCylinderLayer.transform": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.centralHorizontalAngle": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.lowerVerticalAngle": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.radius": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.redraw_event": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.space": { baseline: false,
    support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.transform": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XREquirectLayer.upperVerticalAngle": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRLayerEvent": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRLayerEvent.XRLayerEvent": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRLayerEvent.layer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRMediaBinding": { baseline: false, support: {} }, "api.XRMediaBinding.XRMediaBinding": { baseline: false, support: {} }, "api.XRMediaBinding.createCylinderLayer": { baseline: false, support: {} }, "api.XRMediaBinding.createEquirectLayer": { baseline: false, support: {} }, "api.XRMediaBinding.createQuadLayer": { baseline: false, support: {} }, "\
api.XRProjectionLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRProjectionLayer.fixedFoveation": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRProjectionLayer.ignoreDepthValues": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRProjectionLayer.textureArrayLength": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRProjectionLayer.textureHeight": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRProjectionLayer.textureWidth": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRQuadLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRQuadLayer.height": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRQuadLayer.redraw_event": { baseline: false,
    support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRQuadLayer.space": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRQuadLayer.transform": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRQuadLayer.width": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRRenderState.layers": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRSubImage": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRSubImage.viewport": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "api.XRWebGLBinding.XRWebGLBinding": { baseline: false, support: { chrome: "89", chrome_android: "89", edge: "89" } }, "api.XRWebGLBinding.createCubeLayer": { baseline: false,
    support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.createCylinderLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.createEquirectLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.createProjectionLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.createQuadLayer": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.getSubImage": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.getViewSubImage": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLBinding.nativeProjectionScaleFactor": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLSubImage": { baseline: false, support: {
    chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLSubImage.colorTexture": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLSubImage.colorTextureHeight": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLSubImage.colorTextureWidth": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLSubImage.depthStencilTexture": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } }, "api.XRWebGLSubImage.imageIndex": { baseline: false, support: { chrome: "147", chrome_android: "147", edge: "147" } } }, support: { chrome: "147", chrome_android: "147", edge: "147" } } }, "webxr-lighting-estimation": { compat_features: ["api.XRFrame.getLightEstimate", "api.XRLightEstimate", "api.XRLightEstimate.primaryLightDirection", "api.XRLightEstimate.primaryLightIntensity", "api.XRLightEstimate.sphericalHarmonicsCoefficients", "a\
pi.XRLightProbe", "api.XRLightProbe.probeSpace", "api.XRLightProbe.reflectionchange_event", "api.XRSession.preferredReflectionFormat", "api.XRSession.requestLightProbe", "api.XRWebGLBinding.getReflectionCubeMap"], description: "The XRLightProbe and XRLightEstimate objects represent real-world environmental lighting conditions during a WebXR session.", description_html: "The <code>XRLightProbe</code> and <code>XRLightEstimate</code> objects represent real-world environmental lighting conditions during a WebXR session.", group: ["webxr"], kind: "feature", name: "Lighting estimation", spec: ["https://immersive-web.github.io/lighting-estimation/"], status: { baseline: false, by_compat_key: { "api.XRFrame.getLightEstimate": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRLightEstimate": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRLightEstimate.primaryLightDirection": { baseline: false, support: { chrome: "\
90", chrome_android: "90", edge: "90" } }, "api.XRLightEstimate.primaryLightIntensity": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRLightEstimate.sphericalHarmonicsCoefficients": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRLightProbe": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRLightProbe.probeSpace": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRLightProbe.reflectionchange_event": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRSession.preferredReflectionFormat": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRSession.requestLightProbe": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "90" } }, "api.XRWebGLBinding.getReflectionCubeMap": { baseline: false, support: { chrome: "90", chrome_android: "90", edge: "\
90" } } }, support: { chrome: "90", chrome_android: "90", edge: "90" } } }, "wheel-events": { compat_features: ["api.Element.wheel_event", "api.WheelEvent", "api.WheelEvent.WheelEvent", "api.WheelEvent.deltaMode", "api.WheelEvent.deltaX", "api.WheelEvent.deltaY", "api.WheelEvent.deltaZ", "api.WheelEvent.pinch_to_zoom_support"], description: "The wheel event fires when the user moves a mouse wheel or similar spatially rotating input device.", description_html: "The <code>wheel</code> event fires when the user moves a mouse wheel or similar spatially rotating input device.", kind: "feature", name: "Wheel events", spec: ["https://w3c.github.io/pointerevents/#events-wheelevents"], status: { baseline: false, by_compat_key: { "api.Element.wheel_event": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "17", firefox_android: "17", safari: "7" } }, "api.WheelEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: {
    chrome: "1", chrome_android: "18", edge: "12", firefox: "17", firefox_android: "17", safari: "3", safari_ios: "1" } }, "api.WheelEvent.WheelEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "17", firefox_android: "17", safari: "7", safari_ios: "7" } }, "api.WheelEvent.deltaMode": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "17", firefox_android: "17", safari: "7", safari_ios: "7" } }, "api.WheelEvent.deltaX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "17", firefox_android: "17", safari: "8", safari_ios: "8" } }, "api.WheelEvent.deltaY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "\
31", edge: "12", firefox: "17", firefox_android: "17", safari: "8", safari_ios: "8" } }, "api.WheelEvent.deltaZ": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "17", firefox_android: "17", safari: "8", safari_ios: "8" } }, "api.WheelEvent.pinch_to_zoom_support": { baseline: false, support: { chrome: "31", chrome_android: "31", edge: "79", firefox: "55", firefox_android: "55", safari: "15" } } }, support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "17", firefox_android: "17", safari: "7" } } }, where: { compat_features: ["css.selectors.where", "css.selectors.where.forgiving_selector_list"], description: "The :where() CSS functional pseudo-class takes a selector list as its argument, and matches any element that can be selected by one of the selectors in that list. It is functionally equivalent to the selectors in the list, but doesn't affect the CSS rule specifici\
ty.", description_html: "The <code>:where()</code> CSS functional pseudo-class takes a selector list as its argument, and matches any element that can be selected by one of the selectors in that list. It is functionally equivalent to the selectors in the list, but doesn't affect the CSS rule specificity.", group: ["selectors"], kind: "feature", name: ":where()", spec: ["https://drafts.csswg.org/selectors-4/#zero-matches"], status: { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", by_compat_key: { "css.selectors.where": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "78", firefox_android: "79", safari: "14", safari_ios: "14" } }, "css.selectors.where.forgiving_selector_list": { baseline: "high", baseline_high_date: "2023-07-21", baseline_low_date: "2021-01-21", support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "82", firefox_android: "\
82", safari: "14", safari_ios: "14" } } }, support: { chrome: "88", chrome_android: "88", edge: "88", firefox: "82", firefox_android: "82", safari: "14", safari_ios: "14" } } }, "white-space": { compat_features: ["css.properties.white-space", "css.properties.white-space.break-spaces", "css.properties.white-space.normal", "css.properties.white-space.nowrap", "css.properties.white-space.pre", "css.properties.white-space.pre-line", "css.properties.white-space.pre-wrap", "css.properties.white-space.shorthand_values", "css.properties.white-space.svg_elements", "css.properties.white-space.textarea_support", "svg.global_attributes.white-space"], description: "The white-space CSS property sets how white space is collapsed and how lines wrap. It is a shorthand for white-space-collapse and text-wrap-mode.", description_html: "The <code>white-space</code> CSS property sets how white space is collapsed and how lines wrap. It is a shorthand for <code>white-space-collapse</code> and <code>text-wrap-\
mode</code>.", group: ["white-space"], kind: "feature", name: "white-space", spec: ["https://drafts.csswg.org/css-text-4/#white-space-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.white-space": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.white-space.break-spaces": { baseline: "high", baseline_high_date: "2023-01-28", baseline_low_date: "2020-07-28", support: { chrome: "76", chrome_android: "76", edge: "79", firefox: "69", firefox_android: "79", safari: "13.1", safari_ios: "13.4" } }, "css.properties.white-space.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1",
    safari_ios: "1" } }, "css.properties.white-space.nowrap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.white-space.pre": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.white-space.pre-line": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3", safari_ios: "1" } }, "css.properties.white-space.pre-wrap": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4",
    safari: "3", safari_ios: "1" } }, "css.properties.white-space.shorthand_values": { baseline: false, support: {} }, "css.properties.white-space.svg_elements": { baseline: false, support: { firefox: "36", firefox_android: "36" } }, "css.properties.white-space.textarea_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "36", firefox_android: "36", safari: "1", safari_ios: "1" } }, "svg.global_attributes.white-space": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "white-space-collapse": { compat_features: ["css.properties.white-space-collapse", "css.properties.white-space-collaps\
e.break-spaces", "css.properties.white-space-collapse.collapse", "css.properties.white-space-collapse.preserve", "css.properties.white-space-collapse.preserve-breaks", "css.properties.white-space-collapse.preserve-spaces"], description: "The white-space-collapse CSS property sets whether new line characters are shown as line breaks, and whether multiple consecutive spaces are all displayed or combined.", description_html: "The <code>white-space-collapse</code> CSS property sets whether new line characters are shown as line breaks, and whether multiple consecutive spaces are all displayed or combined.", group: ["white-space"], kind: "feature", name: "white-space-collapse", spec: ["https://drafts.csswg.org/css-text-4/#white-space-collapsing"], status: { baseline: "low", baseline_low_date: "2024-03-19", by_compat_key: { "css.properties.white-space-collapse": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "\
124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.white-space-collapse.break-spaces": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.white-space-collapse.collapse": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.white-space-collapse.preserve": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } }, "css.properties.white-space-collapse.preserve-breaks": { baseline: "low", baseline_low_date: "2024-03-19", support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4",
    safari_ios: "17.4" } }, "css.properties.white-space-collapse.preserve-spaces": { baseline: false, support: { firefox: "124", firefox_android: "124" } } }, support: { chrome: "114", chrome_android: "114", edge: "114", firefox: "124", firefox_android: "124", safari: "17.4", safari_ios: "17.4" } } }, "widows-orphans": { caniuse: ["css-widows-orphans"], compat_features: ["css.properties.orphans", "css.properties.widows"], description: "The widows and orphans CSS properties set the minimum lines included in a text fragment created by page, column, or region breaks.", description_html: "The <code>widows</code> and <code>orphans</code> CSS properties set the minimum lines included in a text fragment created by page, column, or region breaks.", group: ["layout"], kind: "feature", name: "Widows and orphans", spec: ["https://drafts.csswg.org/css-break-4/#widows-orphans"], status: { baseline: false, by_compat_key: { "css.properties.orphans": { baseline: false, support: { chrome: "25", chrome_android: "\
25", edge: "12", safari: "1.3", safari_ios: "1" } }, "css.properties.widows": { baseline: false, support: { chrome: "25", chrome_android: "25", edge: "12", safari: "1.3", safari_ios: "1" } } }, support: { chrome: "25", chrome_android: "25", edge: "12", safari: "1.3", safari_ios: "1" } } }, "width-height": { compat_features: ["css.properties.height", "css.properties.height.auto", "css.properties.width", "css.properties.width.auto", "css.properties.width.is_animatable", "css.types.dimension", "css.types.length", "css.types.length-percentage", "css.types.percentage"], description: "The width and height CSS properties set the preferred physical size of an element.", description_html: "The <code>width</code> and <code>height</code> CSS properties set the preferred physical size of an element.", group: ["layout"], kind: "feature", name: "Width and height", spec: ["https://drafts.csswg.org/css-sizing-3/#preferred-size-properties"], status: { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.height": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.height.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.width": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.width.auto": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1",
    safari_ios: "1" } }, "css.properties.width.is_animatable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "26", chrome_android: "26", edge: "12", firefox: "16", firefox_android: "16", safari: "7", safari_ios: "7" } }, "css.types.dimension": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.length-percentage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "\
css.types.percentage": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "will-change": { caniuse: ["will-change"], compat_features: ["css.properties.will-change", "css.properties.will-change.auto", "css.properties.will-change.contents", "css.properties.will-change.scroll-position"], description: "The will-change CSS property gives hints to the browser about expected changes to an element's scroll position, contents, or style. These hints allow browsers to optimize for upcoming style changes.", description_html: "The <code>will-change</code> CSS property gives hints to the browser about expected changes to an element's scroll position, contents, or style. These hints allow browsers to optimize \
for upcoming style changes.", group: ["css"], kind: "feature", name: "will-change", spec: ["https://drafts.csswg.org/css-will-change-1/"], status: { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", by_compat_key: { "css.properties.will-change": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "36", firefox_android: "36", safari: "9.1", safari_ios: "9.3" } }, "css.properties.will-change.auto": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "36", firefox_android: "36", safari: "9.1", safari_ios: "9.3" } }, "css.properties.will-change.contents": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "36", firefox_android: "36", safari: "9.1", safari_ios: "\
9.3" } }, "css.properties.will-change.scroll-position": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "36", firefox_android: "36", safari: "9.1", safari_ios: "9.3" } } }, support: { chrome: "36", chrome_android: "36", edge: "79", firefox: "36", firefox_android: "36", safari: "9.1", safari_ios: "9.3" } } }, window: { compat_features: ["api.Window", "api.Window.DOMContentLoaded_event", "api.Window.blur_event", "api.Window.close", "api.Window.closed", "api.Window.error_event", "api.Window.focus", "api.Window.focus_event", "api.Window.frameElement", "api.Window.frames", "api.Window.innerHeight", "api.Window.innerWidth", "api.Window.length", "api.Window.load_event", "api.Window.moveBy", "api.Window.moveTo", "api.Window.name", "api.Window.open", "api.Window.open.features_parameter_popup", "api.Window.open.once_per_event", "api.Window.opener", "api.Window.outerHeight", "api.Window.oute\
rWidth", "api.Window.parent", "api.Window.resizeBy", "api.Window.resizeTo", "api.Window.resize_event", "api.Window.screen", "api.Window.screenLeft", "api.Window.screenTop", "api.Window.screenX", "api.Window.screenY", "api.Window.self", "api.Window.stop", "api.Window.top", "api.Window.window"], description: "The window global object represents a browser tab or iframe and its relationship to the document and other tabs. It's also a generic global object, under which many other APIs are located.", description_html: "The <code>window</code> global object represents a browser tab or iframe and its relationship to the document and other tabs. It's also a generic global object, under which many other APIs are located.", kind: "feature", name: "Window", spec: ["https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-window-object"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Window": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.DOMContentLoaded_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.Window.blur_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.Window.close": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.closed": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "10", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.Window.focus": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.focus_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.Window.frameElement": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.frames": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.innerHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.innerWidth": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.length": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "\
1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.load_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Window.moveBy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.moveTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.name": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "\
1" } }, "api.Window.open": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1" } }, "api.Window.open.features_parameter_popup": { baseline: false, support: { chrome: "98", chrome_android: "98", edge: "98", firefox: "96", firefox_android: "96" } }, "api.Window.open.once_per_event": { baseline: false, support: { chrome: "23", chrome_android: "25", edge: "12", firefox: "65", firefox_android: "65", safari: "11" } }, "api.Window.opener": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.outerHeight": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.Window.outerWidth": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "3" } }, "api.Window.parent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.Window.resizeBy": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.resizeTo": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.resize_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.1", safari_ios: "1" } }, "api.Window.screen": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.screenLeft": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "64", firefox_android: "64", safari: "1", safari_ios: "1" } }, "api.Window.screenTop": { baseline: "high", baseline_high_date: "2021-06-11", baseline_low_date: "2018-12-11", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "64", firefox_android: "64", safari: "1", safari_ios: "1" } }, "api.Window.screenX": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.screenY": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.Window.self": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.stop": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "1", chrome_android: "18", edge: "14", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Window.top": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
3", safari_ios: "1" } }, "api.Window.window": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "window-controls-overlay": { compat_features: ["api.Navigator.windowControlsOverlay", "api.WindowControlsOverlay", "api.WindowControlsOverlay.geometrychange_event", "api.WindowControlsOverlay.getTitlebarAreaRect", "api.WindowControlsOverlay.visible", "api.WindowControlsOverlayGeometryChangeEvent", "api.WindowControlsOverlayGeometryChangeEvent.WindowControlsOverlayGeometryChangeEvent", "api.WindowControlsOverlayGeometryChangeEvent.titlebarAreaRect", "api.WindowControlsOverlayGeometryChangeEvent.visible", "css.at-rules.media.display-mode.window-controls-overlay", "css.types.env.titlebar-area-height", "\
css.types.env.titlebar-area-width", "css.types.env.titlebar-area-x", "css.types.env.titlebar-area-y", "manifests.webapp.display_override.window-controls-overlay"], description: 'The display_override: ["window-controls-overlay"] web application manifest member shows content in the title bar area of a progressive web app that is installed on a desktop device.', description_html: 'The <code>display_override: ["window-controls-overlay"]</code> web application manifest member shows content in the title bar area of a progressive web app that is installed on a desktop device.', group: ["progressive-web-app"], kind: "feature", name: "Window Controls Overlay", spec: ["https://wicg.github.io/window-controls-overlay/"], status: { baseline: false, by_compat_key: { "api.Navigator.windowControlsOverlay": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlay": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlay.geometrychange_eve\
nt": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlay.getTitlebarAreaRect": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlay.visible": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlayGeometryChangeEvent": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlayGeometryChangeEvent.WindowControlsOverlayGeometryChangeEvent": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlayGeometryChangeEvent.titlebarAreaRect": { baseline: false, support: { chrome: "105", edge: "105" } }, "api.WindowControlsOverlayGeometryChangeEvent.visible": { baseline: false, support: { chrome: "105", edge: "105" } }, "css.at-rules.media.display-mode.window-controls-overlay": { baseline: false, support: { chrome: "105", edge: "105" } }, "css.types.env.titlebar-area-height": { baseline: false, support: { chrome: "93", chrome_android: "\
93", edge: "93" } }, "css.types.env.titlebar-area-width": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "css.types.env.titlebar-area-x": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "css.types.env.titlebar-area-y": { baseline: false, support: { chrome: "93", chrome_android: "93", edge: "93" } }, "manifests.webapp.display_override.window-controls-overlay": { baseline: false, support: { chrome: "105", chrome_android: "105", edge: "105" } } }, support: { chrome: "105", edge: "105" } } }, "window-management": { compat_features: ["api.Element.requestFullscreen.options_screen_parameter", "api.Permissions.permission_window-management", "api.Screen.change_event", "api.Screen.isExtended", "api.ScreenDetailed", "api.ScreenDetailed.availLeft", "api.ScreenDetailed.availTop", "api.ScreenDetailed.devicePixelRatio", "api.ScreenDetailed.isInternal", "api.ScreenDetailed.isPrimary", "api.ScreenDetailed.label", "api.ScreenDetailed.l\
eft", "api.ScreenDetailed.top", "api.ScreenDetails", "api.ScreenDetails.currentScreen", "api.ScreenDetails.currentscreenchange_event", "api.ScreenDetails.screens", "api.ScreenDetails.screenschange_event", "api.Window.getScreenDetails", "api.Window.moveTo.relative-multi-screen", "api.Window.open.relative-multi-screen", "api.Window.screenLeft.relative-multi-screen", "api.Window.screenTop.relative-multi-screen", "api.Window.screenX.relative-multi-screen", "api.Window.screenY.relative-multi-screen", "html.elements.iframe.allow.window-management", "http.headers.Permissions-Policy.window-management"], description: "The window.getScreenDetails() method gets information about the screens on a device, which you can use to place new windows on a specific screen with window.open().", description_html: "The <code>window.getScreenDetails()</code> method gets information about the screens on a device, which you can use to place new windows on a specific screen with <code>window.open()</code>.", kind: "\
feature", name: "Window management", spec: ["https://w3c.github.io/window-management/"], status: { baseline: false, by_compat_key: { "api.Element.requestFullscreen.options_screen_parameter": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.Permissions.permission_window-management": { baseline: false, support: { chrome: "111", edge: "111" } }, "api.Screen.change_event": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } }, "api.Screen.isExtended": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } }, "api.ScreenDetailed": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.availLeft": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.availTop": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.devicePixelRatio": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.isInternal": { baseline: false,
    support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.isPrimary": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.label": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.left": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetailed.top": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetails": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetails.currentScreen": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetails.currentscreenchange_event": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetails.screens": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.ScreenDetails.screenschange_event": { baseline: false, support: { chrome: "100", edge: "100" } }, "api.Window.getScreenDetails": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } },
    "api.Window.moveTo.relative-multi-screen": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "1", firefox_android: "4" } }, "api.Window.open.relative-multi-screen": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "1", firefox_android: "4" } }, "api.Window.screenLeft.relative-multi-screen": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "64", firefox_android: "64" } }, "api.Window.screenTop.relative-multi-screen": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "64", firefox_android: "64" } }, "api.Window.screenX.relative-multi-screen": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "1", firefox_android: "4" } }, "api.Window.screenY.relative-multi-screen": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100", firefox: "64", firefox_android: "64" } },
    "html.elements.iframe.allow.window-management": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } }, "http.headers.Permissions-Policy.window-management": { baseline: false, support: { chrome: "100", chrome_android: "100", edge: "100" } } }, support: { chrome: "111", edge: "111" } } }, with: { compat_features: ["javascript.builtins.Array.@@unscopables", "javascript.builtins.Symbol.unscopables", "javascript.statements.with"], description: "The with JavaScript statement adds a given object to the chain of scopes used to evaluate names.", description_html: "The <code>with</code> JavaScript statement adds a given object to the chain of scopes used to evaluate names.", discouraged: { according_to: ["https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-with-statement"], alternatives: ["destructuring"], reason: "JavaScript strict mode prohibits the with statement.", reason_html: "JavaScript strict mode prohibits the <cod\
e>with</code> statement." }, group: ["javascript"], kind: "feature", name: "with", spec: ["https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-with-statement"], status: { baseline: false, by_compat_key: { "javascript.builtins.Array.@@unscopables": { baseline: "high", baseline_high_date: "2019-03-20", baseline_low_date: "2016-09-20", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } }, "javascript.builtins.Symbol.unscopables": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "38", chrome_android: "38", edge: "12", firefox: "48", firefox_android: "48", safari: "9", safari_ios: "9" } }, "javascript.statements.with": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "38", chrome_android: "38", edge: "\
12", firefox: "48", firefox_android: "48", safari: "10", safari_ios: "10" } } }, "word-break": { caniuse: ["word-break"], compat_features: ["css.properties.word-break", "css.properties.word-break.break-all", "css.properties.word-break.keep-all", "css.properties.word-break.normal"], description: "The word-break CSS property sets how lines break within words.", description_html: "The <code>word-break</code> CSS property sets how lines break within words.", group: ["text-wrap"], kind: "feature", name: "word-break", spec: ["https://drafts.csswg.org/css-text-4/#word-break-property"], status: { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", by_compat_key: { "css.properties.word-break": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } }, "css.properties.word-break.break-all": { baseline: "high",
    baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } }, "css.properties.word-break.keep-all": { baseline: "high", baseline_high_date: "2018-03-30", baseline_low_date: "2015-09-30", support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "15", firefox_android: "15", safari: "9", safari_ios: "9" } }, "css.properties.word-break.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "15", firefox_android: "15", safari: "3", safari_ios: "2" } } }, support: { chrome: "44", chrome_android: "44", edge: "12", firefox: "15", firefox_android: "15", safari: "9", safari_ios: "9" } } }, "word-break-auto-phrase": { compat_features: ["css.properties.word-break.auto-phrase"], description: "The word-break: auto-phrase CSS declaration specifies\
 that wrapping should occur at natural phrase boundaries, especially in CJK languages.", description_html: "The <code>word-break: auto-phrase</code> CSS declaration specifies that wrapping should occur at natural phrase boundaries, especially in CJK languages.", group: ["text-wrap"], kind: "feature", name: "word-break: auto-phrase", spec: ["https://drafts.csswg.org/css-text-4/#valdef-word-break-auto-phrase"], status: { baseline: false, by_compat_key: { "css.properties.word-break.auto-phrase": { baseline: false, support: { chrome: "119", chrome_android: "119", edge: "119" } } }, support: { chrome: "119", chrome_android: "119", edge: "119" } } }, "word-break-break-word": { compat_features: ["css.properties.word-break.break-word"], description: "The word-break: break-word CSS declaration sets word breaks to occur according to their customary rules.", description_html: "The <code>word-break: break-word</code> CSS declaration sets word breaks to occur according to their customary rules.", discouraged: {
    according_to: ["https://drafts.csswg.org/css-text/#valdef-word-break-break-word"], alternatives: ["overflow-wrap"], reason: "The overflow-wrap: anywhere CSS declaration supersedes word-break: break-word.", reason_html: "The <code>overflow-wrap: anywhere</code> CSS declaration supersedes <code>word-break: break-word</code>." }, group: ["css"], kind: "feature", name: "word-break: break-word", spec: ["https://drafts.csswg.org/css-text-3/#word-break-property"], status: { baseline: false, by_compat_key: { "css.properties.word-break.break-word": { baseline: false, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "67", firefox_android: "67", safari: "3", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "67", firefox_android: "67", safari: "3", safari_ios: "2" } } }, "word-spacing": { compat_features: ["css.properties.word-spacing", "css.properties.word-spacing.normal", "svg.global_attributes.word-spacing"], description: "The word-\
spacing CSS property sets the amount of white space between words.", description_html: "The <code>word-spacing</code> CSS property sets the amount of white space between words.", group: ["text"], kind: "feature", name: "word-spacing", spec: ["https://drafts.csswg.org/css-text-4/#word-spacing-property"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.word-spacing": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.word-spacing.normal": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "svg.global_attributes.word-spacing": { baseline: "high", baseline_high_date: "2018-\
01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, "writing-mode": { caniuse: ["css-writing-mode"], compat_features: ["css.properties.writing-mode", "css.properties.writing-mode.horizontal-tb", "css.properties.writing-mode.sideways-lr", "css.properties.writing-mode.sideways-rl", "css.properties.writing-mode.vertical-lr", "css.properties.writing-mode.vertical-rl", "svg.global_attributes.writing-mode"], description: "The writing-mode CSS property sets whether text is laid out horizontally or vertically, and left to right, or right to left.", description_html: "The <code>writing-mode</code> CSS property sets whether text is laid out horizontally or vertically, and left to right, or right to left.", group: ["css"], kind: "feature", name: "writi\
ng-mode", spec: ["https://drafts.csswg.org/css-writing-modes-4/#block-flow"], status: { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", by_compat_key: { "css.properties.writing-mode": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "41", firefox_android: "41", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.horizontal-tb": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.sideways-lr": { baseline: "low", baseline_low_date: "2025-03-31", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "43", firefox_android: "43", safari: "18.4", safari_ios: "18.4" } }, "css.properties.writing-mode.sideways-rl": { baseline: "\
low", baseline_low_date: "2025-03-31", support: { chrome: "132", chrome_android: "132", edge: "132", firefox: "43", firefox_android: "43", safari: "18.4", safari_ios: "18.4" } }, "css.properties.writing-mode.vertical-lr": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.vertical-rl": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "svg.global_attributes.writing-mode": { baseline: "high", baseline_high_date: "2019-09-27", baseline_low_date: "2017-03-27", support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "41", firefox_android: "41", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "48",
    chrome_android: "48", edge: "12", firefox: "41", firefox_android: "41", safari: "10.1", safari_ios: "10.3" } } }, "writing-mode-svg-values": { compat_features: ["css.properties.writing-mode.lr", "css.properties.writing-mode.lr-tb", "css.properties.writing-mode.rl", "css.properties.writing-mode.rl-tb", "css.properties.writing-mode.tb", "css.properties.writing-mode.tb-rl"], description: "The lr, lr-tb, rl, rl-tb, tb, and tb-rl keyword values for the writing-mode CSS property set the text direction for elements in SVG 1.1 documents.", description_html: "The <code>lr</code>, <code>lr-tb</code>, <code>rl</code>, <code>rl-tb</code>, <code>tb</code>, and <code>tb-rl</code> keyword values for the <code>writing-mode</code> CSS property set the text direction for elements in SVG 1.1 documents.", discouraged: { according_to: ["https://drafts.csswg.org/css-writing-modes-4/#svg-writing-mode"], alternatives: ["writing-mode"], reason: "SVG 1.1 writing modes are superseded by CSS writing-mode valu\
es.", reason_html: "SVG 1.1 writing modes are superseded by CSS <code>writing-mode</code> values." }, group: ["css"], kind: "feature", name: "writing-mode SVG 1.1 values", spec: ["https://drafts.csswg.org/css-writing-modes-4/#block-flow"], status: { baseline: false, by_compat_key: { "css.properties.writing-mode.lr": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.lr-tb": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.rl": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.rl-tb": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "\
43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.tb": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } }, "css.properties.writing-mode.tb-rl": { baseline: false, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } } }, support: { chrome: "48", chrome_android: "48", edge: "12", firefox: "43", firefox_android: "43", safari: "10.1", safari_ios: "10.3" } } }, writingsuggestions: { compat_features: ["api.HTMLElement.writingSuggestions", "html.global_attributes.writingsuggestions"], description: "The writingsuggestions HTML attribute turns on or off a browser's writing suggestions. Writing suggestions vary by browser. For example, if turned on then a browser might show inline text completions accepted by pressing Tab.", description_html: "The <code>writingsuggestions</code> HTML attri\
bute turns on or off a browser's writing suggestions. Writing suggestions vary by browser. For example, if turned on then a browser might show inline text completions accepted by pressing Tab.", group: ["forms"], kind: "feature", name: "writingsuggestions", spec: ["https://html.spec.whatwg.org/multipage/interaction.html#writing-suggestions"], status: { baseline: false, by_compat_key: { "api.HTMLElement.writingSuggestions": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", safari: "18", safari_ios: "18" } }, "html.global_attributes.writingsuggestions": { baseline: false, support: { chrome: "124", chrome_android: "124", edge: "124", safari: "18", safari_ios: "18" } } }, support: { chrome: "124", chrome_android: "124", edge: "124", safari: "18", safari_ios: "18" } } }, xhr: { compat_features: ["api.FormData", "api.FormData.@@iterator", "api.FormData.FormData", "api.FormData.FormData.submitter", "api.FormData.append", "api.FormData.append.filename_parameter",
    "api.FormData.delete", "api.FormData.entries", "api.FormData.forEach", "api.FormData.get", "api.FormData.getAll", "api.FormData.has", "api.FormData.keys", "api.FormData.set", "api.FormData.values", "api.FormData.worker_support", "api.ProgressEvent", "api.ProgressEvent.ProgressEvent", "api.ProgressEvent.ProgressEvent.loaded_total_options_accept_double", "api.ProgressEvent.lengthComputable", "api.ProgressEvent.loaded", "api.ProgressEvent.total", "api.ProgressEvent.worker_support", "api.XMLHttpRequest", "api.XMLHttpRequest.XMLHttpRequest", "api.XMLHttpRequest.abort", "api.XMLHttpRequest.abort_event", "api.XMLHttpRequest.authorization_removed_cross_origin", "api.XMLHttpRequest.error_event", "api.XMLHttpRequest.getAllResponseHeaders", "api.XMLHttpRequest.getAllResponseHeaders.header_names_lowercase", "api.XMLHttpRequest.getResponseHeader", "api.XMLHttpRequest.load_event", "api.XMLHttpRequest.loadend_event", "api.XMLHttpRequest.loadstart_event", "api.XMLHttpRequest.open", "api.XMLHttpReq\
uest.overrideMimeType", "api.XMLHttpRequest.progress_event", "api.XMLHttpRequest.readyState", "api.XMLHttpRequest.readystatechange_event", "api.XMLHttpRequest.response", "api.XMLHttpRequest.responseText", "api.XMLHttpRequest.responseType", "api.XMLHttpRequest.responseType.arraybuffer_value", "api.XMLHttpRequest.responseType.blob_value", "api.XMLHttpRequest.responseType.document_value", "api.XMLHttpRequest.responseType.json_value", "api.XMLHttpRequest.responseURL", "api.XMLHttpRequest.responseXML", "api.XMLHttpRequest.send", "api.XMLHttpRequest.send.body_ArrayBufferView_type", "api.XMLHttpRequest.send.body_ArrayBuffer_type", "api.XMLHttpRequest.send.body_Blob_type", "api.XMLHttpRequest.send.body_FormData_type", "api.XMLHttpRequest.send.body_URLSearchParams_type", "api.XMLHttpRequest.setRequestHeader", "api.XMLHttpRequest.status", "api.XMLHttpRequest.statusText", "api.XMLHttpRequest.timeout", "api.XMLHttpRequest.timeout_event", "api.XMLHttpRequest.upload", "api.XMLHttpRequest.withCredent\
ials", "api.XMLHttpRequest.worker_support", "api.XMLHttpRequestEventTarget", "api.XMLHttpRequestUpload", "api.XMLHttpRequestUpload.abort_event", "api.XMLHttpRequestUpload.error_event", "api.XMLHttpRequestUpload.load_event", "api.XMLHttpRequestUpload.loadend_event", "api.XMLHttpRequestUpload.loadstart_event", "api.XMLHttpRequestUpload.progress_event", "api.XMLHttpRequestUpload.timeout_event"], description: "The XMLHttpRequest API makes HTTP requests. It's the predecessor to fetch(). Also known as XHR.", description_html: "The <code>XMLHttpRequest</code> API makes HTTP requests. It's the predecessor to <code>fetch()</code>. Also known as XHR.", kind: "feature", name: "XMLHttpRequest", spec: ["https://xhr.spec.whatwg.org/"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.FormData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "\
12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.FormData.@@iterator": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.FormData": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.FormData.FormData.submitter": { baseline: "high", baseline_high_date: "2025-10-06", baseline_low_date: "2023-04-06", support: { chrome: "112", chrome_android: "112", edge: "112", firefox: "111", firefox_android: "111", safari: "16.4", safari_ios: "16.4" } }, "api.FormData.append": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "5", chrome_android: "18", edge: "12", firefox: "\
4", firefox_android: "4", safari: "5", safari_ios: "5" } }, "api.FormData.append.filename_parameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "16", chrome_android: "18", edge: "12", firefox: "22", firefox_android: "22", safari: "6", safari_ios: "6" } }, "api.FormData.delete": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.entries": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.forEach": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "47", firefox_android: "\
47", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.get": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.getAll": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.has": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.keys": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "44", firefox_android: "44", safari: "11.1",
    safari_ios: "11.3" } }, "api.FormData.set": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "39", firefox_android: "39", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.values": { baseline: "high", baseline_high_date: "2021-04-02", baseline_low_date: "2018-10-02", support: { chrome: "50", chrome_android: "50", edge: "18", firefox: "44", firefox_android: "44", safari: "11.1", safari_ios: "11.3" } }, "api.FormData.worker_support": { baseline: "high", baseline_high_date: "2022-09-24", baseline_low_date: "2020-03-24", support: { chrome: "50", chrome_android: "50", edge: "79", firefox: "39", firefox_android: "39", safari: "13.1", safari_ios: "13.4" } }, "api.ProgressEvent": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "\
2" } }, "api.ProgressEvent.ProgressEvent": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "16", chrome_android: "18", edge: "14", firefox: "18", firefox_android: "18", safari: "6", safari_ios: "6" } }, "api.ProgressEvent.ProgressEvent.loaded_total_options_accept_double": { baseline: false, support: { chrome: "136", chrome_android: "136", edge: "136", firefox: "138", firefox_android: "138" } }, "api.ProgressEvent.lengthComputable": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ProgressEvent.loaded": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ProgressEvent.total": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.ProgressEvent.worker_support": { baseline: false, support: { firefox: "54", firefox_android: "54", safari: "10", safari_ios: "10" } }, "api.XMLHttpRequest": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.XMLHttpRequest": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XMLHttpRequest.abort": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.abort_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.XMLHttpRequest.authorization_removed_cross_origin": { baseline: false, support: { firefox: "111", firefox_android: "111", safari: "16.1", safari_ios: "16.1" } }, "api.XMLHttpRequest.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.XMLHttpRequest.getAllResponseHeaders": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "\
1" } }, "api.XMLHttpRequest.getAllResponseHeaders.header_names_lowercase": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "60", chrome_android: "60", edge: "79", firefox: "64", firefox_android: "64", safari: "11", safari_ios: "11" } }, "api.XMLHttpRequest.getResponseHeader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.load_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.XMLHttpRequest.loadend_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "5", firefox_android: "\
5", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequest.loadstart_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "1.3", safari_ios: "1" } }, "api.XMLHttpRequest.open": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.overrideMimeType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.progress_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3", safari_ios: "1" } }, "api.XMLHttpRequest.readyState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.readystatechange_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.response": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "6", firefox_android: "6", safari: "5.1", safari_ios: "5" } }, "api.XMLHttpRequest.responseText": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.responseType": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.XMLHttpRequest.responseType.arraybuffer_value": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.XMLHttpRequest.responseType.blob_value": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "31", chrome_android: "31", edge: "12", firefox: "6", firefox_android: "50", safari: "5.1", safari_ios: "5" } }, "api.XMLHttpRequest.responseType.document_value": { baseline: "high", baseline_high_date: "2019-05-15", baseline_low_date: "2016-11-15", support: { chrome: "31", chrome_android: "\
31", edge: "12", firefox: "11", firefox_android: "50", safari: "7", safari_ios: "7" } }, "api.XMLHttpRequest.responseType.json_value": { baseline: "high", baseline_high_date: "2022-07-15", baseline_low_date: "2020-01-15", support: { chrome: "31", chrome_android: "31", edge: "79", firefox: "10", firefox_android: "50", safari: "7", safari_ios: "7" } }, "api.XMLHttpRequest.responseURL": { baseline: "high", baseline_high_date: "2019-02-02", baseline_low_date: "2016-08-02", support: { chrome: "37", chrome_android: "37", edge: "14", firefox: "32", firefox_android: "32", safari: "8", safari_ios: "8" } }, "api.XMLHttpRequest.responseXML": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XMLHttpRequest.send": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.send.body_ArrayBufferView_type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "20", firefox_android: "20", safari: "7", safari_ios: "7" } }, "api.XMLHttpRequest.send.body_ArrayBuffer_type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "9", chrome_android: "18", edge: "12", firefox: "9", firefox_android: "9", safari: "6", safari_ios: "6" } }, "api.XMLHttpRequest.send.body_Blob_type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "22", chrome_android: "25", edge: "12", firefox: "2", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.XMLHttpRequest.send.body_FormData_type": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "6", chrome_android: "18", edge: "12", firefox: "2", firefox_android: "4", safari: "6", safari_ios: "6" } }, "api.XMLHttpRequest.send.body_URLSearchParams_type": { baseline: "high", baseline_high_date: "2024-03-20", baseline_low_date: "2021-09-20", support: { chrome: "59", chrome_android: "59", edge: "17", firefox: "44", firefox_android: "44", safari: "15", safari_ios: "15" } }, "api.XMLHttpRequest.setRequestHeader": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.status": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.statusText": { baseline: "high", baseline_high_date: "2018-01-29",
    baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1.2", safari_ios: "1" } }, "api.XMLHttpRequest.timeout": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "12", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.XMLHttpRequest.timeout_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "12", firefox_android: "14", safari: "7", safari_ios: "7" } }, "api.XMLHttpRequest.upload": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequest.withCredentials": { baseline: "high", baseline_high_date: "2018-0\
1-29", baseline_low_date: "2015-07-29", support: { chrome: "3", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3.2" } }, "api.XMLHttpRequest.worker_support": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "4", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "5" } }, "api.XMLHttpRequestEventTarget": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "api.XMLHttpRequestUpload": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.abort_event": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.error_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.load_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.loadend_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "18", chrome_android: "18", edge: "12", firefox: "5", firefox_android: "5", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.loadstart_event": { baseline: "\
high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.progress_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "2", chrome_android: "18", edge: "12", firefox: "3.5", firefox_android: "4", safari: "4", safari_ios: "3" } }, "api.XMLHttpRequestUpload.timeout_event": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "29", chrome_android: "29", edge: "12", firefox: "12", firefox_android: "14", safari: "7", safari_ios: "7" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, "xml-serializer": { compat_features: ["api.XMLSerializer", "api.XMLSerializer.XMLSerializer", "api.XMLSerializer.serializeToString"], description: "\
The XMLSerializer API provides the serializeToString() method to construct an XML string representing a DOM tree.", description_html: "The <code>XMLSerializer</code> API provides the <code>serializeToString()</code> method to construct an XML string representing a DOM tree.", group: ["parsing-and-serialization", "xml"], kind: "feature", name: "XMLSerializer", spec: ["https://w3c.github.io/DOM-Parsing/#the-xmlserializer-interface"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.XMLSerializer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XMLSerializer.XMLSerializer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "\
3", safari_ios: "1" } }, "api.XMLSerializer.serializeToString": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, xpath: { caniuse: ["document-evaluate-xpath"], compat_features: ["api.Document.createExpression", "api.Document.evaluate", "api.XPathEvaluator", "api.XPathEvaluator.XPathEvaluator", "api.XPathEvaluator.createExpression", "api.XPathEvaluator.evaluate", "api.XPathExpression", "api.XPathExpression.evaluate", "api.XPathResult", "api.XPathResult.booleanValue", "api.XPathResult.invalidIteratorState", "api.XPathResult.iterateNext", "api.XPathResult.numberValue", "api.XPathResult.resultType", "api.XPathResult.singleNodeValue", "api.XPathResult.snapshotItem", "api.XPathResult.snapshotLength",
    "api.XPathResult.stringValue"], description: "The document.evaluate() method selects elements in an HTML or XML document based on an expression of XPath, a domain specific language for querying XML documents. Also known as XML Path Language.", description_html: "The <code>document.evaluate()</code> method selects elements in an HTML or XML document based on an expression of XPath, a domain specific language for querying XML documents. Also known as XML Path Language.", group: ["xml"], kind: "feature", name: "XPath", spec: ["https://dom.spec.whatwg.org/#xpath"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.Document.createExpression": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.Document.evaluate": { baseline: "high", baseline_high_date: "20\
18-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathEvaluator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathEvaluator.XPathEvaluator": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathEvaluator.createExpression": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathEvaluator.evaluate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathExpression": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathExpression.evaluate": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.booleanValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1",
    chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.invalidIteratorState": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.iterateNext": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.numberValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.resultType": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "\
18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.singleNodeValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.snapshotItem": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.snapshotLength": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } }, "api.XPathResult.stringValue": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "\
12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3", safari_ios: "1" } } }, xslt: { compat_features: ["api.XSLTProcessor", "api.XSLTProcessor.XSLTProcessor", "api.XSLTProcessor.clearParameters", "api.XSLTProcessor.getParameter", "api.XSLTProcessor.importStylesheet", "api.XSLTProcessor.removeParameter", "api.XSLTProcessor.reset", "api.XSLTProcessor.setParameter", "api.XSLTProcessor.transformToDocument", "api.XSLTProcessor.transformToFragment"], description: "The XSLTProcessor API transforms XML documents into new XML or HTML documents, using XSLT stylesheets. You can use XSLT to convert data between different XML schemas or to convert XML data into web pages or PDF documents. Also known as Extensible Stylesheet Language Transformations.", description_html: "The <code>XSLTProcessor</code> API transforms XML documents into new XML or HTML documents, using XSLT\
 stylesheets. You can use XSLT to convert data between different XML schemas or to convert XML data into web pages or PDF documents. Also known as Extensible Stylesheet Language Transformations.", group: ["xml"], kind: "feature", name: "XSLT", spec: ["https://dom.spec.whatwg.org/#xslt"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "api.XSLTProcessor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.XSLTProcessor": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.clearParameters": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.getParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.importStylesheet": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.removeParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.reset": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "\
2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.setParameter": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.transformToDocument": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } }, "api.XSLTProcessor.transformToFragment": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "3.1", safari_ios: "2" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "\
4", safari: "3.1", safari_ios: "2" } } }, "z-index": { compat_features: ["css.properties.z-index", "css.properties.z-index.auto", "css.properties.z-index.negative_values", "css.types.integer"], description: "The z-index CSS property orders overlapping elements, with higher values appearing in front of or on top of lower values.", description_html: "The <code>z-index</code> CSS property orders overlapping elements, with higher values appearing in front of or on top of lower values.", group: ["css"], kind: "feature", name: "z-index", spec: ["https://drafts.csswg.org/css2/#z-index"], status: { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", by_compat_key: { "css.properties.z-index": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.z-index.auto": { baseline: "high", baseline_high_date: "\
2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.properties.z-index.negative_values": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "1", safari_ios: "1" } }, "css.types.integer": { baseline: "high", baseline_high_date: "2018-01-29", baseline_low_date: "2015-07-29", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "1", firefox_android: "4", safari: "1", safari_ios: "1" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "3", firefox_android: "4", safari: "1", safari_ios: "1" } } }, zoom: { caniuse: ["css-zoom"], compat_features: ["css.properties.zoom"], description: "The zoom CSS property scales the size of an element. Unlike the transform property, a zoomed element affects page \
layout.", description_html: "The <code>zoom</code> CSS property scales the size of an element. Unlike the <code>transform</code> property, a zoomed element affects page layout.", kind: "feature", name: "zoom", spec: ["https://drafts.csswg.org/css-viewport/#zoom-property"], status: { baseline: "low", baseline_low_date: "2024-05-14", by_compat_key: { "css.properties.zoom": { baseline: "low", baseline_low_date: "2024-05-14", support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "126", firefox_android: "126", safari: "3.1", safari_ios: "3" } } }, support: { chrome: "1", chrome_android: "18", edge: "12", firefox: "126", firefox_android: "126", safari: "3.1", safari_ios: "3" } } }, zstd: { caniuse: ["zstd"], compat_features: ["http.headers.Accept-Encoding.zstd", "http.headers.Content-Encoding.zstd"], description: "Zstandard or zstd is a fast lossless compression algorithm. When used as a content encoding, it is often faster and offers better compression than brotli.", description_html: "\
Zstandard or <code>zstd</code> is a fast lossless compression algorithm. When used as a content encoding, it is often faster and offers better compression than brotli.", kind: "feature", name: "Zstandard compression", spec: ["https://www.rfc-editor.org/rfc/rfc8878"], status: { baseline: "low", baseline_low_date: "2026-02-11", by_compat_key: { "http.headers.Accept-Encoding.zstd": { baseline: "low", baseline_low_date: "2026-02-11", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "126", firefox_android: "126", safari: "26.3", safari_ios: "26.3" } }, "http.headers.Content-Encoding.zstd": { baseline: "low", baseline_low_date: "2026-02-11", support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "126", firefox_android: "126", safari: "26.3", safari_ios: "26.3" } } }, support: { chrome: "123", chrome_android: "123", edge: "123", firefox: "126", firefox_android: "126", safari: "26.3", safari_ios: "26.3" } } } }, groups: { animation: { name: "Animation" }, arrays: {
    name: "Arrays", parent: "collections" }, background: { name: "Background", parent: "css" }, "blend-mode": { name: "Blend mode", parent: "css" }, "borders-outlines": { name: "Borders and outlines", parent: "css" }, canvas: { name: "Canvas" }, clipboard: { name: "Clipboard" }, "clipping-shapes-masking": { name: "Clipping, shapes, and masking" }, collections: { name: "Collections", parent: "javascript" }, "color-types": { name: "Color types", parent: "css" }, "compute-pressure": { name: "Compute pressure" }, "container-queries": { name: "Container queries", parent: "css" }, containment: { name: "Containment", parent: "css" }, cookies: { name: "Cookies" }, counters: { name: "Counters", parent: "css" }, "credential-management": { name: "Credential management" }, css: { name: "CSS" }, cssom: { name: "CSS object models", parent: "css" }, "custom-elements": { name: "Custom elements", parent: "html" }, dom: { name: "DOM" }, "environment-variables": { name: "CSS environment variables", parent: "\
css" }, "explicit-defaults": { name: "Explicit defaults", parent: "css" }, fetch: { name: "Fetch" }, "file-system": { name: "File system access" }, flexbox: { name: "Flexbox", parent: "layout" }, "font-features": { name: "Typographic font features", parent: "fonts" }, "font-synthesis": { name: "Font synthesis", parent: "fonts" }, fonts: { name: "Fonts", parent: "css" }, forms: { name: "Forms", parent: "html" }, gamepad: { name: "Gamepad" }, geolocation: { name: "Geolocation" }, gradients: { name: "Gradients", parent: "css" }, grid: { name: "Grid", parent: "layout" }, html: { name: "HTML" }, "html-elements": { name: "HTML elements", parent: "html" }, http: { name: "HTTP" }, "image-formats": { name: "Image formats", parent: "images" }, "image-scaling": { name: "Image scaling", parent: "images" }, images: { name: "Images" }, indexeddb: { name: "IndexedDB", parent: "storage" }, integrity: { name: "Resource integrity" }, intl: { name: "Internationalization", parent: "javascript" }, iterators: {
    name: "Iterators", parent: "javascript" }, javascript: { name: "JavaScript" }, "js-modules": { name: "JavaScript modules", parent: "javascript" }, json: { name: "JSON", parent: "javascript" }, "landmark-elements": { name: "Landmark elements", parent: "html-elements" }, layout: { name: "Layout", parent: "css" }, lists: { name: "Lists", parent: "css" }, maps: { name: "Maps", parent: "collections" }, mathml: { name: "MathML" }, "media-elements": { name: "Media elements", parent: "html" }, "media-queries": { name: "Media queries", parent: "css" }, messaging: { name: "Messaging" }, "multi-column": { name: "Multi-column", parent: "layout" }, "parsing-and-serialization": { name: "Parsing and serialization" }, payments: { name: "Payments" }, performance: { name: "Performance" }, positioning: { name: "Positioning", parent: "layout" }, "primitive-types": { name: "Primitive types", parent: "javascript" }, print: { name: "Print media" }, "progressive-web-app": { name: "Progressive web app" }, promises: {
    name: "Promises", parent: "javascript" }, "reading-order": { name: "Reading order" }, regexps: { name: "Regular expressions", parent: "javascript" }, "resource-hints": { name: "Resource hints" }, ruby: { name: "Ruby" }, "scroll-markers": { name: "Scroll markers", parent: "scrolling" }, scrolling: { name: "Scrolling" }, security: { name: "Security" }, selection: { name: "Selection" }, selectors: { name: "Selectors", parent: "css" }, sensors: { name: "Sensors" }, sets: { name: "Sets", parent: "collections" }, speech: { name: "Speech" }, storage: { name: "Storage" }, streams: { name: "Streams" }, string: { name: "Strings", parent: "primitive-types" }, svg: { name: "SVG" }, text: { name: "Text", parent: "css" }, "text-fragments": { name: "Text fragments" }, "text-wrap": { name: "Text wrap", parent: "text" }, transforms: { name: "Transforms", parent: "css" }, transitions: { name: "Transitions (CSS)", parent: "css" }, "typed-arrays": { name: "Typed arrays", parent: "collections" }, units: {
    name: "Units", parent: "css" }, "view-transitions": { name: "View transitions" }, "web-audio": { name: "Web audio" }, "web-components": { name: "Web components" }, webassembly: { name: "WebAssembly" }, webauthn: { name: "WebAuthn", parent: "credential-management" }, webdriver: { name: "WebDriver" }, webgl: { name: "WebGL" }, "webgl-extensions": { name: "WebGL extensions", parent: "webgl" }, webgpu: { name: "WebGPU" }, webmcp: { name: "WebMCP" }, webrtc: { name: "WebRTC" }, webxr: { name: "WebXR" }, "white-space": { name: "White space", parent: "css" }, workers: { name: "Workers" }, worklets: { name: "Worklets" }, xml: { name: "XML" } }, snapshots: { "ecmascript-1": { name: "ECMAScript", spec: "https://ecma-international.org/wp-content/uploads/ECMA-262_1st_edition_june_1997.pdf" }, "ecmascript-2015": { name: "ECMAScript 2015", spec: "https://262.ecma-international.org/6.0/" }, "ecmascript-2016": { name: "ECMAScript 2016", spec: "https://262.ecma-international.org/7.0/" }, "ecmascrip\
t-2017": { name: "ECMAScript 2017", spec: "https://262.ecma-international.org/8.0/" }, "ecmascript-2018": { name: "ECMAScript 2018", spec: "https://262.ecma-international.org/9.0/" }, "ecmascript-2019": { name: "ECMAScript 2019", spec: "https://262.ecma-international.org/10.0/" }, "ecmascript-2020": { name: "ECMAScript 2020", spec: "https://262.ecma-international.org/11.0/" }, "ecmascript-2021": { name: "ECMAScript 2021", spec: "https://262.ecma-international.org/12.0/" }, "ecmascript-2022": { name: "ECMAScript 2022", spec: "https://262.ecma-international.org/13.0/" }, "ecmascript-2023": { name: "ECMAScript 2023", spec: "https://262.ecma-international.org/14.0/" }, "ecmascript-5": { name: "ECMAScript 5.1", spec: "https://262.ecma-international.org/5.1/" } } };
  }
});

// core/lib/baseline/web-features-metadata.json
var web_features_metadata_default;
var init_web_features_metadata = __esm({
  "core/lib/baseline/web-features-metadata.json"() {
    web_features_metadata_default = {
      date: "2026-03-18"
    };
  }
});

// core/audits/baseline.js
var baseline_exports = {};
__export(baseline_exports, {
  UIStrings: () => UIStrings93,
  default: () => baseline_default
});
var UIStrings93, str_73, features, Baseline, baseline_default;
var init_baseline = __esm({
  "core/audits/baseline.js"() {
    "use strict";
    init_process_global();
    init_data();
    init_audit();
    init_web_features_metadata();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings93 = {
      /** Title of the Baseline audit. Shown when the page is compatible with the target baseline. */
      title: "Baseline Features",
      /**
       * @description Description of the Baseline audit.
       * @example {2026-03-18} date
       */
      description: "Lists web features used on the page and their Baseline status as of {date}. [Learn more about Baseline](https://webstatus.dev/).",
      /** Label for the column displaying the feature ID. */
      columnFeature: "Web-features",
      /** Label for the column displaying the feature\'s baseline status. */
      columnStatus: "Baseline Status"
    };
    str_73 = createIcuMessageFn({ url: "core/audits/baseline.js" }.url, UIStrings93);
    ({ features } = /** @type {any} */
    data_default);
    Baseline = class extends Audit {
      static {
        __name(this, "Baseline");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "baseline",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_73(UIStrings93.title),
          description: str_73(UIStrings93.description, { date: web_features_metadata_default.date }),
          requiredArtifacts: ["Trace"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts) {
        const trace = artifacts.Trace;
        const featuresMap = /* @__PURE__ */ new Map();
        const dxEvents = (
          /** @type {DXFeatureEvent[]} */
          (trace.traceEvents || []).filter((e) => e.cat === "blink.webdx_feature_usage" && e.args?.feature)
        );
        for (const event of dxEvents) {
          const key = `${event.args.feature}`;
          if (featuresMap.has(key)) continue;
          let source;
          if (event.args.url) {
            const line = event.args.lineNumber ? event.args.lineNumber - 1 : 0;
            const column = event.args.columnNumber ? event.args.columnNumber - 1 : 0;
            source = Audit.makeSourceLocation(event.args.url, line, column);
          }
          featuresMap.set(key, {
            featureId: event.args.feature,
            source
          });
        }
        const baselineFeatures = Array.from(featuresMap.values());
        const baselineStatus = [];
        for (const feature of baselineFeatures) {
          if (!feature.featureId) {
            continue;
          }
          const featureData = features[feature.featureId];
          if (!featureData || !("status" in featureData)) {
            continue;
          }
          let displayStatus = "Limited Availability";
          let baselineTier = "limited";
          if (featureData.status.baseline === "high") {
            displayStatus = `Widely Available (${featureData.status.baseline_low_date})`;
            baselineTier = "high";
          } else if (featureData.status.baseline === "low") {
            displayStatus = `Newly Available (${featureData.status.baseline_low_date})`;
            baselineTier = "low";
          }
          baselineStatus.push({
            featureId: {
              type: (
                /** @type {const} */
                "link"
              ),
              text: feature.featureId,
              url: `https://webstatus.dev/features/${feature.featureId}`
            },
            displayStatus: {
              type: (
                /** @type {const} */
                "baseline-status"
              ),
              status: baselineTier,
              displayString: displayStatus
            },
            source: feature.source
          });
        }
        const headings = [
          {
            key: "featureId",
            valueType: "link",
            label: str_73(UIStrings93.columnFeature)
          },
          {
            key: "displayStatus",
            valueType: "baseline-status",
            label: str_73(UIStrings93.columnStatus)
          },
          {
            key: "source",
            valueType: "source-location",
            label: str_73(UIStrings.columnSource)
          }
        ];
        const getStatusRank = /* @__PURE__ */ __name((status) => {
          if (status.startsWith("Limited")) {
            return 1;
          }
          if (status.startsWith("Newly")) {
            return 2;
          }
          if (status.startsWith("Widely")) {
            return 3;
          }
          return 4;
        }, "getStatusRank");
        const sortedStatuses = baselineStatus.sort((featureA, featureB) => {
          const rankA = getStatusRank(featureA.displayStatus.displayString);
          const rankB = getStatusRank(featureB.displayStatus.displayString);
          if (rankA !== rankB) {
            return rankA - rankB;
          }
          const hasSourceA = !!featureA.source;
          const hasSourceB = !!featureB.source;
          if (hasSourceA !== hasSourceB) {
            return hasSourceA ? -1 : 1;
          }
          return 0;
        });
        const details = Audit.makeTableDetails(headings, sortedStatuses);
        return {
          score: 1,
          details
        };
      }
    };
    baseline_default = Baseline;
  }
});

// core/audits/clickjacking-mitigation.js
var clickjacking_mitigation_exports = {};
__export(clickjacking_mitigation_exports, {
  UIStrings: () => UIStrings94,
  default: () => clickjacking_mitigation_default
});
var UIStrings94, str_74, ClickjackingMitigation, clickjacking_mitigation_default;
var init_clickjacking_mitigation = __esm({
  "core/audits/clickjacking-mitigation.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_main_resource();
    init_i18n();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings94 = {
      /** Title of a Lighthouse audit that evaluates whether the set CSP or XFO header is mitigating clickjacking attacks. "XFO" stands for "X-Frame-Options" and should not be translated. "CSP" stands for "Content-Security-Policy" and should not be translated. "clickjacking" should not be translated. */
      title: "Mitigate clickjacking with XFO or CSP",
      /** Description of a Lighthouse audit that evaluates whether the set CSP or XFO header is mitigating clickjacking attacks. This is displayed after a user expands the section to see more. "clickjacking" should not be translated. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. "XFO" stands for "X-Frame-Options" and should not be translated. "CSP" stands for "Content-Security-Policy" and should not be translated. */
      description: "The `X-Frame-Options` (XFO) header or the `frame-ancestors` directive in the `Content-Security-Policy` (CSP) header control where a page can be embedded. These can mitigate clickjacking attacks by blocking some or all sites from embedding the page. [Learn more about mitigating clickjacking](https://developer.chrome.com/docs/lighthouse/best-practices/clickjacking-mitigation).",
      /** Summary text for the results of a Lighthouse audit that evaluates whether the page is mitigating clickjacking attacks with a frame control policy. This text is displayed if the page does not control how it can be embedded on other pages. */
      noClickjackingMitigation: "No frame control policy found",
      /** Label for a column in a data table; entries will be the severity of an issue with the page's frame control policy. */
      columnSeverity: "Severity"
    };
    str_74 = createIcuMessageFn({ url: "core/audits/clickjacking-mitigation.js" }.url, UIStrings94);
    ClickjackingMitigation = class extends Audit {
      static {
        __name(this, "ClickjackingMitigation");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "clickjacking-mitigation",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_74(UIStrings94.title),
          description: str_74(UIStrings94.description),
          requiredArtifacts: ["DevtoolsLog", "URL"],
          supportedModes: ["navigation"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<{cspHeaders: string[], xfoHeaders: string[]}>}
       */
      static async getRawCspsAndXfo(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        const cspHeaders = mainResource.responseHeaders.filter((h) => {
          return h.name.toLowerCase() === "content-security-policy";
        }).flatMap((h) => h.value.split(",")).filter((rawCsp) => rawCsp.replace(/\s/g, ""));
        let xfoHeaders = mainResource.responseHeaders.filter((h) => {
          return h.name.toLowerCase() === "x-frame-options";
        }).flatMap((h) => h.value);
        xfoHeaders = xfoHeaders.map((v) => v.toLowerCase().replace(/\s/g, ""));
        return { cspHeaders, xfoHeaders };
      }
      /**
       * @param {string | undefined} directive
       * @param {LH.IcuMessage | string} findingDescription
       * @param {LH.IcuMessage=} severity
       * @return {LH.Audit.Details.TableItem}
       */
      static findingToTableItem(directive, findingDescription, severity) {
        return {
          description: findingDescription,
          severity
        };
      }
      /**
       * @param {string[]} cspHeaders
       * @param {string[]} xfoHeaders
       * @return {{score: number, results: LH.Audit.Details.TableItem[]}}
       */
      static constructResults(cspHeaders, xfoHeaders) {
        const allowedDirectives = ["deny", "sameorigin"];
        for (const cspHeader of cspHeaders) {
          if (cspHeader.includes("frame-ancestors")) {
            return { score: 1, results: [] };
          }
        }
        for (const actualDirective of xfoHeaders) {
          if (allowedDirectives.includes(actualDirective)) {
            return { score: 1, results: [] };
          }
        }
        return {
          score: 0,
          results: [{
            severity: str_74(UIStrings.itemSeverityHigh),
            description: str_74(UIStrings94.noClickjackingMitigation)
          }]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const { cspHeaders, xfoHeaders } = await this.getRawCspsAndXfo(artifacts, context);
        const { score, results } = this.constructResults(cspHeaders, xfoHeaders);
        const headings = [
          /* eslint-disable max-len */
          { key: "description", valueType: "text", subItemsHeading: { key: "description" }, label: str_74(UIStrings.columnDescription) },
          { key: "severity", valueType: "text", subItemsHeading: { key: "severity" }, label: str_74(UIStrings94.columnSeverity) }
          /* eslint-enable max-len */
        ];
        const details = Audit.makeTableDetails(headings, results);
        return {
          score,
          notApplicable: !results.length,
          details
        };
      }
    };
    clickjacking_mitigation_default = ClickjackingMitigation;
  }
});

// node_modules/csp_evaluator/dist/finding.js
var require_finding = __commonJS({
  "node_modules/csp_evaluator/dist/finding.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.Type = exports2.Severity = exports2.Finding = void 0;
    var Finding = class _Finding {
      static {
        __name(this, "Finding");
      }
      constructor(type, description, severity, directive, value) {
        this.type = type;
        this.description = description;
        this.severity = severity;
        this.directive = directive;
        this.value = value;
      }
      static getHighestSeverity(findings) {
        if (findings.length === 0) {
          return Severity.NONE;
        }
        const severities = findings.map((finding) => finding.severity);
        const min = /* @__PURE__ */ __name((prev, cur) => prev < cur ? prev : cur, "min");
        return severities.reduce(min, Severity.NONE);
      }
      equals(obj) {
        if (!(obj instanceof _Finding)) {
          return false;
        }
        return obj.type === this.type && obj.description === this.description && obj.severity === this.severity && obj.directive === this.directive && obj.value === this.value;
      }
    };
    exports2.Finding = Finding;
    var Severity;
    (function(Severity2) {
      Severity2[Severity2["HIGH"] = 10] = "HIGH";
      Severity2[Severity2["SYNTAX"] = 20] = "SYNTAX";
      Severity2[Severity2["MEDIUM"] = 30] = "MEDIUM";
      Severity2[Severity2["HIGH_MAYBE"] = 40] = "HIGH_MAYBE";
      Severity2[Severity2["STRICT_CSP"] = 45] = "STRICT_CSP";
      Severity2[Severity2["MEDIUM_MAYBE"] = 50] = "MEDIUM_MAYBE";
      Severity2[Severity2["INFO"] = 60] = "INFO";
      Severity2[Severity2["NONE"] = 100] = "NONE";
    })(Severity = exports2.Severity || (exports2.Severity = {}));
    var Type2;
    (function(Type3) {
      Type3[Type3["MISSING_SEMICOLON"] = 100] = "MISSING_SEMICOLON";
      Type3[Type3["UNKNOWN_DIRECTIVE"] = 101] = "UNKNOWN_DIRECTIVE";
      Type3[Type3["INVALID_KEYWORD"] = 102] = "INVALID_KEYWORD";
      Type3[Type3["NONCE_CHARSET"] = 106] = "NONCE_CHARSET";
      Type3[Type3["MISSING_DIRECTIVES"] = 300] = "MISSING_DIRECTIVES";
      Type3[Type3["SCRIPT_UNSAFE_INLINE"] = 301] = "SCRIPT_UNSAFE_INLINE";
      Type3[Type3["SCRIPT_UNSAFE_EVAL"] = 302] = "SCRIPT_UNSAFE_EVAL";
      Type3[Type3["PLAIN_URL_SCHEMES"] = 303] = "PLAIN_URL_SCHEMES";
      Type3[Type3["PLAIN_WILDCARD"] = 304] = "PLAIN_WILDCARD";
      Type3[Type3["SCRIPT_ALLOWLIST_BYPASS"] = 305] = "SCRIPT_ALLOWLIST_BYPASS";
      Type3[Type3["OBJECT_ALLOWLIST_BYPASS"] = 306] = "OBJECT_ALLOWLIST_BYPASS";
      Type3[Type3["NONCE_LENGTH"] = 307] = "NONCE_LENGTH";
      Type3[Type3["IP_SOURCE"] = 308] = "IP_SOURCE";
      Type3[Type3["DEPRECATED_DIRECTIVE"] = 309] = "DEPRECATED_DIRECTIVE";
      Type3[Type3["SRC_HTTP"] = 310] = "SRC_HTTP";
      Type3[Type3["SRC_NO_PROTOCOL"] = 311] = "SRC_NO_PROTOCOL";
      Type3[Type3["EXPERIMENTAL"] = 312] = "EXPERIMENTAL";
      Type3[Type3["WILDCARD_URL"] = 313] = "WILDCARD_URL";
      Type3[Type3["X_FRAME_OPTIONS_OBSOLETED"] = 314] = "X_FRAME_OPTIONS_OBSOLETED";
      Type3[Type3["STYLE_UNSAFE_INLINE"] = 315] = "STYLE_UNSAFE_INLINE";
      Type3[Type3["STATIC_NONCE"] = 316] = "STATIC_NONCE";
      Type3[Type3["SCRIPT_UNSAFE_HASHES"] = 317] = "SCRIPT_UNSAFE_HASHES";
      Type3[Type3["STRICT_DYNAMIC"] = 400] = "STRICT_DYNAMIC";
      Type3[Type3["STRICT_DYNAMIC_NOT_STANDALONE"] = 401] = "STRICT_DYNAMIC_NOT_STANDALONE";
      Type3[Type3["NONCE_HASH"] = 402] = "NONCE_HASH";
      Type3[Type3["UNSAFE_INLINE_FALLBACK"] = 403] = "UNSAFE_INLINE_FALLBACK";
      Type3[Type3["ALLOWLIST_FALLBACK"] = 404] = "ALLOWLIST_FALLBACK";
      Type3[Type3["IGNORED"] = 405] = "IGNORED";
      Type3[Type3["REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS"] = 500] = "REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS";
      Type3[Type3["REPORTING_DESTINATION_MISSING"] = 600] = "REPORTING_DESTINATION_MISSING";
      Type3[Type3["REPORT_TO_ONLY"] = 601] = "REPORT_TO_ONLY";
    })(Type2 = exports2.Type || (exports2.Type = {}));
  }
});

// node_modules/csp_evaluator/dist/csp.js
var require_csp = __commonJS({
  "node_modules/csp_evaluator/dist/csp.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.CspError = exports2.isHash = exports2.HASH_PATTERN = exports2.STRICT_HASH_PATTERN = exports2.isNonce = exports2.NONCE_PATTERN = exports2.STRICT_NONCE_PATTERN = exports2.isUrlScheme = exports2.isKeyword = exports2.isDirective = exports2.Version = exports2.FETCH_DIRECTIVES = exports2.Directive = exports2.TrustedTypesSink = exports2.Keyword = exports2.Csp = void 0;
    var finding_1 = require_finding();
    var Csp = class _Csp {
      static {
        __name(this, "Csp");
      }
      constructor(directives = {}) {
        this.directives = {};
        for (const [directive, directiveValues] of Object.entries(directives)) {
          if (directiveValues) {
            this.directives[directive] = [...directiveValues];
          }
        }
      }
      clone() {
        return new _Csp(this.directives);
      }
      convertToString() {
        let cspString = "";
        for (const [directive, directiveValues] of Object.entries(this.directives)) {
          cspString += directive;
          if (directiveValues !== void 0) {
            for (let value, i = 0; value = directiveValues[i]; i++) {
              cspString += " ";
              cspString += value;
            }
          }
          cspString += "; ";
        }
        return cspString;
      }
      getEffectiveCsp(cspVersion, optFindings) {
        const findings = optFindings || [];
        const effectiveCsp = this.clone();
        [Directive3.SCRIPT_SRC, Directive3.SCRIPT_SRC_ATTR, Directive3.SCRIPT_SRC_ELEM].forEach((directiveToNormalize) => {
          const directive = effectiveCsp.getEffectiveDirective(directiveToNormalize);
          const values = this.directives[directive] || [];
          const effectiveCspValues = effectiveCsp.directives[directive];
          if (effectiveCspValues && (effectiveCsp.policyHasScriptNonces(directive) || effectiveCsp.policyHasScriptHashes(directive))) {
            if (cspVersion >= Version.CSP2) {
              if (values.includes(Keyword.UNSAFE_INLINE)) {
                arrayRemove(effectiveCspValues, Keyword.UNSAFE_INLINE);
                findings.push(new finding_1.Finding(finding_1.Type.IGNORED, "unsafe-inline is ignored if a nonce or a hash is present. (CSP2 and above)", finding_1.Severity.NONE, directive, Keyword.UNSAFE_INLINE));
              }
            } else {
              for (const value of values) {
                if (value.startsWith("'nonce-") || value.startsWith("'sha")) {
                  arrayRemove(effectiveCspValues, value);
                }
              }
            }
          }
          if (effectiveCspValues && this.policyHasStrictDynamic(directive)) {
            if (cspVersion >= Version.CSP3) {
              for (const value of values) {
                if (!value.startsWith("'") || value === Keyword.SELF || value === Keyword.UNSAFE_INLINE) {
                  arrayRemove(effectiveCspValues, value);
                  findings.push(new finding_1.Finding(finding_1.Type.IGNORED, "Because of strict-dynamic this entry is ignored in CSP3 and above", finding_1.Severity.NONE, directive, value));
                }
              }
            } else {
              arrayRemove(effectiveCspValues, Keyword.STRICT_DYNAMIC);
            }
          }
        });
        if (cspVersion < Version.CSP3) {
          delete effectiveCsp.directives[Directive3.REPORT_TO];
          delete effectiveCsp.directives[Directive3.WORKER_SRC];
          delete effectiveCsp.directives[Directive3.MANIFEST_SRC];
          delete effectiveCsp.directives[Directive3.TRUSTED_TYPES];
          delete effectiveCsp.directives[Directive3.REQUIRE_TRUSTED_TYPES_FOR];
          delete effectiveCsp.directives[Directive3.SCRIPT_SRC_ATTR];
          delete effectiveCsp.directives[Directive3.SCRIPT_SRC_ELEM];
          delete effectiveCsp.directives[Directive3.STYLE_SRC_ATTR];
          delete effectiveCsp.directives[Directive3.STYLE_SRC_ELEM];
        }
        return effectiveCsp;
      }
      getEffectiveDirective(directive) {
        if (directive in this.directives) {
          return directive;
        }
        if ((directive === Directive3.SCRIPT_SRC_ATTR || directive === Directive3.SCRIPT_SRC_ELEM) && Directive3.SCRIPT_SRC in this.directives) {
          return Directive3.SCRIPT_SRC;
        }
        if ((directive === Directive3.STYLE_SRC_ATTR || directive === Directive3.STYLE_SRC_ELEM) && Directive3.STYLE_SRC in this.directives) {
          return Directive3.STYLE_SRC;
        }
        if (exports2.FETCH_DIRECTIVES.includes(directive)) {
          return Directive3.DEFAULT_SRC;
        }
        return directive;
      }
      getEffectiveDirectives(directives) {
        const effectiveDirectives = new Set(directives.map((val) => this.getEffectiveDirective(val)));
        return [...effectiveDirectives];
      }
      policyHasScriptNonces(directive) {
        const directiveName = this.getEffectiveDirective(directive || Directive3.SCRIPT_SRC);
        const values = this.directives[directiveName] || [];
        return values.some((val) => isNonce(val));
      }
      policyHasScriptHashes(directive) {
        const directiveName = this.getEffectiveDirective(directive || Directive3.SCRIPT_SRC);
        const values = this.directives[directiveName] || [];
        return values.some((val) => isHash(val));
      }
      policyHasStrictDynamic(directive) {
        const directiveName = this.getEffectiveDirective(directive || Directive3.SCRIPT_SRC);
        const values = this.directives[directiveName] || [];
        return values.includes(Keyword.STRICT_DYNAMIC);
      }
    };
    exports2.Csp = Csp;
    var Keyword;
    (function(Keyword2) {
      Keyword2["SELF"] = "'self'";
      Keyword2["NONE"] = "'none'";
      Keyword2["UNSAFE_INLINE"] = "'unsafe-inline'";
      Keyword2["UNSAFE_EVAL"] = "'unsafe-eval'";
      Keyword2["WASM_EVAL"] = "'wasm-eval'";
      Keyword2["WASM_UNSAFE_EVAL"] = "'wasm-unsafe-eval'";
      Keyword2["STRICT_DYNAMIC"] = "'strict-dynamic'";
      Keyword2["UNSAFE_HASHED_ATTRIBUTES"] = "'unsafe-hashed-attributes'";
      Keyword2["UNSAFE_HASHES"] = "'unsafe-hashes'";
      Keyword2["REPORT_SAMPLE"] = "'report-sample'";
      Keyword2["BLOCK"] = "'block'";
      Keyword2["ALLOW"] = "'allow'";
      Keyword2["INLINE_SPECULATION_RULES"] = "'inline-speculation-rules'";
    })(Keyword = exports2.Keyword || (exports2.Keyword = {}));
    var TrustedTypesSink;
    (function(TrustedTypesSink2) {
      TrustedTypesSink2["SCRIPT"] = "'script'";
    })(TrustedTypesSink = exports2.TrustedTypesSink || (exports2.TrustedTypesSink = {}));
    var Directive3;
    (function(Directive4) {
      Directive4["CHILD_SRC"] = "child-src";
      Directive4["CONNECT_SRC"] = "connect-src";
      Directive4["DEFAULT_SRC"] = "default-src";
      Directive4["FONT_SRC"] = "font-src";
      Directive4["FRAME_SRC"] = "frame-src";
      Directive4["IMG_SRC"] = "img-src";
      Directive4["MEDIA_SRC"] = "media-src";
      Directive4["OBJECT_SRC"] = "object-src";
      Directive4["SCRIPT_SRC"] = "script-src";
      Directive4["SCRIPT_SRC_ATTR"] = "script-src-attr";
      Directive4["SCRIPT_SRC_ELEM"] = "script-src-elem";
      Directive4["STYLE_SRC"] = "style-src";
      Directive4["STYLE_SRC_ATTR"] = "style-src-attr";
      Directive4["STYLE_SRC_ELEM"] = "style-src-elem";
      Directive4["PREFETCH_SRC"] = "prefetch-src";
      Directive4["MANIFEST_SRC"] = "manifest-src";
      Directive4["WORKER_SRC"] = "worker-src";
      Directive4["BASE_URI"] = "base-uri";
      Directive4["PLUGIN_TYPES"] = "plugin-types";
      Directive4["SANDBOX"] = "sandbox";
      Directive4["DISOWN_OPENER"] = "disown-opener";
      Directive4["FORM_ACTION"] = "form-action";
      Directive4["FRAME_ANCESTORS"] = "frame-ancestors";
      Directive4["NAVIGATE_TO"] = "navigate-to";
      Directive4["REPORT_TO"] = "report-to";
      Directive4["REPORT_URI"] = "report-uri";
      Directive4["BLOCK_ALL_MIXED_CONTENT"] = "block-all-mixed-content";
      Directive4["UPGRADE_INSECURE_REQUESTS"] = "upgrade-insecure-requests";
      Directive4["REFLECTED_XSS"] = "reflected-xss";
      Directive4["REFERRER"] = "referrer";
      Directive4["REQUIRE_SRI_FOR"] = "require-sri-for";
      Directive4["TRUSTED_TYPES"] = "trusted-types";
      Directive4["REQUIRE_TRUSTED_TYPES_FOR"] = "require-trusted-types-for";
      Directive4["WEBRTC"] = "webrtc";
    })(Directive3 = exports2.Directive || (exports2.Directive = {}));
    exports2.FETCH_DIRECTIVES = [
      Directive3.CHILD_SRC,
      Directive3.CONNECT_SRC,
      Directive3.DEFAULT_SRC,
      Directive3.FONT_SRC,
      Directive3.FRAME_SRC,
      Directive3.IMG_SRC,
      Directive3.MANIFEST_SRC,
      Directive3.MEDIA_SRC,
      Directive3.OBJECT_SRC,
      Directive3.SCRIPT_SRC,
      Directive3.SCRIPT_SRC_ATTR,
      Directive3.SCRIPT_SRC_ELEM,
      Directive3.STYLE_SRC,
      Directive3.STYLE_SRC_ATTR,
      Directive3.STYLE_SRC_ELEM,
      Directive3.WORKER_SRC
    ];
    var Version;
    (function(Version2) {
      Version2[Version2["CSP1"] = 1] = "CSP1";
      Version2[Version2["CSP2"] = 2] = "CSP2";
      Version2[Version2["CSP3"] = 3] = "CSP3";
    })(Version = exports2.Version || (exports2.Version = {}));
    function isDirective(directive) {
      return Object.values(Directive3).includes(directive);
    }
    __name(isDirective, "isDirective");
    exports2.isDirective = isDirective;
    function isKeyword(keyword) {
      return Object.values(Keyword).includes(keyword);
    }
    __name(isKeyword, "isKeyword");
    exports2.isKeyword = isKeyword;
    function isUrlScheme(urlScheme) {
      const pattern = new RegExp("^[a-zA-Z][+a-zA-Z0-9.-]*:$");
      return pattern.test(urlScheme);
    }
    __name(isUrlScheme, "isUrlScheme");
    exports2.isUrlScheme = isUrlScheme;
    exports2.STRICT_NONCE_PATTERN = new RegExp("^'nonce-[a-zA-Z0-9+/_-]+[=]{0,2}'$");
    exports2.NONCE_PATTERN = new RegExp("^'nonce-(.+)'$");
    function isNonce(nonce, strictCheck) {
      const pattern = strictCheck ? exports2.STRICT_NONCE_PATTERN : exports2.NONCE_PATTERN;
      return pattern.test(nonce);
    }
    __name(isNonce, "isNonce");
    exports2.isNonce = isNonce;
    exports2.STRICT_HASH_PATTERN = new RegExp("^'(sha256|sha384|sha512)-[a-zA-Z0-9+/]+[=]{0,2}'$");
    exports2.HASH_PATTERN = new RegExp("^'(sha256|sha384|sha512)-(.+)'$");
    function isHash(hash, strictCheck) {
      const pattern = strictCheck ? exports2.STRICT_HASH_PATTERN : exports2.HASH_PATTERN;
      return pattern.test(hash);
    }
    __name(isHash, "isHash");
    exports2.isHash = isHash;
    var CspError = class extends Error {
      static {
        __name(this, "CspError");
      }
      constructor(message) {
        super(message);
      }
    };
    exports2.CspError = CspError;
    function arrayRemove(arr, item) {
      if (arr.includes(item)) {
        const idx = arr.findIndex((elem) => item === elem);
        arr.splice(idx, 1);
      }
    }
    __name(arrayRemove, "arrayRemove");
  }
});

// node_modules/csp_evaluator/dist/checks/parser_checks.js
var require_parser_checks = __commonJS({
  "node_modules/csp_evaluator/dist/checks/parser_checks.js"(exports2) {
    "use strict";
    init_process_global();
    var __createBinding4 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      Object.defineProperty(o, k2, { enumerable: true, get: /* @__PURE__ */ __name(function() {
        return m[k];
      }, "get") });
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    }));
    var __setModuleDefault4 = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    });
    var __importStar4 = exports2 && exports2.__importStar || function(mod2) {
      if (mod2 && mod2.__esModule) return mod2;
      var result = {};
      if (mod2 != null) {
        for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding4(result, mod2, k);
      }
      __setModuleDefault4(result, mod2);
      return result;
    };
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.checkInvalidKeyword = exports2.checkMissingSemicolon = exports2.checkUnknownDirective = void 0;
    var csp = __importStar4(require_csp());
    var csp_1 = require_csp();
    var finding_1 = require_finding();
    function checkUnknownDirective(parsedCsp) {
      const findings = [];
      for (const directive of Object.keys(parsedCsp.directives)) {
        if (csp.isDirective(directive)) {
          continue;
        }
        if (directive.endsWith(":")) {
          findings.push(new finding_1.Finding(finding_1.Type.UNKNOWN_DIRECTIVE, "CSP directives don't end with a colon.", finding_1.Severity.SYNTAX, directive));
        } else {
          findings.push(new finding_1.Finding(finding_1.Type.UNKNOWN_DIRECTIVE, 'Directive "' + directive + '" is not a known CSP directive.', finding_1.Severity.SYNTAX, directive));
        }
      }
      return findings;
    }
    __name(checkUnknownDirective, "checkUnknownDirective");
    exports2.checkUnknownDirective = checkUnknownDirective;
    function checkMissingSemicolon(parsedCsp) {
      const findings = [];
      for (const [directive, directiveValues] of Object.entries(parsedCsp.directives)) {
        if (directiveValues === void 0) {
          continue;
        }
        for (const value of directiveValues) {
          if (csp.isDirective(value)) {
            findings.push(new finding_1.Finding(finding_1.Type.MISSING_SEMICOLON, 'Did you forget the semicolon? "' + value + '" seems to be a directive, not a value.', finding_1.Severity.SYNTAX, directive, value));
          }
        }
      }
      return findings;
    }
    __name(checkMissingSemicolon, "checkMissingSemicolon");
    exports2.checkMissingSemicolon = checkMissingSemicolon;
    function checkInvalidKeyword(parsedCsp) {
      const findings = [];
      const keywordsNoTicks = Object.values(csp_1.Keyword).map((k) => k.replace(/'/g, ""));
      for (const [directive, directiveValues] of Object.entries(parsedCsp.directives)) {
        if (directiveValues === void 0) {
          continue;
        }
        for (const value of directiveValues) {
          if (keywordsNoTicks.some((k) => k === value) || value.startsWith("nonce-") || value.match(/^(sha256|sha384|sha512)-/)) {
            findings.push(new finding_1.Finding(finding_1.Type.INVALID_KEYWORD, 'Did you forget to surround "' + value + '" with single-ticks?', finding_1.Severity.SYNTAX, directive, value));
            continue;
          }
          if (!value.startsWith("'")) {
            continue;
          }
          if (directive === csp.Directive.REQUIRE_TRUSTED_TYPES_FOR) {
            if (value === csp.TrustedTypesSink.SCRIPT) {
              continue;
            }
          } else if (directive === csp.Directive.TRUSTED_TYPES) {
            if (value === "'allow-duplicates'" || value === "'none'") {
              continue;
            }
          } else {
            if (csp.isKeyword(value) || csp.isHash(value) || csp.isNonce(value)) {
              continue;
            }
          }
          findings.push(new finding_1.Finding(finding_1.Type.INVALID_KEYWORD, value + " seems to be an invalid CSP keyword.", finding_1.Severity.SYNTAX, directive, value));
        }
      }
      return findings;
    }
    __name(checkInvalidKeyword, "checkInvalidKeyword");
    exports2.checkInvalidKeyword = checkInvalidKeyword;
  }
});

// node_modules/csp_evaluator/dist/allowlist_bypasses/angular.js
var require_angular2 = __commonJS({
  "node_modules/csp_evaluator/dist/allowlist_bypasses/angular.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.URLS = void 0;
    exports2.URLS = [
      "//gstatic.com/fsn/angular_js-bundle1.js",
      "//www.gstatic.com/fsn/angular_js-bundle1.js",
      "//www.googleadservices.com/pageadimg/imgad",
      "//yandex.st/angularjs/1.2.16/angular-cookies.min.js",
      "//yastatic.net/angularjs/1.2.23/angular.min.js",
      "//yuedust.yuedu.126.net/js/components/angular/angular.js",
      "//art.jobs.netease.com/script/angular.js",
      "//csu-c45.kxcdn.com/angular/angular.js",
      "//elysiumwebsite.s3.amazonaws.com/uploads/blog-media/rockstar/angular.min.js",
      "//inno.blob.core.windows.net/new/libs/AngularJS/1.2.1/angular.min.js",
      "//gift-talk.kakao.com/public/javascripts/angular.min.js",
      "//ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular-route.min.js",
      "//master-sumok.ru/vendors/angular/angular-cookies.js",
      "//ayicommon-a.akamaihd.net/static/vendor/angular-1.4.2.min.js",
      "//pangxiehaitao.com/framework/angular-1.3.9/angular-animate.min.js",
      "//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.16/angular.min.js",
      "//96fe3ee995e96e922b6b-d10c35bd0a0de2c718b252bc575fdb73.ssl.cf1.rackcdn.com/angular.js",
      "//oss.maxcdn.com/angularjs/1.2.20/angular.min.js",
      "//reports.zemanta.com/smedia/common/angularjs/1.2.11/angular.js",
      "//cdn.shopify.com/s/files/1/0225/6463/t/1/assets/angular-animate.min.js",
      "//parademanagement.com.s3-website-ap-southeast-1.amazonaws.com/js/angular.min.js",
      "//cdn.jsdelivr.net/angularjs/1.1.2/angular.min.js",
      "//eb2883ede55c53e09fd5-9c145fb03d93709ea57875d307e2d82e.ssl.cf3.rackcdn.com/components/angular-resource.min.js",
      "//andors-trail.googlecode.com/git/AndorsTrailEdit/lib/angular.min.js",
      "//cdn.walkme.com/General/EnvironmentTests/angular/angular.min.js",
      "//laundrymail.com/angular/angular.js",
      "//s3-eu-west-1.amazonaws.com/staticancpa/js/angular-cookies.min.js",
      "//collade.demo.stswp.com/js/vendor/angular.min.js",
      "//mrfishie.github.io/sailor/bower_components/angular/angular.min.js",
      "//askgithub.com/static/js/angular.min.js",
      "//services.amazon.com/solution-providers/assets/vendor/angular-cookies.min.js",
      "//raw.githubusercontent.com/angular/code.angularjs.org/master/1.0.7/angular-resource.js",
      "//prb-resume.appspot.com/bower_components/angular-animate/angular-animate.js",
      "//dl.dropboxusercontent.com/u/30877786/angular.min.js",
      "//static.tumblr.com/x5qdx0r/nPOnngtff/angular-resource.min_1_.js",
      "//storage.googleapis.com/assets-prod.urbansitter.net/us-sym/assets/vendor/angular-sanitize/angular-sanitize.min.js",
      "//twitter.github.io/labella.js/bower_components/angular/angular.min.js",
      "//cdn2-casinoroom.global.ssl.fastly.net/js/lib/angular-animate.min.js",
      "//www.adobe.com/devnet-apps/flashshowcase/lib/angular/angular.1.1.5.min.js",
      "//eternal-sunset.herokuapp.com/bower_components/angular/angular.js",
      "//cdn.bootcss.com/angular.js/1.2.0/angular.min.js"
    ];
  }
});

// node_modules/csp_evaluator/dist/allowlist_bypasses/flash.js
var require_flash = __commonJS({
  "node_modules/csp_evaluator/dist/allowlist_bypasses/flash.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.URLS = void 0;
    exports2.URLS = [
      "//vk.com/swf/video.swf",
      "//ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf"
    ];
  }
});

// node_modules/csp_evaluator/dist/allowlist_bypasses/jsonp.js
var require_jsonp = __commonJS({
  "node_modules/csp_evaluator/dist/allowlist_bypasses/jsonp.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.URLS = exports2.NEEDS_EVAL = void 0;
    exports2.NEEDS_EVAL = [
      "googletagmanager.com",
      "www.googletagmanager.com",
      "www.googleadservices.com",
      "google-analytics.com",
      "ssl.google-analytics.com",
      "www.google-analytics.com"
    ];
    exports2.URLS = [
      "//bebezoo.1688.com/fragment/index.htm",
      "//www.google-analytics.com/gtm/js",
      "//googleads.g.doubleclick.net/pagead/conversion/1036918760/wcm",
      "//www.googleadservices.com/pagead/conversion/1070110417/wcm",
      "//www.google.com/tools/feedback/escalation-options",
      "//pin.aliyun.com/check_audio",
      "//offer.alibaba.com/market/CID100002954/5/fetchKeyword.do",
      "//ccrprod.alipay.com/ccr/arriveTime.json",
      "//group.aliexpress.com/ajaxAcquireGroupbuyProduct.do",
      "//detector.alicdn.com/2.7.3/index.php",
      "//suggest.taobao.com/sug",
      "//translate.google.com/translate_a/l",
      "//count.tbcdn.cn//counter3",
      "//wb.amap.com/channel.php",
      "//translate.googleapis.com/translate_a/l",
      "//afpeng.alimama.com/ex",
      "//accounts.google.com/o/oauth2/revoke",
      "//pagead2.googlesyndication.com/relatedsearch",
      "//yandex.ru/soft/browsers/check",
      "//api.facebook.com/restserver.php",
      "//mts0.googleapis.com/maps/vt",
      "//syndication.twitter.com/widgets/timelines/765840589183213568",
      "//www.youtube.com/profile_style",
      "//googletagmanager.com/gtm/js",
      "//mc.yandex.ru/watch/24306916/1",
      "//share.yandex.net/counter/gpp/",
      "//ok.go.mail.ru/lady_on_lady_recipes_r.json",
      "//d1f69o4buvlrj5.cloudfront.net/__efa_15_1_ornpba.xekq.arg/optout_check",
      "//www.googletagmanager.com/gtm/js",
      "//api.vk.com/method/wall.get",
      "//www.sharethis.com/get-publisher-info.php",
      "//google.ru/maps/vt",
      "//pro.netrox.sc/oapi/h_checksite.ashx",
      "//vimeo.com/api/oembed.json/",
      "//de.blog.newrelic.com/wp-admin/admin-ajax.php",
      "//ajax.googleapis.com/ajax/services/search/news",
      "//ssl.google-analytics.com/gtm/js",
      "//pubsub.pubnub.com/subscribe/demo/hello_world/",
      "//pass.yandex.ua/services",
      "//id.rambler.ru/script/topline_info.js",
      "//m.addthis.com/live/red_lojson/100eng.json",
      "//passport.ngs.ru/ajax/check",
      "//catalog.api.2gis.ru/ads/search",
      "//gum.criteo.com/sync",
      "//maps.google.com/maps/vt",
      "//ynuf.alipay.com/service/um.json",
      "//securepubads.g.doubleclick.net/gampad/ads",
      "//c.tiles.mapbox.com/v3/texastribune.tx-congress-cvap/6/15/26.grid.json",
      "//rexchange.begun.ru/banners",
      "//an.yandex.ru/page/147484",
      "//links.services.disqus.com/api/ping",
      "//api.map.baidu.com/",
      "//tj.gongchang.com/api/keywordrecomm/",
      "//data.gongchang.com/livegrail/",
      "//ulogin.ru/token.php",
      "//beta.gismeteo.ru/api/informer/layout.js/120x240-3/ru/",
      "//maps.googleapis.com/maps/api/js/GeoPhotoService.GetMetadata",
      "//a.config.skype.com/config/v1/Skype/908_1.33.0.111/SkypePersonalization",
      "//maps.beeline.ru/w",
      "//target.ukr.net/",
      "//www.meteoprog.ua/data/weather/informer/Poltava.js",
      "//cdn.syndication.twimg.com/widgets/timelines/599200054310604802",
      "//wslocker.ru/client/user.chk.php",
      "//community.adobe.com/CommunityPod/getJSON",
      "//maps.google.lv/maps/vt",
      "//dev.virtualearth.net/REST/V1/Imagery/Metadata/AerialWithLabels/26.318581",
      "//awaps.yandex.ru/10/8938/02400400.",
      "//a248.e.akamai.net/h5.hulu.com/h5.mp4",
      "//nominatim.openstreetmap.org/",
      "//plugins.mozilla.org/en-us/plugins_list.json",
      "//h.cackle.me/widget/32153/bootstrap",
      "//graph.facebook.com/1/",
      "//fellowes.ugc.bazaarvoice.com/data/reviews.json",
      "//widgets.pinterest.com/v3/pidgets/boards/ciciwin/hedgehog-squirrel-crafts/pins/",
      "//se.wikipedia.org/w/api.php",
      "//cse.google.com/api/007627024705277327428/cse/r3vs7b0fcli/queries/js",
      "//relap.io/api/v2/similar_pages_jsonp.js",
      "//c1n3.hypercomments.com/stream/subscribe",
      "//maps.google.de/maps/vt",
      "//books.google.com/books",
      "//connect.mail.ru/share_count",
      "//tr.indeed.com/m/newjobs",
      "//www-onepick-opensocial.googleusercontent.com/gadgets/proxy",
      "//www.panoramio.com/map/get_panoramas.php",
      "//client.siteheart.com/streamcli/client",
      "//www.facebook.com/restserver.php",
      "//autocomplete.travelpayouts.com/avia",
      "//www.googleapis.com/freebase/v1/topic/m/0344_",
      "//mts1.googleapis.com/mapslt/ft",
      "//publish.twitter.com/oembed",
      "//fast.wistia.com/embed/medias/o75jtw7654.json",
      "//partner.googleadservices.com/gampad/ads",
      "//pass.yandex.ru/services",
      "//gupiao.baidu.com/stocks/stockbets",
      "//widget.admitad.com/widget/init",
      "//api.instagram.com/v1/tags/partykungen23328/media/recent",
      "//video.media.yql.yahoo.com/v1/video/sapi/streams/063fb76c-6c70-38c5-9bbc-04b7c384de2b",
      "//ib.adnxs.com/jpt",
      "//pass.yandex.com/services",
      "//www.google.de/maps/vt",
      "//clients1.google.com/complete/search",
      "//api.userlike.com/api/chat/slot/proactive/",
      "//www.youku.com/index_cookielist/s/jsonp",
      "//mt1.googleapis.com/mapslt/ft",
      "//api.mixpanel.com/track/",
      "//wpd.b.qq.com/cgi/get_sign.php",
      "//pipes.yahooapis.com/pipes/pipe.run",
      "//gdata.youtube.com/feeds/api/videos/WsJIHN1kNWc",
      "//9.chart.apis.google.com/chart",
      "//cdn.syndication.twitter.com/moments/709229296800440320",
      "//api.flickr.com/services/feeds/photos_friends.gne",
      "//cbks0.googleapis.com/cbk",
      "//www.blogger.com/feeds/5578653387562324002/posts/summary/4427562025302749269",
      "//query.yahooapis.com/v1/public/yql",
      "//kecngantang.blogspot.com/feeds/posts/default/-/Komik",
      "//www.travelpayouts.com/widgets/50f53ce9ada1b54bcc000031.json",
      "//i.cackle.me/widget/32586/bootstrap",
      "//translate.yandex.net/api/v1.5/tr.json/detect",
      "//a.tiles.mapbox.com/v3/zentralmedia.map-n2raeauc.jsonp",
      "//maps.google.ru/maps/vt",
      "//c1n2.hypercomments.com/stream/subscribe",
      "//rec.ydf.yandex.ru/cookie",
      "//cdn.jsdelivr.net"
    ];
  }
});

// node_modules/csp_evaluator/dist/utils.js
var require_utils = __commonJS({
  "node_modules/csp_evaluator/dist/utils.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.applyCheckFunktionToDirectives = exports2.matchWildcardUrls = exports2.getHostname = exports2.getSchemeFreeUrl = void 0;
    function getSchemeFreeUrl(url) {
      url = url.replace(/^\w[+\w.-]*:\/\//i, "");
      url = url.replace(/^\/\//, "");
      return url;
    }
    __name(getSchemeFreeUrl, "getSchemeFreeUrl");
    exports2.getSchemeFreeUrl = getSchemeFreeUrl;
    function getHostname(url) {
      const hostname = new URL("https://" + getSchemeFreeUrl(url).replace(":*", "").replace("*", "wildcard_placeholder")).hostname.replace("wildcard_placeholder", "*");
      const ipv6Regex = /^\[[\d:]+\]/;
      if (getSchemeFreeUrl(url).match(ipv6Regex) && !hostname.match(ipv6Regex)) {
        return "[" + hostname + "]";
      }
      return hostname;
    }
    __name(getHostname, "getHostname");
    exports2.getHostname = getHostname;
    function setScheme(u) {
      if (u.startsWith("//")) {
        return u.replace("//", "https://");
      }
      return u;
    }
    __name(setScheme, "setScheme");
    function matchWildcardUrls(cspUrlString, listOfUrlStrings) {
      const cspUrl = new URL(setScheme(cspUrlString.replace(":*", "").replace("*", "wildcard_placeholder")));
      const listOfUrls = listOfUrlStrings.map((u) => new URL(setScheme(u)));
      const host = cspUrl.hostname.toLowerCase();
      const hostHasWildcard = host.startsWith("wildcard_placeholder.");
      const wildcardFreeHost = host.replace(/^\wildcard_placeholder/i, "");
      const path7 = cspUrl.pathname;
      const hasPath = path7 !== "/";
      for (const url of listOfUrls) {
        const domain = url.hostname;
        if (!domain.endsWith(wildcardFreeHost)) {
          continue;
        }
        if (!hostHasWildcard && host !== domain) {
          continue;
        }
        if (hasPath) {
          if (path7.endsWith("/")) {
            if (!url.pathname.startsWith(path7)) {
              continue;
            }
          } else {
            if (url.pathname !== path7) {
              continue;
            }
          }
        }
        return url;
      }
      return null;
    }
    __name(matchWildcardUrls, "matchWildcardUrls");
    exports2.matchWildcardUrls = matchWildcardUrls;
    function applyCheckFunktionToDirectives(parsedCsp, check) {
      const directiveNames = Object.keys(parsedCsp.directives);
      for (const directive of directiveNames) {
        const directiveValues = parsedCsp.directives[directive];
        if (directiveValues) {
          check(directive, directiveValues);
        }
      }
    }
    __name(applyCheckFunktionToDirectives, "applyCheckFunktionToDirectives");
    exports2.applyCheckFunktionToDirectives = applyCheckFunktionToDirectives;
  }
});

// node_modules/csp_evaluator/dist/checks/security_checks.js
var require_security_checks = __commonJS({
  "node_modules/csp_evaluator/dist/checks/security_checks.js"(exports2) {
    "use strict";
    init_process_global();
    var __createBinding4 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      Object.defineProperty(o, k2, { enumerable: true, get: /* @__PURE__ */ __name(function() {
        return m[k];
      }, "get") });
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    }));
    var __setModuleDefault4 = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    });
    var __importStar4 = exports2 && exports2.__importStar || function(mod2) {
      if (mod2 && mod2.__esModule) return mod2;
      var result = {};
      if (mod2 != null) {
        for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding4(result, mod2, k);
      }
      __setModuleDefault4(result, mod2);
      return result;
    };
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.checkHasConfiguredReporting = exports2.checkSrcHttp = exports2.checkNonceLength = exports2.checkDeprecatedDirective = exports2.checkIpSource = exports2.looksLikeIpAddress = exports2.checkFlashObjectAllowlistBypass = exports2.checkScriptAllowlistBypass = exports2.checkMissingDirectives = exports2.checkMultipleMissingBaseUriDirective = exports2.checkMissingBaseUriDirective = exports2.checkMissingScriptSrcDirective = exports2.checkMissingObjectSrcDirective = exports2.checkWildcards = exports2.checkPlainUrlSchemes = exports2.checkScriptUnsafeEval = exports2.checkScriptUnsafeInline = exports2.URL_SCHEMES_CAUSING_XSS = exports2.DIRECTIVES_CAUSING_XSS = void 0;
    var angular = __importStar4(require_angular2());
    var flash = __importStar4(require_flash());
    var jsonp = __importStar4(require_jsonp());
    var csp = __importStar4(require_csp());
    var csp_1 = require_csp();
    var finding_1 = require_finding();
    var utils = __importStar4(require_utils());
    exports2.DIRECTIVES_CAUSING_XSS = [
      csp_1.Directive.SCRIPT_SRC,
      csp_1.Directive.SCRIPT_SRC_ATTR,
      csp_1.Directive.SCRIPT_SRC_ELEM,
      csp_1.Directive.OBJECT_SRC,
      csp_1.Directive.BASE_URI
    ];
    exports2.URL_SCHEMES_CAUSING_XSS = ["data:", "http:", "https:"];
    function checkScriptUnsafeInline(effectiveCsp) {
      const violations = [];
      const directivesToCheck = effectiveCsp.getEffectiveDirectives([
        csp_1.Directive.SCRIPT_SRC,
        csp_1.Directive.SCRIPT_SRC_ATTR,
        csp_1.Directive.SCRIPT_SRC_ELEM
      ]);
      for (const directive of directivesToCheck) {
        const values = effectiveCsp.directives[directive] || [];
        if (values.includes(csp_1.Keyword.UNSAFE_INLINE)) {
          violations.push(new finding_1.Finding(finding_1.Type.SCRIPT_UNSAFE_INLINE, `'unsafe-inline' allows the execution of unsafe in-page scripts and event handlers.`, finding_1.Severity.HIGH, directive, csp_1.Keyword.UNSAFE_INLINE));
        }
        if (values.includes(csp_1.Keyword.UNSAFE_HASHES)) {
          violations.push(new finding_1.Finding(finding_1.Type.SCRIPT_UNSAFE_HASHES, `'unsafe-hashes', while safer than 'unsafe-inline', allows the execution of unsafe in-page scripts and event handlers as long as their hashes appear in the CSP. Please refactor them to no longer use inline scripts if possible.`, finding_1.Severity.MEDIUM_MAYBE, directive, csp_1.Keyword.UNSAFE_HASHES));
        }
      }
      return violations;
    }
    __name(checkScriptUnsafeInline, "checkScriptUnsafeInline");
    exports2.checkScriptUnsafeInline = checkScriptUnsafeInline;
    function checkScriptUnsafeEval(parsedCsp) {
      const violations = [];
      const directivesToCheck = parsedCsp.getEffectiveDirectives([
        csp_1.Directive.SCRIPT_SRC,
        csp_1.Directive.SCRIPT_SRC_ATTR,
        csp_1.Directive.SCRIPT_SRC_ELEM
      ]);
      for (const directive of directivesToCheck) {
        const values = parsedCsp.directives[directive] || [];
        if (values.includes(csp_1.Keyword.UNSAFE_EVAL)) {
          violations.push(new finding_1.Finding(finding_1.Type.SCRIPT_UNSAFE_EVAL, `'unsafe-eval' allows the execution of code injected into DOM APIs such as eval().`, finding_1.Severity.MEDIUM_MAYBE, directive, csp_1.Keyword.UNSAFE_EVAL));
        }
      }
      return violations;
    }
    __name(checkScriptUnsafeEval, "checkScriptUnsafeEval");
    exports2.checkScriptUnsafeEval = checkScriptUnsafeEval;
    function checkPlainUrlSchemes(parsedCsp) {
      const violations = [];
      const directivesToCheck = parsedCsp.getEffectiveDirectives(exports2.DIRECTIVES_CAUSING_XSS);
      for (const directive of directivesToCheck) {
        const values = parsedCsp.directives[directive] || [];
        for (const value of values) {
          if (exports2.URL_SCHEMES_CAUSING_XSS.includes(value)) {
            violations.push(new finding_1.Finding(finding_1.Type.PLAIN_URL_SCHEMES, value + " URI in " + directive + " allows the execution of unsafe scripts.", finding_1.Severity.HIGH, directive, value));
          }
        }
      }
      return violations;
    }
    __name(checkPlainUrlSchemes, "checkPlainUrlSchemes");
    exports2.checkPlainUrlSchemes = checkPlainUrlSchemes;
    function checkWildcards(parsedCsp) {
      const violations = [];
      const directivesToCheck = parsedCsp.getEffectiveDirectives(exports2.DIRECTIVES_CAUSING_XSS);
      for (const directive of directivesToCheck) {
        const values = parsedCsp.directives[directive] || [];
        for (const value of values) {
          const url = utils.getSchemeFreeUrl(value);
          if (url === "*") {
            violations.push(new finding_1.Finding(finding_1.Type.PLAIN_WILDCARD, directive + ` should not allow '*' as source`, finding_1.Severity.HIGH, directive, value));
            continue;
          }
        }
      }
      return violations;
    }
    __name(checkWildcards, "checkWildcards");
    exports2.checkWildcards = checkWildcards;
    function checkMissingObjectSrcDirective(parsedCsp) {
      let objectRestrictions = [];
      if (csp_1.Directive.OBJECT_SRC in parsedCsp.directives) {
        objectRestrictions = parsedCsp.directives[csp_1.Directive.OBJECT_SRC];
      } else if (csp_1.Directive.DEFAULT_SRC in parsedCsp.directives) {
        objectRestrictions = parsedCsp.directives[csp_1.Directive.DEFAULT_SRC];
      }
      if (objectRestrictions !== void 0 && objectRestrictions.length >= 1) {
        return [];
      }
      return [new finding_1.Finding(finding_1.Type.MISSING_DIRECTIVES, `Missing object-src allows the injection of plugins which can execute JavaScript. Can you set it to 'none'?`, finding_1.Severity.HIGH, csp_1.Directive.OBJECT_SRC)];
    }
    __name(checkMissingObjectSrcDirective, "checkMissingObjectSrcDirective");
    exports2.checkMissingObjectSrcDirective = checkMissingObjectSrcDirective;
    function checkMissingScriptSrcDirective(parsedCsp) {
      if (csp_1.Directive.SCRIPT_SRC in parsedCsp.directives || csp_1.Directive.DEFAULT_SRC in parsedCsp.directives) {
        return [];
      }
      return [new finding_1.Finding(finding_1.Type.MISSING_DIRECTIVES, "script-src directive is missing.", finding_1.Severity.HIGH, csp_1.Directive.SCRIPT_SRC)];
    }
    __name(checkMissingScriptSrcDirective, "checkMissingScriptSrcDirective");
    exports2.checkMissingScriptSrcDirective = checkMissingScriptSrcDirective;
    function checkMissingBaseUriDirective(parsedCsp) {
      return checkMultipleMissingBaseUriDirective([parsedCsp]);
    }
    __name(checkMissingBaseUriDirective, "checkMissingBaseUriDirective");
    exports2.checkMissingBaseUriDirective = checkMissingBaseUriDirective;
    function checkMultipleMissingBaseUriDirective(parsedCsps) {
      const needsBaseUri = /* @__PURE__ */ __name((csp2) => csp2.policyHasScriptNonces() || csp2.policyHasScriptHashes() && csp2.policyHasStrictDynamic(), "needsBaseUri");
      const hasBaseUri = /* @__PURE__ */ __name((csp2) => csp_1.Directive.BASE_URI in csp2.directives, "hasBaseUri");
      if (parsedCsps.some(needsBaseUri) && !parsedCsps.some(hasBaseUri)) {
        const description = `Missing base-uri allows the injection of base tags. They can be used to set the base URL for all relative (script) URLs to an attacker controlled domain. Can you set it to 'none' or 'self'?`;
        return [new finding_1.Finding(finding_1.Type.MISSING_DIRECTIVES, description, finding_1.Severity.HIGH, csp_1.Directive.BASE_URI)];
      }
      return [];
    }
    __name(checkMultipleMissingBaseUriDirective, "checkMultipleMissingBaseUriDirective");
    exports2.checkMultipleMissingBaseUriDirective = checkMultipleMissingBaseUriDirective;
    function checkMissingDirectives(parsedCsp) {
      return [
        ...checkMissingObjectSrcDirective(parsedCsp),
        ...checkMissingScriptSrcDirective(parsedCsp),
        ...checkMissingBaseUriDirective(parsedCsp)
      ];
    }
    __name(checkMissingDirectives, "checkMissingDirectives");
    exports2.checkMissingDirectives = checkMissingDirectives;
    function checkScriptAllowlistBypass(parsedCsp) {
      const violations = [];
      parsedCsp.getEffectiveDirectives([csp_1.Directive.SCRIPT_SRC, csp_1.Directive.SCRIPT_SRC_ELEM]).forEach((effectiveScriptSrcDirective) => {
        const scriptSrcValues = parsedCsp.directives[effectiveScriptSrcDirective] || [];
        if (scriptSrcValues.includes(csp_1.Keyword.NONE)) {
          return;
        }
        for (const value of scriptSrcValues) {
          if (value === csp_1.Keyword.SELF) {
            violations.push(new finding_1.Finding(finding_1.Type.SCRIPT_ALLOWLIST_BYPASS, `'self' can be problematic if you host JSONP, AngularJS or user uploaded files.`, finding_1.Severity.MEDIUM_MAYBE, effectiveScriptSrcDirective, value));
            continue;
          }
          if (value.startsWith("'")) {
            continue;
          }
          if (csp.isUrlScheme(value) || value.indexOf(".") === -1) {
            continue;
          }
          const url = "//" + utils.getSchemeFreeUrl(value);
          const angularBypass = utils.matchWildcardUrls(url, angular.URLS);
          let jsonpBypass = utils.matchWildcardUrls(url, jsonp.URLS);
          if (jsonpBypass) {
            const evalRequired = jsonp.NEEDS_EVAL.includes(jsonpBypass.hostname);
            const evalPresent = scriptSrcValues.includes(csp_1.Keyword.UNSAFE_EVAL);
            if (evalRequired && !evalPresent) {
              jsonpBypass = null;
            }
          }
          if (jsonpBypass || angularBypass) {
            let bypassDomain = "";
            let bypassTxt = "";
            if (jsonpBypass) {
              bypassDomain = jsonpBypass.hostname;
              bypassTxt = " JSONP endpoints";
            }
            if (angularBypass) {
              bypassDomain = angularBypass.hostname;
              bypassTxt += bypassTxt.trim() === "" ? "" : " and";
              bypassTxt += " Angular libraries";
            }
            violations.push(new finding_1.Finding(finding_1.Type.SCRIPT_ALLOWLIST_BYPASS, bypassDomain + " is known to host" + bypassTxt + " which allow to bypass this CSP.", finding_1.Severity.HIGH, effectiveScriptSrcDirective, value));
          } else {
            violations.push(new finding_1.Finding(finding_1.Type.SCRIPT_ALLOWLIST_BYPASS, `No bypass found; make sure that this URL doesn't serve JSONP replies or Angular libraries.`, finding_1.Severity.MEDIUM_MAYBE, effectiveScriptSrcDirective, value));
          }
        }
      });
      return violations;
    }
    __name(checkScriptAllowlistBypass, "checkScriptAllowlistBypass");
    exports2.checkScriptAllowlistBypass = checkScriptAllowlistBypass;
    function checkFlashObjectAllowlistBypass(parsedCsp) {
      const violations = [];
      const effectiveObjectSrcDirective = parsedCsp.getEffectiveDirective(csp_1.Directive.OBJECT_SRC);
      const objectSrcValues = parsedCsp.directives[effectiveObjectSrcDirective] || [];
      const pluginTypes = parsedCsp.directives[csp_1.Directive.PLUGIN_TYPES];
      if (pluginTypes && !pluginTypes.includes("application/x-shockwave-flash")) {
        return [];
      }
      for (const value of objectSrcValues) {
        if (value === csp_1.Keyword.NONE) {
          return [];
        }
        const url = "//" + utils.getSchemeFreeUrl(value);
        const flashBypass = utils.matchWildcardUrls(url, flash.URLS);
        if (flashBypass) {
          violations.push(new finding_1.Finding(finding_1.Type.OBJECT_ALLOWLIST_BYPASS, flashBypass.hostname + " is known to host Flash files which allow to bypass this CSP.", finding_1.Severity.HIGH, effectiveObjectSrcDirective, value));
        } else if (effectiveObjectSrcDirective === csp_1.Directive.OBJECT_SRC) {
          violations.push(new finding_1.Finding(finding_1.Type.OBJECT_ALLOWLIST_BYPASS, `Can you restrict object-src to 'none' only?`, finding_1.Severity.MEDIUM_MAYBE, effectiveObjectSrcDirective, value));
        }
      }
      return violations;
    }
    __name(checkFlashObjectAllowlistBypass, "checkFlashObjectAllowlistBypass");
    exports2.checkFlashObjectAllowlistBypass = checkFlashObjectAllowlistBypass;
    function looksLikeIpAddress(maybeIp) {
      if (maybeIp.startsWith("[") && maybeIp.endsWith("]")) {
        return true;
      }
      if (/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/.test(maybeIp)) {
        return true;
      }
      return false;
    }
    __name(looksLikeIpAddress, "looksLikeIpAddress");
    exports2.looksLikeIpAddress = looksLikeIpAddress;
    function checkIpSource(parsedCsp) {
      const violations = [];
      const checkIp = /* @__PURE__ */ __name((directive, directiveValues) => {
        for (const value of directiveValues) {
          const host = utils.getHostname(value);
          if (looksLikeIpAddress(host)) {
            if (host === "127.0.0.1") {
              violations.push(new finding_1.Finding(finding_1.Type.IP_SOURCE, directive + " directive allows localhost as source. Please make sure to remove this in production environments.", finding_1.Severity.INFO, directive, value));
            } else {
              violations.push(new finding_1.Finding(finding_1.Type.IP_SOURCE, directive + " directive has an IP-Address as source: " + host + " (will be ignored by browsers!). ", finding_1.Severity.INFO, directive, value));
            }
          }
        }
      }, "checkIp");
      utils.applyCheckFunktionToDirectives(parsedCsp, checkIp);
      return violations;
    }
    __name(checkIpSource, "checkIpSource");
    exports2.checkIpSource = checkIpSource;
    function checkDeprecatedDirective(parsedCsp) {
      const violations = [];
      if (csp_1.Directive.REFLECTED_XSS in parsedCsp.directives) {
        violations.push(new finding_1.Finding(finding_1.Type.DEPRECATED_DIRECTIVE, "reflected-xss is deprecated since CSP2. Please, use the X-XSS-Protection header instead.", finding_1.Severity.INFO, csp_1.Directive.REFLECTED_XSS));
      }
      if (csp_1.Directive.REFERRER in parsedCsp.directives) {
        violations.push(new finding_1.Finding(finding_1.Type.DEPRECATED_DIRECTIVE, "referrer is deprecated since CSP2. Please, use the Referrer-Policy header instead.", finding_1.Severity.INFO, csp_1.Directive.REFERRER));
      }
      if (csp_1.Directive.DISOWN_OPENER in parsedCsp.directives) {
        violations.push(new finding_1.Finding(finding_1.Type.DEPRECATED_DIRECTIVE, "disown-opener is deprecated since CSP3. Please, use the Cross Origin Opener Policy header instead.", finding_1.Severity.INFO, csp_1.Directive.DISOWN_OPENER));
      }
      if (csp_1.Directive.PREFETCH_SRC in parsedCsp.directives) {
        violations.push(new finding_1.Finding(finding_1.Type.DEPRECATED_DIRECTIVE, "prefetch-src is deprecated since CSP3. Be aware that this feature may cease to work at any time.", finding_1.Severity.INFO, csp_1.Directive.PREFETCH_SRC));
      }
      return violations;
    }
    __name(checkDeprecatedDirective, "checkDeprecatedDirective");
    exports2.checkDeprecatedDirective = checkDeprecatedDirective;
    function checkNonceLength(parsedCsp) {
      const noncePattern = new RegExp("^'nonce-(.+)'$");
      const violations = [];
      utils.applyCheckFunktionToDirectives(parsedCsp, (directive, directiveValues) => {
        for (const value of directiveValues) {
          const match = value.match(noncePattern);
          if (!match) {
            continue;
          }
          const nonceValue = match[1];
          if (nonceValue.length < 8) {
            violations.push(new finding_1.Finding(finding_1.Type.NONCE_LENGTH, "Nonces should be at least 8 characters long.", finding_1.Severity.MEDIUM, directive, value));
          }
          if (!csp.isNonce(value, true)) {
            violations.push(new finding_1.Finding(finding_1.Type.NONCE_CHARSET, "Nonces should only use the base64 charset.", finding_1.Severity.INFO, directive, value));
          }
        }
      });
      return violations;
    }
    __name(checkNonceLength, "checkNonceLength");
    exports2.checkNonceLength = checkNonceLength;
    function checkSrcHttp(parsedCsp) {
      const violations = [];
      utils.applyCheckFunktionToDirectives(parsedCsp, (directive, directiveValues) => {
        for (const value of directiveValues) {
          const description = directive === csp_1.Directive.REPORT_URI ? "Use HTTPS to send violation reports securely." : "Allow only resources downloaded over HTTPS.";
          if (value.startsWith("http://")) {
            violations.push(new finding_1.Finding(finding_1.Type.SRC_HTTP, description, finding_1.Severity.MEDIUM, directive, value));
          }
        }
      });
      return violations;
    }
    __name(checkSrcHttp, "checkSrcHttp");
    exports2.checkSrcHttp = checkSrcHttp;
    function checkHasConfiguredReporting(parsedCsp) {
      const reportUriValues = parsedCsp.directives[csp_1.Directive.REPORT_URI] || [];
      if (reportUriValues.length > 0) {
        return [];
      }
      const reportToValues = parsedCsp.directives[csp_1.Directive.REPORT_TO] || [];
      if (reportToValues.length > 0) {
        return [new finding_1.Finding(finding_1.Type.REPORT_TO_ONLY, `This CSP policy only provides a reporting destination via the 'report-to' directive. This directive is only supported in Chromium-based browsers so it is recommended to also use a 'report-uri' directive.`, finding_1.Severity.INFO, csp_1.Directive.REPORT_TO)];
      }
      return [new finding_1.Finding(finding_1.Type.REPORTING_DESTINATION_MISSING, "This CSP policy does not configure a reporting destination. This makes it difficult to maintain the CSP policy over time and monitor for any breakages.", finding_1.Severity.INFO, csp_1.Directive.REPORT_URI)];
    }
    __name(checkHasConfiguredReporting, "checkHasConfiguredReporting");
    exports2.checkHasConfiguredReporting = checkHasConfiguredReporting;
  }
});

// node_modules/csp_evaluator/dist/checks/strictcsp_checks.js
var require_strictcsp_checks = __commonJS({
  "node_modules/csp_evaluator/dist/checks/strictcsp_checks.js"(exports2) {
    "use strict";
    init_process_global();
    var __createBinding4 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      Object.defineProperty(o, k2, { enumerable: true, get: /* @__PURE__ */ __name(function() {
        return m[k];
      }, "get") });
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    }));
    var __setModuleDefault4 = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    });
    var __importStar4 = exports2 && exports2.__importStar || function(mod2) {
      if (mod2 && mod2.__esModule) return mod2;
      var result = {};
      if (mod2 != null) {
        for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding4(result, mod2, k);
      }
      __setModuleDefault4(result, mod2);
      return result;
    };
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.checkRequiresTrustedTypesForScripts = exports2.checkAllowlistFallback = exports2.checkUnsafeInlineFallback = exports2.checkStrictDynamicNotStandalone = exports2.checkStrictDynamic = void 0;
    var csp = __importStar4(require_csp());
    var csp_1 = require_csp();
    var finding_1 = require_finding();
    function checkStrictDynamic(parsedCsp) {
      const directiveName = parsedCsp.getEffectiveDirective(csp.Directive.SCRIPT_SRC);
      const values = parsedCsp.directives[directiveName] || [];
      const schemeOrHostPresent = values.some((v) => !v.startsWith("'"));
      if (schemeOrHostPresent && !values.includes(csp_1.Keyword.STRICT_DYNAMIC)) {
        return [new finding_1.Finding(finding_1.Type.STRICT_DYNAMIC, "Host allowlists can frequently be bypassed. Consider using 'strict-dynamic' in combination with CSP nonces or hashes.", finding_1.Severity.STRICT_CSP, directiveName)];
      }
      return [];
    }
    __name(checkStrictDynamic, "checkStrictDynamic");
    exports2.checkStrictDynamic = checkStrictDynamic;
    function checkStrictDynamicNotStandalone(parsedCsp) {
      const directiveName = parsedCsp.getEffectiveDirective(csp.Directive.SCRIPT_SRC);
      const values = parsedCsp.directives[directiveName] || [];
      if (values.includes(csp_1.Keyword.STRICT_DYNAMIC) && (!parsedCsp.policyHasScriptNonces() && !parsedCsp.policyHasScriptHashes())) {
        return [new finding_1.Finding(finding_1.Type.STRICT_DYNAMIC_NOT_STANDALONE, "'strict-dynamic' without a CSP nonce/hash will block all scripts.", finding_1.Severity.INFO, directiveName)];
      }
      return [];
    }
    __name(checkStrictDynamicNotStandalone, "checkStrictDynamicNotStandalone");
    exports2.checkStrictDynamicNotStandalone = checkStrictDynamicNotStandalone;
    function checkUnsafeInlineFallback(parsedCsp) {
      if (!parsedCsp.policyHasScriptNonces() && !parsedCsp.policyHasScriptHashes()) {
        return [];
      }
      const directiveName = parsedCsp.getEffectiveDirective(csp.Directive.SCRIPT_SRC);
      const values = parsedCsp.directives[directiveName] || [];
      if (!values.includes(csp_1.Keyword.UNSAFE_INLINE)) {
        return [new finding_1.Finding(finding_1.Type.UNSAFE_INLINE_FALLBACK, "Consider adding 'unsafe-inline' (ignored by browsers supporting nonces/hashes) to be backward compatible with older browsers.", finding_1.Severity.STRICT_CSP, directiveName)];
      }
      return [];
    }
    __name(checkUnsafeInlineFallback, "checkUnsafeInlineFallback");
    exports2.checkUnsafeInlineFallback = checkUnsafeInlineFallback;
    function checkAllowlistFallback(parsedCsp) {
      const directiveName = parsedCsp.getEffectiveDirective(csp.Directive.SCRIPT_SRC);
      const values = parsedCsp.directives[directiveName] || [];
      if (!values.includes(csp_1.Keyword.STRICT_DYNAMIC)) {
        return [];
      }
      if (!values.some((v) => ["http:", "https:", "*"].includes(v) || v.includes("."))) {
        return [new finding_1.Finding(finding_1.Type.ALLOWLIST_FALLBACK, "Consider adding https: and http: url schemes (ignored by browsers supporting 'strict-dynamic') to be backward compatible with older browsers.", finding_1.Severity.STRICT_CSP, directiveName)];
      }
      return [];
    }
    __name(checkAllowlistFallback, "checkAllowlistFallback");
    exports2.checkAllowlistFallback = checkAllowlistFallback;
    function checkRequiresTrustedTypesForScripts(parsedCsp) {
      const directiveName = parsedCsp.getEffectiveDirective(csp.Directive.REQUIRE_TRUSTED_TYPES_FOR);
      const values = parsedCsp.directives[directiveName] || [];
      if (!values.includes(csp.TrustedTypesSink.SCRIPT)) {
        return [new finding_1.Finding(finding_1.Type.REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS, `Consider requiring Trusted Types for scripts to lock down DOM XSS injection sinks. You can do this by adding "require-trusted-types-for 'script'" to your policy.`, finding_1.Severity.INFO, csp.Directive.REQUIRE_TRUSTED_TYPES_FOR)];
      }
      return [];
    }
    __name(checkRequiresTrustedTypesForScripts, "checkRequiresTrustedTypesForScripts");
    exports2.checkRequiresTrustedTypesForScripts = checkRequiresTrustedTypesForScripts;
  }
});

// node_modules/csp_evaluator/dist/lighthouse/lighthouse_checks.js
var require_lighthouse_checks = __commonJS({
  "node_modules/csp_evaluator/dist/lighthouse/lighthouse_checks.js"(exports2) {
    "use strict";
    init_process_global();
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.evaluateForSyntaxErrors = exports2.evaluateForWarnings = exports2.evaluateForFailure = void 0;
    var parser_checks_1 = require_parser_checks();
    var security_checks_1 = require_security_checks();
    var strictcsp_checks_1 = require_strictcsp_checks();
    var csp_1 = require_csp();
    function arrayContains(arr, elem) {
      return arr.some((e) => e.equals(elem));
    }
    __name(arrayContains, "arrayContains");
    function setIntersection(sets) {
      const intersection = [];
      if (sets.length === 0) {
        return intersection;
      }
      const firstSet = sets[0];
      for (const elem of firstSet) {
        if (sets.every((set) => arrayContains(set, elem))) {
          intersection.push(elem);
        }
      }
      return intersection;
    }
    __name(setIntersection, "setIntersection");
    function setUnion(sets) {
      const union = [];
      for (const set of sets) {
        for (const elem of set) {
          if (!arrayContains(union, elem)) {
            union.push(elem);
          }
        }
      }
      return union;
    }
    __name(setUnion, "setUnion");
    function atLeastOnePasses(parsedCsps, checker) {
      const findings = [];
      for (const parsedCsp of parsedCsps) {
        findings.push(checker(parsedCsp));
      }
      return setIntersection(findings);
    }
    __name(atLeastOnePasses, "atLeastOnePasses");
    function atLeastOneFails(parsedCsps, checker) {
      const findings = [];
      for (const parsedCsp of parsedCsps) {
        findings.push(checker(parsedCsp));
      }
      return setUnion(findings);
    }
    __name(atLeastOneFails, "atLeastOneFails");
    function evaluateForFailure2(parsedCsps) {
      const targetsXssFindings = [
        ...atLeastOnePasses(parsedCsps, security_checks_1.checkMissingScriptSrcDirective),
        ...atLeastOnePasses(parsedCsps, security_checks_1.checkMissingObjectSrcDirective),
        ...security_checks_1.checkMultipleMissingBaseUriDirective(parsedCsps)
      ];
      const effectiveCsps = parsedCsps.map((csp) => csp.getEffectiveCsp(csp_1.Version.CSP3));
      const effectiveCspsWithScript = effectiveCsps.filter((csp) => {
        const directiveName = csp.getEffectiveDirective(csp_1.Directive.SCRIPT_SRC);
        return csp.directives[directiveName];
      });
      const robust = [
        ...atLeastOnePasses(effectiveCspsWithScript, strictcsp_checks_1.checkStrictDynamic),
        ...atLeastOnePasses(effectiveCspsWithScript, security_checks_1.checkScriptUnsafeInline),
        ...atLeastOnePasses(effectiveCsps, security_checks_1.checkWildcards),
        ...atLeastOnePasses(effectiveCsps, security_checks_1.checkPlainUrlSchemes)
      ];
      return [...targetsXssFindings, ...robust];
    }
    __name(evaluateForFailure2, "evaluateForFailure");
    exports2.evaluateForFailure = evaluateForFailure2;
    function evaluateForWarnings2(parsedCsps) {
      return [
        ...atLeastOneFails(parsedCsps, strictcsp_checks_1.checkUnsafeInlineFallback),
        ...atLeastOneFails(parsedCsps, strictcsp_checks_1.checkAllowlistFallback)
      ];
    }
    __name(evaluateForWarnings2, "evaluateForWarnings");
    exports2.evaluateForWarnings = evaluateForWarnings2;
    function evaluateForSyntaxErrors2(parsedCsps) {
      const allFindings = [];
      for (const csp of parsedCsps) {
        const findings = [
          ...security_checks_1.checkNonceLength(csp),
          ...parser_checks_1.checkUnknownDirective(csp),
          ...security_checks_1.checkDeprecatedDirective(csp),
          ...parser_checks_1.checkMissingSemicolon(csp),
          ...parser_checks_1.checkInvalidKeyword(csp)
        ];
        allFindings.push(findings);
      }
      return allFindings;
    }
    __name(evaluateForSyntaxErrors2, "evaluateForSyntaxErrors");
    exports2.evaluateForSyntaxErrors = evaluateForSyntaxErrors2;
  }
});

// node_modules/csp_evaluator/dist/parser.js
var require_parser2 = __commonJS({
  "node_modules/csp_evaluator/dist/parser.js"(exports2) {
    "use strict";
    init_process_global();
    var __createBinding4 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      Object.defineProperty(o, k2, { enumerable: true, get: /* @__PURE__ */ __name(function() {
        return m[k];
      }, "get") });
    }) : (function(o, m, k, k2) {
      if (k2 === void 0) k2 = k;
      o[k2] = m[k];
    }));
    var __setModuleDefault4 = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
      o["default"] = v;
    });
    var __importStar4 = exports2 && exports2.__importStar || function(mod2) {
      if (mod2 && mod2.__esModule) return mod2;
      var result = {};
      if (mod2 != null) {
        for (var k in mod2) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod2, k)) __createBinding4(result, mod2, k);
      }
      __setModuleDefault4(result, mod2);
      return result;
    };
    Object.defineProperty(exports2, "__esModule", { value: true });
    exports2.TEST_ONLY = exports2.CspParser = void 0;
    var csp = __importStar4(require_csp());
    var CspParser2 = class {
      static {
        __name(this, "CspParser");
      }
      constructor(unparsedCsp) {
        this.csp = new csp.Csp();
        this.parse(unparsedCsp);
      }
      parse(unparsedCsp) {
        this.csp = new csp.Csp();
        const directiveTokens = unparsedCsp.split(";");
        for (let i = 0; i < directiveTokens.length; i++) {
          const directiveToken = directiveTokens[i].trim();
          const directiveParts = directiveToken.match(/\S+/g);
          if (Array.isArray(directiveParts)) {
            const directiveName = directiveParts[0].toLowerCase();
            if (directiveName in this.csp.directives) {
              continue;
            }
            if (!csp.isDirective(directiveName)) {
            }
            const directiveValues = [];
            for (let directiveValue, j = 1; directiveValue = directiveParts[j]; j++) {
              directiveValue = normalizeDirectiveValue(directiveValue);
              if (!directiveValues.includes(directiveValue)) {
                directiveValues.push(directiveValue);
              }
            }
            this.csp.directives[directiveName] = directiveValues;
          }
        }
        return this.csp;
      }
    };
    exports2.CspParser = CspParser2;
    function normalizeDirectiveValue(directiveValue) {
      directiveValue = directiveValue.trim();
      const directiveValueLower = directiveValue.toLowerCase();
      if (csp.isKeyword(directiveValueLower) || csp.isUrlScheme(directiveValue)) {
        return directiveValueLower;
      }
      return directiveValue;
    }
    __name(normalizeDirectiveValue, "normalizeDirectiveValue");
    exports2.TEST_ONLY = { normalizeDirectiveValue };
  }
});

// core/lib/csp-evaluator.js
function getTranslatedDescription(finding) {
  let result = FINDING_TO_UI_STRING[finding.type];
  if (!result) {
    lighthouse_logger_default.warn("CSP Evaluator", `No translation found for description: ${finding.description}`);
    return finding.description;
  }
  if (isIcuMessage(result)) return result;
  if (typeof result === "string") return str_75(result, { keyword: finding.value || "" });
  result = result[finding.directive];
  if (!result) {
    lighthouse_logger_default.warn("CSP Evaluator", `No translation found for description: ${finding.description}`);
    return finding.description;
  }
  return result;
}
function parseCsp(rawCsp) {
  return new import_parser.CspParser(rawCsp).csp;
}
function evaluateRawCspsForXss(rawCsps) {
  const parsedCsps = rawCsps.map(parseCsp);
  const bypasses = (0, import_lighthouse_checks.evaluateForFailure)(parsedCsps);
  const warnings = (0, import_lighthouse_checks.evaluateForWarnings)(parsedCsps);
  const syntax = (0, import_lighthouse_checks.evaluateForSyntaxErrors)(parsedCsps);
  return { bypasses, warnings, syntax };
}
var import_lighthouse_checks, import_finding, import_parser, import_csp, UIStrings95, str_75, FINDING_TO_UI_STRING;
var init_csp_evaluator = __esm({
  "core/lib/csp-evaluator.js"() {
    "use strict";
    init_process_global();
    import_lighthouse_checks = __toESM(require_lighthouse_checks(), 1);
    import_finding = __toESM(require_finding(), 1);
    import_parser = __toESM(require_parser2(), 1);
    import_csp = __toESM(require_csp(), 1);
    init_lighthouse_logger();
    init_i18n();
    init_format();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings95 = {
      /** Message shown when a CSP does not have a base-uri directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "base-uri", "'none'", and "'self'" do not need to be translated. */
      missingBaseUri: "Missing `base-uri` allows injected `<base>` tags to set the base URL for all relative URLs (e.g. scripts) to an attacker controlled domain. Consider setting `base-uri` to `'none'` or `'self'`.",
      /** Message shown when a CSP does not have a script-src directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "script-src" does not need to be translated. */
      missingScriptSrc: "`script-src` directive is missing. This can allow the execution of unsafe scripts.",
      /** Message shown when a CSP does not have a script-src directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "object-src" and "'none'" do not need to be translated. */
      missingObjectSrc: "Missing `object-src` allows the injection of plugins that execute unsafe scripts. Consider setting `object-src` to `'none'` if you can.",
      /** Message shown when a CSP uses a domain allowlist to filter out malicious scripts. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "CSP", "'strict-dynamic'", "nonces", and "hashes" do not need to be translated. "allowlists" can be interpreted as "whitelist". */
      strictDynamic: "Host allowlists can frequently be bypassed. Consider using CSP nonces or hashes instead, along with `'strict-dynamic'` if necessary.",
      /** Message shown when a CSP allows inline scripts to be run in the page. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "CSP", "'unsafe-inline'", "nonces", and "hashes" do not need to be translated. */
      unsafeInline: "`'unsafe-inline'` allows the execution of unsafe in-page scripts and event handlers. Consider using CSP nonces or hashes to allow scripts individually.",
      /** Message shown when a CSP is not backwards compatible with browsers that do not support CSP nonces/hashes. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "'unsafe-inline'", "nonces", and "hashes" do not need to be translated. */
      unsafeInlineFallback: "Consider adding `'unsafe-inline'` (ignored by browsers supporting nonces/hashes) to be backward compatible with older browsers.",
      /** Message shown when a CSP is not backwards compatible with browsers that do not support the 'strict-dynamic' keyword. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "http:", "https:", and "'strict-dynamic'" do not need to be translated. */
      allowlistFallback: "Consider adding https: and http: URL schemes (ignored by browsers supporting `'strict-dynamic'`) to be backward compatible with older browsers.",
      /** Message shown when a CSP only provides a reporting destination through the report-to directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "report-to", "report-uri", and "Chromium" do not need to be translated. */
      reportToOnly: "The reporting destination is only configured via the report-to directive. This directive is only supported in Chromium-based browsers so it is recommended to also use a `report-uri` directive.",
      /** Message shown when a CSP does not provide a reporting destination. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "CSP" does not need to be translated. */
      reportingDestinationMissing: "No CSP configures a reporting destination. This makes it difficult to maintain the CSP over time and monitor for any breakages.",
      /** Message shown when a CSP nonce has less than 8 characters. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "Nonces" does not need to be translated. */
      nonceLength: "Nonces should be at least 8 characters long.",
      /** Message shown when a CSP nonce does not use teh base64 charset. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "Nonces" and "base84" do not need to be translated. "charset" can be interpreted as "a set of characters". */
      nonceCharset: "Nonces should use the base64 charset.",
      /**
       * @description Message shown when a CSP is missing a semicolon. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy".
       * @example {'object-src'} keyword
       */
      missingSemicolon: "Did you forget the semicolon? {keyword} seems to be a directive, not a keyword.",
      /** Message shown when a CSP contains an unknown keyword. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "CSP" does not need to be translated. */
      unknownDirective: "Unknown CSP directive.",
      /**
       * @description Message shown when a CSP contains an invalid keyword. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy".
       * @example {'invalid-keyword'} keyword
       */
      unknownKeyword: "{keyword} seems to be an invalid keyword.",
      /** Message shown when a CSP uses the deprecated reflected-xss directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "reflected-xss", "CSP2" and "X-XSS-Protection" do not need to be translated. */
      deprecatedReflectedXSS: "`reflected-xss` is deprecated since CSP2. Please, use the X-XSS-Protection header instead.",
      /** Message shown when a CSP uses the deprecated referrer directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "referrer", "CSP2" and "Referrer-Policy" do not need to be translated. */
      deprecatedReferrer: "`referrer` is deprecated since CSP2. Please, use the Referrer-Policy header instead.",
      /** Message shown when a CSP uses the deprecated disown-opener directive. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy". "disown-opener", "CSP3" and "Cross-Origin-Opener-Policy" do not need to be translated. */
      deprecatedDisownOpener: "`disown-opener` is deprecated since CSP3. Please, use the Cross-Origin-Opener-Policy header instead.",
      /**
       * @description Message shown when a CSP wildcard allows unsafe scripts to be run in the page. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy".
       *  @example {*} keyword
       */
      plainWildcards: "Avoid using plain wildcards ({keyword}) in this directive. Plain wildcards allow scripts to be sourced from an unsafe domain.",
      /**
       * @description Message shown when a CSP URL scheme allows unsafe scripts to be run in the page. Shown in a table with a list of other CSP vulnerabilities and suggestions. "CSP" stands for "Content Security Policy".
       *  @example {https:} keyword
       */
      plainUrlScheme: "Avoid using plain URL schemes ({keyword}) in this directive. Plain URL schemes allow scripts to be sourced from an unsafe domain."
    };
    str_75 = createIcuMessageFn({ url: "core/lib/csp-evaluator.js" }.url, UIStrings95);
    FINDING_TO_UI_STRING = {
      [import_finding.Type.MISSING_SEMICOLON]: UIStrings95.missingSemicolon,
      [import_finding.Type.UNKNOWN_DIRECTIVE]: str_75(UIStrings95.unknownDirective),
      [import_finding.Type.INVALID_KEYWORD]: UIStrings95.unknownKeyword,
      [import_finding.Type.MISSING_DIRECTIVES]: {
        [import_csp.Directive.BASE_URI]: str_75(UIStrings95.missingBaseUri),
        [import_csp.Directive.SCRIPT_SRC]: str_75(UIStrings95.missingScriptSrc),
        [import_csp.Directive.OBJECT_SRC]: str_75(UIStrings95.missingObjectSrc)
      },
      [import_finding.Type.SCRIPT_UNSAFE_INLINE]: str_75(UIStrings95.unsafeInline),
      [import_finding.Type.PLAIN_WILDCARD]: UIStrings95.plainWildcards,
      [import_finding.Type.PLAIN_URL_SCHEMES]: UIStrings95.plainUrlScheme,
      [import_finding.Type.NONCE_LENGTH]: str_75(UIStrings95.nonceLength),
      [import_finding.Type.NONCE_CHARSET]: str_75(UIStrings95.nonceCharset),
      [import_finding.Type.DEPRECATED_DIRECTIVE]: {
        [import_csp.Directive.REFLECTED_XSS]: str_75(UIStrings95.deprecatedReflectedXSS),
        [import_csp.Directive.REFERRER]: str_75(UIStrings95.deprecatedReferrer),
        [import_csp.Directive.DISOWN_OPENER]: str_75(UIStrings95.deprecatedDisownOpener)
      },
      [import_finding.Type.STRICT_DYNAMIC]: str_75(UIStrings95.strictDynamic),
      [import_finding.Type.UNSAFE_INLINE_FALLBACK]: str_75(UIStrings95.unsafeInlineFallback),
      [import_finding.Type.ALLOWLIST_FALLBACK]: str_75(UIStrings95.allowlistFallback),
      [import_finding.Type.REPORTING_DESTINATION_MISSING]: str_75(UIStrings95.reportingDestinationMissing),
      [import_finding.Type.REPORT_TO_ONLY]: str_75(UIStrings95.reportToOnly)
    };
    __name(getTranslatedDescription, "getTranslatedDescription");
    __name(parseCsp, "parseCsp");
    __name(evaluateRawCspsForXss, "evaluateRawCspsForXss");
  }
});

// core/audits/csp-xss.js
var csp_xss_exports = {};
__export(csp_xss_exports, {
  UIStrings: () => UIStrings96,
  default: () => csp_xss_default
});
var UIStrings96, str_76, CspXss, csp_xss_default;
var init_csp_xss = __esm({
  "core/audits/csp-xss.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_main_resource();
    init_i18n();
    init_csp_evaluator();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings96 = {
      /** Title of a Lighthouse audit that evaluates the security of a page's CSP. "CSP" stands for "Content Security Policy". "XSS" stands for "Cross Site Scripting". "CSP" and "XSS" do not need to be translated. */
      title: "Ensure CSP is effective against XSS attacks",
      /** Description of a Lighthouse audit that evaluates the security of a page's CSP. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. "CSP" stands for "Content Security Policy". "XSS" stands for "Cross Site Scripting". "CSP" and "XSS" do not need to be translated. */
      description: "A strong Content Security Policy (CSP) significantly reduces the risk of cross-site scripting (XSS) attacks. [Learn how to use a CSP to prevent XSS](https://developer.chrome.com/docs/lighthouse/best-practices/csp-xss/)",
      /** Summary text for the results of a Lighthouse audit that evaluates the security of a page's CSP. This is displayed if no CSP is being enforced. "CSP" stands for "Content Security Policy". "CSP" does not need to be translated. */
      noCsp: "No CSP found in enforcement mode",
      /** Message shown when one or more CSPs are defined in a <meta> tag. Shown in a table with a list of other CSP bypasses and warnings. "CSP" stands for "Content Security Policy". "CSP" and "HTTP" do not need to be translated. */
      metaTagMessage: "The page contains a CSP defined in a `<meta>` tag. Consider moving the CSP to an HTTP header or defining another strict CSP in an HTTP header.",
      /** Label for a column in a data table; entries will be a directive of a CSP. "CSP" stands for "Content Security Policy". */
      columnDirective: "Directive",
      /** Label for a column in a data table; entries will be the severity of an issue with the CSP. "CSP" stands for "Content Security Policy". */
      columnSeverity: "Severity",
      /** Table item value calling out the presence of a syntax error. */
      itemSeveritySyntax: "Syntax"
    };
    str_76 = createIcuMessageFn({ url: "core/audits/csp-xss.js" }.url, UIStrings96);
    CspXss = class extends Audit {
      static {
        __name(this, "CspXss");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "csp-xss",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_76(UIStrings96.title),
          description: str_76(UIStrings96.description),
          requiredArtifacts: ["DevtoolsLog", "MetaElements", "URL"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<{cspHeaders: string[], cspMetaTags: string[]}>}
       */
      static async getRawCsps(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        const cspMetaTags = artifacts.MetaElements.filter((m) => {
          return m.httpEquiv && m.httpEquiv.toLowerCase() === "content-security-policy";
        }).flatMap((m) => (m.content || "").split(",")).filter((rawCsp) => rawCsp.replace(/\s/g, ""));
        const cspHeaders = mainResource.responseHeaders.filter((h) => {
          return h.name.toLowerCase() === "content-security-policy";
        }).flatMap((h) => h.value.split(",")).filter((rawCsp) => rawCsp.replace(/\s/g, ""));
        return { cspHeaders, cspMetaTags };
      }
      /**
       * @param {Finding} finding
       * @param {LH.IcuMessage=} severity
       * @return {LH.Audit.Details.TableItem}
       */
      static findingToTableItem(finding, severity) {
        return {
          directive: finding.directive,
          description: getTranslatedDescription(finding),
          severity
        };
      }
      /**
       * @param {Finding[][]} syntaxFindings
       * @param {string[]} rawCsps
       * @return {LH.Audit.Details.TableItem[]}
       */
      static constructSyntaxResults(syntaxFindings, rawCsps) {
        const results = [];
        for (let i = 0; i < syntaxFindings.length; ++i) {
          const items = syntaxFindings[i].map((f) => this.findingToTableItem(f));
          if (!items.length) continue;
          results.push({
            severity: str_76(UIStrings96.itemSeveritySyntax),
            description: {
              type: "code",
              value: rawCsps[i]
            },
            subItems: {
              type: "subitems",
              items
            }
          });
        }
        return results;
      }
      /**
       * @param {string[]} cspHeaders
       * @param {string[]} cspMetaTags
       * @return {{score: number, results: LH.Audit.Details.TableItem[]}}
       */
      static constructResults(cspHeaders, cspMetaTags) {
        const rawCsps = [...cspHeaders, ...cspMetaTags];
        if (!rawCsps.length) {
          return {
            score: 0,
            results: [{
              severity: str_76(UIStrings.itemSeverityHigh),
              description: str_76(UIStrings96.noCsp),
              directive: void 0
            }]
          };
        }
        const { bypasses, warnings, syntax } = evaluateRawCspsForXss(rawCsps);
        const results = [
          ...this.constructSyntaxResults(syntax, rawCsps),
          ...bypasses.map((f) => this.findingToTableItem(f, str_76(UIStrings.itemSeverityHigh))),
          ...warnings.map((f) => this.findingToTableItem(f, str_76(UIStrings.itemSeverityMedium)))
        ];
        const headerOnlyBypasses = evaluateRawCspsForXss(cspHeaders).bypasses;
        const headerOnlyIsInsecure = headerOnlyBypasses.length > 0 || cspHeaders.length === 0;
        if (cspMetaTags.length > 0 && headerOnlyIsInsecure) {
          results.push({
            severity: str_76(UIStrings.itemSeverityMedium),
            description: str_76(UIStrings96.metaTagMessage),
            directive: void 0
          });
        }
        return { score: bypasses.length ? 0 : 1, results };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const { cspHeaders, cspMetaTags } = await this.getRawCsps(artifacts, context);
        const { score, results } = this.constructResults(cspHeaders, cspMetaTags);
        const headings = [
          /* eslint-disable max-len */
          { key: "description", valueType: "text", subItemsHeading: { key: "description" }, label: str_76(UIStrings.columnDescription) },
          { key: "directive", valueType: "code", subItemsHeading: { key: "directive" }, label: str_76(UIStrings96.columnDirective) },
          { key: "severity", valueType: "text", subItemsHeading: { key: "severity" }, label: str_76(UIStrings96.columnSeverity) }
          /* eslint-enable max-len */
        ];
        const details = Audit.makeTableDetails(headings, results);
        return {
          score,
          notApplicable: !results.length,
          details
        };
      }
    };
    csp_xss_default = CspXss;
  }
});

// core/computed/js-bundles.js
function computeGeneratedFileSizes2(map, contentLength, content) {
  const lines = content.split("\n");
  const files = {};
  const totalBytes = contentLength;
  let unmappedBytes = totalBytes;
  map.computeLastGeneratedColumns();
  for (const mapping of map.mappings()) {
    const source = mapping.sourceURL;
    const lineNum = mapping.lineNumber;
    const colNum = mapping.columnNumber;
    const lastColNum = mapping.lastColumnNumber;
    if (!source) continue;
    const line = lines[lineNum];
    if (line === null || line === void 0) {
      const errorMessage = `${map.url()} mapping for line out of bounds: ${lineNum + 1}`;
      lighthouse_logger_default.error("JSBundles", errorMessage);
      return { errorMessage };
    }
    if (colNum > line.length) {
      const errorMessage = `${map.url()} mapping for column out of bounds: ${lineNum + 1}:${colNum}`;
      lighthouse_logger_default.error("JSBundles", errorMessage);
      return { errorMessage };
    }
    let mappingLength = 0;
    if (lastColNum !== void 0) {
      if (lastColNum > line.length) {
        const errorMessage = `${map.url()} mapping for last column out of bounds: ${lineNum + 1}:${lastColNum}`;
        lighthouse_logger_default.error("JSBundles", errorMessage);
        return { errorMessage };
      }
      mappingLength = lastColNum - colNum;
    } else {
      mappingLength = line.length - colNum + 1;
    }
    files[source] = (files[source] || 0) + mappingLength;
    unmappedBytes -= mappingLength;
  }
  return {
    files,
    unmappedBytes,
    totalBytes
  };
}
var import_SDK2, JSBundles, JSBundlesComputed;
var init_js_bundles = __esm({
  "core/computed/js-bundles.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_computed_artifact();
    import_SDK2 = __toESM(require_SDK(), 1);
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(computeGeneratedFileSizes2, "computeGeneratedFileSizes");
    JSBundles = class {
      static {
        __name(this, "JSBundles");
      }
      /**
       * @param {Pick<LH.Artifacts, 'SourceMaps'|'Scripts'>} artifacts
       */
      static async compute_(artifacts) {
        const { SourceMaps: SourceMaps2, Scripts: Scripts2 } = artifacts;
        const bundles = [];
        for (const SourceMap of SourceMaps2) {
          if (!SourceMap.map) continue;
          const { scriptId, map: rawMap } = SourceMap;
          if (!rawMap.mappings) continue;
          const script = Scripts2.find((s) => s.scriptId === scriptId);
          if (!script) continue;
          const compiledUrl = SourceMap.scriptUrl || "compiled.js";
          const mapUrl = SourceMap.sourceMapUrl || "compiled.js.map";
          const map = new import_SDK2.default.SourceMap(compiledUrl, mapUrl, rawMap);
          const sizes = computeGeneratedFileSizes2(map, script.length || 0, script.content || "");
          const bundle = {
            rawMap,
            script,
            map,
            sizes
          };
          bundles.push(bundle);
        }
        return bundles;
      }
    };
    JSBundlesComputed = makeComputedArtifact(JSBundles, ["Scripts", "SourceMaps"]);
  }
});

// core/lib/deprecations-strings.js
var UIStrings97, DEPRECATIONS_METADATA;
var init_deprecations_strings = __esm({
  "core/lib/deprecations-strings.js"() {
    "use strict";
    init_process_global();
    UIStrings97 = {
      /**
       * @description This warning occurs when the website uses Attribution Reporting.
       */
      AttributionReporting: "Attribution Reporting is deprecated and will be removed. See https://goo.gle/ps-status for details.",
      /**
       * @description We show this warning when 1) an 'authorization' header is attached to the request by scripts, 2) there is no 'authorization' in the 'access-control-allow-headers' header in the response, and 3) there is a wildcard symbol ('*') in the 'access-control-allow-header' header in the response. This is allowed now, but we're planning to reject such responses and require responses to have an 'access-control-allow-headers' containing 'authorization'.
       */
      AuthorizationCoveredByWildcard: "Authorization will not be covered by the wildcard symbol (*) in CORS `Access-Control-Allow-Headers` handling.",
      /**
       * @description This warning occurs when a page attempts to request a resource whose URL contained both a newline character (`\n` or `\r`), and a less-than character (`<`). These resources are blocked.
       */
      CanRequestURLHTTPContainingNewline: "Resource requests whose URLs contained both removed whitespace `(n|r|t)` characters and less-than characters (`<`) are blocked. Please remove newlines and encode less-than characters from places like element attribute values in order to load these resources.",
      /**
       * @description This warning occurs when the website attempts to invoke the deprecated `chrome.loadTimes().connectionInfo` API.
       */
      ChromeLoadTimesConnectionInfo: "`chrome.loadTimes()` is deprecated, instead use standardized API: Navigation Timing 2.",
      /**
       * @description This warning occurs when the website attempts to invoke the deprecated `chrome.loadTimes().firstPaintAfterLoadTime` API.
       */
      ChromeLoadTimesFirstPaintAfterLoadTime: "`chrome.loadTimes()` is deprecated, instead use standardized API: Paint Timing.",
      /**
       * @description This warning occurs when the website attempts to invoke the deprecated `chrome.loadTimes().wasAlternateProtocolAvailable` API.
       */
      ChromeLoadTimesWasAlternateProtocolAvailable: "`chrome.loadTimes()` is deprecated, instead use standardized API: `nextHopProtocol` in Navigation Timing 2.",
      /**
       * @description This warning occurs when a frame accesses another frame's data after having set `document.domain` without having set the `Origin-Agent-Cluster` http header. This is a companion warning to `documentDomainSettingWithoutOriginAgentClusterHeader`, where that warning occurs when `document.domain` is set, and this warning occurs when an access has been made, based on that previous `document.domain` setting.
       */
      CrossOriginAccessBasedOnDocumentDomain: "Relaxing the same-origin policy by setting `document.domain` is deprecated, and will be disabled by default. This deprecation warning is for a cross-origin access that was enabled by setting `document.domain`.",
      /**
       * @description Issue text shown when the web page uses a deprecated web API. The window.alert is the deprecated web API function.
       */
      CrossOriginWindowAlert: "Triggering window.alert from cross origin iframes has been deprecated and will be removed in the future.",
      /**
       * @description Issue text shown when the web page uses a deprecated web API. The window.confirm is the deprecated web API function.
       */
      CrossOriginWindowConfirm: "Triggering window.confirm from cross origin iframes has been deprecated and will be removed in the future.",
      /**
       * @description Warning displayed to developers when they hide the Cast button on a video element using the deprecated CSS selector instead of using the disableRemotePlayback attribute on the element.
       */
      CSSSelectorInternalMediaControlsOverlayCastButton: "The `disableRemotePlayback` attribute should be used in order to disable the default Cast integration instead of using `-internal-media-controls-overlay-cast-button` selector.",
      /**
       * @description Warning displayed to developers to let them know the CSS appearance property value they used is not standard and will be removed.
       */
      CSSValueAppearanceSliderVertical: "CSS appearance value `slider-vertical` is not standardized and will be removed.",
      /**
       * @description Warning displayed to developers when a data: URL is assigned to SVGUseElement to let them know that the support is deprecated.
       */
      DataUrlInSvgUse: "Support for data: URLs in SVGUseElement is deprecated and it will be removed in the future.",
      /**
       * @description Warning displayed to developers when document.createEvent() is called with 'KeyboardEvents', which is a non-standard event interface that will be removed.
       */
      DocumentCreateEventKeyboardEvents: "document.createEvent('KeyboardEvents') is deprecated and will be removed. Use `new KeyboardEvent()` instead.",
      /**
       * @description Warning displayed to developers when document.createEvent() is called with 'TransitionEvent', which is a non-standard event interface that will be removed.
       */
      DocumentCreateEventTransitionEvent: "document.createEvent('TransitionEvent') is deprecated and will be removed. Use `new TransitionEvent()` instead.",
      /**
       * @description Translation is not needed, this will never be exposed in production code.
       */
      ExampleBrowserProcessDeprecation: "This is an example for showing the code required for a browser process reported deprecation.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when one of the Protected Audience APIs like `navigator.joinAdInterestGroup`, `navigator.getInterestGroupAdAuctionData` or `navigator.runAdAuction` are called.
       */
      Fledge: "The Protected Audience API is deprecated and will be removed in a future release.",
      /**
       * @description Warning displayed to developers when the Geolocation API is used from an insecure origin (one that isn't localhost or doesn't use HTTPS) to notify them that this use is no longer supported.
       */
      GeolocationInsecureOrigin: "`getCurrentPosition()` and `watchPosition()` no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins/ for more details.",
      /**
       * @description Warning displayed to developers when the Geolocation API is used from an insecure origin (one that isn't localhost or doesn't use HTTPS) to notify them that this use is deprecated.
       */
      GeolocationInsecureOriginDeprecatedNotRemoved: "`getCurrentPosition()` and `watchPosition()` are deprecated on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins/ for more details.",
      /**
       * @description This warning occurs when the `getUserMedia()` API is invoked on an insecure (e.g., HTTP) site. This is only permitted on secure sites (e.g., HTTPS).
       */
      GetUserMediaInsecureOrigin: "`getUserMedia()` no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins/ for more details.",
      /**
       * @description A deprecation warning shown to developers in the DevTools Issues tab when code tries to use the deprecated hostCandidate field, guiding developers to use the equivalent information in the .address and .port fields instead.
       */
      HostCandidateAttributeGetter: "`RTCPeerConnectionIceErrorEvent.hostCandidate` is deprecated. Please use `RTCPeerConnectionIceErrorEvent.address` or `RTCPeerConnectionIceErrorEvent.port` instead.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab, when a service worker reads one of the fields from an event named 'canmakepayment'.
       */
      IdentityInCanMakePaymentEvent: "The merchant origin and arbitrary data from the `canmakepayment` service worker event are deprecated and will be removed: `topOrigin`, `paymentRequestOrigin`, `methodData`, `modifiers`.",
      /**
       * @description This warning occurs when an insecure context (e.g., HTTP) requests a private resource (not on open internet). This is done to mitigate the potential for CSRF and other attacks.
       */
      InsecurePrivateNetworkSubresourceRequest: "The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them.",
      /**
       * @description This is a deprecated warning to developers that a field in a structure has been renamed.
       */
      InterestGroupDailyUpdateUrl: "The `dailyUpdateUrl` field of `InterestGroups` passed to `joinAdInterestGroup()` has been renamed to `updateUrl`, to more accurately reflect its behavior.",
      /**
       * @description Warning displayed to developers that instead of calling the `Intl.v8BreakIterator` constructor, which is not a standard JavaScript API, use ECMA402 standard API Intl.Segmenter shipped in end of 2020 instead.
       */
      IntlV8BreakIterator: "`Intl.v8BreakIterator` is deprecated. Please use `Intl.Segmenter` instead.",
      /**
       * @description Warning for using deprecated 'inputQuota' attribute.
       */
      LanguageModel_InputQuota: "LanguageModel.inputQuota is deprecated. Please use LanguageModel.contextWindow instead. This alias is only available in extensions.",
      /**
       * @description Warning for using deprecated 'inputUsage' attribute.
       */
      LanguageModel_InputUsage: "LanguageModel.inputUsage is deprecated. Please use LanguageModel.contextUsage instead. This alias is only available in extensions.",
      /**
       * @description Warning for using deprecated 'measureInputUsage' method.
       */
      LanguageModel_MeasureInputUsage: "LanguageModel.measureInputUsage() is deprecated. Please use LanguageModel.measureContextUsage() instead. This alias is only available in extensions.",
      /**
       * @description Warning for using deprecated 'onquotaoverflow' event handler.
       */
      LanguageModel_OnQuotaOverflow: "LanguageModel.onquotaoverflow is deprecated. Please use LanguageModel.oncontextoverflow instead. The LanguageModel.onquotaoverflow alias is only available in extensions.",
      /**
       * @description Warning message for web developers when they call the deprecated LanguageModel.params() method.
       */
      LanguageModelParams: "LanguageModel.params() is deprecated and now only available in extension contexts. The topK and temperature related fields within its result are also deprecated.",
      /**
       * @description Warning message for web developers when they use the deprecated 'temperature' option in LanguageModel.create() or access the .temperature attribute.
       */
      LanguageModelTemperature: "The 'temperature' parameter/attribute for LanguageModel is deprecated. It is only functional within extensions and may be removed in the future.",
      /**
       * @description Warning message for web developers when they use the deprecated 'topK' option in LanguageModel.create() or access the .topK attribute.
       */
      LanguageModelTopK: "The 'topK' parameter/attribute for LanguageModel is deprecated. It is only functional within extensions and may be removed in the future.",
      /**
       * @description This warning occurs when a stylesheet loaded from a local file directive does not end in the file type `.css`.
       */
      LocalCSSFileExtensionRejected: "CSS cannot be loaded from `file:` URLs unless they end in a `.css` file extension.",
      /**
       * @description This warning occurs when the browser requests Web MIDI access as sysex (system exclusive messages) can be allowed via prompt even if the browser did not specifically request it.
       */
      NoSysexWebMIDIWithoutPermission: "Web MIDI will ask a permission to use even if the sysex is not specified in the `MIDIOptions`.",
      /**
       * @description Warning displayed to developers when the Notification API is used from an insecure origin (one that isn't localhost or doesn't use HTTPS) to notify them that this use is no longer supported.
       */
      NotificationInsecureOrigin: "The Notification API may no longer be used from insecure origins. You should consider switching your application to a secure origin, such as HTTPS. See https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins/ for more details.",
      /**
       * @description Warning displayed to developers when permission to use notifications has been requested by a cross-origin iframe, to notify them that this use is no longer supported.
       */
      NotificationPermissionRequestedIframe: "Permission for the Notification API may no longer be requested from a cross-origin iframe. You should consider requesting permission from a top-level frame or opening a new window instead.",
      /**
       * @description Warning displayed to developers when CreateImageBitmap is used with the newly deprecated option imageOrientation: 'none'.
       */
      ObsoleteCreateImageBitmapImageOrientationNone: "Option `imageOrientation: 'none'` in createImageBitmap is deprecated. Please use createImageBitmap with option '\\{imageOrientation: 'from-image'\\}' instead.",
      /**
       * @description This warning occurs when the WebRTC protocol attempts to negotiate a connection using an obsolete cipher and risks connection security.
       */
      ObsoleteWebRtcCipherSuite: "Your partner is negotiating an obsolete (D)TLS version. Please check with your partner to have this fixed.",
      /**
       * @description Warning displayed to developers that use overflow:visible for replaced elements. This declaration was earlier ignored but will now change the element's painting based on whether the overflow value allows the element to paint outside its bounds.
       */
      OverflowVisibleOnReplacedElement: "Specifying `overflow: visible` on img, video and canvas tags may cause them to produce visual content outside of the element bounds. See https://github.com/WICG/shared-element-transitions/blob/main/debugging_overflow_on_images.md.",
      /**
       * @description Warning displayed to developers when they use a Flash Embed URLS to let them know that the browser will not automatically link to their equivalent HTML5 link.
       */
      OverrideFlashEmbedwithHTML: "Legacy flash video embed has been rewritten to HTML iframe. Flash is long gone, this rewriting hack is deprecated and may be removed in the future.",
      /**
       * @description Warning displayed to developers when they use the PaymentInstruments API to let them know this API is deprecated.
       */
      PaymentInstruments: "`paymentManager.instruments` is deprecated. Please use just-in-time install for payment handlers instead.",
      /**
       * @description Warning displayed to developers when their Web Payment API usage violates their Content-Security-Policy (CSP) connect-src directive to let them know this CSP bypass has been deprecated.
       */
      PaymentRequestCSPViolation: "Your `PaymentRequest` call bypassed Content-Security-Policy (CSP) `connect-src` directive. This bypass is deprecated. Please add the payment method identifier from the `PaymentRequest` API (in `supportedMethods` field) to your CSP `connect-src` directive.",
      /**
       * @description Warning displayed to developers when persistent storage type is used to notify that storage type is deprecated.
       */
      PersistentQuotaType: "`StorageType.persistent` is deprecated. Please use standardized `navigator.storage` instead.",
      /**
       * @description This issue indicates that a `<source>` element with a `<picture>` parent was using an `src` attribute, which is not valid and is ignored by the browser. The `srcset` attribute should be used instead.
       */
      PictureSourceSrc: "`<source src>` with a `<picture>` parent is invalid and therefore ignored. Please use `<source srcset>` instead.",
      /**
       * @description Warning displayed to developers when the vendor-prefixed method (webkitCancelAnimationFrame) is used rather than the equivalent unprefixed method (cancelAnimationFrame).
       */
      PrefixedCancelAnimationFrame: "webkitCancelAnimationFrame is vendor-specific. Please use the standard cancelAnimationFrame instead.",
      /**
       * @description Warning displayed to developers when the vendor-prefixed method (webkitRequestAnimationFrame) is used rather than the equivalent unprefixed method (requestAnimationFrame).
       */
      PrefixedRequestAnimationFrame: "webkitRequestAnimationFrame is vendor-specific. Please use the standard requestAnimationFrame instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      PrefixedVideoDisplayingFullscreen: "HTMLVideoElement.webkitDisplayingFullscreen is deprecated. Please use Document.fullscreenElement instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      PrefixedVideoEnterFullScreen: "HTMLVideoElement.webkitEnterFullScreen() is deprecated. Please use Element.requestFullscreen() instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      PrefixedVideoEnterFullscreen: "HTMLVideoElement.webkitEnterFullscreen() is deprecated. Please use Element.requestFullscreen() instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      PrefixedVideoExitFullScreen: "HTMLVideoElement.webkitExitFullScreen() is deprecated. Please use Document.exitFullscreen() instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      PrefixedVideoExitFullscreen: "HTMLVideoElement.webkitExitFullscreen() is deprecated. Please use Document.exitFullscreen() instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      PrefixedVideoSupportsFullscreen: "HTMLVideoElement.webkitSupportsFullscreen is deprecated. Please use Document.fullscreenEnabled instead.",
      /**
       * @description Standard message when one web API is deprecated in favor of another.
       */
      RangeExpand: "Range.expand() is deprecated. Please use Selection.modify() instead.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when the Storage Access API is automatically granted by Related Website Sets. The placeholder will always be the string `Related Website Sets`.
       */
      RelatedWebsiteSets: "`Related Website Sets` is deprecated and will be removed. See https://privacysandbox.com/news/update-on-plans-for-privacy-sandbox-technologies/ for more details.",
      /**
       * @description This warning occurs when a subresource loaded by a page has a URL with an authority portion. These are disallowed.
       */
      RequestedSubresourceWithEmbeddedCredentials: "Subresource requests whose URLs contain embedded credentials (e.g. `https://user:pass@host/`) are blocked.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when a video conferencing website attempts to use a non-standard crypto method when performing a handshake to set up a connection with another endpoint.
       */
      RTCConstraintEnableDtlsSrtpFalse: "The constraint `DtlsSrtpKeyAgreement` is removed. You have specified a `false` value for this constraint, which is interpreted as an attempt to use the removed `SDES key negotiation` method. This functionality is removed; use a service that supports `DTLS key negotiation` instead.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when a video conferencing website uses a non-standard API for controlling the crypto method used, but is not having an effect because the desired behavior is already enabled-by-default.
       */
      RTCConstraintEnableDtlsSrtpTrue: "The constraint `DtlsSrtpKeyAgreement` is removed. You have specified a `true` value for this constraint, which had no effect, but you can remove this constraint for tidiness.",
      /**
       * @description WebRTC is set of JavaScript APIs for sending and receiving data, audio and video. getStats() is a method used to obtain network and quality metrics. There are two versions of this method, one is being deprecated because it is non-standard.
       */
      RTCPeerConnectionGetStatsLegacyNonCompliant: "The callback-based getStats() is deprecated and will be removed. Use the spec-compliant getStats() instead.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown then a video conferencing website attempts to use the `RTCP MUX` policy.
       */
      RtcpMuxPolicyNegotiate: "The `rtcpMuxPolicy` option is deprecated and will be removed.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. The placeholder is always the noun 'SharedArrayBuffer' which refers to a JavaScript construct.
       */
      SharedArrayBufferConstructedWithoutIsolation: "`SharedArrayBuffer` will require cross-origin isolation. See https://developer.chrome.com/blog/enabling-shared-array-buffer/ for more details.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when one of the Shared Storage APIs like `sharedStorage.set()`, `sharedStorage.worklet.addModule()`, `sharedStorage.selectURL()`, etc., along with `<img sharedstoragewritable>`, `<iframe sharedstoragewritable>`, or `fetch(url, {sharedStorageWritable: true})` are used.
       */
      SharedStorage: "The Shared Storage API is deprecated and will be removed in a future release.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when the `document.requestStorageAccessFor` API is called. The placeholder will always be the string `document.requestStorageAccessFor`.
       */
      StorageAccessAPI_requestStorageAccessFor_Method: "`document.requestStorageAccessFor` is deprecated and will be removed. See https://privacysandbox.com/news/update-on-plans-for-privacy-sandbox-technologies/ for more details.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when the speech synthesis API is called before the page receives a user activation.
       */
      TextToSpeech_DisallowedByAutoplay: "`speechSynthesis.speak()` without user activation is deprecated and will be removed.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when one of the Topics APIs like `document.browsingTopics()`, `<img browsingtopics>`, `<iframe browsingtopics>`, or `fetch(url, {browsingTopics: true})` are used.
       */
      Topics: "The Topics API is deprecated and will be removed in a future release.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. It's shown when a listener for the `unload` event is added.
       */
      UnloadHandler: "Unload event listeners are deprecated and will be removed.",
      /**
       * @description A deprecation warning shown in the DevTools Issues tab. The placeholder is always the noun 'SharedArrayBuffer' which refers to a JavaScript construct. 'Extensions' refers to Chrome extensions. The warning is shown when Chrome Extensions attempt to use 'SharedArrayBuffer's under insecure circumstances.
       */
      V8SharedArrayBufferConstructedInExtensionWithoutIsolation: "Extensions should opt into cross-origin isolation to continue using `SharedArrayBuffer`. See https://developer.chrome.com/docs/extensions/mv3/cross-origin-isolation/.",
      /**
       * @description This warning occurs when the deprecated `BluetoothRemoteGATTCharacteristic.writeValue()` method is used. Developers should use `writeValueWithResponse()` or `writeValueWithoutResponse()` instead.
       */
      WebBluetoothRemoteCharacteristicWriteValue: "`BluetoothRemoteGATTCharacteristic.writeValue()` is deprecated. Use `writeValueWithResponse()` or `writeValueWithoutResponse()` instead.",
      /**
       * @description Warning displayed to developers that they are using `XMLHttpRequest` API in a way that they expect an unsupported character encoding `UTF-16` could be used in the server reply.
       */
      XHRJSONEncodingDetection: "UTF-16 is not supported by response json in `XMLHttpRequest`",
      /**
       * @description Warning displayed to developers. It is shown when the `XMLHttpRequest` API is used in a way that it slows down the page load of the next page. The `main thread` refers to an operating systems thread used to run most of the processing of HTML documents, so please use a consistent wording.
       */
      XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload: "Synchronous `XMLHttpRequest` on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.",
      /**
       * @description Warning displayed to developers that they are using either the XSLTProcessor API, or XSLT processing instructions, both of which have been deprecated and are scheduled to be removed.
       */
      XSLT: "XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon."
    };
    DEPRECATIONS_METADATA = {
      "AttributionReporting": {
        "chromeStatusFeature": 6320639375966208
      },
      "AuthorizationCoveredByWildcard": {
        "milestone": 97
      },
      "CSSSelectorInternalMediaControlsOverlayCastButton": {
        "chromeStatusFeature": 5714245488476160
      },
      "CSSValueAppearanceSliderVertical": {
        "chromeStatusFeature": 6001359429566464
      },
      "CanRequestURLHTTPContainingNewline": {
        "chromeStatusFeature": 5735596811091968
      },
      "ChromeLoadTimesConnectionInfo": {
        "chromeStatusFeature": 5637885046816768
      },
      "ChromeLoadTimesFirstPaintAfterLoadTime": {
        "chromeStatusFeature": 5637885046816768
      },
      "ChromeLoadTimesWasAlternateProtocolAvailable": {
        "chromeStatusFeature": 5637885046816768
      },
      "CrossOriginAccessBasedOnDocumentDomain": {
        "milestone": 115
      },
      "DataUrlInSvgUse": {
        "chromeStatusFeature": 5128825141198848,
        "milestone": 119
      },
      "DocumentCreateEventKeyboardEvents": {
        "chromeStatusFeature": 5095987863486464,
        "milestone": 151
      },
      "DocumentCreateEventTransitionEvent": {
        "chromeStatusFeature": 5095987863486464,
        "milestone": 151
      },
      "IdentityInCanMakePaymentEvent": {
        "chromeStatusFeature": 5190978431352832
      },
      "InsecurePrivateNetworkSubresourceRequest": {
        "chromeStatusFeature": 5436853517811712,
        "milestone": 92
      },
      "LanguageModelParams": {
        "chromeStatusFeature": 5134603979063296
      },
      "LanguageModelTemperature": {
        "chromeStatusFeature": 5134603979063296
      },
      "LanguageModelTopK": {
        "chromeStatusFeature": 5134603979063296
      },
      "LanguageModel_InputQuota": {
        "chromeStatusFeature": 5134603979063296
      },
      "LanguageModel_InputUsage": {
        "chromeStatusFeature": 5134603979063296
      },
      "LanguageModel_MeasureInputUsage": {
        "chromeStatusFeature": 5134603979063296
      },
      "LanguageModel_OnQuotaOverflow": {
        "chromeStatusFeature": 5134603979063296
      },
      "LocalCSSFileExtensionRejected": {
        "milestone": 64
      },
      "NoSysexWebMIDIWithoutPermission": {
        "chromeStatusFeature": 5138066234671104,
        "milestone": 82
      },
      "NotificationPermissionRequestedIframe": {
        "chromeStatusFeature": 6451284559265792
      },
      "ObsoleteCreateImageBitmapImageOrientationNone": {
        "milestone": 111
      },
      "ObsoleteWebRtcCipherSuite": {
        "milestone": 81
      },
      "OverflowVisibleOnReplacedElement": {
        "chromeStatusFeature": 5137515594383360,
        "milestone": 108
      },
      "OverrideFlashEmbedwithHTML": {
        "milestone": 140
      },
      "PaymentInstruments": {
        "chromeStatusFeature": 5099285054488576
      },
      "PaymentRequestCSPViolation": {
        "chromeStatusFeature": 6286595631087616
      },
      "PersistentQuotaType": {
        "chromeStatusFeature": 5176235376246784,
        "milestone": 106
      },
      "RTCConstraintEnableDtlsSrtpFalse": {
        "milestone": 97
      },
      "RTCConstraintEnableDtlsSrtpTrue": {
        "milestone": 97
      },
      "RTCPeerConnectionGetStatsLegacyNonCompliant": {
        "chromeStatusFeature": 4631626228695040,
        "milestone": 117
      },
      "RelatedWebsiteSets": {
        "chromeStatusFeature": 5194473869017088
      },
      "RequestedSubresourceWithEmbeddedCredentials": {
        "chromeStatusFeature": 5669008342777856
      },
      "RtcpMuxPolicyNegotiate": {
        "chromeStatusFeature": 5654810086866944,
        "milestone": 62
      },
      "SharedArrayBufferConstructedWithoutIsolation": {
        "milestone": 106
      },
      "SharedStorage": {
        "chromeStatusFeature": 5076349064708096
      },
      "StorageAccessAPI_requestStorageAccessFor_Method": {
        "chromeStatusFeature": 5162221567082496
      },
      "TextToSpeech_DisallowedByAutoplay": {
        "chromeStatusFeature": 5687444770914304,
        "milestone": 71
      },
      "UnloadHandler": {
        "chromeStatusFeature": 5579556305502208
      },
      "V8SharedArrayBufferConstructedInExtensionWithoutIsolation": {
        "milestone": 96
      },
      "WebBluetoothRemoteCharacteristicWriteValue": {
        "chromeStatusFeature": 5088568590598144
      },
      "XHRJSONEncodingDetection": {
        "milestone": 93
      },
      "XSLT": {
        "chromeStatusFeature": 4709671889534976,
        "milestone": 143
      }
    };
  }
});

// core/lib/deprecation-description.js
function getIssueDetailDescription(issueDetails) {
  let message;
  const type = (
    /** @type {keyof DEPRECATIONS_METADATA} */
    issueDetails.type
  );
  const maybeEnglishMessage = UIStrings97[type];
  if (maybeEnglishMessage) {
    message = deprecationsStr_(maybeEnglishMessage);
  }
  const links = [];
  const deprecationMeta = DEPRECATIONS_METADATA[type];
  const feature = deprecationMeta?.chromeStatusFeature ?? 0;
  if (feature !== 0) {
    links.push({
      link: `https://chromestatus.com/feature/${feature}`,
      linkTitle: str_77(UIStrings98.feature)
    });
  }
  const milestone = deprecationMeta?.milestone ?? 0;
  if (milestone !== 0) {
    links.push({
      link: "https://chromiumdash.appspot.com/schedule",
      linkTitle: str_77(UIStrings98.milestone, { milestone })
    });
  }
  return {
    substitutions: /* @__PURE__ */ new Map([
      ["PLACEHOLDER_title", str_77(UIStrings98.title)],
      ["PLACEHOLDER_message", message]
    ]),
    links,
    message
  };
}
var UIStrings98, str_77, deprecationsStr_;
var init_deprecation_description = __esm({
  "core/lib/deprecation-description.js"() {
    "use strict";
    init_process_global();
    init_i18n();
    init_deprecations_strings();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings98 = {
      // Store strings used across messages in this block.
      /**
       * @description This links to the chrome feature status page when one exists.
       */
      feature: "Check the feature status page for more details.",
      /**
       * @description This links to the chromium dash schedule when a milestone is set.
       * @example {100} milestone
       */
      milestone: "This change will go into effect with milestone {milestone}.",
      /**
       * @description Title of issue raised when a deprecated feature is used
       */
      title: "Deprecated Feature Used"
    };
    str_77 = createIcuMessageFn({ url: "core/lib/deprecation-description.js" }.url, UIStrings98);
    deprecationsStr_ = createIcuMessageFn(
      "node_modules/@paulirish/trace_engine/generated/Deprecation.js",
      UIStrings97
    );
    __name(getIssueDetailDescription, "getIssueDetailDescription");
  }
});

// core/audits/deprecations.js
var deprecations_exports = {};
__export(deprecations_exports, {
  UIStrings: () => UIStrings99,
  default: () => deprecations_default
});
var UIStrings99, str_78, Deprecations, deprecations_default;
var init_deprecations = __esm({
  "core/audits/deprecations.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_js_bundles();
    init_i18n();
    init_deprecation_description();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings99 = {
      /** Title of a Lighthouse audit that provides detail on the use of deprecated APIs. This descriptive title is shown to users when the page does not use deprecated APIs. */
      title: "Avoids deprecated APIs",
      /** Title of a Lighthouse audit that provides detail on the use of deprecated APIs. This descriptive title is shown to users when the page uses deprecated APIs. */
      failureTitle: "Uses deprecated APIs",
      /** Description of a Lighthouse audit that tells the user why they should not use deprecated APIs on their page. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Deprecated APIs will eventually be removed from the browser. [Learn more about deprecated APIs](https://developer.chrome.com/docs/lighthouse/best-practices/deprecations/).",
      /** [ICU Syntax] Label for the audit identifying the number of warnings generated by using deprecated APIs. */
      displayValue: `{itemCount, plural,
    =1 {1 warning found}
    other {# warnings found}
    }`,
      /** Header of the table column which displays the warning message describing use of a deprecated API by code running in the web page. */
      columnDeprecate: "Deprecation / Warning",
      /** Table column header for line of code (eg. 432) that is using a deprecated API. */
      columnLine: "Line"
    };
    str_78 = createIcuMessageFn({ url: "core/audits/deprecations.js" }.url, UIStrings99);
    Deprecations = class extends Audit {
      static {
        __name(this, "Deprecations");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "deprecations",
          title: str_78(UIStrings99.title),
          failureTitle: str_78(UIStrings99.failureTitle),
          description: str_78(UIStrings99.description),
          requiredArtifacts: ["InspectorIssues", "SourceMaps", "Scripts"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const bundles = await JSBundlesComputed.request(artifacts, context);
        const deprecations = (artifacts.InspectorIssues.deprecationIssue ?? []).map((deprecation) => {
          const { scriptId, url, lineNumber, columnNumber } = deprecation.sourceCodeLocation;
          const bundle = bundles.find((bundle2) => bundle2.script.scriptId === scriptId);
          const deprecationMeta = getIssueDetailDescription(deprecation);
          let subItems = void 0;
          if (deprecationMeta.links.length) {
            subItems = {
              type: "subitems",
              items: deprecationMeta.links.map((link) => ({
                type: "link",
                url: link.link,
                text: link.linkTitle
              }))
            };
          }
          const legacyMessage = deprecation.message;
          const item = {
            value: deprecationMeta.message || legacyMessage || deprecation.type,
            // Protocol.Audits.SourceCodeLocation.columnNumber is 1-indexed, but we use 0-indexed.
            source: Audit.makeSourceLocation(url, lineNumber, columnNumber - 1, bundle),
            subItems
          };
          return item;
        });
        const headings = [
          { key: "value", valueType: "text", label: str_78(UIStrings99.columnDeprecate) },
          { key: "source", valueType: "source-location", label: str_78(UIStrings.columnSource) }
        ];
        const details = Audit.makeTableDetails(headings, deprecations);
        let displayValue;
        if (deprecations.length > 0) {
          displayValue = str_78(UIStrings99.displayValue, { itemCount: deprecations.length });
        }
        return {
          score: Number(deprecations.length === 0),
          displayValue,
          details
        };
      }
    };
    deprecations_default = Deprecations;
  }
});

// core/audits/dobetterweb/charset.js
var charset_exports = {};
__export(charset_exports, {
  CHARSET_HTML_REGEX: () => CHARSET_HTML_REGEX,
  CHARSET_HTTP_REGEX: () => CHARSET_HTTP_REGEX2,
  IANA_REGEX: () => IANA_REGEX,
  UIStrings: () => UIStrings100,
  default: () => charset_default
});
var UIStrings100, str_79, CONTENT_TYPE_HEADER, IANA_REGEX, CHARSET_HTML_REGEX, CHARSET_HTTP_REGEX2, CharsetDefined, charset_default;
var init_charset = __esm({
  "core/audits/dobetterweb/charset.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    init_main_resource();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings100 = {
      /** Title of a Lighthouse audit that provides detail on if the charset is set properly for a page. This title is shown when the charset is defined correctly. Charset defines the character encoding (eg UTF-8) of the page content. */
      title: "Properly defines charset",
      /** Title of a Lighthouse audit that provides detail on if the charset is set properly for a page. This title is shown when the charset meta tag is missing or defined too late in the page. */
      failureTitle: "Charset declaration is missing or occurs too late in the HTML",
      /** Description of a Lighthouse audit that tells the user why the charset needs to be defined early on. */
      description: "A character encoding declaration is required. It can be done with a `<meta>` tag in the first 1024 bytes of the HTML or in the Content-Type HTTP response header. [Learn more about declaring the character encoding](https://developer.chrome.com/docs/lighthouse/best-practices/charset/)."
    };
    str_79 = createIcuMessageFn({ url: "core/audits/dobetterweb/charset.js" }.url, UIStrings100);
    CONTENT_TYPE_HEADER = "content-type";
    IANA_REGEX = /^[a-zA-Z0-9-_:.()]{2,}$/;
    CHARSET_HTML_REGEX = /<meta[^>]+charset[^<]+>/i;
    CHARSET_HTTP_REGEX2 = /charset\s*=\s*[a-zA-Z0-9-_:.()]{2,}/i;
    CharsetDefined = class extends Audit {
      static {
        __name(this, "CharsetDefined");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "charset",
          title: str_79(UIStrings100.title),
          failureTitle: str_79(UIStrings100.failureTitle),
          description: str_79(UIStrings100.description),
          requiredArtifacts: ["MainDocumentContent", "URL", "DevtoolsLog", "MetaElements"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        let isCharsetSet = false;
        if (mainResource.responseHeaders) {
          const contentTypeHeader = mainResource.responseHeaders.find((header) => header.name.toLowerCase() === CONTENT_TYPE_HEADER);
          if (contentTypeHeader) {
            isCharsetSet = CHARSET_HTTP_REGEX2.test(contentTypeHeader.value);
          }
        }
        const BOM_FIRSTCHAR = 65279;
        isCharsetSet = isCharsetSet || artifacts.MainDocumentContent.charCodeAt(0) === BOM_FIRSTCHAR;
        if (CHARSET_HTML_REGEX.test(artifacts.MainDocumentContent.slice(0, 1024))) {
          isCharsetSet = isCharsetSet || artifacts.MetaElements.some((meta) => {
            return meta.charset && IANA_REGEX.test(meta.charset) || meta.httpEquiv === "content-type" && meta.content && CHARSET_HTTP_REGEX2.test(meta.content);
          });
        }
        return {
          score: Number(isCharsetSet)
        };
      }
    };
    charset_default = CharsetDefined;
  }
});

// core/lib/lh-trace-processor.js
var LHTraceProcessor, lh_trace_processor_default;
var init_lh_trace_processor = __esm({
  "core/lib/lh-trace-processor.js"() {
    "use strict";
    init_process_global();
    init_lh_error();
    init_trace_processor();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    LHTraceProcessor = class extends TraceProcessor {
      static {
        __name(this, "LHTraceProcessor");
      }
      /**
       * @return {Error}
       */
      static createNoNavstartError() {
        return new LighthouseError(LighthouseError.errors.NO_NAVSTART);
      }
      /**
       * This isn't currently used, but will be when the time origin of trace processing is changed.
       * @see {TraceProcessor.computeTimeOrigin}
       * @see https://github.com/GoogleChrome/lighthouse/pull/11253#discussion_r507985527
       * @return {Error}
       */
      static createNoResourceSendRequestError() {
        return new LighthouseError(LighthouseError.errors.NO_RESOURCE_REQUEST);
      }
      /**
       * @return {Error}
       */
      static createNoTracingStartedError() {
        return new LighthouseError(LighthouseError.errors.NO_TRACING_STARTED);
      }
      /**
       * @return {Error}
       */
      static createNoFirstContentfulPaintError() {
        return new LighthouseError(LighthouseError.errors.NO_FCP);
      }
    };
    lh_trace_processor_default = LHTraceProcessor;
  }
});

// core/computed/processed-trace.js
var ProcessedTrace, ProcessedTraceComputed;
var init_processed_trace = __esm({
  "core/computed/processed-trace.js"() {
    "use strict";
    init_process_global();
    init_computed_artifact();
    init_lh_trace_processor();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ProcessedTrace = class {
      static {
        __name(this, "ProcessedTrace");
      }
      /**
        * @param {LH.Trace} trace
        * @return {Promise<LH.Artifacts.ProcessedTrace>}
       */
      static async compute_(trace) {
        return lh_trace_processor_default.processTrace(trace);
      }
    };
    ProcessedTraceComputed = makeComputedArtifact(ProcessedTrace, null);
  }
});

// core/audits/dobetterweb/doctype.js
var doctype_exports2 = {};
__export(doctype_exports2, {
  UIStrings: () => UIStrings101,
  default: () => doctype_default2
});
var UIStrings101, str_80, Doctype2, doctype_default2;
var init_doctype2 = __esm({
  "core/audits/dobetterweb/doctype.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    init_processed_trace();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings101 = {
      /** Title of a Lighthouse audit that provides detail on the doctype of a page. This descriptive title is shown to users when the pages's doctype is set to HTML. */
      title: "Page has the HTML doctype",
      /** Title of a Lighthouse audit that provides detail on the doctype of a page. This descriptive title is shown to users when the page's doctype is not set to HTML. */
      failureTitle: "Page lacks the HTML doctype, thus triggering quirks-mode",
      /** Description of a Lighthouse audit that tells the user why they should define an HTML doctype. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Specifying a doctype prevents the browser from switching to quirks-mode. [Learn more about the doctype declaration](https://developer.chrome.com/docs/lighthouse/best-practices/doctype/).",
      /** Explanatory message stating that the document has no doctype. */
      explanationNoDoctype: "Document must contain a doctype",
      /** Explanatory message stating that the document has wrong doctype that triggers `quirks-mode` */
      explanationWrongDoctype: "Document contains a `doctype` that triggers `quirks-mode`",
      /** Explanatory message stating that the document has wrong doctype that triggers `limited-quirks-mode` */
      explanationLimitedQuirks: "Document contains a `doctype` that triggers `limited-quirks-mode`",
      /** Explanatory message stating that the publicId field is not empty. */
      explanationPublicId: "Expected publicId to be an empty string",
      /** Explanatory message stating that the systemId field is not empty. */
      explanationSystemId: "Expected systemId to be an empty string",
      /** Explanatory message stating that the doctype is set, but is not "html" and is therefore invalid. */
      explanationBadDoctype: "Doctype name must be the string `html`"
    };
    str_80 = createIcuMessageFn({ url: "core/audits/dobetterweb/doctype.js" }.url, UIStrings101);
    Doctype2 = class extends Audit {
      static {
        __name(this, "Doctype");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "doctype",
          title: str_80(UIStrings101.title),
          failureTitle: str_80(UIStrings101.failureTitle),
          description: str_80(UIStrings101.description),
          requiredArtifacts: ["Doctype"],
          __internalOptionalArtifacts: ["InspectorIssues", "Trace"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        if (!artifacts.Doctype) {
          return {
            score: 0,
            explanation: str_80(UIStrings101.explanationNoDoctype)
          };
        }
        const doctypeName = artifacts.Doctype.name;
        const doctypePublicId = artifacts.Doctype.publicId;
        const doctypeSystemId = artifacts.Doctype.systemId;
        const compatMode = artifacts.Doctype.documentCompatMode;
        const trace = artifacts.Trace;
        let quirksModeIssues = [];
        if (trace && artifacts.InspectorIssues?.quirksModeIssue) {
          const processedTrace = await ProcessedTraceComputed.request(trace, context);
          const mainFrameId2 = processedTrace.mainFrameInfo.frameId;
          quirksModeIssues = artifacts.InspectorIssues.quirksModeIssue.filter((issue) => issue.frameId === mainFrameId2);
        }
        const isLimitedQuirksMode = quirksModeIssues.some((issue) => issue.isLimitedQuirksMode);
        if (compatMode === "CSS1Compat" && !isLimitedQuirksMode) {
          return {
            score: 1
          };
        }
        if (isLimitedQuirksMode) {
          return {
            score: 0,
            explanation: str_80(UIStrings101.explanationLimitedQuirks)
          };
        }
        if (doctypePublicId !== "") {
          return {
            score: 0,
            explanation: str_80(UIStrings101.explanationPublicId)
          };
        }
        if (doctypeSystemId !== "") {
          return {
            score: 0,
            explanation: str_80(UIStrings101.explanationSystemId)
          };
        }
        if (doctypeName !== "html") {
          return {
            score: 0,
            explanation: str_80(UIStrings101.explanationBadDoctype)
          };
        }
        return {
          score: 0,
          explanation: str_80(UIStrings101.explanationWrongDoctype)
        };
      }
    };
    doctype_default2 = Doctype2;
  }
});

// core/audits/violation-audit.js
var ViolationAudit, violation_audit_default;
var init_violation_audit = __esm({
  "core/audits/violation-audit.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_js_bundles();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ViolationAudit = class extends Audit {
      static {
        __name(this, "ViolationAudit");
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @param {RegExp} pattern
       * @return {Promise<Array<{source: LH.Audit.Details.SourceLocationValue}>>}
       */
      static async getViolationResults(artifacts, context, pattern) {
        const bundles = await JSBundlesComputed.request(artifacts, context);
        function filterUndefined(value) {
          return value !== void 0;
        }
        __name(filterUndefined, "filterUndefined");
        const seen = /* @__PURE__ */ new Set();
        return artifacts.ConsoleMessages.filter((entry) => entry.url && entry.source === "violation" && pattern.test(entry.text)).map((entry) => {
          const bundle = bundles.find((bundle2) => bundle2.script.scriptId === entry.scriptId);
          return Audit.makeSourceLocationFromConsoleMessage(entry, bundle);
        }).filter(filterUndefined).filter((source) => {
          const key = `${source.url}!${source.line}!${source.column}`;
          if (seen.has(key)) return false;
          seen.add(key);
          return true;
        }).map((source) => ({ source }));
      }
    };
    violation_audit_default = ViolationAudit;
  }
});

// core/audits/dobetterweb/geolocation-on-start.js
var geolocation_on_start_exports = {};
__export(geolocation_on_start_exports, {
  UIStrings: () => UIStrings102,
  default: () => geolocation_on_start_default
});
var UIStrings102, str_81, GeolocationOnStart, geolocation_on_start_default;
var init_geolocation_on_start = __esm({
  "core/audits/dobetterweb/geolocation-on-start.js"() {
    "use strict";
    init_process_global();
    init_violation_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings102 = {
      /** Title of a Lighthouse audit that provides detail on geolocation permission requests while the page is loading. This descriptive title is shown to users when the page does not ask for geolocation permissions on load. */
      title: "Avoids requesting the geolocation permission on page load",
      /** Title of a Lighthouse audit that provides detail on geolocation permissions requests. This descriptive title is shown to users when the page does ask for geolocation permissions on load. */
      failureTitle: "Requests the geolocation permission on page load",
      /** Description of a Lighthouse audit that tells the user why they should not ask for geolocation permissions on load. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to a user action instead. [Learn more about the geolocation permission](https://developer.chrome.com/docs/lighthouse/best-practices/geolocation-on-start/)."
    };
    str_81 = createIcuMessageFn({ url: "core/audits/dobetterweb/geolocation-on-start.js" }.url, UIStrings102);
    GeolocationOnStart = class extends violation_audit_default {
      static {
        __name(this, "GeolocationOnStart");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "geolocation-on-start",
          title: str_81(UIStrings102.title),
          failureTitle: str_81(UIStrings102.failureTitle),
          description: str_81(UIStrings102.description),
          supportedModes: ["navigation"],
          requiredArtifacts: ["ConsoleMessages", "SourceMaps", "Scripts"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const results = await violation_audit_default.getViolationResults(artifacts, context, /geolocation/);
        const headings = [
          { key: "source", valueType: "source-location", label: str_81(UIStrings.columnSource) }
        ];
        const details = violation_audit_default.makeTableDetails(headings, results);
        return {
          score: Number(results.length === 0),
          details
        };
      }
    };
    geolocation_on_start_default = GeolocationOnStart;
  }
});

// core/audits/dobetterweb/inspector-issues.js
var inspector_issues_exports2 = {};
__export(inspector_issues_exports2, {
  UIStrings: () => UIStrings103,
  default: () => inspector_issues_default2
});
var UIStrings103, str_82, IssuesPanelEntries, inspector_issues_default2;
var init_inspector_issues2 = __esm({
  "core/audits/dobetterweb/inspector-issues.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings103 = {
      /** Title of a Lighthouse audit that provides detail on various types of problems with a website, like security or network errors. This descriptive title is shown to users when no issues were logged into the Chrome DevTools Issues panel. */
      title: "No issues in the `Issues` panel in Chrome Devtools",
      /** Title of a Lighthouse audit that provides detail on various types of problems with a website, like security or network errors. This descriptive title is shown to users when issues are detected and logged into the Chrome DevTools Issues panel. */
      failureTitle: "Issues were logged in the `Issues` panel in Chrome Devtools",
      /* eslint-disable max-len */
      /** Description of a Lighthouse audit that tells the user why issues being logged to the Chrome DevTools Issues panel are a cause for concern and so should be fixed. This is displayed after a user expands the section to see more. No character length limits. */
      description: "Issues logged to the `Issues` panel in Chrome Devtools indicate unresolved problems. They can come from network request failures, insufficient security controls, and other browser concerns. Open up the Issues panel in Chrome DevTools for more details on each issue.",
      /* eslint-enable max-len */
      /** Table column header for the types of problems observed in a website, like security or network errors. */
      columnIssueType: "Issue type",
      /** The type of an Issue in Chrome DevTools when a resource is blocked due to the website's cross-origin policy. */
      issueTypeBlockedByResponse: "Blocked by cross-origin policy",
      /** The type of an Issue in Chrome DevTools when a site has large ads that use up a lot of the browser's resources. */
      issueTypeHeavyAds: "Heavy resource usage by ads"
    };
    str_82 = createIcuMessageFn({ url: "core/audits/dobetterweb/inspector-issues.js" }.url, UIStrings103);
    IssuesPanelEntries = class extends Audit {
      static {
        __name(this, "IssuesPanelEntries");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "inspector-issues",
          title: str_82(UIStrings103.title),
          failureTitle: str_82(UIStrings103.failureTitle),
          description: str_82(UIStrings103.description),
          requiredArtifacts: ["InspectorIssues"]
        };
      }
      /**
       * @param {Array<LH.Crdp.Audits.MixedContentIssueDetails>} mixedContentIssues
       * @return {LH.Audit.Details.TableItem}
       */
      static getMixedContentRow(mixedContentIssues) {
        const requestUrls = /* @__PURE__ */ new Set();
        for (const issue of mixedContentIssues) {
          const requestUrl = issue.request?.url || issue.mainResourceURL;
          requestUrls.add(requestUrl);
        }
        return {
          issueType: "Mixed content",
          subItems: {
            type: "subitems",
            items: Array.from(requestUrls).map((url) => ({ url }))
          }
        };
      }
      /**
       * @param {Array<LH.Crdp.Audits.CookieIssueDetails>} CookieIssues
       * @return {LH.Audit.Details.TableItem}
       */
      static getCookieRow(CookieIssues) {
        const requestUrls = /* @__PURE__ */ new Set();
        for (const issue of CookieIssues) {
          const requestUrl = issue.request?.url || issue.cookieUrl;
          if (requestUrl) {
            requestUrls.add(requestUrl);
          }
        }
        return {
          issueType: "Cookie",
          subItems: {
            type: "subitems",
            items: Array.from(requestUrls).map((url) => {
              return {
                url
              };
            })
          }
        };
      }
      /**
       * @param {Array<LH.Crdp.Audits.BlockedByResponseIssueDetails>} blockedByResponseIssues
       * @return {LH.Audit.Details.TableItem}
       */
      static getBlockedByResponseRow(blockedByResponseIssues) {
        const requestUrls = /* @__PURE__ */ new Set();
        for (const issue of blockedByResponseIssues) {
          const requestUrl = issue.request?.url;
          if (requestUrl) {
            requestUrls.add(requestUrl);
          }
        }
        return {
          issueType: str_82(UIStrings103.issueTypeBlockedByResponse),
          subItems: {
            type: "subitems",
            items: Array.from(requestUrls).map((url) => {
              return {
                url
              };
            })
          }
        };
      }
      /**
       * @param {Array<LH.Crdp.Audits.ContentSecurityPolicyIssueDetails>} cspIssues
       * @return {LH.Audit.Details.TableItem}
       */
      static getContentSecurityPolicyRow(cspIssues) {
        const requestUrls = /* @__PURE__ */ new Set();
        for (const issue of cspIssues) {
          const requestUrl = issue.blockedURL;
          if (requestUrl) {
            requestUrls.add(requestUrl);
          }
        }
        return {
          issueType: "Content security policy",
          subItems: {
            type: "subitems",
            items: Array.from(requestUrls).map((url) => {
              return {
                url
              };
            })
          }
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const headings = [
          /* eslint-disable max-len */
          { key: "issueType", valueType: "text", subItemsHeading: { key: "url", valueType: "url" }, label: str_82(UIStrings103.columnIssueType) }
          /* eslint-enable max-len */
        ];
        const issues = artifacts.InspectorIssues;
        const items = [];
        if (issues.mixedContentIssue?.length) {
          items.push(this.getMixedContentRow(issues.mixedContentIssue));
        }
        if (issues.cookieIssue?.length) {
          items.push(this.getCookieRow(issues.cookieIssue));
        }
        if (issues.blockedByResponseIssue?.length) {
          items.push(this.getBlockedByResponseRow(issues.blockedByResponseIssue));
        }
        if (issues.heavyAdIssue?.length) {
          items.push({ issueType: str_82(UIStrings103.issueTypeHeavyAds) });
        }
        if (issues.contentSecurityPolicyIssue?.length) {
          items.push(this.getContentSecurityPolicyRow(issues.contentSecurityPolicyIssue));
        }
        return {
          score: items.length > 0 ? 0 : 1,
          details: Audit.makeTableDetails(headings, items)
        };
      }
    };
    inspector_issues_default2 = IssuesPanelEntries;
  }
});

// core/audits/dobetterweb/js-libraries.js
var js_libraries_exports = {};
__export(js_libraries_exports, {
  UIStrings: () => UIStrings104,
  default: () => js_libraries_default
});
var UIStrings104, str_83, JsLibrariesAudit, js_libraries_default;
var init_js_libraries = __esm({
  "core/audits/dobetterweb/js-libraries.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings104 = {
      /** Title of a Lighthouse audit that provides detail on the Javascript libraries that are used on the page. */
      title: "Detected JavaScript libraries",
      /** Description of a Lighthouse audit that tells the user what this audit is detecting. This is displayed after a user expands the section to see more. No character length limits. */
      description: "All front-end JavaScript libraries detected on the page. [Learn more about this JavaScript library detection diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/js-libraries/).",
      /** Label for a column in a data table; entries will be the version numbers of the detected Javascript libraries.  */
      columnVersion: "Version"
    };
    str_83 = createIcuMessageFn({ url: "core/audits/dobetterweb/js-libraries.js" }.url, UIStrings104);
    JsLibrariesAudit = class extends Audit {
      static {
        __name(this, "JsLibrariesAudit");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "js-libraries",
          title: str_83(UIStrings104.title),
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          description: str_83(UIStrings104.description),
          requiredArtifacts: ["Stacks"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const libDetails = artifacts.Stacks.filter((stack) => stack.detector === "js").filter((stack) => !stack.id.endsWith("-fast")).map((stack) => ({
          name: stack.name,
          version: stack.version,
          npm: stack.npm
        }));
        const headings = [
          { key: "name", valueType: "text", label: str_83(UIStrings.columnName) },
          { key: "version", valueType: "text", label: str_83(UIStrings104.columnVersion) }
        ];
        const details = Audit.makeTableDetails(headings, libDetails);
        const debugData = {
          type: (
            /** @type {const} */
            "debugdata"
          ),
          stacks: artifacts.Stacks.map((stack) => {
            return {
              id: stack.id,
              version: stack.version
            };
          })
        };
        if (!libDetails.length) {
          return { score: null, notApplicable: true };
        }
        return {
          score: 1,
          // Always pass for now.
          details: {
            ...details,
            debugData
          }
        };
      }
    };
    js_libraries_default = JsLibrariesAudit;
  }
});

// core/audits/dobetterweb/notification-on-start.js
var notification_on_start_exports = {};
__export(notification_on_start_exports, {
  UIStrings: () => UIStrings105,
  default: () => notification_on_start_default
});
var UIStrings105, str_84, NotificationOnStart, notification_on_start_default;
var init_notification_on_start = __esm({
  "core/audits/dobetterweb/notification-on-start.js"() {
    "use strict";
    init_process_global();
    init_violation_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings105 = {
      /** Title of a Lighthouse audit that provides detail on the page's notification permission requests. This descriptive title is shown to users when the page does not ask for notification permission on load. */
      title: "Avoids requesting the notification permission on page load",
      /** Title of a Lighthouse audit that provides detail on the page's notification permission requests. This descriptive title is shown to users when the page does ask for notification permission on load. */
      failureTitle: "Requests the notification permission on page load",
      /** Description of a Lighthouse audit that tells the user why they should not ask for notification permission on load. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      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 about responsibly getting permission for notifications](https://developer.chrome.com/docs/lighthouse/best-practices/notification-on-start/)."
    };
    str_84 = createIcuMessageFn({ url: "core/audits/dobetterweb/notification-on-start.js" }.url, UIStrings105);
    NotificationOnStart = class extends violation_audit_default {
      static {
        __name(this, "NotificationOnStart");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "notification-on-start",
          title: str_84(UIStrings105.title),
          failureTitle: str_84(UIStrings105.failureTitle),
          description: str_84(UIStrings105.description),
          supportedModes: ["navigation"],
          requiredArtifacts: ["ConsoleMessages", "SourceMaps", "Scripts"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const results = await violation_audit_default.getViolationResults(artifacts, context, /notification permission/);
        const headings = [
          { key: "source", valueType: "source-location", label: str_84(UIStrings.columnSource) }
        ];
        const details = violation_audit_default.makeTableDetails(headings, results);
        return {
          score: Number(results.length === 0),
          details
        };
      }
    };
    notification_on_start_default = NotificationOnStart;
  }
});

// core/audits/dobetterweb/paste-preventing-inputs.js
var paste_preventing_inputs_exports = {};
__export(paste_preventing_inputs_exports, {
  UIStrings: () => UIStrings106,
  default: () => paste_preventing_inputs_default
});
var UIStrings106, str_85, PastePreventingInputsAudit, paste_preventing_inputs_default;
var init_paste_preventing_inputs = __esm({
  "core/audits/dobetterweb/paste-preventing-inputs.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings106 = {
      /** Title of a Lighthouse audit that provides detail on the ability to paste into input fields. This descriptive title is shown to users when the page allows pasting of content into input fields. */
      title: "Allows users to paste into input fields",
      /** Title of a Lighthouse audit that provides detail on the ability to paste into input fields. This descriptive title is shown to users when the page does not allow pasting of content into input fields. */
      failureTitle: "Prevents users from pasting into input fields",
      /** Description of a Lighthouse audit that tells the user why they should allow pasting of content into input fields. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      description: "Preventing input pasting is a bad practice for the UX, and weakens security by blocking password managers.[Learn more about user-friendly input fields](https://developer.chrome.com/docs/lighthouse/best-practices/paste-preventing-inputs/)."
    };
    str_85 = createIcuMessageFn({ url: "core/audits/dobetterweb/paste-preventing-inputs.js" }.url, UIStrings106);
    PastePreventingInputsAudit = class extends Audit {
      static {
        __name(this, "PastePreventingInputsAudit");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "paste-preventing-inputs",
          title: str_85(UIStrings106.title),
          failureTitle: str_85(UIStrings106.failureTitle),
          description: str_85(UIStrings106.description),
          requiredArtifacts: ["Inputs"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const inputsWithPreventsPaste = artifacts.Inputs.inputs.filter((input) => input.preventsPaste);
        const items = [];
        inputsWithPreventsPaste.forEach((input) => {
          items.push({
            node: Audit.makeNodeItem(input.node),
            type: input.type
          });
        });
        const headings = [
          { key: "node", valueType: "node", label: str_85(UIStrings.columnFailingElem) }
        ];
        return {
          score: Number(inputsWithPreventsPaste.length === 0),
          details: Audit.makeTableDetails(headings, items)
        };
      }
    };
    paste_preventing_inputs_default = PastePreventingInputsAudit;
  }
});

// core/audits/errors-in-console.js
var errors_in_console_exports = {};
__export(errors_in_console_exports, {
  UIStrings: () => UIStrings107,
  default: () => errors_in_console_default
});
var KB, MAX_CONSOLE_ERRORS, UIStrings107, str_86, ErrorLogs, errors_in_console_default;
var init_errors_in_console = __esm({
  "core/audits/errors-in-console.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_audit();
    init_js_bundles();
    init_i18n();
    init_util();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    KB = 1024;
    MAX_CONSOLE_ERRORS = 1e3;
    UIStrings107 = {
      /** Title of a Lighthouse audit that provides detail on browser errors. This descriptive title is shown to users when no browser errors were logged into the devtools console. */
      title: "No browser errors logged to the console",
      /** Title of a Lighthouse audit that provides detail on browser errors. This descriptive title is shown to users when browser errors occurred and were logged into the devtools console. */
      failureTitle: "Browser errors were logged to the console",
      /** Description of a Lighthouse audit that tells the user why errors being logged to the devtools console are a cause for concern and so should be fixed. This is displayed after a user expands the section to see more. No character length limits. */
      description: "Errors logged to the console indicate unresolved problems. They can come from network request failures and other browser concerns. [Learn more about this errors in console diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/errors-in-console/)"
    };
    str_86 = createIcuMessageFn({ url: "core/audits/errors-in-console.js" }.url, UIStrings107);
    ErrorLogs = class _ErrorLogs extends Audit {
      static {
        __name(this, "ErrorLogs");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "errors-in-console",
          title: str_86(UIStrings107.title),
          failureTitle: str_86(UIStrings107.failureTitle),
          description: str_86(UIStrings107.description),
          requiredArtifacts: ["ConsoleMessages", "SourceMaps", "Scripts"]
        };
      }
      /** @return {AuditOptions} */
      static get defaultOptions() {
        return { ignoredPatterns: ["ERR_BLOCKED_BY_CLIENT.Inspector"] };
      }
      /**
       * @template {{description: string | undefined}} T
       * @param {Array<T>} items
       * @param {AuditOptions} options
       * @return {Array<T>}
       */
      static filterAccordingToOptions(items, options) {
        const { ignoredPatterns, ...restOfOptions } = options;
        const otherOptionKeys = Object.keys(restOfOptions);
        if (otherOptionKeys.length) lighthouse_logger_default.warn(this.meta.id, "Unrecognized options", otherOptionKeys);
        if (!ignoredPatterns) return items;
        return items.filter(({ description }) => {
          if (!description) return true;
          for (const pattern of ignoredPatterns) {
            if (pattern instanceof RegExp && pattern.test(description)) return false;
            if (typeof pattern === "string" && description.includes(pattern)) return false;
          }
          return true;
        });
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const auditOptions = context.options;
        const bundles = await JSBundlesComputed.request(artifacts, context);
        const consoleRows = artifacts.ConsoleMessages.filter((item) => item.level === "error").map((item) => {
          const bundle = bundles.find((bundle2) => bundle2.script.scriptId === item.scriptId);
          return {
            source: item.source,
            description: item.text ? Util.truncate(item.text, 10 * KB) : void 0,
            sourceLocation: Audit.makeSourceLocationFromConsoleMessage(item, bundle)
          };
        }).slice(0, MAX_CONSOLE_ERRORS);
        const tableRows = _ErrorLogs.filterAccordingToOptions(consoleRows, auditOptions).sort((a, b) => (a.description || "").localeCompare(b.description || ""));
        const headings = [
          /* eslint-disable max-len */
          { key: "sourceLocation", valueType: "source-location", label: str_86(UIStrings.columnSource) },
          { key: "description", valueType: "code", label: str_86(UIStrings.columnDescription) }
          /* eslint-enable max-len */
        ];
        const details = Audit.makeTableDetails(headings, tableRows);
        const numErrors = tableRows.length;
        return {
          score: Number(numErrors === 0),
          details
        };
      }
    };
    errors_in_console_default = ErrorLogs;
  }
});

// core/audits/has-hsts.js
var has_hsts_exports = {};
__export(has_hsts_exports, {
  UIStrings: () => UIStrings108,
  default: () => has_hsts_default
});
var UIStrings108, str_87, HasHsts, has_hsts_default;
var init_has_hsts = __esm({
  "core/audits/has-hsts.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_main_resource();
    init_i18n();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings108 = {
      /** Title of a Lighthouse audit that evaluates the security of a page's HSTS header. "HSTS" stands for "HTTP Strict Transport Security". */
      title: "Use a strong HSTS policy",
      /** Description of a Lighthouse audit that evaluates the security of a page's HSTS header. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. "HSTS" stands for "HTTP Strict Transport Security". */
      description: "Deployment of the HSTS header significantly reduces the risk of downgrading HTTP connections and eavesdropping attacks. A rollout in stages, starting with a low max-age is recommended. [Learn more about using a strong HSTS policy.](https://developer.chrome.com/docs/lighthouse/best-practices/has-hsts)",
      /** Summary text for the results of a Lighthouse audit that evaluates the HSTS header. This is displayed if no HSTS header is deployed. "HSTS" stands for "HTTP Strict Transport Security". */
      noHsts: "No HSTS header found",
      /** Summary text for the results of a Lighthouse audit that evaluates the HSTS header. This is displayed if the preload directive is missing. "HSTS" stands for "HTTP Strict Transport Security". */
      noPreload: "No `preload` directive found",
      /** Summary text for the results of a Lighthouse audit that evaluates the HSTS header. This is displayed if the includeSubDomains directive is missing. "HSTS" stands for "HTTP Strict Transport Security". */
      noSubdomain: "No `includeSubDomains` directive found",
      /** Summary text for the results of a Lighthouse audit that evaluates the HSTS header. This is displayed if the max-age directive is missing. "HSTS" stands for "HTTP Strict Transport Security". */
      noMaxAge: "No `max-age` directive",
      /** Summary text for the results of a Lighthouse audit that evaluates the HSTS header. This is displayed if the provided duration for the max-age directive is too low. "HSTS" stands for "HTTP Strict Transport Security". */
      lowMaxAge: "`max-age` is too low",
      /** Table item value calling out the presence of a syntax error. */
      invalidSyntax: "Invalid syntax",
      /** Label for a column in a data table; entries will be a directive of the HSTS header. "HSTS" stands for "HTTP Strict Transport Security". */
      columnDirective: "Directive",
      /** Label for a column in a data table; entries will be the severity of an issue with the HSTS header. "HSTS" stands for "HTTP Strict Transport Security". */
      columnSeverity: "Severity"
    };
    str_87 = createIcuMessageFn({ url: "core/audits/has-hsts.js" }.url, UIStrings108);
    HasHsts = class extends Audit {
      static {
        __name(this, "HasHsts");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "has-hsts",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_87(UIStrings108.title),
          description: str_87(UIStrings108.description),
          requiredArtifacts: ["DevtoolsLog", "URL"],
          supportedModes: ["navigation"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<string[]>}
       */
      static async getRawHsts(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        let hstsHeaders = mainResource.responseHeaders.filter((h) => {
          return h.name.toLowerCase() === "strict-transport-security";
        }).flatMap((h) => h.value.split(";"));
        hstsHeaders = hstsHeaders.map((v) => v.toLowerCase().replace(/\s/g, ""));
        return hstsHeaders;
      }
      /**
       * @param {string} hstsDirective
       * @param {LH.IcuMessage | string} findingDescription
       * @param {LH.IcuMessage=} severity
       * @return {LH.Audit.Details.TableItem}
       */
      static findingToTableItem(hstsDirective, findingDescription, severity) {
        return {
          directive: hstsDirective,
          description: findingDescription,
          severity
        };
      }
      /**
       * @param {string[]} hstsHeaders
       * @return {{score: number, results: LH.Audit.Details.TableItem[]}}
       */
      static constructResults(hstsHeaders) {
        const rawHsts = [...hstsHeaders];
        const allowedDirectives = ["max-age", "includesubdomains", "preload"];
        const violations = [];
        const warnings = [];
        const syntax = [];
        if (!rawHsts.length) {
          return {
            score: 0,
            results: [{
              severity: str_87(UIStrings.itemSeverityHigh),
              description: str_87(UIStrings108.noHsts),
              directive: void 0
            }]
          };
        }
        if (!hstsHeaders.toString().includes("max-age")) {
          violations.push({
            severity: str_87(UIStrings.itemSeverityHigh),
            description: str_87(UIStrings108.noMaxAge),
            directive: "max-age"
          });
        }
        if (!hstsHeaders.toString().includes("includesubdomains")) {
          warnings.push({
            severity: str_87(UIStrings.itemSeverityMedium),
            description: str_87(UIStrings108.noSubdomain),
            directive: "includeSubDomains"
          });
        }
        if (!hstsHeaders.toString().includes("preload")) {
          warnings.push({
            severity: str_87(UIStrings.itemSeverityMedium),
            description: str_87(UIStrings108.noPreload),
            directive: "preload"
          });
        }
        for (const actualDirective of hstsHeaders) {
          if (actualDirective.includes("max-age") && parseInt(actualDirective.split("=")[1], 10) < 31536e3) {
            violations.push({
              severity: str_87(UIStrings.itemSeverityHigh),
              description: str_87(UIStrings108.lowMaxAge),
              directive: "max-age"
            });
          }
          if (!allowedDirectives.includes(actualDirective) && !actualDirective.includes("max-age")) {
            syntax.push({
              severity: str_87(UIStrings.itemSeverityLow),
              description: str_87(UIStrings108.invalidSyntax),
              directive: actualDirective
            });
          }
        }
        const results = [
          ...violations.map(
            (f) => this.findingToTableItem(
              f.directive,
              f.description,
              str_87(UIStrings.itemSeverityHigh)
            )
          ),
          ...warnings.map(
            (f) => this.findingToTableItem(
              f.directive,
              f.description,
              str_87(UIStrings.itemSeverityMedium)
            )
          ),
          ...syntax.map(
            (f) => this.findingToTableItem(
              f.directive,
              f.description,
              str_87(UIStrings.itemSeverityLow)
            )
          )
        ];
        return { score: violations.length || syntax.length ? 0 : 1, results };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const hstsHeaders = await this.getRawHsts(artifacts, context);
        const { score, results } = this.constructResults(hstsHeaders);
        const headings = [
          /* eslint-disable max-len */
          { key: "description", valueType: "text", subItemsHeading: { key: "description" }, label: str_87(UIStrings.columnDescription) },
          { key: "directive", valueType: "code", subItemsHeading: { key: "directive" }, label: str_87(UIStrings108.columnDirective) },
          { key: "severity", valueType: "text", subItemsHeading: { key: "severity" }, label: str_87(UIStrings108.columnSeverity) }
          /* eslint-enable max-len */
        ];
        const details = Audit.makeTableDetails(headings, results);
        return {
          score,
          notApplicable: !results.length,
          details
        };
      }
    };
    has_hsts_default = HasHsts;
  }
});

// core/audits/image-aspect-ratio.js
var image_aspect_ratio_exports = {};
__export(image_aspect_ratio_exports, {
  UIStrings: () => UIStrings109,
  default: () => image_aspect_ratio_default
});
var UIStrings109, str_88, THRESHOLD_PX, ImageAspectRatio, image_aspect_ratio_default;
var init_image_aspect_ratio = __esm({
  "core/audits/image-aspect-ratio.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_url_utils();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings109 = {
      /** Title of a Lighthouse audit that provides detail on the aspect ratios of all images on the page. This descriptive title is shown to users when all images use correct aspect ratios. */
      title: "Displays images with correct aspect ratio",
      /** Title of a Lighthouse audit that provides detail on the aspect ratios of all images on the page. This descriptive title is shown to users when not all images use correct aspect ratios. */
      failureTitle: "Displays images with incorrect aspect ratio",
      /** Description of a Lighthouse audit that tells the user why they should maintain the correct aspect ratios for all images. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Image display dimensions should match natural aspect ratio. [Learn more about image aspect ratio](https://developer.chrome.com/docs/lighthouse/best-practices/image-aspect-ratio/).",
      /**  Label for a column in a data table; entries in the column will be the numeric aspect ratio of an image as displayed in a web page. */
      columnDisplayed: "Aspect Ratio (Displayed)",
      /**  Label for a column in a data table; entries in the column will be the numeric aspect ratio of the raw (actual) image. */
      columnActual: "Aspect Ratio (Actual)"
    };
    str_88 = createIcuMessageFn({ url: "core/audits/image-aspect-ratio.js" }.url, UIStrings109);
    THRESHOLD_PX = 2;
    ImageAspectRatio = class _ImageAspectRatio extends Audit {
      static {
        __name(this, "ImageAspectRatio");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "image-aspect-ratio",
          title: str_88(UIStrings109.title),
          failureTitle: str_88(UIStrings109.failureTitle),
          description: str_88(UIStrings109.description),
          requiredArtifacts: ["ImageElements"]
        };
      }
      /**
       * @param {WellDefinedImage} image
       * @return {{url: string, node: LH.Audit.Details.NodeValue, displayedAspectRatio: string, actualAspectRatio: string, doRatiosMatch: boolean}}
       */
      static computeAspectRatios(image) {
        const url = url_utils_default.elideDataURI(image.src);
        const actualAspectRatio = image.naturalDimensions.width / image.naturalDimensions.height;
        const displayedAspectRatio = image.displayedWidth / image.displayedHeight;
        const targetDisplayHeight = image.displayedWidth / actualAspectRatio;
        const targetDisplayWidth = image.displayedHeight * actualAspectRatio;
        const doRatiosMatch = targetDisplayHeight < targetDisplayWidth ? Math.abs(targetDisplayHeight - image.displayedHeight) < THRESHOLD_PX : Math.abs(targetDisplayWidth - image.displayedWidth) < THRESHOLD_PX;
        return {
          url,
          node: Audit.makeNodeItem(image.node),
          displayedAspectRatio: `${image.displayedWidth} x ${image.displayedHeight}
        (${displayedAspectRatio.toFixed(2)})`,
          actualAspectRatio: `${image.naturalDimensions.width} x ${image.naturalDimensions.height}
        (${actualAspectRatio.toFixed(2)})`,
          doRatiosMatch
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const images = artifacts.ImageElements;
        const results = [];
        images.filter((image) => {
          return !image.isCss && url_utils_default.guessMimeType(image.src) !== "image/svg+xml" && image.naturalDimensions && image.naturalDimensions.height > 5 && image.naturalDimensions.width > 5 && image.displayedWidth && image.displayedHeight && image.computedStyles.objectFit === "fill";
        }).forEach((image) => {
          const wellDefinedImage = (
            /** @type {WellDefinedImage} */
            image
          );
          const processed = _ImageAspectRatio.computeAspectRatios(wellDefinedImage);
          if (!processed.doRatiosMatch) results.push(processed);
        });
        const headings = [
          { key: "node", valueType: "node", label: "" },
          { key: "url", valueType: "url", label: str_88(UIStrings.columnURL) },
          { key: "displayedAspectRatio", valueType: "text", label: str_88(UIStrings109.columnDisplayed) },
          { key: "actualAspectRatio", valueType: "text", label: str_88(UIStrings109.columnActual) }
        ];
        return {
          score: Number(results.length === 0),
          details: Audit.makeTableDetails(headings, results)
        };
      }
    };
    image_aspect_ratio_default = ImageAspectRatio;
  }
});

// core/computed/image-records.js
var ImageRecords, ImageRecordsComputed;
var init_image_records = __esm({
  "core/computed/image-records.js"() {
    "use strict";
    init_process_global();
    init_url_utils();
    init_computed_artifact();
    /**
     * @license
     * Copyright 2021 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ImageRecords = class _ImageRecords {
      static {
        __name(this, "ImageRecords");
      }
      /**
       * @param {LH.Artifacts.NetworkRequest[]} networkRecords
       */
      static indexNetworkRecords(networkRecords) {
        return networkRecords.reduce(
          (map, record) => {
            const isImage = /^image/.test(record.mimeType) || /\.(avif|webp)$/i.test(record.url);
            if (isImage && record.finished && record.statusCode === 200) {
              map[record.url] = record;
            }
            return map;
          },
          /** @type {Record<string, LH.Artifacts.NetworkRequest>} */
          {}
        );
      }
      /**
       * @param {{ImageElements: LH.Artifacts['ImageElements'], networkRecords: LH.Artifacts.NetworkRequest[]}} data
       * @return {Promise<LH.Artifacts.ImageElementRecord[]>}
       */
      static async compute_(data31) {
        const indexedNetworkRecords = _ImageRecords.indexNetworkRecords(data31.networkRecords);
        const imageRecords = [];
        for (const element of data31.ImageElements) {
          const networkRecord = indexedNetworkRecords[element.src];
          const mimeType = networkRecord?.mimeType;
          imageRecords.push({
            ...element,
            mimeType: mimeType ? mimeType : url_utils_default.guessMimeType(element.src)
          });
        }
        imageRecords.sort((a, b) => {
          const aRecord = indexedNetworkRecords[a.src] || {};
          const bRecord = indexedNetworkRecords[b.src] || {};
          return bRecord.resourceSize - aRecord.resourceSize;
        });
        return imageRecords;
      }
    };
    ImageRecordsComputed = makeComputedArtifact(ImageRecords, ["ImageElements", "networkRecords"]);
  }
});

// core/audits/image-size-responsive.js
var image_size_responsive_exports = {};
__export(image_size_responsive_exports, {
  UIStrings: () => UIStrings110,
  default: () => image_size_responsive_default
});
function isVisible(imageRect, viewportDimensions) {
  return (imageRect.bottom - imageRect.top) * (imageRect.right - imageRect.left) > 0 && imageRect.top <= viewportDimensions.innerHeight && imageRect.bottom >= 0 && imageRect.left <= viewportDimensions.innerWidth && imageRect.right >= 0;
}
function isSmallerThanViewport(imageRect, viewportDimensions) {
  return imageRect.bottom - imageRect.top <= viewportDimensions.innerHeight && imageRect.right - imageRect.left <= viewportDimensions.innerWidth;
}
function isCandidate(image, imageRecord) {
  const artisticImageRenderingValues = ["pixelated", "crisp-edges"];
  const densityDescriptorRegex = / \d+(\.\d+)?x/;
  if (image.displayedWidth <= 1 || image.displayedHeight <= 1) {
    return false;
  }
  if (!image.naturalDimensions || !image.naturalDimensions.width || !image.naturalDimensions.height) {
    return false;
  }
  if (imageRecord?.mimeType === "image/svg+xml") {
    return false;
  }
  if (url_utils_default.guessMimeType(image.src) === "image/svg+xml") {
    return false;
  }
  if (image.isCss) {
    return false;
  }
  if (image.computedStyles.objectFit !== "fill") {
    return false;
  }
  if (artisticImageRenderingValues.includes(image.computedStyles.imageRendering)) {
    return false;
  }
  if (densityDescriptorRegex.test(image.srcset)) {
    return false;
  }
  return true;
}
function imageHasNaturalDimensions(image) {
  return !!image.naturalDimensions;
}
function imageHasRightSize(image, DPR) {
  const [expectedWidth, expectedHeight] = allowedImageSize(image.displayedWidth, image.displayedHeight, DPR);
  return image.naturalDimensions.width >= expectedWidth && image.naturalDimensions.height >= expectedHeight;
}
function getResult(image, DPR) {
  const [expectedWidth, expectedHeight] = expectedImageSize(image.displayedWidth, image.displayedHeight, DPR);
  return {
    url: url_utils_default.elideDataURI(image.src),
    node: Audit.makeNodeItem(image.node),
    displayedSize: `${image.displayedWidth} x ${image.displayedHeight}`,
    actualSize: `${image.naturalDimensions.width} x ${image.naturalDimensions.height}`,
    actualPixels: image.naturalDimensions.width * image.naturalDimensions.height,
    expectedSize: `${expectedWidth} x ${expectedHeight}`,
    expectedPixels: expectedWidth * expectedHeight
  };
}
function allowedImageSize(displayedWidth, displayedHeight, DPR) {
  let factor = SMALL_IMAGE_FACTOR;
  if (displayedWidth > SMALL_IMAGE_THRESHOLD || displayedHeight > SMALL_IMAGE_THRESHOLD) {
    factor = LARGE_IMAGE_FACTOR;
  }
  const requiredDpr = quantizeDpr(DPR);
  const width = Math.ceil(factor * requiredDpr * displayedWidth);
  const height = Math.ceil(factor * requiredDpr * displayedHeight);
  return [width, height];
}
function expectedImageSize(displayedWidth, displayedHeight, DPR) {
  const width = Math.ceil(quantizeDpr(DPR) * displayedWidth);
  const height = Math.ceil(quantizeDpr(DPR) * displayedHeight);
  return [width, height];
}
function deduplicateResultsByUrl(results) {
  results.sort((a, b) => a.url === b.url ? 0 : a.url < b.url ? -1 : 1);
  const deduplicated = [];
  for (const r of results) {
    const previousResult = deduplicated[deduplicated.length - 1];
    if (previousResult && previousResult.url === r.url) {
      if (previousResult.expectedPixels < r.expectedPixels) {
        deduplicated[deduplicated.length - 1] = r;
      }
    } else {
      deduplicated.push(r);
    }
  }
  return deduplicated;
}
function sortResultsBySizeDelta(results) {
  return results.sort(
    (a, b) => b.expectedPixels - b.actualPixels - (a.expectedPixels - a.actualPixels)
  );
}
function quantizeDpr(dpr) {
  if (dpr >= 2) {
    return 2;
  }
  if (dpr >= 1.5) {
    return 1.5;
  }
  return 1;
}
var UIStrings110, str_89, SMALL_IMAGE_FACTOR, LARGE_IMAGE_FACTOR, SMALL_IMAGE_THRESHOLD, ImageSizeResponsive, image_size_responsive_default;
var init_image_size_responsive = __esm({
  "core/audits/image-size-responsive.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_image_records();
    init_network_records();
    init_url_utils();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings110 = {
      /** Title of a Lighthouse audit that provides detail on the size of visible images on the page. This descriptive title is shown to users when all images have correct sizes. */
      title: "Serves images with appropriate resolution",
      /** Title of a Lighthouse audit that provides detail on the size of visible images on the page. This descriptive title is shown to users when not all images have correct sizes. */
      failureTitle: "Serves images with low resolution",
      /** Description of a Lighthouse audit that tells the user why they should maintain an appropriate size for all images. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Image natural dimensions should be proportional to the display size and the pixel ratio to maximize image clarity. [Learn how to provide responsive images](https://web.dev/articles/serve-responsive-images).",
      /**  Label for a column in a data table; entries in the column will be a string representing the displayed size of the image. */
      columnDisplayed: "Displayed size",
      /**  Label for a column in a data table; entries in the column will be a string representing the actual size of the image. */
      columnActual: "Actual size",
      /**  Label for a column in a data table; entries in the column will be a string representing the expected size of the image. */
      columnExpected: "Expected size"
    };
    str_89 = createIcuMessageFn({ url: "core/audits/image-size-responsive.js" }.url, UIStrings110);
    SMALL_IMAGE_FACTOR = 1;
    LARGE_IMAGE_FACTOR = 0.75;
    SMALL_IMAGE_THRESHOLD = 64;
    __name(isVisible, "isVisible");
    __name(isSmallerThanViewport, "isSmallerThanViewport");
    __name(isCandidate, "isCandidate");
    __name(imageHasNaturalDimensions, "imageHasNaturalDimensions");
    __name(imageHasRightSize, "imageHasRightSize");
    __name(getResult, "getResult");
    __name(allowedImageSize, "allowedImageSize");
    __name(expectedImageSize, "expectedImageSize");
    __name(deduplicateResultsByUrl, "deduplicateResultsByUrl");
    __name(sortResultsBySizeDelta, "sortResultsBySizeDelta");
    ImageSizeResponsive = class extends Audit {
      static {
        __name(this, "ImageSizeResponsive");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "image-size-responsive",
          title: str_89(UIStrings110.title),
          failureTitle: str_89(UIStrings110.failureTitle),
          description: str_89(UIStrings110.description),
          requiredArtifacts: ["ImageElements", "ViewportDimensions"],
          __internalOptionalArtifacts: ["DevtoolsLog"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const DPR = artifacts.ViewportDimensions.devicePixelRatio;
        const imageRecordsByURL = /* @__PURE__ */ new Map();
        if (artifacts.DevtoolsLog) {
          const networkRecords = await NetworkRecordsComputed.request(artifacts.DevtoolsLog, context);
          const images = await ImageRecordsComputed.request({
            ImageElements: artifacts.ImageElements,
            networkRecords
          }, context);
          images.forEach((img) => imageRecordsByURL.set(img.src, img));
        }
        const results = Array.from(artifacts.ImageElements).filter((image) => isCandidate(image, imageRecordsByURL.get(image.src))).filter(imageHasNaturalDimensions).filter((image) => !imageHasRightSize(image, DPR)).filter((image) => isVisible(image.clientRect, artifacts.ViewportDimensions)).filter((image) => isSmallerThanViewport(image.clientRect, artifacts.ViewportDimensions)).map((image) => getResult(image, DPR));
        const headings = [
          { key: "node", valueType: "node", label: "" },
          { key: "url", valueType: "url", label: str_89(UIStrings.columnURL) },
          { key: "displayedSize", valueType: "text", label: str_89(UIStrings110.columnDisplayed) },
          { key: "actualSize", valueType: "text", label: str_89(UIStrings110.columnActual) },
          { key: "expectedSize", valueType: "text", label: str_89(UIStrings110.columnExpected) }
        ];
        const finalResults = sortResultsBySizeDelta(deduplicateResultsByUrl(results));
        return {
          score: Number(results.length === 0),
          details: Audit.makeTableDetails(headings, finalResults)
        };
      }
    };
    __name(quantizeDpr, "quantizeDpr");
    image_size_responsive_default = ImageSizeResponsive;
  }
});

// core/audits/is-on-https.js
var is_on_https_exports = {};
__export(is_on_https_exports, {
  UIStrings: () => UIStrings111,
  default: () => is_on_https_default
});
var UIStrings111, resolutionToString, str_90, HTTPS, is_on_https_default;
var init_is_on_https = __esm({
  "core/audits/is-on-https.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_url_utils();
    init_network_request();
    init_network_records();
    init_i18n();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings111 = {
      /** Title of a Lighthouse audit that provides detail on the useage of HTTPS on a page. This descriptive title is shown to users when all requests on a page are fufilled using HTTPS. */
      title: "Uses HTTPS",
      /** Title of a Lighthouse audit that provides detail on the useage of HTTPS on a page. This descriptive title is shown to users when some, or all, requests on the page use HTTP instead of HTTPS. */
      failureTitle: "Does not use HTTPS",
      /** Description of a Lighthouse audit that tells the user *why* HTTPS use *for all resources* is important. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "All sites should be protected with HTTPS, even ones that don't handle sensitive data. This includes avoiding [mixed content](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content), where some resources are loaded over HTTP despite the initial request being served over HTTPS. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more about HTTPS](https://developer.chrome.com/docs/lighthouse/pwa/is-on-https/).",
      /** [ICU Syntax] Label identifying the number of insecure network requests found by an audit of a web page. */
      displayValue: `{itemCount, plural,
    =1 {1 insecure request found}
    other {# insecure requests found}
    }`,
      /** Label for a column in a data table; entries in the column will be the URLs of insecure (non-HTTPS) network requests. */
      columnInsecureURL: "Insecure URL",
      /** Label for a column in a data table; entries in the column will be how the browser handled insecure (non-HTTPS) network requests. */
      columnResolution: "Request Resolution",
      /** Value for the resolution column in a data table; denotes that the insecure URL was allowed by the browser. */
      allowed: "Allowed",
      /** Value for the resolution column in a data table; denotes that the insecure URL was blocked by the browser. */
      blocked: "Blocked",
      /** Value for the resolution column in a data table; denotes that the insecure URL may be blocked by the browser in the future. */
      warning: "Allowed with warning",
      /** Value for the resolution column in a data table; denotes that the insecure URL was upgraded to a secure request by the browser. */
      upgraded: "Automatically upgraded to HTTPS"
    };
    resolutionToString = {
      MixedContentAutomaticallyUpgraded: UIStrings111.upgraded,
      MixedContentBlocked: UIStrings111.blocked,
      MixedContentWarning: UIStrings111.warning
    };
    str_90 = createIcuMessageFn({ url: "core/audits/is-on-https.js" }.url, UIStrings111);
    HTTPS = class extends Audit {
      static {
        __name(this, "HTTPS");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "is-on-https",
          title: str_90(UIStrings111.title),
          failureTitle: str_90(UIStrings111.failureTitle),
          description: str_90(UIStrings111.description),
          requiredArtifacts: ["DevtoolsLog", "InspectorIssues"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const devtoolsLogs = artifacts.DevtoolsLog;
        const networkRecords = await NetworkRecordsComputed.request(devtoolsLogs, context);
        const insecureURLs = networkRecords.filter((record) => !NetworkRequest.isSecureRequest(record)).map((record) => url_utils_default.elideDataURI(record.url));
        const items = Array.from(new Set(insecureURLs)).map((url) => ({ url, resolution: void 0 }));
        const headings = [
          { key: "url", valueType: "url", label: str_90(UIStrings111.columnInsecureURL) },
          { key: "resolution", valueType: "text", label: str_90(UIStrings111.columnResolution) }
        ];
        for (const details of artifacts.InspectorIssues.mixedContentIssue ?? []) {
          let item = items.find((item2) => item2.url === details.insecureURL);
          if (!item) {
            item = { url: details.insecureURL };
            items.push(item);
          }
          item.resolution = resolutionToString[details.resolutionStatus] ? str_90(resolutionToString[details.resolutionStatus]) : details.resolutionStatus;
        }
        for (const item of items) {
          if (!item.resolution) item.resolution = str_90(UIStrings111.allowed);
        }
        let displayValue;
        if (items.length > 0) {
          displayValue = str_90(UIStrings111.displayValue, { itemCount: items.length });
        }
        return {
          score: Number(items.length === 0),
          displayValue,
          details: Audit.makeTableDetails(headings, items)
        };
      }
    };
    is_on_https_default = HTTPS;
  }
});

// core/lib/rect-helpers.js
function addRectTopAndBottom({ x, y, width, height }) {
  return {
    left: x,
    top: y,
    right: x + width,
    bottom: y + height,
    width,
    height
  };
}
function getRectOverlapArea(rect1, rect2) {
  const rectYOverlap = Math.min(rect1.bottom, rect2.bottom) - Math.max(rect1.top, rect2.top);
  if (rectYOverlap <= 0) return 0;
  const rectXOverlap = Math.min(rect1.right, rect2.right) - Math.max(rect1.left, rect2.left);
  if (rectXOverlap <= 0) return 0;
  return rectXOverlap * rectYOverlap;
}
function getRectArea(rect) {
  return rect.width * rect.height;
}
function traceRectToLHRect(rect) {
  const rectArgs = {
    x: rect[0],
    y: rect[1],
    width: rect[2],
    height: rect[3]
  };
  return addRectTopAndBottom(rectArgs);
}
var init_rect_helpers = __esm({
  "core/lib/rect-helpers.js"() {
    "use strict";
    init_process_global();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    __name(addRectTopAndBottom, "addRectTopAndBottom");
    __name(getRectOverlapArea, "getRectOverlapArea");
    __name(getRectArea, "getRectArea");
    __name(traceRectToLHRect, "traceRectToLHRect");
  }
});

// core/lib/polyfill-dom-rect.js
function polyfillDOMRect() {
  (function(global2) {
    function number(v) {
      return v === void 0 ? 0 : Number(v);
    }
    __name(number, "number");
    function different(u, v) {
      return u !== v && !(isNaN(u) && isNaN(v));
    }
    __name(different, "different");
    function DOMRect(xArg, yArg, wArg, hArg) {
      let x, y, width, height, left, right, top, bottom;
      x = number(xArg);
      y = number(yArg);
      width = number(wArg);
      height = number(hArg);
      Object.defineProperties(this, {
        x: {
          get: /* @__PURE__ */ __name(function() {
            return x;
          }, "get"),
          set: /* @__PURE__ */ __name(function(newX) {
            if (different(x, newX)) {
              x = newX;
              left = right = void 0;
            }
          }, "set"),
          enumerable: true
        },
        y: {
          get: /* @__PURE__ */ __name(function() {
            return y;
          }, "get"),
          set: /* @__PURE__ */ __name(function(newY) {
            if (different(y, newY)) {
              y = newY;
              top = bottom = void 0;
            }
          }, "set"),
          enumerable: true
        },
        width: {
          get: /* @__PURE__ */ __name(function() {
            return width;
          }, "get"),
          set: /* @__PURE__ */ __name(function(newWidth) {
            if (different(width, newWidth)) {
              width = newWidth;
              left = right = void 0;
            }
          }, "set"),
          enumerable: true
        },
        height: {
          get: /* @__PURE__ */ __name(function() {
            return height;
          }, "get"),
          set: /* @__PURE__ */ __name(function(newHeight) {
            if (different(height, newHeight)) {
              height = newHeight;
              top = bottom = void 0;
            }
          }, "set"),
          enumerable: true
        },
        left: {
          get: /* @__PURE__ */ __name(function() {
            if (left === void 0) {
              left = x + Math.min(0, width);
            }
            return left;
          }, "get"),
          enumerable: true
        },
        right: {
          get: /* @__PURE__ */ __name(function() {
            if (right === void 0) {
              right = x + Math.max(0, width);
            }
            return right;
          }, "get"),
          enumerable: true
        },
        top: {
          get: /* @__PURE__ */ __name(function() {
            if (top === void 0) {
              top = y + Math.min(0, height);
            }
            return top;
          }, "get"),
          enumerable: true
        },
        bottom: {
          get: /* @__PURE__ */ __name(function() {
            if (bottom === void 0) {
              bottom = y + Math.max(0, height);
            }
            return bottom;
          }, "get"),
          enumerable: true
        }
      });
    }
    __name(DOMRect, "DOMRect");
    globalThis.DOMRect = DOMRect;
  })(globalThis);
}
var init_polyfill_dom_rect = __esm({
  "core/lib/polyfill-dom-rect.js"() {
    "use strict";
    init_process_global();
    __name(polyfillDOMRect, "polyfillDOMRect");
  }
});

// core/lib/trace-engine.js
var TraceProcessor3, TraceHandlers;
var init_trace_engine = __esm({
  "core/lib/trace-engine.js"() {
    "use strict";
    init_process_global();
    init_trace2();
    init_polyfill_dom_rect();
    polyfillDOMRect();
    TraceProcessor3 = Processor_exports.TraceProcessor;
    TraceHandlers = handlers_exports.ModelHandlers;
  }
});

// core/computed/metrics/cumulative-layout-shift.js
var RECENT_INPUT_WINDOW, CumulativeLayoutShift, CumulativeLayoutShiftComputed;
var init_cumulative_layout_shift = __esm({
  "core/computed/metrics/cumulative-layout-shift.js"() {
    "use strict";
    init_process_global();
    init_computed_artifact();
    init_processed_trace();
    init_rect_helpers();
    init_trace_engine();
    init_sentry();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    RECENT_INPUT_WINDOW = 500;
    CumulativeLayoutShift = class _CumulativeLayoutShift {
      static {
        __name(this, "CumulativeLayoutShift");
      }
      /**
       * Returns all LayoutShift events that had no recent input.
       * Only a `weightedScore` per event is returned. For non-main-frame events, this is
       * the only score that matters. For main-frame events, `weighted_score_delta === score`.
       * @see https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/layout/layout_shift_tracker.cc;l=492-495;drc=de3b3a8a8839269c6b44403fa38a13a1ed12fed5
       * @param {LH.Artifacts.ProcessedTrace} processedTrace
       * @return {Array<LayoutShiftEvent>}
       */
      static getLayoutShiftEvents(processedTrace) {
        const layoutShiftEvents2 = [];
        let mustRespectHadRecentInput = false;
        let viewportChangeTs = processedTrace.timestamps.timeOrigin;
        const firstViewportEvent = processedTrace.frameEvents.find((event) => event.name === "viewport");
        if (firstViewportEvent) {
          viewportChangeTs = firstViewportEvent.ts;
        }
        for (const event of processedTrace.frameTreeEvents) {
          if (event.name !== "LayoutShift" || !event.args.data || event.args.data.is_main_frame === void 0) {
            continue;
          }
          if (event.args.data.weighted_score_delta === void 0) {
            throw new Error("CLS missing weighted_score_delta");
          }
          if (event.args.data.had_recent_input) {
            const timing = (event.ts - viewportChangeTs) / 1e3;
            if (timing > RECENT_INPUT_WINDOW || mustRespectHadRecentInput) continue;
          } else {
            mustRespectHadRecentInput = true;
          }
          layoutShiftEvents2.push({
            ts: event.ts,
            isMainFrame: event.args.data.is_main_frame,
            weightedScore: event.args.data.weighted_score_delta,
            impactedNodes: event.args.data.impacted_nodes,
            event
          });
        }
        return layoutShiftEvents2;
      }
      /**
       * Each layout shift event has a 'score' which is the amount added to the CLS as a result of the given shift(s).
       * We calculate the score per element by taking the 'score' of each layout shift event and
       * distributing it between all the nodes that were shifted, proportianal to the impact region of
       * each shifted element.
       *
       * @param {LayoutShiftEvent[]} layoutShiftEvents
       * @return {Map<number, number>}
       */
      static getImpactByNodeId(layoutShiftEvents2) {
        const impactByNodeId = /* @__PURE__ */ new Map();
        for (const event of layoutShiftEvents2) {
          if (!event.impactedNodes) continue;
          let totalAreaOfImpact = 0;
          const pixelsMovedPerNode = /* @__PURE__ */ new Map();
          for (const node of event.impactedNodes) {
            if (!node.node_id || !node.old_rect || !node.new_rect) continue;
            const oldRect = traceRectToLHRect(node.old_rect);
            const newRect = traceRectToLHRect(node.new_rect);
            const areaOfImpact = getRectArea(oldRect) + getRectArea(newRect) - getRectOverlapArea(oldRect, newRect);
            pixelsMovedPerNode.set(node.node_id, areaOfImpact);
            totalAreaOfImpact += areaOfImpact;
          }
          for (const [nodeId, pixelsMoved] of pixelsMovedPerNode.entries()) {
            let clsContribution = impactByNodeId.get(nodeId) || 0;
            clsContribution += pixelsMoved / totalAreaOfImpact * event.weightedScore;
            impactByNodeId.set(nodeId, clsContribution);
          }
        }
        return impactByNodeId;
      }
      /**
       * Calculates cumulative layout shifts per cluster (session) of LayoutShift
       * events -- where a new cluster is created when there's a gap of more than
       * 1000ms since the last LayoutShift event or the cluster is greater than
       * 5000ms long -- and returns the max LayoutShift score found.
       * @param {Array<LayoutShiftEvent>} layoutShiftEvents
       * @return {number}
       */
      static calculate(layoutShiftEvents2) {
        const gapMicroseconds = 1e6;
        const limitMicroseconds = 5e6;
        let maxScore = 0;
        let currentClusterScore = 0;
        let firstTs = Number.NEGATIVE_INFINITY;
        let prevTs = Number.NEGATIVE_INFINITY;
        for (const event of layoutShiftEvents2) {
          if (event.ts - firstTs > limitMicroseconds || event.ts - prevTs > gapMicroseconds) {
            firstTs = event.ts;
            currentClusterScore = 0;
          }
          prevTs = event.ts;
          currentClusterScore += event.weightedScore;
          maxScore = Math.max(maxScore, currentClusterScore);
        }
        return maxScore;
      }
      /**
       * @param {LayoutShiftEvent[]} allFrameShiftEvents
       * @param {LayoutShiftEvent[]} mainFrameShiftEvents
       */
      static async computeWithSharedTraceEngine(allFrameShiftEvents, mainFrameShiftEvents) {
        const run = /* @__PURE__ */ __name(async (events) => {
          const processor = new TraceProcessor3({
            LayoutShifts: TraceHandlers.LayoutShifts,
            Screenshots: TraceHandlers.Screenshots
          });
          await processor.parse(
            /** @type {import('@paulirish/trace_engine').Types.Events.Event[]} */
            events,
            {}
          );
          if (!processor.data) {
            throw new Error("null trace engine result");
          }
          return processor.data.LayoutShifts.sessionMaxScore;
        }, "run");
        const cumulativeLayoutShift = await run(allFrameShiftEvents.map((e) => e.event));
        const cumulativeLayoutShiftMainFrame = await run(mainFrameShiftEvents.map((e) => e.event));
        return { cumulativeLayoutShift, cumulativeLayoutShiftMainFrame };
      }
      /**
       * @param {LH.Trace} trace
       * @param {LH.Artifacts.ComputedContext} context
       * @return {Promise<{cumulativeLayoutShift: number, cumulativeLayoutShiftMainFrame: number, impactByNodeId: Map<number, number>, newEngineResult?: {cumulativeLayoutShift: number, cumulativeLayoutShiftMainFrame: number}, newEngineResultDiffered: boolean}>}
       */
      static async compute_(trace, context) {
        const processedTrace = await ProcessedTraceComputed.request(trace, context);
        const allFrameShiftEvents = _CumulativeLayoutShift.getLayoutShiftEvents(processedTrace);
        const impactByNodeId = _CumulativeLayoutShift.getImpactByNodeId(allFrameShiftEvents);
        const mainFrameShiftEvents = allFrameShiftEvents.filter((e) => e.isMainFrame);
        const cumulativeLayoutShift = _CumulativeLayoutShift.calculate(allFrameShiftEvents);
        const cumulativeLayoutShiftMainFrame = _CumulativeLayoutShift.calculate(mainFrameShiftEvents);
        let newEngineResult;
        let newEngineResultDiffered = false;
        let tryNewTraceEngine = true;
        if (allFrameShiftEvents.some((e) => e.event.args.data?.had_recent_input)) {
          tryNewTraceEngine = false;
        }
        if (tryNewTraceEngine) {
          try {
            newEngineResult = await this.computeWithSharedTraceEngine(allFrameShiftEvents, mainFrameShiftEvents);
            newEngineResultDiffered = newEngineResult.cumulativeLayoutShift !== cumulativeLayoutShift || newEngineResult.cumulativeLayoutShiftMainFrame !== cumulativeLayoutShiftMainFrame;
            if (newEngineResultDiffered) {
              newEngineResultDiffered = true;
              const expected = JSON.stringify({ cumulativeLayoutShift, cumulativeLayoutShiftMainFrame });
              const got = JSON.stringify(newEngineResult);
              throw new Error(`new trace engine differed. expected: ${expected}, got: ${got}`);
            }
          } catch (err) {
            console.error(err);
            newEngineResultDiffered = true;
            const error = new Error("Error when using new trace engine", { cause: err });
            if (global.expect) {
              throw error;
            } else {
              Sentry.captureException(error, {
                tags: { computed: "new-trace-engine" },
                level: "error",
                extra: {
                  // Not sure if Sentry handles `cause`, so just in case add the info in a second place.
                  errorMsg: err.toString()
                }
              });
            }
          }
        }
        return {
          cumulativeLayoutShift,
          cumulativeLayoutShiftMainFrame,
          impactByNodeId,
          newEngineResult,
          newEngineResultDiffered
        };
      }
    };
    CumulativeLayoutShiftComputed = makeComputedArtifact(CumulativeLayoutShift, null);
  }
});

// core/audits/metrics/cumulative-layout-shift.js
var cumulative_layout_shift_exports = {};
__export(cumulative_layout_shift_exports, {
  UIStrings: () => UIStrings112,
  default: () => cumulative_layout_shift_default
});
var UIStrings112, str_91, CumulativeLayoutShift2, cumulative_layout_shift_default;
var init_cumulative_layout_shift2 = __esm({
  "core/audits/metrics/cumulative-layout-shift.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_cumulative_layout_shift();
    init_i18n();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings112 = {
      /** Description of the Cumulative Layout Shift metric that indicates how much the page changes its layout while it loads. If big segments of the page shift their location during load, the Cumulative Layout Shift will be higher. This description is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Cumulative Layout Shift measures the movement of visible elements within the viewport. [Learn more about the Cumulative Layout Shift metric](https://web.dev/articles/cls)."
    };
    str_91 = createIcuMessageFn({ url: "core/audits/metrics/cumulative-layout-shift.js" }.url, UIStrings112);
    CumulativeLayoutShift2 = class extends Audit {
      static {
        __name(this, "CumulativeLayoutShift");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "cumulative-layout-shift",
          title: str_91(UIStrings.cumulativeLayoutShiftMetric),
          description: str_91(UIStrings112.description),
          scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
          requiredArtifacts: ["Trace"]
        };
      }
      /**
       * @return {LH.Audit.ScoreOptions}
       */
      static get defaultOptions() {
        return {
          // https://web.dev/articles/cls#what_is_a_good_cls_score
          // This 0.1 target score was determined through both manual evaluation and large-scale analysis.
          // see https://www.desmos.com/calculator/ksp7q91nop
          p10: 0.1,
          median: 0.25
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const trace = artifacts.Trace;
        const { cumulativeLayoutShift, impactByNodeId, ...rest } = await CumulativeLayoutShiftComputed.request(trace, context);
        const details = {
          type: "debugdata",
          items: [rest]
        };
        const scoringOptions = { p10: context.options.p10, median: context.options.median };
        return {
          score: Audit.computeLogNormalScore(
            scoringOptions,
            cumulativeLayoutShift
          ),
          scoringOptions,
          numericValue: cumulativeLayoutShift,
          numericUnit: "unitless",
          displayValue: cumulativeLayoutShift.toLocaleString(context.settings.locale),
          details
        };
      }
    };
    cumulative_layout_shift_default = CumulativeLayoutShift2;
  }
});

// core/audits/origin-isolation.js
var origin_isolation_exports = {};
__export(origin_isolation_exports, {
  UIStrings: () => UIStrings113,
  default: () => origin_isolation_default
});
var UIStrings113, str_92, OriginIsolation, origin_isolation_default;
var init_origin_isolation = __esm({
  "core/audits/origin-isolation.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_main_resource();
    init_i18n();
    /**
     * @license
     * Copyright 2024 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings113 = {
      /** Title of a Lighthouse audit that evaluates the security of a page's COOP header for origin isolation. "COOP" stands for "Cross-Origin-Opener-Policy" and should not be translated. */
      title: "Ensure proper origin isolation with COOP",
      /** Description of a Lighthouse audit that evaluates the security of a page's COOP header for origin isolation. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. "COOP" stands for "Cross-Origin-Opener-Policy", neither should be translated. */
      description: "The Cross-Origin-Opener-Policy (COOP) can be used to isolate the top-level window from other documents such as pop-ups. [Learn more about deploying the COOP header.](https://web.dev/articles/why-coop-coep#coop)",
      /** Summary text for the results of a Lighthouse audit that evaluates the COOP header for origin isolation. This is displayed if no COOP header is deployed. "COOP" stands for "Cross-Origin-Opener-Policy" and should not be translated. */
      noCoop: "No COOP header found",
      /** Table item value calling out the presence of a syntax error. */
      invalidSyntax: "Invalid syntax",
      /** Label for a column in a data table; entries will be a directive of the COOP header. "COOP" stands for "Cross-Origin-Opener-Policy". */
      columnDirective: "Directive",
      /** Label for a column in a data table; entries will be the severity of an issue with the COOP header. "COOP" stands for "Cross-Origin-Opener-Policy". */
      columnSeverity: "Severity"
    };
    str_92 = createIcuMessageFn({ url: "core/audits/origin-isolation.js" }.url, UIStrings113);
    OriginIsolation = class extends Audit {
      static {
        __name(this, "OriginIsolation");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "origin-isolation",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_92(UIStrings113.title),
          description: str_92(UIStrings113.description),
          requiredArtifacts: ["DevtoolsLog", "URL"],
          supportedModes: ["navigation"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<string[]>}
       */
      static async getRawCoop(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        let coopHeaders = mainResource.responseHeaders.filter((h) => {
          return h.name.toLowerCase() === "cross-origin-opener-policy";
        }).flatMap((h) => h.value);
        coopHeaders = coopHeaders.map((v) => v.toLowerCase().replace(/\s/g, ""));
        return coopHeaders;
      }
      /**
       * @param {string | undefined} coopDirective
       * @param {LH.IcuMessage | string} findingDescription
       * @param {LH.IcuMessage=} severity
       * @return {LH.Audit.Details.TableItem}
       */
      static findingToTableItem(coopDirective, findingDescription, severity) {
        return {
          directive: coopDirective,
          description: findingDescription,
          severity
        };
      }
      /**
       * @param {string[]} coopHeaders
       * @return {{score: number, results: LH.Audit.Details.TableItem[]}}
       */
      static constructResults(coopHeaders) {
        const rawCoop = [...coopHeaders];
        const allowedDirectives = [
          "unsafe-none",
          "same-origin-allow-popups",
          "same-origin",
          "noopener-allow-popups"
        ];
        const violations = [];
        const syntax = [];
        if (!rawCoop.length) {
          violations.push({
            severity: str_92(UIStrings.itemSeverityHigh),
            description: str_92(UIStrings113.noCoop),
            directive: void 0
          });
        }
        for (const actualDirective of coopHeaders) {
          if (!allowedDirectives.includes(actualDirective)) {
            syntax.push({
              severity: str_92(UIStrings.itemSeverityLow),
              description: str_92(UIStrings113.invalidSyntax),
              directive: actualDirective
            });
          }
        }
        const results = [
          ...violations.map(
            (f) => this.findingToTableItem(
              f.directive,
              f.description,
              str_92(UIStrings.itemSeverityHigh)
            )
          ),
          ...syntax.map(
            (f) => this.findingToTableItem(
              f.directive,
              f.description,
              str_92(UIStrings.itemSeverityLow)
            )
          )
        ];
        return { score: violations.length || syntax.length ? 0 : 1, results };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const coopHeaders = await this.getRawCoop(artifacts, context);
        const { score, results } = this.constructResults(coopHeaders);
        const headings = [
          /* eslint-disable max-len */
          { key: "description", valueType: "text", subItemsHeading: { key: "description" }, label: str_92(UIStrings.columnDescription) },
          { key: "directive", valueType: "code", subItemsHeading: { key: "directive" }, label: str_92(UIStrings113.columnDirective) },
          { key: "severity", valueType: "text", subItemsHeading: { key: "severity" }, label: str_92(UIStrings113.columnSeverity) }
          /* eslint-enable max-len */
        ];
        const details = Audit.makeTableDetails(headings, results);
        return {
          score,
          notApplicable: !results.length,
          details
        };
      }
    };
    origin_isolation_default = OriginIsolation;
  }
});

// core/audits/redirects-http.js
var redirects_http_exports = {};
__export(redirects_http_exports, {
  UIStrings: () => UIStrings114,
  default: () => redirects_http_default
});
var UIStrings114, str_93, RedirectsHTTP, redirects_http_default;
var init_redirects_http = __esm({
  "core/audits/redirects-http.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    init_url_utils();
    /**
     * @license Copyright 2024 The Lighthouse Authors. All Rights Reserved.
     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
     */
    UIStrings114 = {
      /** Title of a Lighthouse audit that provides detail on HTTP to HTTPS redirects. This descriptive title is shown to users when HTTP traffic is redirected to HTTPS. */
      title: "Redirects HTTP traffic to HTTPS",
      /** Title of a Lighthouse audit that provides detail on HTTP to HTTPS redirects. This descriptive title is shown to users when HTTP traffic is not redirected to HTTPS. */
      failureTitle: "Does not redirect HTTP traffic to HTTPS",
      /** Description of a Lighthouse audit that tells the user why they should direct HTTP traffic to HTTPS. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
      description: "Make sure that you redirect all HTTP traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://developer.chrome.com/docs/lighthouse/pwa/redirects-http/)."
    };
    str_93 = createIcuMessageFn({ url: "core/audits/redirects-http.js" }.url, UIStrings114);
    RedirectsHTTP = class extends Audit {
      static {
        __name(this, "RedirectsHTTP");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "redirects-http",
          title: str_93(UIStrings114.title),
          failureTitle: str_93(UIStrings114.failureTitle),
          description: str_93(UIStrings114.description),
          requiredArtifacts: ["URL"],
          supportedModes: ["navigation"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        if (!artifacts.URL.requestedUrl) {
          throw new Error("Missing requestedUrl");
        }
        const requestedUrl = new URL(artifacts.URL.requestedUrl);
        const finalDisplayedUrl = new URL(artifacts.URL.finalDisplayedUrl);
        const startedInsecure = requestedUrl.protocol === "http:";
        const isLocalhost = url_utils_default.isLikeLocalhost(finalDisplayedUrl.hostname);
        if (!startedInsecure || isLocalhost) {
          return {
            score: null,
            notApplicable: true
          };
        }
        const endedSecure = finalDisplayedUrl.protocol === "https:";
        return {
          score: Number(endedSecure)
        };
      }
    };
    redirects_http_default = RedirectsHTTP;
  }
});

// core/audits/seo/canonical.js
var canonical_exports = {};
__export(canonical_exports, {
  UIStrings: () => UIStrings115,
  default: () => canonical_default
});
var UIStrings115, str_94, Canonical, canonical_default;
var init_canonical = __esm({
  "core/audits/seo/canonical.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_url_utils();
    init_main_resource();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings115 = {
      /** Title of a Lighthouse audit that provides detail on a page's rel=canonical link. This descriptive title is shown to users when the rel=canonical link is valid. "rel=canonical" is an HTML attribute and value and so should not be translated. */
      title: "Document has a valid `rel=canonical`",
      /** Title of a Lighthouse audit that provides detail on a page's rel=canonical link. This descriptive title is shown to users when the rel=canonical link is invalid and should be fixed. "rel=canonical" is an HTML attribute and value and so should not be translated. */
      failureTitle: "Document does not have a valid `rel=canonical`",
      /** 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. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Canonical links suggest which URL to show in search results. [Learn more about canonical links](https://developer.chrome.com/docs/lighthouse/seo/canonical/).",
      /**
       * @description Explanatory message stating that there was a failure in an audit caused by multiple URLs conflicting with each other.
       * @example {https://example.com, https://example2.com} urlList
       * */
      explanationConflict: "Multiple conflicting URLs ({urlList})",
      /**
       * @description Explanatory message stating that there was a failure in an audit caused by a URL being invalid.
       * @example {https://example.com/} url
       * */
      explanationInvalid: "Invalid URL ({url})",
      /**
       * @description Explanatory message stating that there was a failure in an audit caused by a URL being relative instead of absolute.
       * @example {https://example.com/} url
       * */
      explanationRelative: "Is not an absolute URL ({url})",
      /**
       * @description Explanatory message stating that there was a failure in an audit caused by a URL pointing to a different hreflang than the current context.'hreflang' is an HTML attribute and should not be translated.
       * @example {https://example.com/} url
       */
      explanationPointsElsewhere: "Points to another `hreflang` location ({url})",
      /** Explanatory message stating that the page's canonical URL was pointing to the domain's root URL, which is a common mistake. "points" refers to the action of the 'rel=canonical' referencing another link. "root" refers to the starting/home page of the website. "domain" refers to the registered domain name of the website. */
      explanationRoot: "Points to the domain's root URL (the homepage), instead of an equivalent page of content"
    };
    str_94 = createIcuMessageFn({ url: "core/audits/seo/canonical.js" }.url, UIStrings115);
    Canonical = class _Canonical extends Audit {
      static {
        __name(this, "Canonical");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "canonical",
          title: str_94(UIStrings115.title),
          failureTitle: str_94(UIStrings115.failureTitle),
          description: str_94(UIStrings115.description),
          supportedModes: ["navigation"],
          requiredArtifacts: ["LinkElements", "URL", "DevtoolsLog"]
        };
      }
      /**
       * @param {LH.Artifacts.LinkElement[]} linkElements
       * @return {CanonicalURLData}
       */
      static collectCanonicalURLs(linkElements) {
        const uniqueCanonicalURLs = /* @__PURE__ */ new Set();
        const hreflangURLs = /* @__PURE__ */ new Set();
        let invalidCanonicalLink;
        let relativeCanonicallink;
        for (const link of linkElements) {
          if (link.source === "body") continue;
          if (link.rel === "canonical") {
            if (!link.hrefRaw) continue;
            if (!link.href) invalidCanonicalLink = link;
            else if (!url_utils_default.isValid(link.hrefRaw)) relativeCanonicallink = link;
            else uniqueCanonicalURLs.add(link.href);
          } else if (link.rel === "alternate") {
            if (link.href && link.hreflang) hreflangURLs.add(link.href);
          }
        }
        return { uniqueCanonicalURLs, hreflangURLs, invalidCanonicalLink, relativeCanonicallink };
      }
      /**
       * @param {CanonicalURLData} canonicalURLData
       * @return {LH.Audit.Product|undefined}
       */
      static findInvalidCanonicalURLReason(canonicalURLData) {
        const { uniqueCanonicalURLs, invalidCanonicalLink, relativeCanonicallink } = canonicalURLData;
        if (invalidCanonicalLink) {
          return {
            score: 0,
            explanation: str_94(UIStrings115.explanationInvalid, { url: invalidCanonicalLink.hrefRaw })
          };
        }
        if (relativeCanonicallink) {
          return {
            score: 0,
            explanation: str_94(UIStrings115.explanationRelative, { url: relativeCanonicallink.hrefRaw })
          };
        }
        const canonicalURLs = Array.from(uniqueCanonicalURLs);
        if (canonicalURLs.length === 0) {
          return {
            score: 1,
            notApplicable: true
          };
        }
        if (canonicalURLs.length > 1) {
          return {
            score: 0,
            explanation: str_94(UIStrings115.explanationConflict, { urlList: canonicalURLs.join(", ") })
          };
        }
      }
      /**
       * @param {CanonicalURLData} canonicalURLData
       * @param {URL} canonicalURL
       * @param {URL} baseURL
       * @return {LH.Audit.Product|undefined}
       */
      static findCommonCanonicalURLMistakes(canonicalURLData, canonicalURL, baseURL) {
        const { hreflangURLs } = canonicalURLData;
        if (hreflangURLs.has(baseURL.href) && hreflangURLs.has(canonicalURL.href) && baseURL.href !== canonicalURL.href) {
          return {
            score: 0,
            explanation: str_94(UIStrings115.explanationPointsElsewhere, { url: baseURL.href })
          };
        }
        if (canonicalURL.origin === baseURL.origin && canonicalURL.pathname === "/" && baseURL.pathname !== "/") {
          return {
            score: 0,
            explanation: str_94(UIStrings115.explanationRoot)
          };
        }
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        const baseURL = new URL(mainResource.url);
        const canonicalURLData = _Canonical.collectCanonicalURLs(artifacts.LinkElements);
        const invalidURLAuditProduct = _Canonical.findInvalidCanonicalURLReason(canonicalURLData);
        if (invalidURLAuditProduct) return invalidURLAuditProduct;
        const canonicalURL = new URL([...canonicalURLData.uniqueCanonicalURLs][0]);
        const mistakeAuditProduct = _Canonical.findCommonCanonicalURLMistakes(
          canonicalURLData,
          canonicalURL,
          baseURL
        );
        if (mistakeAuditProduct) return mistakeAuditProduct;
        return {
          score: 1
        };
      }
    };
    canonical_default = Canonical;
  }
});

// core/audits/seo/crawlable-anchors.js
var crawlable_anchors_exports = {};
__export(crawlable_anchors_exports, {
  UIStrings: () => UIStrings116,
  default: () => crawlable_anchors_default
});
var UIStrings116, hrefAssociatedAttributes, str_95, CrawlableAnchors, crawlable_anchors_default;
var init_crawlable_anchors = __esm({
  "core/audits/seo/crawlable-anchors.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings116 = {
      /** Title of a Lighthouse audit that provides detail on whether links have potentially-crawlable href attributes. This descriptive title is shown when all links on the page are potentially-crawlable. */
      title: "Links are crawlable",
      /** Descriptive title of a Lighthouse audit that provides detail on whether links have potentially-crawlable href attributes. This descriptive title is shown when there are href attributes which are not crawlable by search engines. */
      failureTitle: "Links are not crawlable",
      /** Description of a Lighthouse audit that tells the user why href attributes on links should be crawlable. This is displayed after a user expands the section to see more. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn how to make links crawlable](https://support.google.com/webmasters/answer/9112205)",
      /** Label for a column in a data table; entries will be the HTML anchor elements that failed the audit. Anchors are DOM elements that are links. */
      columnFailingLink: "Uncrawlable Link"
    };
    hrefAssociatedAttributes = [
      "target",
      "download",
      "ping",
      "rel",
      "hreflang",
      "type",
      "referrerpolicy"
    ];
    str_95 = createIcuMessageFn({ url: "core/audits/seo/crawlable-anchors.js" }.url, UIStrings116);
    CrawlableAnchors = class extends Audit {
      static {
        __name(this, "CrawlableAnchors");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "crawlable-anchors",
          title: str_95(UIStrings116.title),
          failureTitle: str_95(UIStrings116.failureTitle),
          description: str_95(UIStrings116.description),
          requiredArtifacts: ["AnchorElements", "URL"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit({ AnchorElements: anchorElements, URL: url }) {
        const failingAnchors = anchorElements.filter(({
          rawHref,
          name = "",
          role = "",
          id,
          href,
          attributeNames = [],
          listeners = []
        }) => {
          rawHref = rawHref.replace(/\s/g, "");
          name = name.trim();
          role = role.trim();
          if (role.length > 0) return;
          if (rawHref.startsWith("mailto:")) return;
          if (rawHref === "" && id) return;
          const javaScriptVoidRegExp = /javascript:void(\(|)0(\)|)/;
          if (rawHref.startsWith("file:")) return true;
          if (name.length > 0) return;
          if (!attributeNames.includes("href") && hrefAssociatedAttributes.every((attribute) => !attributeNames.includes(attribute))) {
            return Boolean(listeners.length);
          }
          if (href === "") return true;
          if (javaScriptVoidRegExp.test(rawHref)) return true;
          try {
            new URL(rawHref, url.finalDisplayedUrl);
          } catch (e) {
            return true;
          }
        });
        const headings = [{
          key: "node",
          valueType: "node",
          label: str_95(UIStrings116.columnFailingLink)
        }];
        const itemsToDisplay = failingAnchors.map((anchor) => {
          return {
            node: Audit.makeNodeItem(anchor.node)
          };
        });
        return {
          score: Number(failingAnchors.length === 0),
          details: Audit.makeTableDetails(headings, itemsToDisplay)
        };
      }
    };
    crawlable_anchors_default = CrawlableAnchors;
  }
});

// third-party/axe/valid-langs.js
function isValidLang(lang) {
  let array = langs;
  while (lang.length < 3) {
    lang += "`";
  }
  for (let i = 0; i <= lang.length - 1; i++) {
    const index = lang.charCodeAt(i) - 96;
    array = array[index];
    if (!array) {
      return false;
    }
  }
  return true;
}
var langs;
var init_valid_langs = __esm({
  "third-party/axe/valid-langs.js"() {
    "use strict";
    init_process_global();
    langs = [, [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, 1, 1, , 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, , , , , , 1, 1, 1, 1, , , 1, 1, 1, , 1, , 1, , 1, 1], [1, 1, 1, , 1, 1, , 1, 1, 1, , 1, , , 1, 1, 1, , , 1, 1, 1, , , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , , , , 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1], [, 1, , , , , , 1, , 1, , , , , 1, , 1, , , 1, 1, 1, , 1, , , 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , , 1, 1, 1, 1, , , 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , 1, 1, , , 1, , , , 1, 1, 1, 1, , 1, , 1, , 1, , , , , , 1], [1, , 1, 1, 1, 1, , , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [1, , 1, , 1, , , , , 1, , 1, 1, 1, 1, 1, , , , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, , 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1], [, , 1, , , 1, , 1, , , , 1, 1, 1, , , , , , , , , , , 1], [1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1], [1, 1, 1, 1, 1, , , 1, , , 1, , , 1, 1, 1, , , , , 1, , , , , , 1]], [, [1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, , 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ,
    1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1], [, 1, , 1, 1, 1, , 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, , , 1, 1, , , , , , 1, 1], [1, 1, 1, , , , , 1, , , , 1, 1, , 1, , , , , , 1, , , , , 1], [, 1, , , 1, , , 1, , , , , , 1], [, 1, , 1, , , , 1, , , , 1], [1, , 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , , 1, , , 1, , 1, 1, , 1, , 1, , , , , 1, , 1], [, 1, , , , 1, , , 1, 1, , 1, , 1, 1, 1, 1, , 1, 1, , , 1, , , 1], [, 1, 1, , , , , , 1, , , , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1], [, 1, , 1, 1, 1, , , 1, 1, 1, 1, 1, 1, , 1, , , , 1, 1, 1, , 1, , 1], [, 1, , 1, , 1, , 1, , 1, , 1, 1, 1, 1, 1, , , 1, 1, 1], [, 1, 1, 1, , , , 1, 1, 1, , 1, 1, , , 1, 1, 1, 1, 1, 1, 1, , 1, 1], [1,
    1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, , 1, 1, 1, , 1, , , , , 1, 1, 1, , , 1, , 1, , , 1, 1], [, , , , 1, , , , , , , , , , , , , , , , , 1], [1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , 1, 1, 1, , 1, 1, , , , 1, 1, 1, 1, 1, , , 1, 1, 1, , , , 1, 1], [1, 1, 1, 1, , , , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , , , , , , 1, , , , , , , 1], [, 1, 1, , 1, 1, , 1, , , , , , , , , , , , , 1], [, , , , , , , , 1], [1, 1, 1, , , , , , , , , , , , , 1], [, , , , , , , , 1, , , 1, , , 1, 1, , , , , 1]], [, [1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1], [, , , 1, , , , , , , , , , , , , , , 1], [, 1, , , 1, 1, , 1, , 1, 1, , , , 1, 1, , , 1, 1, , , , 1], [1, , , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1,
    1, , 1, 1, 1, 1, , , 1, , , , 1], , [, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, , 1, 1, , , 1, 1, 1, 1, , 1, 1, , 1], [, 1, , , 1, , , 1, , 1, , , 1, 1, 1, 1, , , 1, 1, , 1, 1, 1, 1], [, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, , , 1, , , 1, , 1], [, 1, , , , , , 1, , , , 1, 1, , , , , , 1, 1, , , , , 1], [, , , , , , , 1, , , , 1, , 1, 1], [, 1, 1, 1, 1, 1, 1, 1, , , , 1, 1, 1, 1, 1, , , 1, 1, , 1, 1, 1, 1, 1], [, 1, , , 1, 1, , 1, , 1, 1, 1, , , 1, 1, , , 1, , 1, 1, 1, 1, , 1], [, 1, 1, 1, , 1, 1, , 1, 1, , 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1], [, , , , , , , , , , , , , , , , 1], , [, 1, 1, 1, 1, 1, , 1, 1, 1, , , 1, , 1, 1, , 1, 1, 1, 1, 1, , 1, , 1], [, , 1, , , 1, , , 1, 1, , 1, 1, , 1, 1, , 1, , , , , , , , , 1], [, 1, 1, , 1, , , , 1, 1, , 1, , 1, 1, 1, 1, , 1, 1, 1, 1, , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [1, 1], [, 1, , , , , , , , , , 1,
    1, , , , , , 1, 1, , 1, , 1, , 1, 1], , [, 1, 1, , 1, , , 1, , 1, , , , 1, 1, 1, , , 1, , , 1, , , , 1], [1, 1, , , 1, 1, , 1, , , , , 1, , 1]], [, [, 1], [, , , 1, , , , 1, , , , 1, , , , 1, , , 1, , , 1], [, , , , , , , , , , , , , , , , , , 1, 1, , , , , , 1], , [1, , , , , 1], [, 1, , , , 1, , , , 1], [, 1, , , , , , , , , , , 1, 1, , 1, , , , , , , , , 1, 1], [, , , , , , , , , , , , , , , , , , , 1, , 1], [, , , , , , , , , , , , , , , , 1, , , , 1, , 1], [, 1], [, 1, , 1, , 1, , 1, , 1, , 1, 1, 1, , 1, 1, , 1, , , , , , , 1], [1, , , , , 1, , , 1, 1, , 1, , 1, , 1, 1, , , , , 1, , , 1], [, 1, 1, , , 1, , 1, , 1, , 1, , 1, 1, 1, 1, 1, , 1, , 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, , 1, , 1, , , , 1, 1, 1, 1, , 1, 1, , , 1, 1, 1, 1], [1, , , , , , , , , , , , , , , , , , , , 1], [, , , , , , , , , 1], , [, 1, , , , , , 1, 1, 1, , 1, , , , 1, , , 1, 1, 1, , , 1], [1, , , , , 1, , 1, 1, 1, , 1, 1, 1, 1, 1, , 1, , 1, , 1, , , 1, 1], [1, , 1, 1, , , , , 1, , , , , , 1, 1, , , 1, 1, 1, 1,
    , , 1, , 1], [1, , , , 1, , , , , , , , , , , , , 1], [, , , , , 1, , , 1, , , , , , 1], [, , , , , , , , , , , , , , , 1], [, , , , , , , , , , , , , , , , , , , , 1], [, 1, , , , , , , , , , , , , , 1], [, 1, , , , 1]], [, [1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, , 1, 1, , , 1, 1, 1], [, , , , , , , , , , , , 1], [, , , , , , , , , , , , , , , , , , , 1], , [, , , , , , , , , , , , , , , , , , 1], [1, , , , , , , , , 1, , , , 1], [, , , , , , , , , , , , , , , , , , 1], , [1, 1, , , , 1, 1, , , , , , 1, , , , 1, , 1, , 1, 1, , 1], [1], [, , , , , , , , , , , 1, , , , , , , , , , , 1], [, 1, , , , , , , 1, 1, , , 1, , 1, , , , 1, , , , , , , 1], [, , , , , , , , , , , , , , , , 1, , , , , 1], [, , 1, , , , , 1, , 1], [1, , , , 1, , , , , 1, , , , 1, 1, , , , 1, 1, , , , , 1], [, , , , , 1], [, , , , , , , , , , , , , , , , , , , 1], [1, , , 1, 1, , , , , , , 1, , 1, , 1, 1, 1, 1, 1, 1], [, , , , , 1, , , , , , , 1, , , , , , , 1], , [, , 1, 1, 1, 1, 1, , 1, 1, 1, , , 1,
    1, , , 1, 1, , 1, 1, 1, , , 1], [, , , , , , , , , , , , , , , , , , 1], [, 1, , , , 1], , [1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, , , 1, 1, 1, 1, , , , , , 1, , 1, , , , 1, , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , , 1], [, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , , , 1, , 1, , , 1, 1, 1, 1, 1], [, , , , , , , , , , , 1, , , , , , , , , 1, , , , 1], [, 1, 1, , 1, 1, , 1, , , , 1, 1, , 1, 1, , , 1, , 1, 1, , 1], [, 1, , 1, , 1, , , 1, , , 1, 1, , 1, 1, , , 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [, , , , , , , , , 1, , 1, , 1, 1, , , , 1, , , 1], [, 1, , , 1, 1, , , , , , , , , 1, 1, 1, , , , , 1], [1, , 1, 1, 1, , , , 1, 1, 1, 1, 1, , , 1, , , 1, , , 1, , 1, , 1], [, 1, 1, , 1, 1, , 1, 1, , , , 1, 1, 1, , , 1, 1, , , 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1,
    1, 1, 1, 1, , 1, 1, , 1, 1, , 1, , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , , 1, , , , , , , , , 1], [, 1, , , , , , , , 1, , , , , 1, , , , 1, , , 1], [, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, , 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , , , 1, , 1, , , , , 1, 1, 1, 1, 1, , , 1, , , , 1], [, 1, , , , , , , , 1, , , , , , , , , , , , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1], [1, 1, , 1, , 1, 1, , , , 1, , 1, 1, 1, 1, 1, , 1, 1, , , , , , 1], [, 1, 1, 1, 1, 1, 1, 1, , 1, 1, , , 1, 1, , , , 1, , 1, 1, , 1, 1], [, , , , , , , , , , , , , , , , , , , , , , , , 1], [, 1, 1, , 1, 1, 1, 1, , 1, , , 1, 1, 1, 1, , , 1, , , , , , , 1, 1], [, 1, , , , , , , , 1, , , , , 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1], [, 1, 1, , , , , , , , , , , , 1, 1, , , , , , 1], [, 1, , , , , , , 1], [, , , , , , , , , , , , , , 1, , , , , 1, , , , , , 1], [1, 1, , , 1,
    , , 1, 1, 1, , , , 1], , [, , , , , , , , , , , , , 1, , , , , , , , , , 1], [, , , , , , , , , 1, , , , , , , , , 1, , , , , , , 1], [1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, , 1, , , 1, , 1, , , 1, 1], [, , , , , , , , , 1], [, 1, , , , 1, , , 1, , , 1, , , 1, , , , , 1], [, 1, 1, , 1, 1, , , , , , , , , , , , , , , 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , 1, 1, , 1, 1, 1, 1, , , 1, 1, 1, , , , 1, , 1], [1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, , 1, 1, , 1, 1], [, , , , , , , , , , , , , , , 1, , , , 1], , [1, 1, , 1, , 1, , , , , , 1, , 1, , 1, 1, , 1, , 1, 1, , 1, 1, , 1], [, , 1, , , , , , 1, , , , 1, , 1, , , , , 1], [1, , , , , , , , , 1, , , , , , 1, , , , 1, , 1, , , 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , 1, , 1, , , , , , 1, , , 1, , , , , , , , 1], [, 1, , 1, , , , , , , , , , , , 1], , [1, 1, , , , , , , , , , , , , , , , , , , , , , 1, 1], [1]],
    [, [1, , , , , , , , , 1, , , , , 1, , 1, , 1], [, 1, 1, , 1, 1, , 1, 1, 1, , , 1, 1, 1, , , , 1, , , 1, , , , 1], [, 1, , , , , , , 1, , , , 1, , , , , , 1], [1, 1, 1, 1, 1, 1, , , , 1, , , , , , , , , 1, 1, 1, 1], [1], [, 1, 1, , , 1, 1, , , , , 1, , 1, , , , , , , , 1, , , , 1], [1, , 1, , , 1, , 1, , , , , 1, 1, 1, 1, , , , 1, , , , 1], [, , 1, , , , , , , 1, , , , , , , 1, , , , , , , 1], [1, , , , , , , , , , , , , , 1, , , , 1], [, , , 1, , 1, , , , , 1, , , , 1, 1, , , , 1], [1, , , , , 1, , , 1, 1, , 1, 1, , , 1, 1, , 1, 1, 1, , 1, 1, 1, , 1], [, 1, 1, , , , , 1, , 1, , 1, 1, 1, , 1, 1, , , 1, , 1, 1, 1], [, 1, , , , 1, , , , 1, , , 1, , 1, 1, , , 1, 1, 1, , , , , 1], [1, , 1, 1, , 1, , 1, 1, , 1, , 1, 1, 1, 1, 1, , , 1, 1, , , , , , 1], [1, , , , , , , , , , , , , , , , , , 1, , , 1, , 1], [, , , , , , , , , 1, , , , , , 1], [, , , , , , , , , , , , , , , , , , , , , 1, , 1], [, 1, , , , 1, , , 1, 1, , 1, , , 1, 1, , , 1, , , 1, , , 1, 1], [1, 1, , 1, 1, 1, , 1, 1, 1, , 1,
    , 1, 1, 1, , , 1, , 1, 1, 1], [1, , 1, 1, 1, 1, , , , 1, , 1, 1, 1, , 1, , , 1, 1, 1, , 1, 1, 1, 1, 1], [1, , , , , , , , , , , , , 1], [, , 1, , , , , , , , , , , , , , , , , , , , 1], [1, , , , , , , , , , , 1, , 1, , 1, , , , 1], [, , , 1, , , , , , , , , 1], [, 1, , , , , , , , , , , , , , 1, , , , , , , , , 1], [, , , , , , , , 1, 1, , , , 1, , , , , 1, , , , , , , , 1]], [, [1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , , 1, 1, 1], [, , , , , 1, , , , 1, 1, 1, , 1, 1, 1, , , 1, , 1, 1, , 1], [, , , , , , , , , , , , , , , , , , , 1, 1], [, 1, , , , , , 1, , , , , , , , , , , , , 1], [, , 1, , , 1, , 1, 1, 1, , 1, 1, , 1, , , , 1, , 1, 1], , [, , 1, , , 1, , , , , , 1, , , , 1], [, , , , , , , , , 1, , , , , , , , , , 1], [1, 1, 1, 1, 1, 1, , 1, 1, 1, , , 1, 1, , 1, , 1, , , 1, 1, 1, , , 1], [, , , , , 1, , , , , , , , , , , , , 1], [, 1, , , , , , , , , , , , 1, , 1, 1, , 1, 1, , 1], [, , , , , 1, , , , , , , , , , , , , , 1], [, 1, 1, 1, 1, , , , , 1, , , 1,
    , 1, , , , 1, 1, , , , 1, 1], [, 1, , , 1, , , 1, , 1, 1, , 1, , , , , , , 1], [, , 1, , 1, , , 1, , , , , , , , , , , 1, 1, , , , 1], [, 1, , , , , , , , , , , , , , , , , 1, , , , , , 1], [, , , , , , , , , , , , , , , , , , 1], [, 1, 1, , , , , , , , , , , , , , , , 1, , 1, 1], [, , , , , , , , , , , , 1], , [, 1, 1, 1, 1, , , , 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1, , 1], [1, , , , 1, , , , , , , , , , 1], [1, , , , , , , , , 1], , [, 1, , , , 1, , , , , , , , , , , , , , , , , , , , 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, , , , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1, , 1, 1, 1, 1], [1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , 1, 1, 1, 1, , 1, , , , 1, 1, , , 1, 1, , 1], [, 1, 1, , 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , , , , ,
    , , , , , , 1], [1, 1, 1, , , , , 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , , , , 1], [, 1, , , , , , , 1, 1, , , 1, 1, 1, , 1, , , 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, 1, , , , 1, , , , 1, , , 1, , , , 1, , , , , , , 1, 1], [, 1, 1, 1, 1, 1, , , 1, 1, 1, , 1, 1, 1, 1, , , 1, 1, 1, 1, , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1], [1, 1, 1, , 1, , , 1, 1, 1, 1, , 1, 1, 1, 1, , , , 1, , 1, , 1, , , 1], [1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , , 1, , , , , , , , , 1, 1, , , , , , , , , 1], [, , , , , , , , , , , , , , , , , , 1], [, 1, , 1, , 1, , 1, , 1, , 1, 1, 1, 1, 1, , , 1, , 1, , 1, , , , 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, , , 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, , 1], [1, , , 1, , , , 1, 1, 1, , , , , 1, 1, , , , 1, , 1], [1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [1, 1, , , , , , , , 1, , 1, 1, , , , , , , 1, , 1], [, 1, , , , 1, , 1, 1, , , , 1, 1, , 1, , , , 1, 1, 1, , 1], [, , , , , , , , , , , , , 1], [, 1, , , , , , 1, , , , , , , 1], [, , , , , , , , 1, , , , 1, , 1, , , , , , , , , , , , 1]], [, [, 1, 1, , 1, 1, 1, 1, , 1, 1, 1, , 1, 1, , 1, 1, , 1, 1, 1, 1, 1, 1, , 1], [, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1], [, 1, 1,
    , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, , 1], [1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , 1, , , , , , , , 1, , , , , , 1, , , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, , 1,
    1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, , , , 1, 1, 1, , 1, 1, 1, 1, , , 1, 1, 1, 1, , , 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1], [1, 1, , 1, , 1, , 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, , , 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1], [, 1, 1, , , , , 1, 1, 1, , , 1, , 1, 1, , , , 1, , 1, , , 1, 1], [, , , , , , , 1, , , , 1, 1, 1, 1, 1, , 1, , , 1, , , , , 1], [1, 1, 1, 1, , 1, 1, 1, , 1, , 1, 1, 1, 1, , 1, , 1, , 1, 1, , , 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , , 1, 1, , 1, , 1, 1, 1, , 1, , 1, 1, , 1, 1, , 1, , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1], [1, , , , , , , , 1, , , , , 1, , 1], [, 1, 1, 1, , 1, , 1, , 1, , , , 1, , 1, , , 1, , , , , 1, 1, 1], [, 1, , , 1, 1, , 1, , 1, , 1, 1, 1, 1, 1, , 1, 1, , , 1, , , 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, , , , , 1, , 1, , 1, , , , , 1, 1, , 1, , , , 1, 1]], [, [, 1, , 1, , , , , , , , 1, , , , , , , 1, , , , 1], [, , , , , , , , , 1, , 1, 1, 1, , 1, , , 1, , 1, 1], [1, 1, , , , , , , 1, , , , , 1, , 1, , , , , , 1], [, 1, , , , , , , , , , 1, , , , , , , , , 1, 1], , [, , , , , , , , , , , , , , , 1, , , , 1, , 1], [, , 1, 1, , 1, , 1, , , , , , , , 1, , , , , , 1], [, , , , , , , , , , , , , , , , , , , , 1, 1], [, 1, , , , 1, , , , , , , , , 1], [1, , 1, 1, , , , 1, , , , , , , , , 1, , , 1, , , 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, , 1, 1, , 1, , 1], [, 1, , , 1, 1, , , , , , 1, , 1, , 1, , , 1, , 1, 1], [1, 1, 1, 1, , 1, , 1, , 1, , 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, 1,
    1, , , 1, , 1, , 1, 1, 1, , , 1, 1, 1, , 1, 1, 1, 1, , 1, 1], [, , , , 1, , , 1, , , , , , , 1, , , , 1, 1], [, 1, , , , , , , , , , 1, , 1, , 1, , , , , 1, , , , , 1], , [1, 1, , 1, , 1, , 1, 1, , , , , , 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, , 1, , , , , , 1, , , , , 1, 1, 1, , , , 1, 1, , , 1], [, 1, 1, , 1, 1, , , , 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1], [, 1, 1, , , 1, , , , 1, , , , 1, 1], [, , , , 1], [, , , , , , , , , 1, , , 1], , [, , 1, , 1, , , , , , , , , 1, , , , , , , , , , , , 1], [, , , , , , , , , , , , , 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , 1, 1, , 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , , 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, , , , , 1], [, 1, , 1, , , , , , 1, , , , , 1, 1, , , , , 1, 1], [, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, , , 1, , 1, 1, 1], [, 1, , , , 1, , , , , , , 1], [, 1, , , 1, , , 1, , 1, , 1, 1, , 1, , , , , 1, , 1, , ,
    , 1, 1], [, 1, , , 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , , , , , , , , , , , , , , , , , , 1], [, 1, 1, 1, , , , 1, 1, , , , , , 1, 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1, 1], [, 1, , , , 1, , , , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , , 1, , , , , , , , 1, , , , , , , , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [1, 1, , 1, 1, 1, , 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1], [1, 1, , , , , , , 1, 1, , , , , 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, , 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1], , [, 1,
    1, , , , , 1, , 1, , , , 1, 1, 1, , , 1, , , , , 1], [, , , , , , , , , , , , , 1], [, , , , , 1, , , , , , , , 1, 1, , , , , 1, , 1, , , 1, 1], [, , , , , 1, , , 1, , , , , , 1]], [, [, 1], , , , , , , , , , , , , , , , , , , , [1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, , , 1, 1, 1, 1, 1], [, 1, , 1, , 1, , , 1, 1, 1, , 1, 1, 1, 1, 1, , , 1, , , , 1, , 1, 1], [, 1, , 1, , 1, , , 1, , , , , 1, , , , , , 1, 1], [, 1, , 1, , , , , 1, , , , 1, , 1, 1, 1, 1, 1, 1, 1, 1, , 1], [, 1, , , , , , , , , , , , , , , 1]], [, [, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , 1, , , , , , , , , 1, 1, , , , 1], [, , , , , , 1], [, , 1], [, 1, 1, , , 1, , 1, , 1, 1, , 1, 1, 1, , , , 1, 1, 1, , , , , 1], , [, 1, , , , 1, , , , , , 1, , , 1, , , , 1, 1, , 1], [, , , , , , , 1, , , , , , , , , 1], [, 1, 1, , , 1, 1, , , , , , 1, 1, 1, , , , 1, , 1, 1], [, , , , , , , 1, , 1, , , , , , , , , , 1], [, 1, 1, , , , , , 1, 1, , , , 1, , , , , , , 1, , , 1],
    , [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, , 1, , , 1, , , , , 1, , 1, , 1, , 1, , , , , 1], [1, 1, 1, 1, 1, 1, 1, 1, , , , , 1, 1, , 1, 1, , 1, , , 1, , 1], [, , , , , , , , , , , , , , 1, , , , , , 1], , [, , , , , , , , , 1, , , , 1, , 1, , , , , 1], [, , 1, , , , , , , 1, , 1, 1, 1, 1, , , , , , , , , 1], [, , , 1, , , , , 1, , , , , 1, , , , , , 1, , , , 1], [1, , 1, 1, , 1, 1, 1, 1, 1, , 1, , , , 1, 1, 1, , , 1, 1, , , , 1, 1], , [1, 1, , , , , , , , , , 1, 1, 1, , 1, , , 1], [, , , , 1, , , , , , , , , , , , , , , , , , , 1], [, , , , , , , , , , , , , , 1, , , , , 1, , 1], [, , , , , , , , 1]], [, [1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, , , 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1], [1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [, , 1, , , 1, , , , , , , , 1, , , , , , 1, , , , 1], [1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, , , , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1], [1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, , 1, 1, 1, 1, , 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [1, 1, , , , , , , 1, , 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, , , 1], [1, 1, 1, 1, , 1, 1, 1, 1,
    1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1], [1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1], [1, 1, 1, 1, , 1, , 1, , 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1], [1, 1, 1, 1, , 1, , , , , , 1, , 1, , , , , 1, 1, , , , , 1], [1, , 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , 1, 1, , 1, , 1, , , , 1, 1, 1, 1, 1, , , 1, 1, , 1, , 1], [, 1, 1, 1, 1, , , , , 1, , 1, 1, 1, 1, 1, , , 1, 1, , , , 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, , , , , 1, , 1, , 1, , , 1, , , 1, 1, , 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , , , , , , , 1, , , , , 1, 1, , , 1, , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , , 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , , , , 1, , 1, 1, , 1, 1, 1, 1, 1, , , 1, , 1, , 1], [1, 1, 1, , 1, 1, 1, 1, , , , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1], [1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, 1, , 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1], [, , 1, , , , , , , , , , 1, 1, 1, 1, 1, 1, 1, , 1, 1, , 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , 1, 1, , , , 1, , 1, 1, 1, 1, 1, , , , 1, 1, 1, , 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, , , , 1, 1, 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1], [, 1, 1, 1, , 1, , 1, 1, 1, 1, , , 1, 1, 1, , 1, 1, 1, 1, 1, , , 1, 1], [1, 1, , , , 1, , , 1, 1, 1, , 1, , 1, , 1, , 1, 1, 1, 1, 1, , 1, 1, 1], [, 1, , , , , , , 1, , 1, , 1, 1, 1, 1, , , , , , , , , 1]], [, [, , , , , , , , , , , , , 1, 1, , , , 1], [, 1, , , , , , , , 1, , , 1, , , , , , 1, , , 1, , , , 1], , [, 1, , , , 1, , 1, , 1, 1, , 1, 1, , , , , , , , 1], [, , , , , , , , , , , , , , , , , , , 1], [, , , , , , , , , 1], [1, 1, 1, , , 1, , , 1, , , , , , 1, 1, , , , , , , , , , 1], [, 1, , , , , , , , , , , , , 1], [, , , , , , , , , , , , , , , , , , , 1, , , 1], [, , , , , , , , , 1],
    [1, 1, , , , , , 1, 1, 1, , 1, 1, , , , 1, 1, , 1, , 1, 1, 1, , 1], [, 1, 1, 1, , 1, 1, , , 1, , 1, 1, 1, 1, , , , , , , 1, , 1, , 1], [, 1, 1, 1, 1, , , 1, , 1, , , , 1, 1, 1, 1, , 1, 1, , 1], [, 1, , , 1, 1, , 1, , 1, , 1, , 1, 1, , 1, , 1, , , 1, , , 1, , 1], [, , , , , , , , , , , 1, , , 1], [, , , , , , , , , 1, , , , , , , , , , , , , 1], , [1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1], [, 1, , , , , , , 1, 1, , 1, , , , , 1, , , 1, , 1], [, 1, , , , 1, , , 1, , , , , , , , 1, , 1, , , 1], [, , , , , , , , , , , , , 1, 1, , , , 1, , , 1], [, , , , , 1, , , 1, , , , 1], [, 1], , [, 1], [1, , , , , , , , , , , , , , 1, , , , , 1]], [, [, 1, , , , 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, , 1, 1, , 1, 1, , , 1], [, , 1, , , , , , , , , 1], , , [1, , , 1, 1, , , , , , , , 1, 1, , 1, 1, , 1], , [, , , , , , , , , , , , , , , , , , 1, , 1], , [1, , , 1, 1, , 1, 1, , , , , 1, , 1, , , , , 1, 1, , 1], [, , , , , , , , , , , 1], [, 1, , , , , , , , 1, 1, 1, 1,
    1, 1, 1, 1, , , , 1, 1, , , , , 1], [, , , , , , , , , , , , , , , , 1, , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1], [, , , , , , , , , , , 1, , 1, , , 1], [1, , , , , , , , , , , , , , , , , , 1, , 1], , , [, 1, , , , , , , , , , , , , , 1, , , , 1, 1], [, , , , , , , , , 1, , , 1, , 1, , , , , , , , 1], [, , , , , , , , , , , , , , , 1], [, , , , , , , , , , , , , 1, 1, , , , , , 1], , [, 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , , 1, 1, , 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, , 1, 1], [, 1, , , , , , , , 1], [, , , , 1, , , 1, , , 1, 1, , , , , , , , , 1, 1, , , , 1], [, 1, , 1, 1, , , 1, 1, 1, , , , 1, 1, 1, 1, , 1, 1, 1, 1, , 1], [, , , , , , , 1], [, 1, 1, , , , , 1, , 1, , , , , , 1, , , , , , 1, , 1, , 1], [, 1, , , , , , 1, , , , 1, , , , , , , , , , 1], [, , 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , , 1, , 1, 1, 1, 1, , 1], [, 1, , , , , , , , 1], [, 1, 1, , 1, , , , , , ,
    , 1, , , , , , 1, , , 1, , 1, , 1], [, 1, , 1, , 1, , 1, 1, 1, , 1, 1, 1, , 1, , , 1, 1, , 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, , , , 1, 1, 1, , , , 1, 1, , , 1, 1], [, , 1, 1, 1, 1, , 1, , 1, , 1, , 1, 1, 1, 1, , , , , 1, , 1, , 1], [1, 1, 1, 1, 1, 1, 1, 1, , 1, , 1, , 1, 1, 1, , , 1, 1, , , , 1, , 1], [, , , 1], , [, 1, 1, , 1, , , 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, , 1, 1, 1, 1, 1, 1], [, 1, , , , , , 1, , 1, , 1, , , , , , , 1, 1, , 1, 1], [, , 1, , , , 1, , 1, 1, , 1, , 1, , , , , , , , , , 1], [, 1, 1, , 1, , , , 1, , , , 1, 1, 1, , , , 1, , 1, 1, 1, , 1, 1], , [, 1, 1, , , , , , , , , , , , , 1, , , 1, , , , , 1], [, 1, , , , , , , , , , , , , , , , , , , , , , 1], [, 1, 1, , , , , , , 1, , , , 1, 1, , , , 1, , , , , , , 1]], [, [, 1, 1, 1, 1, 1, , 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1], [, 1, 1, 1, 1, 1, , 1, , 1, 1, , , 1, 1, 1, 1, , 1, , , , , 1, 1, 1], [, , 1, 1, , 1, , 1, 1, , , , 1, 1, 1, 1, , , 1, , 1, 1, 1, 1, , 1], [, 1, , 1, , , , , , , , 1,
    , 1, , 1, , 1, , , , , , , , 1], [, , 1, , 1, , , 1, , , , , 1, 1, , , 1, , 1, 1, 1, 1], [, 1], [, 1, 1, , 1, , 1, 1, , 1, , , 1, 1, 1, , , , 1, , , 1, , 1], [1, 1, , 1, 1, 1, , , , , , , , 1, , , , , 1, , 1, 1, 1], [, 1, 1, , , , , , , 1, , , 1, , 1, , 1, , 1, 1, , , 1, , , 1], [, , 1, , , , , , , , , , , , , , , , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, 1, 1, 1, , 1, , 1, , , , , 1, 1, 1, , , 1, , 1, , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, , , 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, , , , 1, 1], [, , , 1, 1, , , 1, , 1, , 1, , 1, 1, 1, 1, , 1, , , , , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , , , , , , , , , , , , , , , , , 1], [, 1, 1, , 1, 1, , 1, , 1, , , , 1, 1, , , 1, 1, , 1, 1, , 1], [, 1, 1, 1, 1, 1, , , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, , , 1], [, 1, 1, 1, 1, 1, , 1, 1, 1, 1, , 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1], [, 1, 1, , 1, , , 1, , , 1, , 1, 1, 1, 1, 1, , 1, , 1, 1], [, , , , , 1, , , , 1, , , , , 1, 1, , , , 1], [, 1, , 1, 1, 1, , 1, , , 1, 1, 1, , , 1, , , 1, , 1, , , 1], [, , 1, , , , , , , , , 1, , 1, , , , , 1, , 1], [, 1, 1, , , , , , , , 1, 1, 1, , , , , , , , 1, , , , , 1], [, , , , , , , , 1, , , , , 1, , , 1]], [, [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, 1, , 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, , , , , , , , , 1, 1], [, , , , , , , , 1, , , , 1, , 1, , 1, , 1], [, 1, , , 1, 1, , 1, , , , 1, , , , , , , , 1], [, 1, , 1, , 1, , , , 1, 1, , 1, , 1, , , , 1, 1, 1, 1, 1, , , 1], , [, 1, , , , , , , , 1, , , 1, 1, , , 1, , 1, 1, , 1, , 1], [, 1, , , 1, , , , , , , , 1, , , , , , , 1], [1, 1, , , , , 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1], , [, 1, , , , , , 1, 1, 1, , 1, 1, 1, 1, 1, , , 1, , 1, 1, , , , 1], [, 1, 1, , , 1, , 1, , 1, , , 1, 1, 1, 1, , , 1, , , 1, , , , 1], [, 1, 1, 1,
    1, 1, , 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , , , 1, , 1], [, 1, 1, , 1, 1, , 1, 1, , , 1, 1, , 1, 1, , 1, , 1, , 1], [1, , 1, , , , , 1, , 1, , 1, 1, 1, 1, , , , , 1, 1, , , , 1, 1], [, 1, 1, , , , , 1, 1, , , 1, , 1, 1, 1, 1, , , , , , , , , , 1], , [, 1, 1, , , 1, , , , 1, , 1, 1, 1, 1, 1, , , , 1, , , , 1, , 1], [, , , 1, 1, , , 1, , , , , 1, 1, 1, 1, 1, , 1, 1, , , , , , 1], [, 1, , , , , , , , , , , 1, , , , 1, , , , , , , 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, , 1, 1, 1, , 1, 1, , 1, 1, 1, 1], [, 1, , , , , , , , , , , , , , , , , , , 1], [, 1, , , , , , 1, , , , , 1, , 1, , , 1, 1, , 1, 1, , 1], [, 1, , , , , , 1, , , , , 1, 1, , , , , , , , 1, , , , 1], [, , , , , , , , , , , , , , , , , , 1, , , 1, , , , , 1], [, , , , , , , 1, , , , 1]], [, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , 1, , 1, , , , , , , 1, , , , , , , , 1, 1, , 1], [, 1, , , 1, , , , 1], [, , , , , , , , , , 1], [, 1, , , , , , 1, 1, , , , ,
    1, 1], , [, 1, 1, , , , , , 1, , , , , 1, 1, , , , 1], [1, , 1, , 1, , , , , 1, , , , , 1, , , , , , , , , 1, 1], [, 1, 1, , , , , , , , , 1, 1, 1, 1, , , , 1, , , , , 1, , , 1], , [, 1, 1, , 1, , , 1, 1, , , 1, , , 1, 1, 1, , 1, , 1, 1, 1, , , , 1], [, 1, , , , 1, , , , , 1, , , 1, 1, , , 1, , 1, , 1, , 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, 1, , , 1, 1, , 1, , , , 1, , , , , , , , 1], [, , , 1, , , , , 1, , , , , 1, , 1, , 1, 1, 1], [, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [, , , , , 1], [, 1, , , , , , 1, , , , , , , 1, 1, 1, , , 1], [, 1, , , , , , , , , , 1, 1, 1, , , , , 1, , , 1], [, , , , , 1, , 1, , , , , 1, 1, 1, , 1, 1, , 1, 1, 1, , , 1, 1], [1, 1, , , , , , , 1, , , , , 1, 1, , , , , , , , , , , 1], , [, 1], [, , , , , , , , , , , , , , , , , , , , , , , , 1], [, , 1, , , , , 1, , , 1, , , , 1, , 1], [, 1, , , , , , , , , 1]]];
    __name(isValidLang, "isValidLang");
  }
});

// core/audits/seo/hreflang.js
var hreflang_exports = {};
__export(hreflang_exports, {
  UIStrings: () => UIStrings117,
  default: () => hreflang_default
});
function isFullyQualified(href) {
  return href.startsWith("http:") || href.startsWith("https:");
}
function isExpectedLanguageCode(hreflang) {
  if (hreflang.toLowerCase() === NO_LANGUAGE) {
    return true;
  }
  const [lang] = hreflang.split("-");
  return isValidLang(lang.toLowerCase());
}
var NO_LANGUAGE, UIStrings117, str_96, Hreflang, hreflang_default;
var init_hreflang = __esm({
  "core/audits/seo/hreflang.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    init_valid_langs();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    NO_LANGUAGE = "x-default";
    UIStrings117 = {
      /** Title of a Lighthouse audit that provides detail on the `hreflang` attribute on a page. This descriptive title is shown when the page's `hreflang` attribute is configured correctly. "hreflang" is an HTML attribute and should not be translated. */
      title: "Document has a valid `hreflang`",
      /** Title of a Lighthouse audit that provides detail on the `hreflang` attribute on a page. This descriptive title is shown when the page's `hreflang` attribute is not valid and needs to be fixed. "hreflang" is an HTML attribute and should not be translated. */
      failureTitle: "Document doesn't have a valid `hreflang`",
      /** Description of a Lighthouse audit that tells the user *why* they need to have an hreflang link on their page. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. "hreflang" is an HTML attribute and should not be translated. */
      description: "hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more about `hreflang`](https://developer.chrome.com/docs/lighthouse/seo/hreflang/).",
      /** A failure reason for a Lighthouse audit that flags incorrect use of the `hreflang` attribute on `link` elements. This failure reason is shown when the hreflang language code is unexpected. */
      unexpectedLanguage: "Unexpected language code",
      /** A failure reason for a Lighthouse audit that flags incorrect use of the `hreflang` attribute on `link` elements. This failure reason is shown when the `href` attribute value is not fully-qualified. */
      notFullyQualified: "Relative href value"
    };
    str_96 = createIcuMessageFn({ url: "core/audits/seo/hreflang.js" }.url, UIStrings117);
    __name(isFullyQualified, "isFullyQualified");
    __name(isExpectedLanguageCode, "isExpectedLanguageCode");
    Hreflang = class extends Audit {
      static {
        __name(this, "Hreflang");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "hreflang",
          title: str_96(UIStrings117.title),
          failureTitle: str_96(UIStrings117.failureTitle),
          description: str_96(UIStrings117.description),
          supportedModes: ["navigation"],
          requiredArtifacts: ["LinkElements", "URL"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit({ LinkElements: LinkElements2 }) {
        const invalidHreflangs = [];
        const auditableLinkElements = LinkElements2.filter((linkElement) => {
          const isAlternate = linkElement.rel === "alternate";
          const hasHreflang = linkElement.hreflang;
          const isInBody = linkElement.source === "body";
          return isAlternate && hasHreflang && !isInBody;
        });
        for (const link of auditableLinkElements) {
          const reasons = [];
          let source;
          if (!isExpectedLanguageCode(link.hreflang)) {
            reasons.push(str_96(UIStrings117.unexpectedLanguage));
          }
          if (!isFullyQualified(link.hrefRaw.toLowerCase())) {
            reasons.push(str_96(UIStrings117.notFullyQualified));
          }
          if (link.source === "head") {
            if (link.node) {
              source = {
                ...Audit.makeNodeItem(link.node),
                snippet: `<link rel="alternate" hreflang="${link.hreflang}" href="${link.hrefRaw}" />`
              };
            } else {
              source = {
                type: "node",
                snippet: `<link rel="alternate" hreflang="${link.hreflang}" href="${link.hrefRaw}" />`
              };
            }
          } else if (link.source === "headers") {
            source = `Link: <${link.hrefRaw}>; rel="alternate"; hreflang="${link.hreflang}"`;
          }
          if (!source || !reasons.length) continue;
          invalidHreflangs.push({
            source,
            subItems: {
              type: "subitems",
              items: reasons.map((reason) => ({ reason }))
            }
          });
        }
        const headings = [{
          key: "source",
          valueType: "code",
          subItemsHeading: {
            key: "reason",
            valueType: "text"
          },
          label: ""
        }];
        const details = Audit.makeTableDetails(headings, invalidHreflangs);
        return {
          score: Number(invalidHreflangs.length === 0),
          details
        };
      }
    };
    hreflang_default = Hreflang;
  }
});

// core/audits/seo/http-status-code.js
var http_status_code_exports = {};
__export(http_status_code_exports, {
  UIStrings: () => UIStrings118,
  default: () => http_status_code_default
});
var HTTP_UNSUCCESSFUL_CODE_LOW, HTTP_UNSUCCESSFUL_CODE_HIGH, UIStrings118, str_97, HTTPStatusCode, http_status_code_default;
var init_http_status_code = __esm({
  "core/audits/seo/http-status-code.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    init_main_resource();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    HTTP_UNSUCCESSFUL_CODE_LOW = 400;
    HTTP_UNSUCCESSFUL_CODE_HIGH = 599;
    UIStrings118 = {
      /** Title of a Lighthouse audit that provides detail on the HTTP status code a page responds with. This descriptive title is shown when the page has responded with a valid HTTP status code. */
      title: "Page has successful HTTP status code",
      /** Descriptive title of a Lighthouse audit that provides detail on the HTTP status code a page responds with. This descriptive title is shown when the page responds to requests with an HTTP status code that indicates the request was unsuccessful. */
      failureTitle: "Page has unsuccessful HTTP status code",
      /** Description of a Lighthouse audit that tells the user *why* they need to serve pages with a valid HTTP status code. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Pages with unsuccessful HTTP status codes may not be indexed properly. [Learn more about HTTP status codes](https://developer.chrome.com/docs/lighthouse/seo/http-status-code/)."
    };
    str_97 = createIcuMessageFn({ url: "core/audits/seo/http-status-code.js" }.url, UIStrings118);
    HTTPStatusCode = class extends Audit {
      static {
        __name(this, "HTTPStatusCode");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "http-status-code",
          title: str_97(UIStrings118.title),
          failureTitle: str_97(UIStrings118.failureTitle),
          description: str_97(UIStrings118.description),
          requiredArtifacts: ["DevtoolsLog", "URL", "GatherContext"],
          supportedModes: ["navigation"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const URL3 = artifacts.URL;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: URL3 }, context);
        const statusCode = mainResource.statusCode;
        if (statusCode >= HTTP_UNSUCCESSFUL_CODE_LOW && statusCode <= HTTP_UNSUCCESSFUL_CODE_HIGH) {
          return {
            score: 0,
            displayValue: `${statusCode}`
          };
        }
        return {
          score: 1
        };
      }
    };
    http_status_code_default = HTTPStatusCode;
  }
});

// node_modules/robots-parser/Robots.js
var require_Robots = __commonJS({
  "node_modules/robots-parser/Robots.js"(exports2, module2) {
    init_process_global();
    function trimLine(line) {
      if (!line) {
        return null;
      }
      if (Array.isArray(line)) {
        return line.map(trimLine);
      }
      return String(line).trim();
    }
    __name(trimLine, "trimLine");
    function removeComments(line) {
      var commentStartIndex = line.indexOf("#");
      if (commentStartIndex > -1) {
        return line.substr(0, commentStartIndex);
      }
      return line;
    }
    __name(removeComments, "removeComments");
    function splitLine(line) {
      var idx = String(line).indexOf(":");
      if (!line || idx < 0) {
        return null;
      }
      return [line.slice(0, idx), line.slice(idx + 1)];
    }
    __name(splitLine, "splitLine");
    function formatUserAgent(userAgent) {
      var formattedUserAgent = userAgent.toLowerCase();
      var idx = formattedUserAgent.indexOf("/");
      if (idx > -1) {
        formattedUserAgent = formattedUserAgent.substr(0, idx);
      }
      return formattedUserAgent.trim();
    }
    __name(formatUserAgent, "formatUserAgent");
    function normaliseEncoding(path7) {
      try {
        return urlEncodeToUpper(encodeURI(path7).replace(/%25/g, "%"));
      } catch (e) {
        return path7;
      }
    }
    __name(normaliseEncoding, "normaliseEncoding");
    function urlEncodeToUpper(path7) {
      return path7.replace(/%[0-9a-fA-F]{2}/g, function(match) {
        return match.toUpperCase();
      });
    }
    __name(urlEncodeToUpper, "urlEncodeToUpper");
    function matches(pattern, path7) {
      var matchingLengths = new Array(path7.length + 1);
      var numMatchingLengths = 1;
      matchingLengths[0] = 0;
      for (var p = 0; p < pattern.length; p++) {
        if (pattern[p] === "$" && p + 1 === pattern.length) {
          return matchingLengths[numMatchingLengths - 1] === path7.length;
        }
        if (pattern[p] == "*") {
          numMatchingLengths = path7.length - matchingLengths[0] + 1;
          for (var i = 1; i < numMatchingLengths; i++) {
            matchingLengths[i] = matchingLengths[i - 1] + 1;
          }
        } else {
          var numMatches = 0;
          for (var i = 0; i < numMatchingLengths; i++) {
            if (matchingLengths[i] < path7.length && path7[matchingLengths[i]] === pattern[p]) {
              matchingLengths[numMatches++] = matchingLengths[i] + 1;
            }
          }
          if (numMatches == 0) {
            return false;
          }
          numMatchingLengths = numMatches;
        }
      }
      return true;
    }
    __name(matches, "matches");
    function parseRobots(contents, robots) {
      var newlineRegex = /\r\n|\r|\n/;
      var lines = contents.split(newlineRegex).map(removeComments).map(splitLine).map(trimLine);
      var currentUserAgents = [];
      var isNoneUserAgentState = true;
      for (var i = 0; i < lines.length; i++) {
        var line = lines[i];
        if (!line || !line[0]) {
          continue;
        }
        switch (line[0].toLowerCase()) {
          case "user-agent":
            if (isNoneUserAgentState) {
              currentUserAgents.length = 0;
            }
            if (line[1]) {
              currentUserAgents.push(formatUserAgent(line[1]));
            }
            break;
          case "disallow":
            robots.addRule(currentUserAgents, line[1], false, i + 1);
            break;
          case "allow":
            robots.addRule(currentUserAgents, line[1], true, i + 1);
            break;
          case "crawl-delay":
            robots.setCrawlDelay(currentUserAgents, line[1]);
            break;
          case "sitemap":
            if (line[1]) {
              robots.addSitemap(line[1]);
            }
            break;
          case "host":
            if (line[1]) {
              robots.setPreferredHost(line[1].toLowerCase());
            }
            break;
        }
        isNoneUserAgentState = line[0].toLowerCase() !== "user-agent";
      }
    }
    __name(parseRobots, "parseRobots");
    function findRule(path7, rules) {
      var matchedRule = null;
      for (var i = 0; i < rules.length; i++) {
        var rule = rules[i];
        if (!matches(rule.pattern, path7)) {
          continue;
        }
        if (!matchedRule || rule.pattern.length > matchedRule.pattern.length) {
          matchedRule = rule;
        } else if (rule.pattern.length == matchedRule.pattern.length && rule.allow && !matchedRule.allow) {
          matchedRule = rule;
        }
      }
      return matchedRule;
    }
    __name(findRule, "findRule");
    function parseUrl(url) {
      try {
        var url = new URL(url, "http://robots-relative.samclarke.com/");
        if (!url.port) {
          url.port = url.protocol === "https:" ? 443 : 80;
        }
        return url;
      } catch (e) {
        return null;
      }
    }
    __name(parseUrl, "parseUrl");
    function Robots(url, contents) {
      this._url = parseUrl(url) || {};
      this._rules = /* @__PURE__ */ Object.create(null);
      this._sitemaps = [];
      this._preferredHost = null;
      parseRobots(contents || "", this);
    }
    __name(Robots, "Robots");
    Robots.prototype.addRule = function(userAgents2, pattern, allow, lineNumber) {
      var rules = this._rules;
      userAgents2.forEach(function(userAgent) {
        rules[userAgent] = rules[userAgent] || [];
        if (!pattern) {
          return;
        }
        rules[userAgent].push({
          pattern: normaliseEncoding(pattern),
          allow,
          lineNumber
        });
      });
    };
    Robots.prototype.setCrawlDelay = function(userAgents2, delayStr) {
      var rules = this._rules;
      var delay = Number(delayStr);
      userAgents2.forEach(function(userAgent) {
        rules[userAgent] = rules[userAgent] || [];
        if (isNaN(delay)) {
          return;
        }
        rules[userAgent].crawlDelay = delay;
      });
    };
    Robots.prototype.addSitemap = function(url) {
      this._sitemaps.push(url);
    };
    Robots.prototype.setPreferredHost = function(url) {
      this._preferredHost = url;
    };
    Robots.prototype._getRule = function(url, ua) {
      var parsedUrl = parseUrl(url) || {};
      var userAgent = formatUserAgent(ua || "*");
      if (parsedUrl.protocol !== this._url.protocol || parsedUrl.hostname !== this._url.hostname || parsedUrl.port !== this._url.port) {
        return;
      }
      var rules = this._rules[userAgent] || this._rules["*"] || [];
      var path7 = urlEncodeToUpper(parsedUrl.pathname + parsedUrl.search);
      var rule = findRule(path7, rules);
      return rule;
    };
    Robots.prototype.isAllowed = function(url, ua) {
      var rule = this._getRule(url, ua);
      if (typeof rule === "undefined") {
        return;
      }
      return !rule || rule.allow;
    };
    Robots.prototype.getMatchingLineNumber = function(url, ua) {
      var rule = this._getRule(url, ua);
      return rule ? rule.lineNumber : -1;
    };
    Robots.prototype.isDisallowed = function(url, ua) {
      return !this.isAllowed(url, ua);
    };
    Robots.prototype.getCrawlDelay = function(ua) {
      var userAgent = formatUserAgent(ua || "*");
      return (this._rules[userAgent] || this._rules["*"] || {}).crawlDelay;
    };
    Robots.prototype.getPreferredHost = function() {
      return this._preferredHost;
    };
    Robots.prototype.getSitemaps = function() {
      return this._sitemaps.slice(0);
    };
    module2.exports = Robots;
  }
});

// node_modules/robots-parser/index.js
var require_robots_parser = __commonJS({
  "node_modules/robots-parser/index.js"(exports2, module2) {
    init_process_global();
    var Robots = require_Robots();
    module2.exports = function(url, contents) {
      return new Robots(url, contents);
    };
  }
});

// core/audits/seo/is-crawlable.js
var is_crawlable_exports = {};
__export(is_crawlable_exports, {
  UIStrings: () => UIStrings119,
  default: () => is_crawlable_default
});
function isUnavailable(directive) {
  const parts = directive.split(":");
  if (parts.length <= 1 || parts[0] !== UNAVAILABLE_AFTER) {
    return false;
  }
  const date = Date.parse(parts.slice(1).join(":"));
  return !isNaN(date) && date < Date.now();
}
function hasBlockingDirective(directives) {
  return directives.split(",").map((d) => d.toLowerCase().trim()).some((d) => BLOCKLIST.has(d) || isUnavailable(d));
}
function getUserAgentFromHeaderDirectives(directives) {
  const parts = directives.match(/^([^,:]+):/);
  if (!!parts && parts[1].toLowerCase() !== UNAVAILABLE_AFTER) {
    return parts[1];
  }
}
var import_robots_parser, BOT_USER_AGENTS, BLOCKLIST, ROBOTS_HEADER, UNAVAILABLE_AFTER, UIStrings119, str_98, IsCrawlable, is_crawlable_default;
var init_is_crawlable = __esm({
  "core/audits/seo/is-crawlable.js"() {
    "use strict";
    init_process_global();
    import_robots_parser = __toESM(require_robots_parser(), 1);
    init_audit();
    init_main_resource();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    BOT_USER_AGENTS = /* @__PURE__ */ new Set([
      void 0,
      "Googlebot",
      "bingbot",
      "DuckDuckBot",
      "archive.org_bot"
    ]);
    BLOCKLIST = /* @__PURE__ */ new Set([
      "noindex",
      "none"
    ]);
    ROBOTS_HEADER = "x-robots-tag";
    UNAVAILABLE_AFTER = "unavailable_after";
    UIStrings119 = {
      /** Title of a Lighthouse audit that provides detail on if search-engine crawlers are blocked from indexing the page. This title is shown when the page is not blocked from indexing and can be crawled. */
      title: "Page isn’t blocked from indexing",
      /** Title of a Lighthouse audit that provides detail on if search-engine crawlers are blocked from indexing the page. This title is shown when the page has been configured to block indexing and therefore cannot be indexed by search engines. */
      failureTitle: "Page is blocked from indexing",
      /** Description of a Lighthouse audit that tells the user *why* allowing search-engine crawling of their page is beneficial. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Search engines are unable to include your pages in search results if they don't have permission to crawl them. [Learn more about crawler directives](https://developer.chrome.com/docs/lighthouse/seo/is-crawlable/)."
    };
    str_98 = createIcuMessageFn({ url: "core/audits/seo/is-crawlable.js" }.url, UIStrings119);
    __name(isUnavailable, "isUnavailable");
    __name(hasBlockingDirective, "hasBlockingDirective");
    __name(getUserAgentFromHeaderDirectives, "getUserAgentFromHeaderDirectives");
    IsCrawlable = class _IsCrawlable extends Audit {
      static {
        __name(this, "IsCrawlable");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "is-crawlable",
          title: str_98(UIStrings119.title),
          failureTitle: str_98(UIStrings119.failureTitle),
          description: str_98(UIStrings119.description),
          supportedModes: ["navigation"],
          requiredArtifacts: ["MetaElements", "RobotsTxt", "URL", "DevtoolsLog"]
        };
      }
      /**
       * @param {LH.Artifacts.MetaElement} metaElement
       */
      static handleMetaElement(metaElement) {
        const content = metaElement.content || "";
        if (hasBlockingDirective(content)) {
          return {
            source: {
              ...Audit.makeNodeItem(metaElement.node),
              snippet: `<meta name="${metaElement.name}" content="${content}" />`
            }
          };
        }
      }
      /**
       * @param {string|undefined} userAgent
       * @param {LH.Artifacts.NetworkRequest} mainResource
       * @param {LH.Artifacts.MetaElement[]} metaElements
       * @param {import('robots-parser').Robot|undefined} parsedRobotsTxt
       * @param {URL} robotsTxtUrl
       */
      static determineIfCrawlableForUserAgent(userAgent, mainResource, metaElements, parsedRobotsTxt, robotsTxtUrl) {
        const blockingDirectives = [];
        let meta;
        if (userAgent) meta = metaElements.find((meta2) => meta2.name === userAgent.toLowerCase());
        if (!meta) meta = metaElements.find((meta2) => meta2.name === "robots");
        if (meta) {
          const blockingDirective = _IsCrawlable.handleMetaElement(meta);
          if (blockingDirective) blockingDirectives.push(blockingDirective);
        }
        for (const header of mainResource.responseHeaders || []) {
          if (header.name.toLowerCase() !== ROBOTS_HEADER) continue;
          const directiveUserAgent = getUserAgentFromHeaderDirectives(header.value);
          if (directiveUserAgent !== userAgent && directiveUserAgent !== void 0) continue;
          let directiveWithoutUserAgentPrefix = header.value.trim();
          if (userAgent && header.value.startsWith(`${userAgent}:`)) {
            directiveWithoutUserAgentPrefix = header.value.replace(`${userAgent}:`, "");
          }
          if (!hasBlockingDirective(directiveWithoutUserAgentPrefix)) continue;
          blockingDirectives.push({ source: `${header.name}: ${header.value}` });
        }
        if (parsedRobotsTxt && !parsedRobotsTxt.isAllowed(mainResource.url, userAgent)) {
          const line = parsedRobotsTxt.getMatchingLineNumber(mainResource.url) || 1;
          blockingDirectives.push({
            source: {
              type: (
                /** @type {const} */
                "source-location"
              ),
              url: robotsTxtUrl.href,
              urlProvider: (
                /** @type {const} */
                "network"
              ),
              line: line - 1,
              column: 0
            }
          });
        }
        return blockingDirectives;
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        const robotsTxtUrl = new URL("/robots.txt", mainResource.url);
        const parsedRobotsTxt = artifacts.RobotsTxt.content ? (0, import_robots_parser.default)(robotsTxtUrl.href, artifacts.RobotsTxt.content) : void 0;
        const blockedUserAgents = [];
        const genericBlockingDirectives = [];
        for (const userAgent of BOT_USER_AGENTS) {
          const blockingDirectives = _IsCrawlable.determineIfCrawlableForUserAgent(
            userAgent,
            mainResource,
            artifacts.MetaElements,
            parsedRobotsTxt,
            robotsTxtUrl
          );
          if (blockingDirectives.length > 0) {
            blockedUserAgents.push(userAgent);
          }
          if (userAgent === void 0) {
            genericBlockingDirectives.push(...blockingDirectives);
          }
        }
        const score = blockedUserAgents.length === BOT_USER_AGENTS.size ? 0 : 1;
        const warnings = [];
        if (score && blockedUserAgents.length > 0) {
          const list = blockedUserAgents.filter(Boolean).join(", ");
          warnings.push(`The following bot user agents are blocked from crawling: ${list}. The audit is otherwise passing, because at least one bot was explicitly allowed.`);
        }
        const headings = [
          { key: "source", valueType: "code", label: "Blocking Directive Source" }
        ];
        const details = Audit.makeTableDetails(headings, score === 0 ? genericBlockingDirectives : []);
        return {
          score,
          details,
          warnings
        };
      }
    };
    is_crawlable_default = IsCrawlable;
  }
});

// core/audits/seo/link-text.js
var link_text_exports = {};
__export(link_text_exports, {
  UIStrings: () => UIStrings120,
  default: () => link_text_default
});
var nonDescriptiveLinkTexts, UIStrings120, str_99, LinkText, link_text_default;
var init_link_text = __esm({
  "core/audits/seo/link-text.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_url_utils();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    nonDescriptiveLinkTexts = {
      // English
      "en": /* @__PURE__ */ new Set([
        "click here",
        "click this",
        "go",
        "here",
        "information",
        "learn more",
        "more",
        "more info",
        "more information",
        "right here",
        "read more",
        "see more",
        "start",
        "this"
      ]),
      // Japanese
      "ja": /* @__PURE__ */ new Set([
        "ここをクリック",
        "こちらをクリック",
        "リンク",
        "続きを読む",
        "続く",
        "全文表示"
      ]),
      // Spanish
      "es": /* @__PURE__ */ 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"
      ]),
      // Portuguese
      "pt": /* @__PURE__ */ new Set([
        "clique aqui",
        "ir",
        "mais informação",
        "mais informações",
        "mais",
        "veja mais"
      ]),
      // Korean
      "ko": /* @__PURE__ */ new Set([
        "여기",
        "여기를 클릭",
        "클릭",
        "링크",
        "자세히",
        "자세히 보기",
        "계속",
        "이동",
        "전체 보기"
      ]),
      // Swedish
      "sv": /* @__PURE__ */ new Set([
        "här",
        "klicka här",
        "läs mer",
        "mer",
        "mer info",
        "mer information"
      ]),
      // German
      "de": /* @__PURE__ */ new Set([
        "klicke hier",
        "hier klicken",
        "hier",
        "mehr",
        "siehe",
        "dies",
        "das",
        "weiterlesen"
      ]),
      // Tamil
      "ta": /* @__PURE__ */ new Set([
        "அடுத்த பக்கம்",
        "மறுபக்கம்",
        "முந்தைய பக்கம்",
        "முன்பக்கம்",
        "மேலும் அறிக",
        "மேலும் தகவலுக்கு",
        "மேலும் தரவுகளுக்கு",
        "தயவுசெய்து இங்கே அழுத்தவும்",
        "இங்கே கிளிக் செய்யவும்"
      ]),
      // Persian
      "fa": /* @__PURE__ */ new Set([
        "اطلاعات بیشتر",
        "اطلاعات",
        "این",
        "اینجا بزنید",
        "اینجا کلیک کنید",
        "اینجا",
        "برو",
        "بیشتر بخوانید",
        "بیشتر بدانید",
        "بیشتر",
        "شروع"
      ])
    };
    UIStrings120 = {
      /** Title of a Lighthouse audit that tests if each link on a page contains a sufficient description of what a user will find when they click it. Generic, non-descriptive text like "click here" doesn't give an indication of what the link leads to. This descriptive title is shown when all links on the page have sufficient textual descriptions. */
      title: "Links have descriptive text",
      /** Title of a Lighthouse audit that tests if each link on a page contains a sufficient description of what a user will find when they click it. Generic, non-descriptive text like "click here" doesn't give an indication of what the link leads to. This descriptive title is shown when one or more links on the page contain generic, non-descriptive text. */
      failureTitle: "Links do not have descriptive text",
      /** Description of a Lighthouse audit that tells the user *why* they need to have descriptive text on the links in their page. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Descriptive link text helps search engines understand your content. [Learn how to make links more accessible](https://developer.chrome.com/docs/lighthouse/seo/link-text/).",
      /** [ICU Syntax] Label for the audit identifying the number of links found. "link" here refers to the links in a web page to other web pages. */
      displayValue: `{itemCount, plural,
    =1 {1 link found}
    other {# links found}
    }`
    };
    str_99 = createIcuMessageFn({ url: "core/audits/seo/link-text.js" }.url, UIStrings120);
    LinkText = class extends Audit {
      static {
        __name(this, "LinkText");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "link-text",
          title: str_99(UIStrings120.title),
          failureTitle: str_99(UIStrings120.failureTitle),
          description: str_99(UIStrings120.description),
          requiredArtifacts: ["URL", "AnchorElements"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const failingLinks = artifacts.AnchorElements.filter((link) => {
          if (!link.href || link.rel.includes("nofollow")) return false;
          const href = link.href.toLowerCase();
          if (href.startsWith("javascript:") || href.startsWith("mailto:") || // This line prevents the audit from flagging anchor links.
          // In this case it is better to use `finalDisplayedUrl` than `mainDocumentUrl`.
          url_utils_default.equalWithExcludedFragments(link.href, artifacts.URL.finalDisplayedUrl)) {
            return false;
          }
          const searchTerm = link.text.trim().toLowerCase();
          if (searchTerm) {
            if (link.textLang) {
              const lang = link.textLang.split("-")[0];
              if (nonDescriptiveLinkTexts[lang] && nonDescriptiveLinkTexts[lang].has(searchTerm)) {
                return true;
              }
            } else {
              for (const texts of Object.values(nonDescriptiveLinkTexts)) {
                if (texts.has(searchTerm)) {
                  return true;
                }
              }
            }
          }
          return false;
        }).map((link) => {
          return {
            href: link.href,
            text: link.text.trim(),
            textLang: link.textLang
          };
        });
        const headings = [
          { key: "href", valueType: "url", label: "Link destination" },
          { key: "text", valueType: "text", label: "Link Text" }
        ];
        const details = Audit.makeTableDetails(headings, failingLinks);
        let displayValue;
        if (failingLinks.length) {
          displayValue = str_99(UIStrings120.displayValue, { itemCount: failingLinks.length });
        }
        return {
          score: Number(failingLinks.length === 0),
          details,
          displayValue
        };
      }
    };
    link_text_default = LinkText;
  }
});

// core/audits/seo/manual/structured-data.js
var structured_data_exports = {};
__export(structured_data_exports, {
  UIStrings: () => UIStrings121,
  default: () => structured_data_default
});
var UIStrings121, str_100, StructuredData, structured_data_default;
var init_structured_data = __esm({
  "core/audits/seo/manual/structured-data.js"() {
    "use strict";
    init_process_global();
    init_manual_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings121 = {
      /** Description of a Lighthouse audit that provides detail on the structured data in a page. "Structured data" is a standardized data format on a page that helps a search engine categorize and understand its contents. This description is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Run the [Structured Data Testing Tool](https://developers.google.com/search/docs/appearance/structured-data/) to validate structured data. [Learn more about Structured Data](https://developer.chrome.com/docs/lighthouse/seo/structured-data/).",
      /** Title of a Lighthouse audit that prompts users to manually check their page for valid structured data. "Structured data" is a standardized data format on a page that helps a search engine categorize and understand its contents. */
      title: "Structured data is valid"
    };
    str_100 = createIcuMessageFn({ url: "core/audits/seo/manual/structured-data.js" }.url, UIStrings121);
    StructuredData = class extends manual_audit_default {
      static {
        __name(this, "StructuredData");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return Object.assign({
          id: "structured-data",
          description: str_100(UIStrings121.description),
          title: str_100(UIStrings121.title)
        }, super.partialMeta);
      }
    };
    structured_data_default = StructuredData;
  }
});

// core/audits/seo/meta-description.js
var meta_description_exports = {};
__export(meta_description_exports, {
  UIStrings: () => UIStrings122,
  default: () => meta_description_default
});
var UIStrings122, str_101, Description, meta_description_default;
var init_meta_description = __esm({
  "core/audits/seo/meta-description.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings122 = {
      /** Title of a Lighthouse audit that provides detail on the web page's document meta description. This descriptive title is shown when the document has a meta description. "meta" should be left untranslated because it refers to an HTML element. */
      title: "Document has a meta description",
      /** Title of a Lighthouse audit that provides detail on the web page's document meta description. This descriptive title is shown when the document does not have a meta description. "meta" should be left untranslated because it refers to an HTML element. */
      failureTitle: "Document does not have a meta description",
      /** Description of a Lighthouse audit that tells the user *why* they need to have meta descriptions on their page. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Meta descriptions may be included in search results to concisely summarize page content. [Learn more about the meta description](https://developer.chrome.com/docs/lighthouse/seo/meta-description/).",
      /** Explanatory message stating that there was a failure in an audit caused by the page's meta description text being empty. */
      explanation: "Description text is empty."
    };
    str_101 = createIcuMessageFn({ url: "core/audits/seo/meta-description.js" }.url, UIStrings122);
    Description = class extends Audit {
      static {
        __name(this, "Description");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "meta-description",
          title: str_101(UIStrings122.title),
          failureTitle: str_101(UIStrings122.failureTitle),
          description: str_101(UIStrings122.description),
          requiredArtifacts: ["MetaElements"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const metaDescription = artifacts.MetaElements.find((meta) => meta.name === "description");
        if (!metaDescription) {
          return {
            score: 0
          };
        }
        const description = metaDescription.content || "";
        if (description.trim().length === 0) {
          return {
            score: 0,
            explanation: str_101(UIStrings122.explanation)
          };
        }
        return {
          score: 1
        };
      }
    };
    meta_description_default = Description;
  }
});

// core/audits/seo/robots-txt.js
var robots_txt_exports2 = {};
__export(robots_txt_exports2, {
  UIStrings: () => UIStrings123,
  default: () => robots_txt_default2
});
function verifyDirective(directiveName, directiveValue) {
  if (!DIRECTIVE_SAFELIST.has(directiveName)) {
    throw new Error("Unknown directive");
  }
  if (directiveName === DIRECTIVE_SITEMAP) {
    let sitemapUrl;
    try {
      sitemapUrl = new URL(directiveValue);
    } catch (e) {
      throw new Error("Invalid sitemap URL");
    }
    if (!SITEMAP_VALID_PROTOCOLS.has(sitemapUrl.protocol)) {
      throw new Error("Invalid sitemap URL protocol");
    }
  }
  if (directiveName === DIRECTIVE_USER_AGENT && !directiveValue) {
    throw new Error("No user-agent specified");
  }
  if (directiveName === DIRECTIVE_ALLOW || directiveName === DIRECTIVE_DISALLOW) {
    if (directiveValue !== "" && directiveValue[0] !== "/" && directiveValue[0] !== "*") {
      throw new Error('Pattern should either be empty, start with "/" or "*"');
    }
    const dollarIndex = directiveValue.indexOf("$");
    if (dollarIndex !== -1 && dollarIndex !== directiveValue.length - 1) {
      throw new Error('"$" should only be used at the end of the pattern');
    }
  }
}
function parseLine(line) {
  const hashIndex = line.indexOf("#");
  if (hashIndex !== -1) {
    line = line.substr(0, hashIndex);
  }
  line = line.trim();
  if (line.length === 0) {
    return null;
  }
  const colonIndex = line.indexOf(":");
  if (colonIndex === -1) {
    throw new Error("Syntax not understood");
  }
  const directiveName = line.slice(0, colonIndex).trim().toLowerCase();
  const directiveValue = line.slice(colonIndex + 1).trim();
  verifyDirective(directiveName, directiveValue);
  return {
    directive: directiveName,
    value: directiveValue
  };
}
function validateRobots(content) {
  const errors = [];
  let inGroup = false;
  content.split(/\r\n|\r|\n/).forEach((line, index) => {
    let parsedLine;
    try {
      parsedLine = parseLine(line);
    } catch (e) {
      errors.push({
        index: (index + 1).toString(),
        line,
        message: e.message.toString()
      });
    }
    if (!parsedLine) {
      return;
    }
    if (parsedLine.directive === DIRECTIVE_USER_AGENT) {
      inGroup = true;
    } else if (!inGroup && DIRECTIVES_GROUP_MEMBERS.has(parsedLine.directive)) {
      errors.push({
        index: (index + 1).toString(),
        line,
        message: "No user-agent specified"
      });
    }
  });
  return errors;
}
var HTTP_CLIENT_ERROR_CODE_LOW2, HTTP_SERVER_ERROR_CODE_LOW2, DIRECTIVE_SITEMAP, DIRECTIVE_USER_AGENT, DIRECTIVE_ALLOW, DIRECTIVE_DISALLOW, DIRECTIVES_GROUP_MEMBERS, DIRECTIVE_SAFELIST, SITEMAP_VALID_PROTOCOLS, UIStrings123, str_102, RobotsTxt2, robots_txt_default2;
var init_robots_txt2 = __esm({
  "core/audits/seo/robots-txt.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2018 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    HTTP_CLIENT_ERROR_CODE_LOW2 = 400;
    HTTP_SERVER_ERROR_CODE_LOW2 = 500;
    DIRECTIVE_SITEMAP = "sitemap";
    DIRECTIVE_USER_AGENT = "user-agent";
    DIRECTIVE_ALLOW = "allow";
    DIRECTIVE_DISALLOW = "disallow";
    DIRECTIVES_GROUP_MEMBERS = /* @__PURE__ */ new Set([DIRECTIVE_ALLOW, DIRECTIVE_DISALLOW]);
    DIRECTIVE_SAFELIST = /* @__PURE__ */ new Set([
      DIRECTIVE_USER_AGENT,
      DIRECTIVE_DISALLOW,
      // standard
      DIRECTIVE_ALLOW,
      DIRECTIVE_SITEMAP,
      // universally supported
      "crawl-delay",
      // yahoo, bing, yandex
      "clean-param",
      "host",
      // yandex
      "request-rate",
      "visit-time",
      "noindex",
      "content-signal"
      // not officially supported, but used in the wild
    ]);
    SITEMAP_VALID_PROTOCOLS = /* @__PURE__ */ new Set(["https:", "http:", "ftp:"]);
    UIStrings123 = {
      /** Title of a Lighthouse audit that provides detail on the site's robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This descriptive title is shown when the robots.txt file is present and configured correctly. */
      title: "robots.txt is valid",
      /** Title of a Lighthouse audit that provides detail on the site's robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This descriptive title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */
      failureTitle: "robots.txt is not valid",
      /** Description of a Lighthouse audit that tells the user *why* they need to have a valid robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This is displayed after a user expands the section to see more. No character length limits. */
      description: "If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. [Learn more about robots.txt](https://developer.chrome.com/docs/lighthouse/seo/invalid-robots-txt/).",
      /**
       * @description Label for the audit identifying that the robots.txt request has returned a specific HTTP status code. Note: "robots.txt" is a canonical filename and should not be translated.
       * @example {500} statusCode
       * */
      displayValueHttpBadCode: "Request for robots.txt returned HTTP status: {statusCode}",
      /** [ICU Syntax] Label for the audit identifying the number of errors that occured while validating the robots.txt file. "itemCount" will be replaced by the integer count of errors encountered. */
      displayValueValidationError: `{itemCount, plural,
    =1 {1 error found}
    other {# errors found}
    }`,
      /** Explanatory message stating that there was a failure in an audit caused by Lighthouse not being able to download the robots.txt file for the site.  Note: "robots.txt" is a canonical filename and should not be translated. */
      explanation: "Lighthouse was unable to download a robots.txt file"
    };
    str_102 = createIcuMessageFn({ url: "core/audits/seo/robots-txt.js" }.url, UIStrings123);
    __name(verifyDirective, "verifyDirective");
    __name(parseLine, "parseLine");
    __name(validateRobots, "validateRobots");
    RobotsTxt2 = class extends Audit {
      static {
        __name(this, "RobotsTxt");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "robots-txt",
          title: str_102(UIStrings123.title),
          failureTitle: str_102(UIStrings123.failureTitle),
          description: str_102(UIStrings123.description),
          requiredArtifacts: ["RobotsTxt"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const {
          status,
          content
        } = artifacts.RobotsTxt;
        if (!status) {
          return {
            score: 0,
            explanation: str_102(UIStrings123.explanation)
          };
        }
        if (status >= HTTP_SERVER_ERROR_CODE_LOW2) {
          return {
            score: 0,
            displayValue: str_102(UIStrings123.displayValueHttpBadCode, { statusCode: status })
          };
        } else if (status >= HTTP_CLIENT_ERROR_CODE_LOW2 || content === "") {
          return {
            score: 1,
            notApplicable: true
          };
        }
        if (content === null) {
          throw new Error(`Status ${status} was valid, but content was null`);
        }
        const validationErrors = validateRobots(content);
        const headings = [
          { key: "index", valueType: "text", label: "Line #" },
          { key: "line", valueType: "code", label: "Content" },
          { key: "message", valueType: "code", label: "Error" }
        ];
        const details = Audit.makeTableDetails(headings, validationErrors);
        let displayValue;
        if (validationErrors.length) {
          displayValue = str_102(UIStrings123.displayValueValidationError, { itemCount: validationErrors.length });
        }
        return {
          score: Number(validationErrors.length === 0),
          details,
          displayValue
        };
      }
    };
    robots_txt_default2 = RobotsTxt2;
  }
});

// core/audits/third-party-cookies.js
var third_party_cookies_exports = {};
__export(third_party_cookies_exports, {
  UIStrings: () => UIStrings124,
  default: () => third_party_cookies_default
});
var UIStrings124, str_103, ThirdPartyCookies, third_party_cookies_default;
var init_third_party_cookies = __esm({
  "core/audits/third-party-cookies.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2023 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings124 = {
      /** Title of a Lighthouse audit that provides detail on the use of third party cookies. This descriptive title is shown to users when the page does not use third party cookies. */
      title: "Avoids third-party cookies",
      /** Title of a Lighthouse audit that provides detail on the use of third party cookies. This descriptive title is shown to users when the page uses third party cookies. */
      failureTitle: "Uses third-party cookies",
      /** Description of a Lighthouse audit that tells the user why they should not use third party cookies on their page. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Third-party cookies may be blocked in some contexts. [Learn more about preparing for third-party cookie restrictions](https://privacysandbox.google.com/cookies/prepare/overview).",
      /** [ICU Syntax] Label for the audit identifying the number of third-party cookies. */
      displayValue: `{itemCount, plural,
    =1 {1 cookie found}
    other {# cookies found}
    }`
    };
    str_103 = createIcuMessageFn({ url: "core/audits/third-party-cookies.js" }.url, UIStrings124);
    ThirdPartyCookies = class extends Audit {
      static {
        __name(this, "ThirdPartyCookies");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "third-party-cookies",
          title: str_103(UIStrings124.title),
          failureTitle: str_103(UIStrings124.failureTitle),
          description: str_103(UIStrings124.description),
          requiredArtifacts: ["InspectorIssues"]
        };
      }
      /**
       * https://source.chromium.org/chromium/chromium/src/+/d2fcd4ba302baeabf4b96d8fa9fdb7a215736c31:third_party/devtools-frontend/src/front_end/models/issues_manager/CookieIssue.ts;l=62-69
       * @param {LH.Crdp.Audits.CookieIssueDetails} cookieIssue
       * @return {string}
       */
      static getCookieId(cookieIssue) {
        if (!cookieIssue.cookie) {
          return cookieIssue.rawCookieLine ?? "no-cookie-info";
        }
        const { domain, path: path7, name } = cookieIssue.cookie;
        const cookieId = `${domain};${path7};${name}`;
        return cookieId;
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts) {
        const seenCookies = /* @__PURE__ */ new Set();
        const items = [];
        for (const issue of artifacts.InspectorIssues.cookieIssue ?? []) {
          const isPhaseoutWarn = issue.cookieWarningReasons.includes("WarnThirdPartyPhaseout");
          const isPhaseoutExclude = issue.cookieExclusionReasons.includes("ExcludeThirdPartyPhaseout");
          if (!isPhaseoutWarn && !isPhaseoutExclude) continue;
          const name = issue.cookie?.name || issue.rawCookieLine;
          if (!name) continue;
          const cookieId = this.getCookieId(issue);
          if (seenCookies.has(cookieId)) continue;
          seenCookies.add(cookieId);
          items.push({
            name,
            url: issue.cookieUrl
          });
        }
        const headings = [
          { key: "name", valueType: "text", label: str_103(UIStrings.columnName) },
          { key: "url", valueType: "url", label: str_103(UIStrings.columnURL) }
        ];
        const details = Audit.makeTableDetails(headings, items);
        let displayValue;
        if (items.length > 0) {
          displayValue = str_103(UIStrings124.displayValue, { itemCount: items.length });
        }
        return {
          score: items.length ? 0 : 1,
          displayValue,
          details
        };
      }
    };
    third_party_cookies_default = ThirdPartyCookies;
  }
});

// core/audits/trusted-types-xss.js
var trusted_types_xss_exports = {};
__export(trusted_types_xss_exports, {
  UIStrings: () => UIStrings125,
  default: () => trusted_types_xss_default
});
var import_csp2, UIStrings125, str_104, TrustedTypesXss, trusted_types_xss_default;
var init_trusted_types_xss = __esm({
  "core/audits/trusted-types-xss.js"() {
    "use strict";
    init_process_global();
    import_csp2 = __toESM(require_csp(), 1);
    init_audit();
    init_main_resource();
    init_i18n();
    init_csp_evaluator();
    /**
     * @license
     * Copyright 2025 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings125 = {
      /** Title of a Lighthouse audit that evaluates whether the set CSP header and Trusted Types directive is mitigating DOM-based XSS. "CSP" stands for "Content-Security-Policy" and should not be translated. "XSS" stands for "Cross Site Scripting" and should not be translated. */
      title: "Mitigate DOM-based XSS with Trusted Types",
      /** Description of a Lighthouse audit that evaluates whether the set CSP header and Trusted Types directive is mitigating DOM-based XSS. This is displayed after a user expands the section to see more. "CSP" stands for "Content-Security-Policy" and should not be translated. "XSS" stands for "Cross Site Scripting" and should not be translated. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "The `require-trusted-types-for` directive in the `Content-Security-Policy` (CSP) header instructs user agents to control the data passed to DOM XSS sink functions. [Learn more about mitigating DOM-based XSS with Trusted Types](https://developer.chrome.com/docs/lighthouse/best-practices/trusted-types-xss).",
      /** Summary text for the results of a Lighthouse audit that evaluates whether the set CSP header and Trusted Types directive is mitigating DOM-based XSS. This text is displayed if the page does not respond with a CSP header and a Trusted Types directive. "CSP" stands for "Content-Security-Policy" and should not be translated. "XSS" stands for "Cross Site Scripting" and should not be translated. */
      noTrustedTypesToMitigateXss: "No `Content-Security-Policy` header with Trusted Types directive found",
      /** Label for a column in a data table; entries will be the severity of an issue with the page's CSP and Trusted Types directive. */
      columnSeverity: "Severity"
    };
    str_104 = createIcuMessageFn({ url: "core/audits/trusted-types-xss.js" }.url, UIStrings125);
    TrustedTypesXss = class extends Audit {
      static {
        __name(this, "TrustedTypesXss");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "trusted-types-xss",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_104(UIStrings125.title),
          description: str_104(UIStrings125.description),
          requiredArtifacts: ["DevtoolsLog", "MetaElements", "URL"],
          supportedModes: ["navigation"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<{cspHeaders: string[], cspMetaTags: string[]}>}
       */
      static async getRawCsps(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        const mainResource = await MainResourceComputed.request({ devtoolsLog, URL: artifacts.URL }, context);
        const cspMetaTags = artifacts.MetaElements.filter((m) => {
          return m.httpEquiv && m.httpEquiv.toLowerCase() === "content-security-policy";
        }).flatMap((m) => (m.content || "").split(",")).filter((rawCsp) => rawCsp.replace(/\s/g, ""));
        const cspHeaders = mainResource.responseHeaders.filter((h) => {
          return h.name.toLowerCase() === "content-security-policy";
        }).flatMap((h) => h.value.split(",")).filter((rawCsp) => rawCsp.replace(/\s/g, ""));
        return { cspHeaders, cspMetaTags };
      }
      /**
       * @param {LH.IcuMessage | string} findingDescription
       * @param {LH.IcuMessage=} severity
       * @return {LH.Audit.Details.TableItem}
       */
      static findingToTableItem(findingDescription, severity) {
        return {
          description: findingDescription,
          severity
        };
      }
      /**
       * @param {string[]} cspHeaders
       * @param {string[]} cspMetaTags
       * @return {{score: number, results: LH.Audit.Details.TableItem[]}}
       */
      static constructResults(cspHeaders, cspMetaTags) {
        const rawCsps = [...cspHeaders, ...cspMetaTags];
        const parsedCsps = rawCsps.map(parseCsp);
        for (const pc of parsedCsps) {
          const directiveValues = pc.directives[pc.getEffectiveDirective(
            import_csp2.Directive.REQUIRE_TRUSTED_TYPES_FOR
          )] || [];
          if (directiveValues.includes("'script'")) {
            return { score: 1, results: [] };
          }
        }
        return {
          score: 0,
          results: [{
            severity: str_104(UIStrings.itemSeverityHigh),
            description: str_104(UIStrings125.noTrustedTypesToMitigateXss)
          }]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts, context) {
        const { cspHeaders, cspMetaTags } = await this.getRawCsps(artifacts, context);
        const { score, results } = this.constructResults(cspHeaders, cspMetaTags);
        const headings = [
          /* eslint-disable max-len */
          { key: "description", valueType: "text", subItemsHeading: { key: "description" }, label: str_104(UIStrings.columnDescription) },
          { key: "severity", valueType: "text", subItemsHeading: { key: "severity" }, label: str_104(UIStrings125.columnSeverity) }
          /* eslint-enable max-len */
        ];
        const details = Audit.makeTableDetails(headings, results);
        return {
          score,
          notApplicable: !results.length,
          details
        };
      }
    };
    trusted_types_xss_default = TrustedTypesXss;
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/entity-classification.js
var entity_classification_exports = {};
__export(entity_classification_exports, {
  EntityClassification: () => EntityClassification,
  EntityClassificationComputed: () => EntityClassificationComputed
});
var EntityClassification, EntityClassificationComputed;
var init_entity_classification = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/entity-classification.js"() {
    init_process_global();
    init_computed_artifact();
    EntityClassification = class {
      static {
        __name(this, "EntityClassification");
      }
      static async compute_() {
        return {
          entityByUrl: /* @__PURE__ */ new Map(),
          urlsByEntity: /* @__PURE__ */ new Map(),
          isFirstParty: /* @__PURE__ */ __name(() => false, "isFirstParty")
        };
      }
    };
    EntityClassificationComputed = makeComputedArtifact(EntityClassification, null);
  }
});

// core/audits/valid-source-maps.js
var valid_source_maps_exports = {};
__export(valid_source_maps_exports, {
  UIStrings: () => UIStrings126,
  default: () => valid_source_maps_default
});
var UIStrings126, str_105, LARGE_JS_BYTE_THRESHOLD, ValidSourceMaps, valid_source_maps_default;
var init_valid_source_maps = __esm({
  "core/audits/valid-source-maps.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_entity_classification();
    init_i18n();
    init_util();
    init_url_utils();
    /**
     * @license Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings126 = {
      /** Title of a Lighthouse audit that provides detail on HTTP to HTTPS redirects. This descriptive title is shown to users when HTTP traffic is redirected to HTTPS. */
      title: "Page has valid source maps",
      /** Title of a Lighthouse audit that provides detail on HTTP to HTTPS redirects. This descriptive title is shown to users when HTTP traffic is not redirected to HTTPS. */
      failureTitle: "Missing source maps for large first-party JavaScript",
      /** Description of a Lighthouse audit that tells the user that their JavaScript source maps are invalid or missing. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
      description: "Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more about source maps](https://developer.chrome.com/docs/devtools/javascript/source-maps/).",
      /** Label for a column in a data table. Entries will be URLs to JavaScript source maps. */
      columnMapURL: "Map URL",
      /** Label for a possible error message indicating that a source map for a large, first-party JavaScript script is missing. */
      missingSourceMapErrorMessage: "Large JavaScript file is missing a source map",
      /** Label for a possible error message indicating that the content of a source map is invalid because it is missing items in the sourcesContent attribute. */
      missingSourceMapItemsWarningMesssage: `{missingItems, plural,
    =1 {Warning: missing 1 item in \`.sourcesContent\`}
    other {Warning: missing # items in \`.sourcesContent\`}
    }`
    };
    str_105 = createIcuMessageFn({ url: "core/audits/valid-source-maps.js" }.url, UIStrings126);
    LARGE_JS_BYTE_THRESHOLD = 500 * 1024;
    ValidSourceMaps = class extends Audit {
      static {
        __name(this, "ValidSourceMaps");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "valid-source-maps",
          title: str_105(UIStrings126.title),
          failureTitle: str_105(UIStrings126.failureTitle),
          description: str_105(UIStrings126.description),
          requiredArtifacts: ["Scripts", "SourceMaps", "URL", "DevtoolsLog"]
        };
      }
      /**
       * Returns true if the size of the script exceeds a static threshold.
       * @param {LH.Artifacts.Script} script
       * @param {LH.Artifacts.EntityClassification} classifiedEntities
       * @return {boolean}
       */
      static isLargeFirstPartyJS(script, classifiedEntities) {
        const url = script.url;
        if (!script.length || !url) return false;
        if (!url_utils_default.isValid(url)) return false;
        if (!Util.createOrReturnURL(url).protocol.startsWith("http")) return false;
        const isLargeJS = script.length >= LARGE_JS_BYTE_THRESHOLD;
        return classifiedEntities.isFirstParty(url) && isLargeJS;
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Audit.Context} context
       */
      static async audit(artifacts, context) {
        const { SourceMaps: SourceMaps2 } = artifacts;
        const devtoolsLog = artifacts.DevtoolsLog;
        const classifiedEntities = await EntityClassification.request(
          { URL: artifacts.URL, devtoolsLog },
          context
        );
        const isMissingMapForLargeFirstPartyScriptUrl = /* @__PURE__ */ new Set();
        let missingMapsForLargeFirstPartyFile = false;
        const results = [];
        for (const script of artifacts.Scripts) {
          const sourceMap = SourceMaps2.find((m) => m.scriptId === script.scriptId);
          const errors = [];
          const isLargeFirstParty = this.isLargeFirstPartyJS(script, classifiedEntities);
          if (isLargeFirstParty && (!sourceMap || !sourceMap.map)) {
            missingMapsForLargeFirstPartyFile = true;
            isMissingMapForLargeFirstPartyScriptUrl.add(script.url);
            errors.push({ error: str_105(UIStrings126.missingSourceMapErrorMessage) });
          }
          if (sourceMap && !sourceMap.map) {
            errors.push({ error: sourceMap.errorMessage });
          }
          if (sourceMap?.map) {
            const sourcesContent = sourceMap.map.sourcesContent || [];
            let missingSourcesContentCount = 0;
            for (let i = 0; i < sourceMap.map.sources.length; i++) {
              if (sourcesContent.length < i || !sourcesContent[i]) missingSourcesContentCount += 1;
            }
            if (missingSourcesContentCount > 0) {
              errors.push({ error: str_105(
                UIStrings126.missingSourceMapItemsWarningMesssage,
                { missingItems: missingSourcesContentCount }
              ) });
            }
          }
          if (sourceMap || errors.length) {
            results.push({
              scriptUrl: script.url,
              sourceMapUrl: sourceMap?.sourceMapUrl,
              subItems: {
                type: (
                  /** @type {const} */
                  "subitems"
                ),
                items: errors
              }
            });
          }
        }
        const headings = [
          {
            key: "scriptUrl",
            valueType: "url",
            subItemsHeading: { key: "error" },
            label: str_105(UIStrings.columnURL)
          },
          { key: "sourceMapUrl", valueType: "url", label: str_105(UIStrings126.columnMapURL) }
        ];
        results.sort((a, b) => {
          const missingMapA = isMissingMapForLargeFirstPartyScriptUrl.has(a.scriptUrl);
          const missingMapB = isMissingMapForLargeFirstPartyScriptUrl.has(b.scriptUrl);
          if (missingMapA && !missingMapB) return -1;
          if (!missingMapA && missingMapB) return 1;
          if (a.subItems.items.length && !b.subItems.items.length) return -1;
          if (!a.subItems.items.length && b.subItems.items.length) return 1;
          return b.scriptUrl.localeCompare(a.scriptUrl);
        });
        return {
          score: missingMapsForLargeFirstPartyFile ? 0 : 1,
          details: Audit.makeTableDetails(headings, results)
        };
      }
    };
    valid_source_maps_default = ValidSourceMaps;
  }
});

// core/audits/webmcp-form-coverage.js
var webmcp_form_coverage_exports = {};
__export(webmcp_form_coverage_exports, {
  UIStrings: () => UIStrings127,
  default: () => webmcp_form_coverage_default
});
var UIStrings127, str_106, WebMcpFormCoverage, webmcp_form_coverage_default;
var init_webmcp_form_coverage = __esm({
  "core/audits/webmcp-form-coverage.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings127 = {
      /** Title of a Lighthouse audit that lists forms found in the page for WebMCP coverage. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      title: "WebMCP form coverage",
      /** Description of a Lighthouse audit that lists forms found in the page and indicates whether they have WebMCP declarative tool annotations. This is displayed after a user expands the section to see more. No character length limits. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      description: "Consider adding WebMCP annotations to the forms listed below. This helps AI agents identify and interact with these forms more reliably.",
      // TODO: add a learn more link once available
      /** [ICU Syntax] Label for the audit identifying the number of forms missing annotations. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      displayValue: `{itemCount, plural,
    =1 {1 form missing annotations}
    other {# forms missing annotations}
    }`,
      /** Label for a column in a data table; entries will be the form element found on the page. */
      columnForm: "Form"
    };
    str_106 = createIcuMessageFn({ url: "core/audits/webmcp-form-coverage.js" }.url, UIStrings127);
    WebMcpFormCoverage = class extends Audit {
      static {
        __name(this, "WebMcpFormCoverage");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "webmcp-form-coverage",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_106(UIStrings127.title),
          description: str_106(UIStrings127.description),
          requiredArtifacts: ["Inputs", "WebMCP"],
          supportedModes: ["navigation", "snapshot"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        const forms = artifacts.Inputs.forms;
        if (forms.length === 0 || !artifacts.WebMCP.isSupported) {
          return {
            notApplicable: true,
            score: 1
          };
        }
        const withoutTools = [];
        for (const form of forms) {
          const hasToolName = !!form.webMcpToolname;
          const hasToolDescription = !!form.webMcpTooldescription;
          if (!hasToolName && !hasToolDescription) {
            withoutTools.push({
              node: Audit.makeNodeItem(form.node)
            });
          }
        }
        if (withoutTools.length === 0) {
          return {
            notApplicable: true,
            score: 1
          };
        }
        const headings = [
          { key: "node", valueType: "node", label: str_106(UIStrings127.columnForm) }
        ];
        const details = Audit.makeTableDetails(headings, withoutTools);
        return {
          score: 1,
          displayValue: str_106(UIStrings127.displayValue, { itemCount: withoutTools.length }),
          details
        };
      }
    };
    webmcp_form_coverage_default = WebMcpFormCoverage;
  }
});

// core/audits/webmcp-registered-tools.js
var webmcp_registered_tools_exports = {};
__export(webmcp_registered_tools_exports, {
  UIStrings: () => UIStrings128,
  default: () => webmcp_registered_tools_default
});
var UIStrings128, str_107, WebMCPRegisteredTools, webmcp_registered_tools_default;
var init_webmcp_registered_tools = __esm({
  "core/audits/webmcp-registered-tools.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings128 = {
      /** Title of a Lighthouse audit that lists registered WebMCP tools. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      title: "WebMCP tools registered",
      /** Description of a Lighthouse audit that lists registered WebMCP tools. This is displayed after a user expands the section to see more. No character length limits. "WebMCP" stands for "Web Model Context Protocol", neither should be translated. */
      description: "Lists the WebMCP tools registered at the time of analysis. ",
      /** Label for a column in a data table; entries will be the name of a WebMCP tool. */
      columnTool: "Tool name",
      /** Label for a column in a data table; entries will be the description of a WebMCP tool. */
      columnDescription: "Description",
      /** Label for a column in a data table; entries will be the source location where an imperative WebMCP tool was registered. */
      columnImperativeLocation: "Source Location",
      /** Label for a column in a data table; entries will be the DOM element associated with a declarative WebMCP tool. */
      columnDeclarativeElement: "Element",
      /** Label for a column in a data table; entries will be the input schema of a WebMCP tool. */
      columnInputSchema: "Input schema",
      /** Title for the table listing imperative WebMCP tools. */
      titleImperativeTools: "Imperative Tools",
      /** Title for the table listing declarative WebMCP tools. */
      titleDeclarativeTools: "Declarative Tools"
    };
    str_107 = createIcuMessageFn({ url: "core/audits/webmcp-registered-tools.js" }.url, UIStrings128);
    WebMCPRegisteredTools = class extends Audit {
      static {
        __name(this, "WebMCPRegisteredTools");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "webmcp-registered-tools",
          scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
          title: str_107(UIStrings128.title),
          description: str_107(UIStrings128.description),
          requiredArtifacts: ["WebMCP"],
          supportedModes: ["navigation", "snapshot"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {LH.Audit.Product}
       */
      static audit(artifacts) {
        if (!artifacts.WebMCP.isSupported) {
          return {
            notApplicable: true,
            score: 1
          };
        }
        const tools = artifacts.WebMCP.tools || [];
        const imperativeResults = [];
        const declarativeResults = [];
        for (const tool of tools) {
          const isDeclarative = typeof tool.backendNodeId === "number";
          let source;
          let element;
          if (isDeclarative && tool.nodeDetails) {
            element = Audit.makeNodeItem(tool.nodeDetails);
          } else if (isDeclarative) {
            element = `Node ID: ${tool.backendNodeId}`;
          } else if (tool.stackTrace) {
            const callFrame = tool.stackTrace.callFrames?.[0];
            if (callFrame) {
              source = Audit.makeSourceLocation(
                callFrame.url,
                callFrame.lineNumber,
                callFrame.columnNumber || 0
              );
            }
          }
          const item = {
            tool: tool.name,
            description: tool.description,
            inputSchema: JSON.stringify(tool.inputSchema, null, 2)
          };
          if (isDeclarative) {
            declarativeResults.push({
              ...item,
              element
            });
          } else {
            imperativeResults.push({
              ...item,
              source
            });
          }
        }
        const list = [];
        if (imperativeResults.length > 0) {
          const headings = [
            { key: "tool", valueType: "text", label: str_107(UIStrings128.columnTool) },
            { key: "description", valueType: "text", label: str_107(UIStrings128.columnDescription) },
            {
              key: "source",
              valueType: "source-location",
              label: str_107(UIStrings128.columnImperativeLocation)
            },
            { key: "inputSchema", valueType: "code", label: str_107(UIStrings128.columnInputSchema) }
          ];
          const table = Audit.makeTableDetails(headings, imperativeResults);
          list.push(Audit.makeListDetailSectionItem(table, str_107(UIStrings128.titleImperativeTools)));
        }
        if (declarativeResults.length > 0) {
          const headings = [
            { key: "tool", valueType: "text", label: str_107(UIStrings128.columnTool) },
            { key: "description", valueType: "text", label: str_107(UIStrings128.columnDescription) },
            { key: "element", valueType: "node", label: str_107(UIStrings128.columnDeclarativeElement) },
            { key: "inputSchema", valueType: "code", label: str_107(UIStrings128.columnInputSchema) }
          ];
          const table = Audit.makeTableDetails(headings, declarativeResults);
          list.push(Audit.makeListDetailSectionItem(table, str_107(UIStrings128.titleDeclarativeTools)));
        }
        if (list.length === 0) {
          return {
            score: 1
          };
        }
        return {
          score: 1,
          details: Audit.makeListDetails(list)
        };
      }
    };
    webmcp_registered_tools_default = WebMCPRegisteredTools;
  }
});

// core/audits/webmcp-schema-validity.js
var webmcp_schema_validity_exports = {};
__export(webmcp_schema_validity_exports, {
  UIStrings: () => UIStrings129,
  default: () => webmcp_schema_validity_default
});
var UIStrings129, str_108, WebMcpSchemaValidity, webmcp_schema_validity_default;
var init_webmcp_schema_validity = __esm({
  "core/audits/webmcp-schema-validity.js"() {
    "use strict";
    init_process_global();
    init_audit();
    init_i18n();
    /**
     * @license
     * Copyright 2026 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    UIStrings129 = {
      /** Title of a Lighthouse audit that evaluates WebMCP schema validity. This descriptive title is shown to users when there are no schema validity issues. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      title: "WebMCP schemas are valid",
      /** Title of a Lighthouse audit that provides detail on WebMCP schema validity. This descriptive title is shown to users when there are schema validity issues. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      failureTitle: "WebMCP schemas are invalid",
      /** Description of a Lighthouse audit that tells the user why they should ensure WebMCP schemas are valid. This is displayed after a user expands the section to see more. No character length limits. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
      description: "Valid WebMCP schemas are required for AI agents to  understand and interact with tools correctly. Please fix any errors or warnings reported by the browser.",
      /** Header of the table column which displays the element. */
      columnElement: "Element",
      /** Header of the table column which displays the issue. */
      columnIssue: "Issue",
      /** Descriptive reason for why a form fails WebMCP validation due to missing `toolname` attribute. */
      missingToolName: "Form level `toolname` attribute is missing. Add it to define the tool name.",
      /** Descriptive reason for why a form fails WebMCP validation due to missing `tooldescription` attribute. */
      missingToolDescription: "Form level `tooldescription` attribute is missing. Add it to describe the tool for AI agents.",
      /** Descriptive reason for why a form field fails WebMCP validation due to missing `name` attribute for a required field. */
      missingRequiredParamName: "Missing `name` attribute for a required field. Add it to define the parameter name.",
      /** Descriptive reason for why a form field fails WebMCP validation due to missing `name` attribute for an optional field. */
      missingOptionalParamName: "Missing `name` attribute for an optional field. Add it to define the parameter name.",
      /** Descriptive reason for why a form field fails WebMCP validation due to missing description. */
      missingParamDescription: "Add a description to make this form more accessible for AI agents."
    };
    str_108 = createIcuMessageFn({ url: "core/audits/webmcp-schema-validity.js" }.url, UIStrings129);
    WebMcpSchemaValidity = class extends Audit {
      static {
        __name(this, "WebMcpSchemaValidity");
      }
      /**
       * @return {LH.Audit.Meta}
       */
      static get meta() {
        return {
          id: "webmcp-schema-validity",
          title: str_108(UIStrings129.title),
          failureTitle: str_108(UIStrings129.failureTitle),
          description: str_108(UIStrings129.description),
          requiredArtifacts: ["WebMCP", "WebMcpSchemaIssues"],
          supportedModes: ["navigation", "snapshot"]
        };
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @return {Promise<LH.Audit.Product>}
       */
      static async audit(artifacts) {
        if (!artifacts.WebMCP.isSupported) {
          return {
            notApplicable: true,
            score: 1
          };
        }
        const Severity = {
          ERROR: 1,
          WARNING: 2
        };
        const issueConfigs = {
          "FormModelContextMissingToolName": {
            severity: Severity.ERROR,
            description: str_108(UIStrings129.missingToolName)
          },
          "FormModelContextMissingToolDescription": {
            severity: Severity.ERROR,
            description: str_108(UIStrings129.missingToolDescription)
          },
          "FormModelContextRequiredParameterMissingName": {
            severity: Severity.ERROR,
            description: str_108(UIStrings129.missingRequiredParamName)
          },
          "FormModelContextParameterMissingTitleAndDescription": {
            severity: Severity.WARNING,
            description: str_108(UIStrings129.missingParamDescription)
          },
          "FormModelContextParameterMissingName": {
            severity: Severity.WARNING,
            description: str_108(UIStrings129.missingOptionalParamName)
          }
        };
        const rawIssues = artifacts.WebMcpSchemaIssues;
        const uniqueIssues = [
          ...new Map(
            rawIssues.map((issue) => [`${issue.violatingNodeId}_${issue.errorType}`, issue])
          ).values()
        ];
        const sortedUniqueIssues = uniqueIssues.sort((a, b) => {
          return (issueConfigs[a.errorType]?.severity || Severity.ERROR) - (issueConfigs[b.errorType]?.severity || Severity.ERROR);
        });
        const items = sortedUniqueIssues.map((issue) => {
          return {
            element: issue.nodeDetails ? Audit.makeNodeItem(issue.nodeDetails) : void 0,
            issue: issueConfigs[issue.errorType]?.description || ""
          };
        });
        const headings = [
          { key: "element", valueType: "node", label: str_108(UIStrings129.columnElement) },
          { key: "issue", valueType: "text", label: str_108(UIStrings129.columnIssue) }
        ];
        const details = Audit.makeTableDetails(headings, items);
        const hasErrors = sortedUniqueIssues.some((issue) => issueConfigs[issue.errorType]?.severity === Severity.ERROR);
        if ((artifacts.WebMCP.tools?.length || 0) === 0 && rawIssues.length === 0) {
          return {
            notApplicable: true,
            score: 1
          };
        }
        return {
          score: hasErrors ? 0 : items.length > 0 ? 0.5 : 1,
          details: items.length > 0 ? details : void 0
        };
      }
    };
    webmcp_schema_validity_default = WebMcpSchemaValidity;
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/speedline.js
var speedline_exports = {};
__export(speedline_exports, {
  Speedline: () => Speedline,
  SpeedlineComputed: () => SpeedlineComputed
});
var Speedline, SpeedlineComputed;
var init_speedline = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/speedline.js"() {
    init_process_global();
    init_computed_artifact();
    init_lh_error();
    Speedline = class {
      static {
        __name(this, "Speedline");
      }
      static async compute_() {
        throw new LighthouseError(LighthouseError.errors.NO_SPEEDLINE_FRAMES);
      }
    };
    SpeedlineComputed = makeComputedArtifact(Speedline, null);
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/metrics/timing-summary.js
var timing_summary_exports = {};
__export(timing_summary_exports, {
  TimingSummary: () => TimingSummary,
  TimingSummaryComputed: () => TimingSummaryComputed
});
var TimingSummary, TimingSummaryComputed;
var init_timing_summary = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/metrics/timing-summary.js"() {
    init_process_global();
    init_computed_artifact();
    TimingSummary = class {
      static {
        __name(this, "TimingSummary");
      }
      static async compute_() {
        return { metrics: {}, debugInfo: {} };
      }
    };
    TimingSummaryComputed = makeComputedArtifact(TimingSummary, null);
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/trace-engine-result.js
var trace_engine_result_exports = {};
__export(trace_engine_result_exports, {
  TraceEngineResult: () => TraceEngineResult,
  TraceEngineResultComputed: () => TraceEngineResultComputed
});
var TraceEngineResult, TraceEngineResultComputed;
var init_trace_engine_result = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/core/computed/trace-engine-result.js"() {
    init_process_global();
    init_computed_artifact();
    TraceEngineResult = class {
      static {
        __name(this, "TraceEngineResult");
      }
      static async compute_() {
        return { data: {}, insights: /* @__PURE__ */ new Map() };
      }
      static localizeFunction(str, fn) {
        return fn;
      }
    };
    TraceEngineResultComputed = makeComputedArtifact(TraceEngineResult, null);
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/bf-cache-failures.js
var bf_cache_failures_exports = {};
__export(bf_cache_failures_exports, {
  default: () => bf_cache_failures_default
});
var ShimGatherer, bf_cache_failures_default;
var init_bf_cache_failures = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/bf-cache-failures.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    bf_cache_failures_default = ShimGatherer;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/css-usage.js
var css_usage_exports = {};
__export(css_usage_exports, {
  default: () => css_usage_default
});
var ShimGatherer2, css_usage_default;
var init_css_usage = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/css-usage.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer2 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    css_usage_default = ShimGatherer2;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/full-page-screenshot.js
var full_page_screenshot_exports = {};
__export(full_page_screenshot_exports, {
  default: () => full_page_screenshot_default
});
var ShimGatherer3, full_page_screenshot_default;
var init_full_page_screenshot = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/full-page-screenshot.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer3 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    full_page_screenshot_default = ShimGatherer3;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/iframe-elements.js
var iframe_elements_exports = {};
__export(iframe_elements_exports, {
  default: () => iframe_elements_default
});
var ShimGatherer4, iframe_elements_default;
var init_iframe_elements = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/iframe-elements.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer4 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    iframe_elements_default = ShimGatherer4;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/js-usage.js
var js_usage_exports = {};
__export(js_usage_exports, {
  default: () => js_usage_default
});
var ShimGatherer5, js_usage_default;
var init_js_usage = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/js-usage.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer5 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    js_usage_default = ShimGatherer5;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/network-user-agent.js
var network_user_agent_exports = {};
__export(network_user_agent_exports, {
  default: () => network_user_agent_default
});
var ShimGatherer6, network_user_agent_default;
var init_network_user_agent = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/network-user-agent.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer6 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    network_user_agent_default = ShimGatherer6;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/stylesheets.js
var stylesheets_exports = {};
__export(stylesheets_exports, {
  default: () => stylesheets_default
});
var ShimGatherer7, stylesheets_default;
var init_stylesheets = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/stylesheets.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer7 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    stylesheets_default = ShimGatherer7;
  }
});

// lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/trace-elements.js
var trace_elements_exports = {};
__export(trace_elements_exports, {
  default: () => trace_elements_default
});
var ShimGatherer8, trace_elements_default;
var init_trace_elements = __esm({
  "lh-gatherer-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/gather/gatherers/trace-elements.js"() {
    init_process_global();
    init_base_gatherer();
    ShimGatherer8 = class extends base_gatherer_default {
      static {
        __name(this, "ShimGatherer");
      }
      meta = { supportedModes: ["navigation", "timespan", "snapshot"] };
      static getDefaultTraceCategories() {
        return [];
      }
      getArtifact() {
        return void 0;
      }
    };
    trace_elements_default = ShimGatherer8;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/autocomplete.js
var autocomplete_exports = {};
__export(autocomplete_exports, {
  default: () => autocomplete_default
});
var ShimAudit, autocomplete_default;
var init_autocomplete = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/autocomplete.js"() {
    init_process_global();
    init_audit();
    ShimAudit = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "autocomplete",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    autocomplete_default = ShimAudit;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/bf-cache.js
var bf_cache_exports = {};
__export(bf_cache_exports, {
  default: () => bf_cache_default
});
var ShimAudit2, bf_cache_default;
var init_bf_cache = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/bf-cache.js"() {
    init_process_global();
    init_audit();
    ShimAudit2 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "bf-cache",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    bf_cache_default = ShimAudit2;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/bootup-time.js
var bootup_time_exports = {};
__export(bootup_time_exports, {
  default: () => bootup_time_default
});
var ShimAudit3, bootup_time_default;
var init_bootup_time = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/bootup-time.js"() {
    init_process_global();
    init_audit();
    ShimAudit3 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "bootup-time",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    bootup_time_default = ShimAudit3;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/total-byte-weight.js
var total_byte_weight_exports = {};
__export(total_byte_weight_exports, {
  default: () => total_byte_weight_default
});
var ShimAudit4, total_byte_weight_default;
var init_total_byte_weight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/total-byte-weight.js"() {
    init_process_global();
    init_audit();
    ShimAudit4 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "total-byte-weight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    total_byte_weight_default = ShimAudit4;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unminified-css.js
var unminified_css_exports = {};
__export(unminified_css_exports, {
  default: () => unminified_css_default
});
var ShimAudit5, unminified_css_default;
var init_unminified_css = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unminified-css.js"() {
    init_process_global();
    init_audit();
    ShimAudit5 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "unminified-css",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    unminified_css_default = ShimAudit5;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unminified-javascript.js
var unminified_javascript_exports = {};
__export(unminified_javascript_exports, {
  default: () => unminified_javascript_default
});
var ShimAudit6, unminified_javascript_default;
var init_unminified_javascript = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unminified-javascript.js"() {
    init_process_global();
    init_audit();
    ShimAudit6 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "unminified-javascript",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    unminified_javascript_default = ShimAudit6;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unused-css-rules.js
var unused_css_rules_exports = {};
__export(unused_css_rules_exports, {
  default: () => unused_css_rules_default
});
var ShimAudit7, unused_css_rules_default;
var init_unused_css_rules = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unused-css-rules.js"() {
    init_process_global();
    init_audit();
    ShimAudit7 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "unused-css-rules",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    unused_css_rules_default = ShimAudit7;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unused-javascript.js
var unused_javascript_exports = {};
__export(unused_javascript_exports, {
  default: () => unused_javascript_default
});
var ShimAudit8, unused_javascript_default;
var init_unused_javascript = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/byte-efficiency/unused-javascript.js"() {
    init_process_global();
    init_audit();
    ShimAudit8 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "unused-javascript",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    unused_javascript_default = ShimAudit8;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/diagnostics.js
var diagnostics_exports = {};
__export(diagnostics_exports, {
  default: () => diagnostics_default
});
var ShimAudit9, diagnostics_default;
var init_diagnostics = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/diagnostics.js"() {
    init_process_global();
    init_audit();
    ShimAudit9 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "diagnostics",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    diagnostics_default = ShimAudit9;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/final-screenshot.js
var final_screenshot_exports = {};
__export(final_screenshot_exports, {
  default: () => final_screenshot_default
});
var ShimAudit10, final_screenshot_default;
var init_final_screenshot = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/final-screenshot.js"() {
    init_process_global();
    init_audit();
    ShimAudit10 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "final-screenshot",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    final_screenshot_default = ShimAudit10;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/cache-insight.js
var cache_insight_exports = {};
__export(cache_insight_exports, {
  default: () => cache_insight_default
});
var ShimAudit11, cache_insight_default;
var init_cache_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/cache-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit11 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "cache-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    cache_insight_default = ShimAudit11;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/cls-culprits-insight.js
var cls_culprits_insight_exports = {};
__export(cls_culprits_insight_exports, {
  default: () => cls_culprits_insight_default
});
var ShimAudit12, cls_culprits_insight_default;
var init_cls_culprits_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/cls-culprits-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit12 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "cls-culprits-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    cls_culprits_insight_default = ShimAudit12;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/document-latency-insight.js
var document_latency_insight_exports = {};
__export(document_latency_insight_exports, {
  default: () => document_latency_insight_default
});
var ShimAudit13, document_latency_insight_default;
var init_document_latency_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/document-latency-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit13 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "document-latency-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    document_latency_insight_default = ShimAudit13;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/dom-size-insight.js
var dom_size_insight_exports = {};
__export(dom_size_insight_exports, {
  default: () => dom_size_insight_default
});
var ShimAudit14, dom_size_insight_default;
var init_dom_size_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/dom-size-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit14 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "dom-size-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    dom_size_insight_default = ShimAudit14;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/duplicated-javascript-insight.js
var duplicated_javascript_insight_exports = {};
__export(duplicated_javascript_insight_exports, {
  default: () => duplicated_javascript_insight_default
});
var ShimAudit15, duplicated_javascript_insight_default;
var init_duplicated_javascript_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/duplicated-javascript-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit15 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "duplicated-javascript-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    duplicated_javascript_insight_default = ShimAudit15;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/font-display-insight.js
var font_display_insight_exports = {};
__export(font_display_insight_exports, {
  default: () => font_display_insight_default
});
var ShimAudit16, font_display_insight_default;
var init_font_display_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/font-display-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit16 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "font-display-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    font_display_insight_default = ShimAudit16;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/forced-reflow-insight.js
var forced_reflow_insight_exports = {};
__export(forced_reflow_insight_exports, {
  default: () => forced_reflow_insight_default
});
var ShimAudit17, forced_reflow_insight_default;
var init_forced_reflow_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/forced-reflow-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit17 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "forced-reflow-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    forced_reflow_insight_default = ShimAudit17;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/image-delivery-insight.js
var image_delivery_insight_exports = {};
__export(image_delivery_insight_exports, {
  default: () => image_delivery_insight_default
});
var ShimAudit18, image_delivery_insight_default;
var init_image_delivery_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/image-delivery-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit18 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "image-delivery-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    image_delivery_insight_default = ShimAudit18;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/inp-breakdown-insight.js
var inp_breakdown_insight_exports = {};
__export(inp_breakdown_insight_exports, {
  default: () => inp_breakdown_insight_default
});
var ShimAudit19, inp_breakdown_insight_default;
var init_inp_breakdown_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/inp-breakdown-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit19 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "inp-breakdown-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    inp_breakdown_insight_default = ShimAudit19;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/lcp-breakdown-insight.js
var lcp_breakdown_insight_exports = {};
__export(lcp_breakdown_insight_exports, {
  default: () => lcp_breakdown_insight_default
});
var ShimAudit20, lcp_breakdown_insight_default;
var init_lcp_breakdown_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/lcp-breakdown-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit20 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "lcp-breakdown-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    lcp_breakdown_insight_default = ShimAudit20;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/lcp-discovery-insight.js
var lcp_discovery_insight_exports = {};
__export(lcp_discovery_insight_exports, {
  default: () => lcp_discovery_insight_default
});
var ShimAudit21, lcp_discovery_insight_default;
var init_lcp_discovery_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/lcp-discovery-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit21 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "lcp-discovery-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    lcp_discovery_insight_default = ShimAudit21;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/legacy-javascript-insight.js
var legacy_javascript_insight_exports = {};
__export(legacy_javascript_insight_exports, {
  default: () => legacy_javascript_insight_default
});
var ShimAudit22, legacy_javascript_insight_default;
var init_legacy_javascript_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/legacy-javascript-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit22 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "legacy-javascript-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    legacy_javascript_insight_default = ShimAudit22;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/modern-http-insight.js
var modern_http_insight_exports = {};
__export(modern_http_insight_exports, {
  default: () => modern_http_insight_default
});
var ShimAudit23, modern_http_insight_default;
var init_modern_http_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/modern-http-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit23 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "modern-http-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    modern_http_insight_default = ShimAudit23;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/network-dependency-tree-insight.js
var network_dependency_tree_insight_exports = {};
__export(network_dependency_tree_insight_exports, {
  default: () => network_dependency_tree_insight_default
});
var ShimAudit24, network_dependency_tree_insight_default;
var init_network_dependency_tree_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/network-dependency-tree-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit24 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "network-dependency-tree-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    network_dependency_tree_insight_default = ShimAudit24;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/render-blocking-insight.js
var render_blocking_insight_exports = {};
__export(render_blocking_insight_exports, {
  default: () => render_blocking_insight_default
});
var ShimAudit25, render_blocking_insight_default;
var init_render_blocking_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/render-blocking-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit25 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "render-blocking-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    render_blocking_insight_default = ShimAudit25;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/slow-css-selector-insight.js
var slow_css_selector_insight_exports = {};
__export(slow_css_selector_insight_exports, {
  default: () => slow_css_selector_insight_default
});
var ShimAudit26, slow_css_selector_insight_default;
var init_slow_css_selector_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/slow-css-selector-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit26 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "slow-css-selector-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    slow_css_selector_insight_default = ShimAudit26;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/third-parties-insight.js
var third_parties_insight_exports = {};
__export(third_parties_insight_exports, {
  default: () => third_parties_insight_default
});
var ShimAudit27, third_parties_insight_default;
var init_third_parties_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/third-parties-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit27 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "third-parties-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    third_parties_insight_default = ShimAudit27;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/viewport-insight.js
var viewport_insight_exports = {};
__export(viewport_insight_exports, {
  default: () => viewport_insight_default
});
var ShimAudit28, viewport_insight_default;
var init_viewport_insight = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/insights/viewport-insight.js"() {
    init_process_global();
    init_audit();
    ShimAudit28 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "viewport-insight",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    viewport_insight_default = ShimAudit28;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/layout-shifts.js
var layout_shifts_exports = {};
__export(layout_shifts_exports, {
  default: () => layout_shifts_default
});
var ShimAudit29, layout_shifts_default;
var init_layout_shifts = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/layout-shifts.js"() {
    init_process_global();
    init_audit();
    ShimAudit29 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "layout-shifts",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    layout_shifts_default = ShimAudit29;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/long-tasks.js
var long_tasks_exports = {};
__export(long_tasks_exports, {
  default: () => long_tasks_default
});
var ShimAudit30, long_tasks_default;
var init_long_tasks = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/long-tasks.js"() {
    init_process_global();
    init_audit();
    ShimAudit30 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "long-tasks",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    long_tasks_default = ShimAudit30;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/main-thread-tasks.js
var main_thread_tasks_exports = {};
__export(main_thread_tasks_exports, {
  default: () => main_thread_tasks_default
});
var ShimAudit31, main_thread_tasks_default;
var init_main_thread_tasks = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/main-thread-tasks.js"() {
    init_process_global();
    init_audit();
    ShimAudit31 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "main-thread-tasks",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    main_thread_tasks_default = ShimAudit31;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/mainthread-work-breakdown.js
var mainthread_work_breakdown_exports = {};
__export(mainthread_work_breakdown_exports, {
  default: () => mainthread_work_breakdown_default
});
var ShimAudit32, mainthread_work_breakdown_default;
var init_mainthread_work_breakdown = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/mainthread-work-breakdown.js"() {
    init_process_global();
    init_audit();
    ShimAudit32 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "mainthread-work-breakdown",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    mainthread_work_breakdown_default = ShimAudit32;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics.js
var metrics_exports2 = {};
__export(metrics_exports2, {
  default: () => metrics_default
});
var ShimAudit33, metrics_default;
var init_metrics2 = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics.js"() {
    init_process_global();
    init_audit();
    ShimAudit33 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "metrics",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    metrics_default = ShimAudit33;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/first-contentful-paint.js
var first_contentful_paint_exports = {};
__export(first_contentful_paint_exports, {
  default: () => first_contentful_paint_default
});
var ShimAudit34, first_contentful_paint_default;
var init_first_contentful_paint = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/first-contentful-paint.js"() {
    init_process_global();
    init_audit();
    ShimAudit34 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "first-contentful-paint",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    first_contentful_paint_default = ShimAudit34;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/interaction-to-next-paint.js
var interaction_to_next_paint_exports = {};
__export(interaction_to_next_paint_exports, {
  default: () => interaction_to_next_paint_default
});
var ShimAudit35, interaction_to_next_paint_default;
var init_interaction_to_next_paint = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/interaction-to-next-paint.js"() {
    init_process_global();
    init_audit();
    ShimAudit35 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "interaction-to-next-paint",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    interaction_to_next_paint_default = ShimAudit35;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/interactive.js
var interactive_exports = {};
__export(interactive_exports, {
  default: () => interactive_default
});
var ShimAudit36, interactive_default;
var init_interactive = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/interactive.js"() {
    init_process_global();
    init_audit();
    ShimAudit36 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "interactive",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    interactive_default = ShimAudit36;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/largest-contentful-paint.js
var largest_contentful_paint_exports = {};
__export(largest_contentful_paint_exports, {
  default: () => largest_contentful_paint_default
});
var ShimAudit37, largest_contentful_paint_default;
var init_largest_contentful_paint = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/largest-contentful-paint.js"() {
    init_process_global();
    init_audit();
    ShimAudit37 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "largest-contentful-paint",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    largest_contentful_paint_default = ShimAudit37;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/max-potential-fid.js
var max_potential_fid_exports = {};
__export(max_potential_fid_exports, {
  default: () => max_potential_fid_default
});
var ShimAudit38, max_potential_fid_default;
var init_max_potential_fid = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/max-potential-fid.js"() {
    init_process_global();
    init_audit();
    ShimAudit38 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "max-potential-fid",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    max_potential_fid_default = ShimAudit38;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/speed-index.js
var speed_index_exports = {};
__export(speed_index_exports, {
  default: () => speed_index_default
});
var ShimAudit39, speed_index_default;
var init_speed_index = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/speed-index.js"() {
    init_process_global();
    init_audit();
    ShimAudit39 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "speed-index",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    speed_index_default = ShimAudit39;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/total-blocking-time.js
var total_blocking_time_exports = {};
__export(total_blocking_time_exports, {
  default: () => total_blocking_time_default
});
var ShimAudit40, total_blocking_time_default;
var init_total_blocking_time = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/metrics/total-blocking-time.js"() {
    init_process_global();
    init_audit();
    ShimAudit40 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "total-blocking-time",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    total_blocking_time_default = ShimAudit40;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/network-requests.js
var network_requests_exports = {};
__export(network_requests_exports, {
  default: () => network_requests_default
});
var ShimAudit41, network_requests_default;
var init_network_requests = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/network-requests.js"() {
    init_process_global();
    init_audit();
    ShimAudit41 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "network-requests",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    network_requests_default = ShimAudit41;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/network-rtt.js
var network_rtt_exports = {};
__export(network_rtt_exports, {
  default: () => network_rtt_default
});
var ShimAudit42, network_rtt_default;
var init_network_rtt = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/network-rtt.js"() {
    init_process_global();
    init_audit();
    ShimAudit42 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "network-rtt",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    network_rtt_default = ShimAudit42;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/network-server-latency.js
var network_server_latency_exports = {};
__export(network_server_latency_exports, {
  default: () => network_server_latency_default
});
var ShimAudit43, network_server_latency_default;
var init_network_server_latency = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/network-server-latency.js"() {
    init_process_global();
    init_audit();
    ShimAudit43 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "network-server-latency",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    network_server_latency_default = ShimAudit43;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/non-composited-animations.js
var non_composited_animations_exports = {};
__export(non_composited_animations_exports, {
  default: () => non_composited_animations_default
});
var ShimAudit44, non_composited_animations_default;
var init_non_composited_animations = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/non-composited-animations.js"() {
    init_process_global();
    init_audit();
    ShimAudit44 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "non-composited-animations",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    non_composited_animations_default = ShimAudit44;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/oopif-iframe-test-audit.js
var oopif_iframe_test_audit_exports = {};
__export(oopif_iframe_test_audit_exports, {
  default: () => oopif_iframe_test_audit_default
});
var ShimAudit45, oopif_iframe_test_audit_default;
var init_oopif_iframe_test_audit = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/oopif-iframe-test-audit.js"() {
    init_process_global();
    init_audit();
    ShimAudit45 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "oopif-iframe-test-audit",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    oopif_iframe_test_audit_default = ShimAudit45;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/predictive-perf.js
var predictive_perf_exports = {};
__export(predictive_perf_exports, {
  default: () => predictive_perf_default
});
var ShimAudit46, predictive_perf_default;
var init_predictive_perf = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/predictive-perf.js"() {
    init_process_global();
    init_audit();
    ShimAudit46 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "predictive-perf",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    predictive_perf_default = ShimAudit46;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/redirects.js
var redirects_exports = {};
__export(redirects_exports, {
  default: () => redirects_default
});
var ShimAudit47, redirects_default;
var init_redirects = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/redirects.js"() {
    init_process_global();
    init_audit();
    ShimAudit47 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "redirects",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    redirects_default = ShimAudit47;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/resource-summary.js
var resource_summary_exports = {};
__export(resource_summary_exports, {
  default: () => resource_summary_default
});
var ShimAudit48, resource_summary_default;
var init_resource_summary = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/resource-summary.js"() {
    init_process_global();
    init_audit();
    ShimAudit48 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "resource-summary",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    resource_summary_default = ShimAudit48;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/screenshot-thumbnails.js
var screenshot_thumbnails_exports = {};
__export(screenshot_thumbnails_exports, {
  default: () => screenshot_thumbnails_default
});
var ShimAudit49, screenshot_thumbnails_default;
var init_screenshot_thumbnails = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/screenshot-thumbnails.js"() {
    init_process_global();
    init_audit();
    ShimAudit49 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "screenshot-thumbnails",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    screenshot_thumbnails_default = ShimAudit49;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/script-treemap-data.js
var script_treemap_data_exports = {};
__export(script_treemap_data_exports, {
  default: () => script_treemap_data_default
});
var ShimAudit50, script_treemap_data_default;
var init_script_treemap_data = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/script-treemap-data.js"() {
    init_process_global();
    init_audit();
    ShimAudit50 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "script-treemap-data",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    script_treemap_data_default = ShimAudit50;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/server-response-time.js
var server_response_time_exports = {};
__export(server_response_time_exports, {
  default: () => server_response_time_default
});
var ShimAudit51, server_response_time_default;
var init_server_response_time = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/server-response-time.js"() {
    init_process_global();
    init_audit();
    ShimAudit51 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "server-response-time",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    server_response_time_default = ShimAudit51;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/unsized-images.js
var unsized_images_exports = {};
__export(unsized_images_exports, {
  default: () => unsized_images_default
});
var ShimAudit52, unsized_images_default;
var init_unsized_images = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/unsized-images.js"() {
    init_process_global();
    init_audit();
    ShimAudit52 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "unsized-images",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    unsized_images_default = ShimAudit52;
  }
});

// lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/user-timings.js
var user_timings_exports = {};
__export(user_timings_exports, {
  default: () => user_timings_default
});
var ShimAudit53, user_timings_default;
var init_user_timings = __esm({
  "lh-audit-shim:/usr/local/google/home/lusazhan/Git/lighthouse/core/audits/user-timings.js"() {
    init_process_global();
    init_audit();
    ShimAudit53 = class extends Audit {
      static {
        __name(this, "ShimAudit");
      }
      static get meta() {
        return {
          id: "user-timings",
          title: "Shim Audit",
          description: "This audit was filtered out and is not available in this bundle.",
          scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE,
          requiredArtifacts: []
        };
      }
      static audit() {
        return { score: null, scoreDisplayMode: Audit.SCORING_MODES.NOT_APPLICABLE };
      }
    };
    user_timings_default = ShimAudit53;
  }
});

// core/config/config-helpers.js
import path4 from "path";
function isBundledEnvironment2() {
  if (global.isDevtools || global.isLightrider) return true;
  try {
    require4.resolve("lighthouse-logger");
    return false;
  } catch (err) {
    return true;
  }
}
function _mergeConfigFragment(base, extension, overwriteArrays = false) {
  if (typeof base === "undefined" || base === null) {
    return extension;
  } else if (typeof extension === "undefined") {
    return base;
  } else if (Array.isArray(extension)) {
    if (overwriteArrays) return extension;
    if (!Array.isArray(base)) throw new TypeError(`Expected array but got ${typeof base}`);
    const merged = base.slice();
    extension.forEach((item) => {
      if (!merged.some((candidate) => isEqual_default(candidate, item))) merged.push(item);
    });
    return merged;
  } else if (typeof extension === "object") {
    if (typeof base !== "object") throw new TypeError(`Expected object but got ${typeof base}`);
    if (Array.isArray(base)) throw new TypeError("Expected object but got Array");
    Object.keys(extension).forEach((key) => {
      const localOverwriteArrays = overwriteArrays || key === "settings" && typeof base[key] === "object";
      base[key] = _mergeConfigFragment(base[key], extension[key], localOverwriteArrays);
    });
    return base;
  }
  return extension;
}
function mergeConfigFragmentArrayByKey(baseArray, extensionArray, keyFn) {
  const itemsByKey = /* @__PURE__ */ new Map();
  const mergedArray = baseArray || [];
  for (let i = 0; i < mergedArray.length; i++) {
    const item = mergedArray[i];
    itemsByKey.set(keyFn(item), { index: i, item });
  }
  for (const item of extensionArray || []) {
    const baseItemEntry = itemsByKey.get(keyFn(item));
    if (baseItemEntry) {
      const baseItem = baseItemEntry.item;
      const merged = typeof item === "object" && typeof baseItem === "object" ? mergeConfigFragment(baseItem, item, true) : item;
      mergedArray[baseItemEntry.index] = merged;
    } else {
      mergedArray.push(item);
    }
  }
  return mergedArray;
}
function expandGathererShorthand(gatherer) {
  if (typeof gatherer === "string") {
    return { path: gatherer };
  } else if ("implementation" in gatherer || "instance" in gatherer) {
    return gatherer;
  } else if ("path" in gatherer) {
    if (typeof gatherer.path !== "string") {
      throw new Error("Invalid Gatherer type " + JSON.stringify(gatherer));
    }
    return gatherer;
  } else if (typeof gatherer === "function") {
    return { implementation: gatherer };
  } else if (gatherer && typeof gatherer.getArtifact === "function") {
    return { instance: gatherer };
  } else {
    throw new Error("Invalid Gatherer type " + JSON.stringify(gatherer));
  }
}
function expandAuditShorthand(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));
  }
}
async function requireWrapper(requirePath) {
  if (path4.isAbsolute(requirePath)) {
    requirePath = url_default.pathToFileURL(requirePath).href;
  }
  let module2;
  if (bundledModules.has(requirePath)) {
    module2 = await bundledModules.get(requirePath);
  } else if (requirePath.match(/\.(js|mjs|cjs)$/)) {
    module2 = await import(requirePath);
  } else {
    requirePath += ".js";
    module2 = await import(requirePath);
  }
  if (module2.default) return module2.default;
  const methods = /* @__PURE__ */ new Set(["meta"]);
  const possibleNamedExports = Object.keys(module2).filter((key) => {
    if (!(module2[key] && module2[key] instanceof Object)) return false;
    return Object.getOwnPropertyNames(module2[key]).some((method) => methods.has(method));
  });
  if (possibleNamedExports.length === 1) return possibleNamedExports[0];
  if (possibleNamedExports.length > 1) {
    throw new Error(`module '${requirePath}' has too many possible exports`);
  }
  throw new Error(`module '${requirePath}' missing default export`);
}
async function requireGatherer(gathererPath, coreGathererList, configDir) {
  const coreGatherer = coreGathererList.find((a) => a === `${gathererPath}.js`);
  let requirePath = `../gather/gatherers/${gathererPath}`;
  if (!coreGatherer) {
    requirePath = resolveModulePath(gathererPath, configDir, "gatherer");
  }
  const GathererClass = (
    /** @type {GathererConstructor} */
    await requireWrapper(requirePath)
  );
  return {
    instance: new GathererClass(),
    implementation: GathererClass,
    path: gathererPath
  };
}
function requireAudit(auditPath, coreAuditList, configDir) {
  const auditPathJs = `${auditPath}.js`;
  const coreAudit = coreAuditList.find((a) => a === auditPathJs);
  let requirePath = `../audits/${auditPath}`;
  if (!coreAudit) {
    if (isBundledEnvironment2()) {
      requirePath = auditPath;
    } else {
      const absolutePath = resolveModulePath(auditPath, configDir, "audit");
      if (isBundledEnvironment2()) {
        requirePath = path4.relative("", absolutePath);
      } else {
        requirePath = absolutePath;
      }
    }
  }
  return requireWrapper(requirePath);
}
function cleanFlagsForSettings(flags = {}) {
  const settings = {};
  for (const key of Object.keys(flags)) {
    if (key in defaultSettings) {
      settings[key] = flags[key];
    }
  }
  return settings;
}
function resolveSettings(settingsJson = {}, overrides = void 0) {
  const locale = lookupLocale(overrides?.locale || settingsJson.locale);
  const { defaultSettings: defaultSettings2 } = constants_exports;
  const settingWithDefaults = mergeConfigFragment(deepClone(defaultSettings2), settingsJson, true);
  const settingsWithFlags = mergeConfigFragment(
    settingWithDefaults,
    cleanFlagsForSettings(overrides),
    true
  );
  settingsWithFlags.locale = locale;
  if (settingsWithFlags.emulatedUserAgent === true) {
    settingsWithFlags.emulatedUserAgent = userAgents[settingsWithFlags.formFactor];
  }
  assertValidSettings(settingsWithFlags);
  return settingsWithFlags;
}
async function mergePlugins(config5, configDir, flags) {
  const configPlugins = config5.plugins || [];
  const flagPlugins = flags?.plugins || [];
  const pluginNames = /* @__PURE__ */ new Set([...configPlugins, ...flagPlugins]);
  for (const pluginName of pluginNames) {
    assertValidPluginName(config5, pluginName);
    const pluginPath = isBundledEnvironment2() ? pluginName : resolveModulePath(pluginName, configDir, "plugin");
    const rawPluginJson = await requireWrapper(pluginPath);
    const pluginJson = config_plugin_default.parsePlugin(rawPluginJson, pluginName);
    config5 = mergeConfigFragment(config5, pluginJson);
  }
  return config5;
}
async function resolveGathererToDefn(gathererJson, coreGathererList, configDir) {
  const gathererDefn = expandGathererShorthand(gathererJson);
  if (gathererDefn.instance) {
    return {
      instance: gathererDefn.instance,
      implementation: gathererDefn.implementation,
      path: gathererDefn.path
    };
  } else if (gathererDefn.implementation) {
    const GathererClass = gathererDefn.implementation;
    return {
      instance: new GathererClass(),
      implementation: gathererDefn.implementation,
      path: gathererDefn.path
    };
  } else if (gathererDefn.path) {
    const path7 = gathererDefn.path;
    return requireGatherer(path7, coreGathererList, configDir);
  } else {
    throw new Error("Invalid expanded Gatherer: " + JSON.stringify(gathererDefn));
  }
}
async function resolveAuditsToDefns(audits, configDir) {
  if (!audits) {
    return null;
  }
  const coreList = Runner.getAuditList();
  const auditDefnsPromises = audits.map(async (auditJson) => {
    const auditDefn = expandAuditShorthand(auditJson);
    let implementation;
    if ("implementation" in auditDefn) {
      implementation = auditDefn.implementation;
    } else {
      implementation = await requireAudit(auditDefn.path, coreList, configDir);
    }
    return {
      implementation,
      path: auditDefn.path,
      options: auditDefn.options || {}
    };
  });
  const auditDefns = await Promise.all(auditDefnsPromises);
  const mergedAuditDefns = mergeOptionsOfItems(auditDefns);
  mergedAuditDefns.forEach((audit) => assertValidAudit(audit));
  return mergedAuditDefns;
}
function resolveModulePath(moduleIdentifier, configDir, category) {
  try {
    return require4.resolve(moduleIdentifier);
  } catch (e) {
  }
  try {
    return require4.resolve(moduleIdentifier, { paths: [process.cwd()] });
  } catch (e) {
  }
  const cwdPath = path4.resolve(process.cwd(), moduleIdentifier);
  try {
    return require4.resolve(cwdPath);
  } catch (e) {
  }
  const errorString = "Unable to locate " + (category ? `${category}: ` : "") + `\`${moduleIdentifier}\`.
     Tried to resolve the module from these locations:
       ${""}
       ${cwdPath}`;
  if (!configDir) {
    throw new Error(errorString);
  }
  const relativePath = path4.resolve(configDir, moduleIdentifier);
  try {
    return require4.resolve(relativePath);
  } catch (requireError) {
  }
  try {
    return require4.resolve(moduleIdentifier, { paths: [configDir] });
  } catch (requireError) {
  }
  throw new Error(errorString + `
       ${relativePath}`);
}
function shallowClone(item) {
  if (typeof item === "object") {
    return Object.assign(
      Object.create(
        Object.getPrototypeOf(item)
      ),
      item
    );
  }
  return item;
}
function deepClone(json) {
  return JSON.parse(JSON.stringify(json));
}
function deepCloneConfigJson(json) {
  const cloned = deepClone(json);
  if (Array.isArray(json.audits)) {
    cloned.audits = json.audits.map((audit) => shallowClone(audit));
  }
  if (Array.isArray(json.artifacts)) {
    cloned.artifacts = json.artifacts.map((artifact) => ({
      ...artifact,
      gatherer: shallowClone(artifact.gatherer)
    }));
  }
  return cloned;
}
var require4, mergeOptionsOfItems, mergeConfigFragment, bundledModules;
var init_config_helpers = __esm({
  "core/config/config-helpers.js"() {
    "use strict";
    init_process_global();
    init_module();
    init_url();
    init_lodash();
    init_constants();
    init_config_plugin();
    init_runner();
    init_i18n();
    init_validation();
    init_esm_utils();
    /**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    require4 = createRequire({ url: "core/config/config-helpers.js" }.url);
    __name(isBundledEnvironment2, "isBundledEnvironment");
    mergeOptionsOfItems = /* @__PURE__ */ __name(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;
    }, "mergeOptionsOfItems");
    __name(_mergeConfigFragment, "_mergeConfigFragment");
    mergeConfigFragment = _mergeConfigFragment;
    __name(mergeConfigFragmentArrayByKey, "mergeConfigFragmentArrayByKey");
    __name(expandGathererShorthand, "expandGathererShorthand");
    __name(expandAuditShorthand, "expandAuditShorthand");
    bundledModules = /* @__PURE__ */ new Map([
      ["../gather/gatherers/accessibility", Promise.resolve().then(() => (init_accessibility(), accessibility_exports))],
      ["../gather/gatherers/agentic/llms-txt", Promise.resolve().then(() => (init_llms_txt(), llms_txt_exports))],
      ["../gather/gatherers/anchor-elements", Promise.resolve().then(() => (init_anchor_elements(), anchor_elements_exports))],
      ["../gather/gatherers/console-messages", Promise.resolve().then(() => (init_console_messages(), console_messages_exports))],
      ["../gather/gatherers/devtools-log", Promise.resolve().then(() => (init_devtools_log(), devtools_log_exports))],
      ["../gather/gatherers/dobetterweb/doctype", Promise.resolve().then(() => (init_doctype(), doctype_exports))],
      ["../gather/gatherers/image-elements", Promise.resolve().then(() => (init_image_elements(), image_elements_exports))],
      ["../gather/gatherers/inputs", Promise.resolve().then(() => (init_inputs(), inputs_exports))],
      ["../gather/gatherers/inspector-issues", Promise.resolve().then(() => (init_inspector_issues(), inspector_issues_exports))],
      ["../gather/gatherers/link-elements", Promise.resolve().then(() => (init_link_elements(), link_elements_exports))],
      ["../gather/gatherers/main-document-content", Promise.resolve().then(() => (init_main_document_content(), main_document_content_exports))],
      ["../gather/gatherers/meta-elements", Promise.resolve().then(() => (init_meta_elements(), meta_elements_exports))],
      ["../gather/gatherers/scripts", Promise.resolve().then(() => (init_scripts(), scripts_exports))],
      ["../gather/gatherers/seo/robots-txt", Promise.resolve().then(() => (init_robots_txt(), robots_txt_exports))],
      ["../gather/gatherers/source-maps", Promise.resolve().then(() => (init_source_maps(), source_maps_exports))],
      ["../gather/gatherers/stacks", Promise.resolve().then(() => (init_stacks(), stacks_exports))],
      ["../gather/gatherers/trace", Promise.resolve().then(() => (init_trace(), trace_exports))],
      ["../gather/gatherers/viewport-dimensions", Promise.resolve().then(() => (init_viewport_dimensions(), viewport_dimensions_exports))],
      ["../gather/gatherers/webmcp-schema", Promise.resolve().then(() => (init_webmcp_schema(), webmcp_schema_exports))],
      ["../gather/gatherers/webmcp", Promise.resolve().then(() => (init_webmcp(), webmcp_exports))],
      ["../audits/accessibility/accesskeys", Promise.resolve().then(() => (init_accesskeys(), accesskeys_exports))],
      ["../audits/accessibility/aria-allowed-attr", Promise.resolve().then(() => (init_aria_allowed_attr(), aria_allowed_attr_exports))],
      ["../audits/accessibility/aria-allowed-role", Promise.resolve().then(() => (init_aria_allowed_role(), aria_allowed_role_exports))],
      ["../audits/accessibility/aria-command-name", Promise.resolve().then(() => (init_aria_command_name(), aria_command_name_exports))],
      ["../audits/accessibility/aria-conditional-attr", Promise.resolve().then(() => (init_aria_conditional_attr(), aria_conditional_attr_exports))],
      ["../audits/accessibility/aria-deprecated-role", Promise.resolve().then(() => (init_aria_deprecated_role(), aria_deprecated_role_exports))],
      ["../audits/accessibility/aria-dialog-name", Promise.resolve().then(() => (init_aria_dialog_name(), aria_dialog_name_exports))],
      ["../audits/accessibility/aria-hidden-body", Promise.resolve().then(() => (init_aria_hidden_body(), aria_hidden_body_exports))],
      ["../audits/accessibility/aria-hidden-focus", Promise.resolve().then(() => (init_aria_hidden_focus(), aria_hidden_focus_exports))],
      ["../audits/accessibility/aria-input-field-name", Promise.resolve().then(() => (init_aria_input_field_name(), aria_input_field_name_exports))],
      ["../audits/accessibility/aria-meter-name", Promise.resolve().then(() => (init_aria_meter_name(), aria_meter_name_exports))],
      ["../audits/accessibility/aria-progressbar-name", Promise.resolve().then(() => (init_aria_progressbar_name(), aria_progressbar_name_exports))],
      ["../audits/accessibility/aria-prohibited-attr", Promise.resolve().then(() => (init_aria_prohibited_attr(), aria_prohibited_attr_exports))],
      ["../audits/accessibility/aria-required-attr", Promise.resolve().then(() => (init_aria_required_attr(), aria_required_attr_exports))],
      ["../audits/accessibility/aria-required-children", Promise.resolve().then(() => (init_aria_required_children(), aria_required_children_exports))],
      ["../audits/accessibility/aria-required-parent", Promise.resolve().then(() => (init_aria_required_parent(), aria_required_parent_exports))],
      ["../audits/accessibility/aria-roles", Promise.resolve().then(() => (init_aria_roles(), aria_roles_exports))],
      ["../audits/accessibility/aria-text", Promise.resolve().then(() => (init_aria_text(), aria_text_exports))],
      ["../audits/accessibility/aria-toggle-field-name", Promise.resolve().then(() => (init_aria_toggle_field_name(), aria_toggle_field_name_exports))],
      ["../audits/accessibility/aria-tooltip-name", Promise.resolve().then(() => (init_aria_tooltip_name(), aria_tooltip_name_exports))],
      ["../audits/accessibility/aria-treeitem-name", Promise.resolve().then(() => (init_aria_treeitem_name(), aria_treeitem_name_exports))],
      ["../audits/accessibility/aria-valid-attr-value", Promise.resolve().then(() => (init_aria_valid_attr_value(), aria_valid_attr_value_exports))],
      ["../audits/accessibility/aria-valid-attr", Promise.resolve().then(() => (init_aria_valid_attr(), aria_valid_attr_exports))],
      ["../audits/accessibility/autocomplete-valid", Promise.resolve().then(() => (init_autocomplete_valid(), autocomplete_valid_exports))],
      ["../audits/accessibility/button-name", Promise.resolve().then(() => (init_button_name(), button_name_exports))],
      ["../audits/accessibility/bypass", Promise.resolve().then(() => (init_bypass(), bypass_exports))],
      ["../audits/accessibility/color-contrast", Promise.resolve().then(() => (init_color_contrast(), color_contrast_exports))],
      ["../audits/accessibility/definition-list", Promise.resolve().then(() => (init_definition_list(), definition_list_exports))],
      ["../audits/accessibility/dlitem", Promise.resolve().then(() => (init_dlitem(), dlitem_exports))],
      ["../audits/accessibility/document-title", Promise.resolve().then(() => (init_document_title(), document_title_exports))],
      ["../audits/accessibility/duplicate-id-aria", Promise.resolve().then(() => (init_duplicate_id_aria(), duplicate_id_aria_exports))],
      ["../audits/accessibility/empty-heading", Promise.resolve().then(() => (init_empty_heading(), empty_heading_exports))],
      ["../audits/accessibility/form-field-multiple-labels", Promise.resolve().then(() => (init_form_field_multiple_labels(), form_field_multiple_labels_exports))],
      ["../audits/accessibility/frame-title", Promise.resolve().then(() => (init_frame_title(), frame_title_exports))],
      ["../audits/accessibility/heading-order", Promise.resolve().then(() => (init_heading_order(), heading_order_exports))],
      ["../audits/accessibility/html-has-lang", Promise.resolve().then(() => (init_html_has_lang(), html_has_lang_exports))],
      ["../audits/accessibility/html-lang-valid", Promise.resolve().then(() => (init_html_lang_valid(), html_lang_valid_exports))],
      ["../audits/accessibility/html-xml-lang-mismatch", Promise.resolve().then(() => (init_html_xml_lang_mismatch(), html_xml_lang_mismatch_exports))],
      ["../audits/accessibility/identical-links-same-purpose", Promise.resolve().then(() => (init_identical_links_same_purpose(), identical_links_same_purpose_exports))],
      ["../audits/accessibility/image-alt", Promise.resolve().then(() => (init_image_alt(), image_alt_exports))],
      ["../audits/accessibility/image-redundant-alt", Promise.resolve().then(() => (init_image_redundant_alt(), image_redundant_alt_exports))],
      ["../audits/accessibility/input-button-name", Promise.resolve().then(() => (init_input_button_name(), input_button_name_exports))],
      ["../audits/accessibility/input-image-alt", Promise.resolve().then(() => (init_input_image_alt(), input_image_alt_exports))],
      ["../audits/accessibility/label-content-name-mismatch", Promise.resolve().then(() => (init_label_content_name_mismatch(), label_content_name_mismatch_exports))],
      ["../audits/accessibility/label", Promise.resolve().then(() => (init_label(), label_exports))],
      ["../audits/accessibility/landmark-one-main", Promise.resolve().then(() => (init_landmark_one_main(), landmark_one_main_exports))],
      ["../audits/accessibility/link-in-text-block", Promise.resolve().then(() => (init_link_in_text_block(), link_in_text_block_exports))],
      ["../audits/accessibility/link-name", Promise.resolve().then(() => (init_link_name(), link_name_exports))],
      ["../audits/accessibility/list", Promise.resolve().then(() => (init_list(), list_exports))],
      ["../audits/accessibility/listitem", Promise.resolve().then(() => (init_listitem(), listitem_exports))],
      ["../audits/accessibility/manual/custom-controls-labels", Promise.resolve().then(() => (init_custom_controls_labels(), custom_controls_labels_exports))],
      ["../audits/accessibility/manual/custom-controls-roles", Promise.resolve().then(() => (init_custom_controls_roles(), custom_controls_roles_exports))],
      ["../audits/accessibility/manual/focus-traps", Promise.resolve().then(() => (init_focus_traps(), focus_traps_exports))],
      ["../audits/accessibility/manual/focusable-controls", Promise.resolve().then(() => (init_focusable_controls(), focusable_controls_exports))],
      ["../audits/accessibility/manual/interactive-element-affordance", Promise.resolve().then(() => (init_interactive_element_affordance(), interactive_element_affordance_exports))],
      ["../audits/accessibility/manual/logical-tab-order", Promise.resolve().then(() => (init_logical_tab_order(), logical_tab_order_exports))],
      ["../audits/accessibility/manual/managed-focus", Promise.resolve().then(() => (init_managed_focus(), managed_focus_exports))],
      ["../audits/accessibility/manual/offscreen-content-hidden", Promise.resolve().then(() => (init_offscreen_content_hidden(), offscreen_content_hidden_exports))],
      ["../audits/accessibility/manual/use-landmarks", Promise.resolve().then(() => (init_use_landmarks(), use_landmarks_exports))],
      ["../audits/accessibility/manual/visual-order-follows-dom", Promise.resolve().then(() => (init_visual_order_follows_dom(), visual_order_follows_dom_exports))],
      ["../audits/accessibility/meta-refresh", Promise.resolve().then(() => (init_meta_refresh(), meta_refresh_exports))],
      ["../audits/accessibility/meta-viewport", Promise.resolve().then(() => (init_meta_viewport(), meta_viewport_exports))],
      ["../audits/accessibility/object-alt", Promise.resolve().then(() => (init_object_alt(), object_alt_exports))],
      ["../audits/accessibility/presentation-role-conflict", Promise.resolve().then(() => (init_presentation_role_conflict(), presentation_role_conflict_exports))],
      ["../audits/accessibility/select-name", Promise.resolve().then(() => (init_select_name(), select_name_exports))],
      ["../audits/accessibility/skip-link", Promise.resolve().then(() => (init_skip_link(), skip_link_exports))],
      ["../audits/accessibility/svg-img-alt", Promise.resolve().then(() => (init_svg_img_alt(), svg_img_alt_exports))],
      ["../audits/accessibility/tabindex", Promise.resolve().then(() => (init_tabindex(), tabindex_exports))],
      ["../audits/accessibility/table-duplicate-name", Promise.resolve().then(() => (init_table_duplicate_name(), table_duplicate_name_exports))],
      ["../audits/accessibility/table-fake-caption", Promise.resolve().then(() => (init_table_fake_caption(), table_fake_caption_exports))],
      ["../audits/accessibility/target-size", Promise.resolve().then(() => (init_target_size(), target_size_exports))],
      ["../audits/accessibility/td-has-header", Promise.resolve().then(() => (init_td_has_header(), td_has_header_exports))],
      ["../audits/accessibility/td-headers-attr", Promise.resolve().then(() => (init_td_headers_attr(), td_headers_attr_exports))],
      ["../audits/accessibility/th-has-data-cells", Promise.resolve().then(() => (init_th_has_data_cells(), th_has_data_cells_exports))],
      ["../audits/accessibility/valid-lang", Promise.resolve().then(() => (init_valid_lang(), valid_lang_exports))],
      ["../audits/accessibility/video-caption", Promise.resolve().then(() => (init_video_caption(), video_caption_exports))],
      ["../audits/agentic/agent-accessibility-tree", Promise.resolve().then(() => (init_agent_accessibility_tree(), agent_accessibility_tree_exports))],
      ["../audits/agentic/llms-txt", Promise.resolve().then(() => (init_llms_txt2(), llms_txt_exports2))],
      ["../audits/baseline", Promise.resolve().then(() => (init_baseline(), baseline_exports))],
      ["../audits/clickjacking-mitigation", Promise.resolve().then(() => (init_clickjacking_mitigation(), clickjacking_mitigation_exports))],
      ["../audits/csp-xss", Promise.resolve().then(() => (init_csp_xss(), csp_xss_exports))],
      ["../audits/deprecations", Promise.resolve().then(() => (init_deprecations(), deprecations_exports))],
      ["../audits/dobetterweb/charset", Promise.resolve().then(() => (init_charset(), charset_exports))],
      ["../audits/dobetterweb/doctype", Promise.resolve().then(() => (init_doctype2(), doctype_exports2))],
      ["../audits/dobetterweb/geolocation-on-start", Promise.resolve().then(() => (init_geolocation_on_start(), geolocation_on_start_exports))],
      ["../audits/dobetterweb/inspector-issues", Promise.resolve().then(() => (init_inspector_issues2(), inspector_issues_exports2))],
      ["../audits/dobetterweb/js-libraries", Promise.resolve().then(() => (init_js_libraries(), js_libraries_exports))],
      ["../audits/dobetterweb/notification-on-start", Promise.resolve().then(() => (init_notification_on_start(), notification_on_start_exports))],
      ["../audits/dobetterweb/paste-preventing-inputs", Promise.resolve().then(() => (init_paste_preventing_inputs(), paste_preventing_inputs_exports))],
      ["../audits/errors-in-console", Promise.resolve().then(() => (init_errors_in_console(), errors_in_console_exports))],
      ["../audits/has-hsts", Promise.resolve().then(() => (init_has_hsts(), has_hsts_exports))],
      ["../audits/image-aspect-ratio", Promise.resolve().then(() => (init_image_aspect_ratio(), image_aspect_ratio_exports))],
      ["../audits/image-size-responsive", Promise.resolve().then(() => (init_image_size_responsive(), image_size_responsive_exports))],
      ["../audits/is-on-https", Promise.resolve().then(() => (init_is_on_https(), is_on_https_exports))],
      ["../audits/metrics/cumulative-layout-shift", Promise.resolve().then(() => (init_cumulative_layout_shift2(), cumulative_layout_shift_exports))],
      ["../audits/origin-isolation", Promise.resolve().then(() => (init_origin_isolation(), origin_isolation_exports))],
      ["../audits/redirects-http", Promise.resolve().then(() => (init_redirects_http(), redirects_http_exports))],
      ["../audits/seo/canonical", Promise.resolve().then(() => (init_canonical(), canonical_exports))],
      ["../audits/seo/crawlable-anchors", Promise.resolve().then(() => (init_crawlable_anchors(), crawlable_anchors_exports))],
      ["../audits/seo/hreflang", Promise.resolve().then(() => (init_hreflang(), hreflang_exports))],
      ["../audits/seo/http-status-code", Promise.resolve().then(() => (init_http_status_code(), http_status_code_exports))],
      ["../audits/seo/is-crawlable", Promise.resolve().then(() => (init_is_crawlable(), is_crawlable_exports))],
      ["../audits/seo/link-text", Promise.resolve().then(() => (init_link_text(), link_text_exports))],
      ["../audits/seo/manual/structured-data", Promise.resolve().then(() => (init_structured_data(), structured_data_exports))],
      ["../audits/seo/meta-description", Promise.resolve().then(() => (init_meta_description(), meta_description_exports))],
      ["../audits/seo/robots-txt", Promise.resolve().then(() => (init_robots_txt2(), robots_txt_exports2))],
      ["../audits/third-party-cookies", Promise.resolve().then(() => (init_third_party_cookies(), third_party_cookies_exports))],
      ["../audits/trusted-types-xss", Promise.resolve().then(() => (init_trusted_types_xss(), trusted_types_xss_exports))],
      ["../audits/valid-source-maps", Promise.resolve().then(() => (init_valid_source_maps(), valid_source_maps_exports))],
      ["../audits/webmcp-form-coverage", Promise.resolve().then(() => (init_webmcp_form_coverage(), webmcp_form_coverage_exports))],
      ["../audits/webmcp-registered-tools", Promise.resolve().then(() => (init_webmcp_registered_tools(), webmcp_registered_tools_exports))],
      ["../audits/webmcp-schema-validity", Promise.resolve().then(() => (init_webmcp_schema_validity(), webmcp_schema_validity_exports))],
      ["../computed/speedline", Promise.resolve().then(() => (init_speedline(), speedline_exports))],
      ["../computed/metrics/timing-summary", Promise.resolve().then(() => (init_timing_summary(), timing_summary_exports))],
      ["../computed/entity-classification", Promise.resolve().then(() => (init_entity_classification(), entity_classification_exports))],
      ["../computed/trace-engine-result", Promise.resolve().then(() => (init_trace_engine_result(), trace_engine_result_exports))],
      ["../gather/gatherers/bf-cache-failures", Promise.resolve().then(() => (init_bf_cache_failures(), bf_cache_failures_exports))],
      ["../gather/gatherers/css-usage", Promise.resolve().then(() => (init_css_usage(), css_usage_exports))],
      ["../gather/gatherers/full-page-screenshot", Promise.resolve().then(() => (init_full_page_screenshot(), full_page_screenshot_exports))],
      ["../gather/gatherers/iframe-elements", Promise.resolve().then(() => (init_iframe_elements(), iframe_elements_exports))],
      ["../gather/gatherers/js-usage", Promise.resolve().then(() => (init_js_usage(), js_usage_exports))],
      ["../gather/gatherers/network-user-agent", Promise.resolve().then(() => (init_network_user_agent(), network_user_agent_exports))],
      ["../gather/gatherers/stylesheets", Promise.resolve().then(() => (init_stylesheets(), stylesheets_exports))],
      ["../gather/gatherers/trace-elements", Promise.resolve().then(() => (init_trace_elements(), trace_elements_exports))],
      ["../audits/autocomplete", Promise.resolve().then(() => (init_autocomplete(), autocomplete_exports))],
      ["../audits/bf-cache", Promise.resolve().then(() => (init_bf_cache(), bf_cache_exports))],
      ["../audits/bootup-time", Promise.resolve().then(() => (init_bootup_time(), bootup_time_exports))],
      ["../audits/byte-efficiency/total-byte-weight", Promise.resolve().then(() => (init_total_byte_weight(), total_byte_weight_exports))],
      ["../audits/byte-efficiency/unminified-css", Promise.resolve().then(() => (init_unminified_css(), unminified_css_exports))],
      ["../audits/byte-efficiency/unminified-javascript", Promise.resolve().then(() => (init_unminified_javascript(), unminified_javascript_exports))],
      ["../audits/byte-efficiency/unused-css-rules", Promise.resolve().then(() => (init_unused_css_rules(), unused_css_rules_exports))],
      ["../audits/byte-efficiency/unused-javascript", Promise.resolve().then(() => (init_unused_javascript(), unused_javascript_exports))],
      ["../audits/diagnostics", Promise.resolve().then(() => (init_diagnostics(), diagnostics_exports))],
      ["../audits/final-screenshot", Promise.resolve().then(() => (init_final_screenshot(), final_screenshot_exports))],
      ["../audits/insights/cache-insight", Promise.resolve().then(() => (init_cache_insight(), cache_insight_exports))],
      ["../audits/insights/cls-culprits-insight", Promise.resolve().then(() => (init_cls_culprits_insight(), cls_culprits_insight_exports))],
      ["../audits/insights/document-latency-insight", Promise.resolve().then(() => (init_document_latency_insight(), document_latency_insight_exports))],
      ["../audits/insights/dom-size-insight", Promise.resolve().then(() => (init_dom_size_insight(), dom_size_insight_exports))],
      ["../audits/insights/duplicated-javascript-insight", Promise.resolve().then(() => (init_duplicated_javascript_insight(), duplicated_javascript_insight_exports))],
      ["../audits/insights/font-display-insight", Promise.resolve().then(() => (init_font_display_insight(), font_display_insight_exports))],
      ["../audits/insights/forced-reflow-insight", Promise.resolve().then(() => (init_forced_reflow_insight(), forced_reflow_insight_exports))],
      ["../audits/insights/image-delivery-insight", Promise.resolve().then(() => (init_image_delivery_insight(), image_delivery_insight_exports))],
      ["../audits/insights/inp-breakdown-insight", Promise.resolve().then(() => (init_inp_breakdown_insight(), inp_breakdown_insight_exports))],
      ["../audits/insights/lcp-breakdown-insight", Promise.resolve().then(() => (init_lcp_breakdown_insight(), lcp_breakdown_insight_exports))],
      ["../audits/insights/lcp-discovery-insight", Promise.resolve().then(() => (init_lcp_discovery_insight(), lcp_discovery_insight_exports))],
      ["../audits/insights/legacy-javascript-insight", Promise.resolve().then(() => (init_legacy_javascript_insight(), legacy_javascript_insight_exports))],
      ["../audits/insights/modern-http-insight", Promise.resolve().then(() => (init_modern_http_insight(), modern_http_insight_exports))],
      ["../audits/insights/network-dependency-tree-insight", Promise.resolve().then(() => (init_network_dependency_tree_insight(), network_dependency_tree_insight_exports))],
      ["../audits/insights/render-blocking-insight", Promise.resolve().then(() => (init_render_blocking_insight(), render_blocking_insight_exports))],
      ["../audits/insights/slow-css-selector-insight", Promise.resolve().then(() => (init_slow_css_selector_insight(), slow_css_selector_insight_exports))],
      ["../audits/insights/third-parties-insight", Promise.resolve().then(() => (init_third_parties_insight(), third_parties_insight_exports))],
      ["../audits/insights/viewport-insight", Promise.resolve().then(() => (init_viewport_insight(), viewport_insight_exports))],
      ["../audits/layout-shifts", Promise.resolve().then(() => (init_layout_shifts(), layout_shifts_exports))],
      ["../audits/long-tasks", Promise.resolve().then(() => (init_long_tasks(), long_tasks_exports))],
      ["../audits/main-thread-tasks", Promise.resolve().then(() => (init_main_thread_tasks(), main_thread_tasks_exports))],
      ["../audits/mainthread-work-breakdown", Promise.resolve().then(() => (init_mainthread_work_breakdown(), mainthread_work_breakdown_exports))],
      ["../audits/metrics", Promise.resolve().then(() => (init_metrics2(), metrics_exports2))],
      ["../audits/metrics/first-contentful-paint", Promise.resolve().then(() => (init_first_contentful_paint(), first_contentful_paint_exports))],
      ["../audits/metrics/interaction-to-next-paint", Promise.resolve().then(() => (init_interaction_to_next_paint(), interaction_to_next_paint_exports))],
      ["../audits/metrics/interactive", Promise.resolve().then(() => (init_interactive(), interactive_exports))],
      ["../audits/metrics/largest-contentful-paint", Promise.resolve().then(() => (init_largest_contentful_paint(), largest_contentful_paint_exports))],
      ["../audits/metrics/max-potential-fid", Promise.resolve().then(() => (init_max_potential_fid(), max_potential_fid_exports))],
      ["../audits/metrics/speed-index", Promise.resolve().then(() => (init_speed_index(), speed_index_exports))],
      ["../audits/metrics/total-blocking-time", Promise.resolve().then(() => (init_total_blocking_time(), total_blocking_time_exports))],
      ["../audits/network-requests", Promise.resolve().then(() => (init_network_requests(), network_requests_exports))],
      ["../audits/network-rtt", Promise.resolve().then(() => (init_network_rtt(), network_rtt_exports))],
      ["../audits/network-server-latency", Promise.resolve().then(() => (init_network_server_latency(), network_server_latency_exports))],
      ["../audits/non-composited-animations", Promise.resolve().then(() => (init_non_composited_animations(), non_composited_animations_exports))],
      ["../audits/oopif-iframe-test-audit", Promise.resolve().then(() => (init_oopif_iframe_test_audit(), oopif_iframe_test_audit_exports))],
      ["../audits/predictive-perf", Promise.resolve().then(() => (init_predictive_perf(), predictive_perf_exports))],
      ["../audits/redirects", Promise.resolve().then(() => (init_redirects(), redirects_exports))],
      ["../audits/resource-summary", Promise.resolve().then(() => (init_resource_summary(), resource_summary_exports))],
      ["../audits/screenshot-thumbnails", Promise.resolve().then(() => (init_screenshot_thumbnails(), screenshot_thumbnails_exports))],
      ["../audits/script-treemap-data", Promise.resolve().then(() => (init_script_treemap_data(), script_treemap_data_exports))],
      ["../audits/server-response-time", Promise.resolve().then(() => (init_server_response_time(), server_response_time_exports))],
      ["../audits/unsized-images", Promise.resolve().then(() => (init_unsized_images(), unsized_images_exports))],
      ["../audits/user-timings", Promise.resolve().then(() => (init_user_timings(), user_timings_exports))]
    ]);
    __name(requireWrapper, "requireWrapper");
    __name(requireGatherer, "requireGatherer");
    __name(requireAudit, "requireAudit");
    __name(cleanFlagsForSettings, "cleanFlagsForSettings");
    __name(resolveSettings, "resolveSettings");
    __name(mergePlugins, "mergePlugins");
    __name(resolveGathererToDefn, "resolveGathererToDefn");
    __name(resolveAuditsToDefns, "resolveAuditsToDefns");
    __name(resolveModulePath, "resolveModulePath");
    __name(shallowClone, "shallowClone");
    __name(deepClone, "deepClone");
    __name(deepCloneConfigJson, "deepCloneConfigJson");
  }
});

// core/config/config.js
import path5 from "path";
function resolveWorkingCopy(config5, context) {
  let { configPath } = context;
  if (configPath && !path5.isAbsolute(configPath)) {
    throw new Error("configPath must be an absolute path");
  }
  if (!config5) {
    config5 = default_config_default;
    configPath = defaultConfigPath;
  }
  const configDir = configPath ? path5.dirname(configPath) : void 0;
  return {
    configWorkingCopy: deepCloneConfigJson(config5),
    configPath,
    configDir
  };
}
function resolveExtensions(config5) {
  if (!config5.extends) return config5;
  if (config5.extends !== "lighthouse:default") {
    throw new Error("`lighthouse:default` is the only valid extension method.");
  }
  const { artifacts, ...extensionJSON } = config5;
  const defaultClone = deepCloneConfigJson(default_config_default);
  const mergedConfig = mergeConfigFragment(defaultClone, extensionJSON);
  mergedConfig.artifacts = mergeConfigFragmentArrayByKey(
    defaultClone.artifacts,
    artifacts,
    (artifact) => artifact.id
  );
  return mergedConfig;
}
function resolveArtifactDependencies(artifact, gatherer, artifactDefnsBySymbol) {
  if (!("dependencies" in gatherer.instance.meta)) return void 0;
  const dependencies = Object.entries(gatherer.instance.meta.dependencies).map(
    ([dependencyName, artifactSymbol]) => {
      const dependency = artifactDefnsBySymbol.get(artifactSymbol);
      if (!dependency) throwInvalidDependencyOrder(artifact.id, dependencyName);
      const validDependency = isValidArtifactDependency(gatherer, dependency.gatherer);
      if (!validDependency) throwInvalidArtifactDependency(artifact.id, dependencyName);
      return [dependencyName, { id: dependency.id }];
    }
  );
  return Object.fromEntries(dependencies);
}
async function resolveArtifactsToDefns(artifacts, configDir) {
  if (!artifacts) return null;
  const status = { msg: "Resolve artifact definitions", id: "lh:config:resolveArtifactsToDefns" };
  lighthouse_logger_default.time(status, "verbose");
  const sortedArtifacts = [...artifacts];
  sortedArtifacts.sort((a, b) => {
    const aPriority = internalArtifactPriorities[a.id] || 0;
    const bPriority = internalArtifactPriorities[b.id] || 0;
    return aPriority - bPriority;
  });
  const artifactDefnsBySymbol = /* @__PURE__ */ new Map();
  const coreGathererList = Runner.getGathererList();
  const artifactDefns = [];
  for (const artifactJson of sortedArtifacts) {
    const gathererJson = artifactJson.gatherer;
    const gatherer = await resolveGathererToDefn(gathererJson, coreGathererList, configDir);
    const artifact = {
      id: artifactJson.id,
      gatherer,
      dependencies: resolveArtifactDependencies(artifactJson, gatherer, artifactDefnsBySymbol)
    };
    const symbol = artifact.gatherer.instance.meta.symbol;
    if (symbol) artifactDefnsBySymbol.set(symbol, artifact);
    artifactDefns.push(artifact);
  }
  lighthouse_logger_default.timeEnd(status);
  return artifactDefns;
}
function overrideSettingsForGatherMode(settings, gatherMode) {
  if (gatherMode === "timespan") {
    if (settings.throttlingMethod === "simulate") {
      settings.throttlingMethod = "devtools";
    }
  }
}
function overrideThrottlingWindows(settings) {
  if (settings.throttlingMethod === "simulate") return;
  settings.cpuQuietThresholdMs = Math.max(
    settings.cpuQuietThresholdMs || 0,
    nonSimulatedSettingsOverrides.cpuQuietThresholdMs
  );
  settings.networkQuietThresholdMs = Math.max(
    settings.networkQuietThresholdMs || 0,
    nonSimulatedSettingsOverrides.networkQuietThresholdMs
  );
  settings.pauseAfterFcpMs = Math.max(
    settings.pauseAfterFcpMs || 0,
    nonSimulatedSettingsOverrides.pauseAfterFcpMs
  );
  settings.pauseAfterLoadMs = Math.max(
    settings.pauseAfterLoadMs || 0,
    nonSimulatedSettingsOverrides.pauseAfterLoadMs
  );
}
async function initializeConfig(gatherMode, config5, flags = {}) {
  const status = { msg: "Initialize config", id: "lh:config" };
  lighthouse_logger_default.time(status, "verbose");
  let { configWorkingCopy, configDir } = resolveWorkingCopy(config5, flags);
  configWorkingCopy = resolveExtensions(configWorkingCopy);
  configWorkingCopy = await mergePlugins(configWorkingCopy, configDir, flags);
  const settings = resolveSettings(configWorkingCopy.settings || {}, flags);
  overrideSettingsForGatherMode(settings, gatherMode);
  overrideThrottlingWindows(settings);
  const artifacts = await resolveArtifactsToDefns(configWorkingCopy.artifacts, configDir);
  let resolvedConfig = {
    artifacts,
    audits: await resolveAuditsToDefns(configWorkingCopy.audits, configDir),
    categories: configWorkingCopy.categories || null,
    groups: configWorkingCopy.groups || null,
    settings
  };
  assertValidConfig(resolvedConfig);
  resolvedConfig = filterConfigByGatherMode(resolvedConfig, gatherMode);
  resolvedConfig = filterConfigByExplicitFilters(resolvedConfig, settings);
  lighthouse_logger_default.timeEnd(status);
  return { resolvedConfig };
}
var defaultConfigPath, internalArtifactPriorities;
var init_config = __esm({
  "core/config/config.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_runner();
    init_default_config();
    init_constants();
    init_validation();
    init_filters();
    init_config_helpers();
    init_esm_utils();
    init_format();
    /**
     * @license
     * Copyright 2020 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    defaultConfigPath = path5.join(
      "",
      "../../config/default-config.js"
    );
    internalArtifactPriorities = {
      FullPageScreenshot: 1,
      BFCacheFailures: 1
    };
    __name(resolveWorkingCopy, "resolveWorkingCopy");
    __name(resolveExtensions, "resolveExtensions");
    __name(resolveArtifactDependencies, "resolveArtifactDependencies");
    __name(resolveArtifactsToDefns, "resolveArtifactsToDefns");
    __name(overrideSettingsForGatherMode, "overrideSettingsForGatherMode");
    __name(overrideThrottlingWindows, "overrideThrottlingWindows");
    __name(initializeConfig, "initializeConfig");
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/node_modules/@sentry/node/build/cjs/index.js
var cjs_exports = {};
__export(cjs_exports, {
  default: () => cjs_default
});
var cjs_default;
var init_cjs = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/node_modules/@sentry/node/build/cjs/index.js"() {
    init_process_global();
    cjs_default = {};
  }
});

// core/lib/sentry.js
async function init(opts) {
  if (!opts.flags.enableErrorReporting) {
    return;
  }
  if (!sentryDelegate._shouldSample()) {
    return;
  }
  try {
    const Sentry2 = await Promise.resolve().then(() => (init_cjs(), cjs_exports));
    Sentry2.init({
      ...opts.environmentData,
      dsn: SENTRY_URL
    });
    let settings = opts.flags;
    try {
      const { resolvedConfig } = await initializeConfig("navigation", opts.config, opts.flags);
      settings = resolvedConfig.settings;
    } catch {
    }
    const baseTags = {
      channel: settings.channel,
      formFactor: settings.formFactor,
      throttlingMethod: settings.throttlingMethod
    };
    Sentry2.setTags(baseTags);
    const extras = {
      ...settings.throttling,
      url: opts.url
    };
    Sentry2.setExtras(extras);
    sentryDelegate.captureMessage = (...args) => Sentry2.captureMessage(...args);
    sentryDelegate.captureBreadcrumb = (...args) => Sentry2.addBreadcrumb(...args);
    sentryDelegate.getContext = () => extras;
    const sentryExceptionCache = /* @__PURE__ */ new Map();
    sentryDelegate.captureException = async (err, opts2 = {}) => {
      if (!err) return;
      if (err.expected) return;
      const tags = opts2.tags || {};
      if (tags.audit) {
        const key = `audit-${tags.audit}-${err.message}`;
        if (sentryExceptionCache.has(key)) return;
        sentryExceptionCache.set(key, true);
      }
      if (tags.gatherer) {
        const key = `gatherer-${tags.gatherer}-${err.message}`;
        if (sentryExceptionCache.has(key)) return;
        sentryExceptionCache.set(key, true);
      }
      if (err.protocolMethod) {
        opts2.fingerprint = ["{{ default }}", err.protocolMethod, err.protocolError];
        opts2.tags = opts2.tags || {};
        opts2.tags.protocolMethod = err.protocolMethod;
      }
      Sentry2.withScope((scope) => {
        if (opts2.level) {
          scope.setLevel(opts2.level);
        }
        if (opts2.tags) {
          scope.setTags(opts2.tags);
        }
        let extra;
        if (opts2.extra) extra = { ...opts2.extra };
        if (err.extra) extra = { ...extra, ...err.extra };
        if (extra) {
          scope.setExtras(extra);
        }
        Sentry2.captureException(err);
      });
    };
  } catch (e) {
    lighthouse_logger_default.warn(
      "sentry",
      "Could not load Sentry, errors will not be reported."
    );
  }
}
var SENTRY_URL, SAMPLE_RATE, noop, sentryDelegate, Sentry;
var init_sentry = __esm({
  "core/lib/sentry.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_config();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    SENTRY_URL = "https://a6bb0da87ee048cc9ae2a345fc09ab2e:63a7029f46f74265981b7e005e0f69f8@sentry.io/174697";
    SAMPLE_RATE = 0.01;
    noop = /* @__PURE__ */ __name(() => {
    }, "noop");
    sentryDelegate = {
      init,
      /** @type {(message: string, level?: SeverityLevel) => void} */
      captureMessage: noop,
      /** @type {(breadcrumb: Breadcrumb) => void} */
      captureBreadcrumb: noop,
      /** @type {() => any} */
      getContext: noop,
      /** @type {(error: Error, options: {level?: string, tags?: {[key: string]: any}, extra?: {[key: string]: any}}) => Promise<void>} */
      captureException: /* @__PURE__ */ __name(async () => {
      }, "captureException"),
      _shouldSample() {
        return SAMPLE_RATE >= Math.random();
      }
    };
    __name(init, "init");
    Sentry = sentryDelegate;
  }
});

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/report/generator/report-assets.js
var reportAssets;
var init_report_assets = __esm({
  "replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/report/generator/report-assets.js"() {
    init_process_global();
    reportAssets = {
      REPORT_TEMPLATE: `<!--
@license
Copyright 2018 Google LLC
SPDX-License-Identifier: Apache-2.0
-->
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
  <link rel="icon" href='data:image/svg+xml;utf8,<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z" fill="%23F63"/><path d="M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z" fill="%23FFA385"/><path fill="%23FF3" d="M20.5 10h7v7h-7z"/></svg>'>
  <title>Lighthouse Report</title>
  <style>body {margin: 0}</style>
</head>
<body>
  <noscript>Lighthouse report requires JavaScript. Please enable.</noscript>

  <div id="lh-log"></div>

  <script>window.__LIGHTHOUSE_JSON__ = %%LIGHTHOUSE_JSON%%;</script>
  <script>%%LIGHTHOUSE_JAVASCRIPT%%
  __initLighthouseReport__();
  //# sourceURL=compiled-reportrenderer.js
  </script>
  <script>console.log('window.__LIGHTHOUSE_JSON__', __LIGHTHOUSE_JSON__);</script>
</body>
</html>
`,
      REPORT_JAVASCRIPT: '"use strict";(()=>{var Re=.8999999999999999,Ne=.5,Ie=.49999999999999994;function He(o){let e=Math.sign(o);o=Math.abs(o);let t=.254829592,n=-.284496736,r=1.421413741,i=-1.453152027,a=1.061405429,s=1/(1+.3275911*o),c=s*(t+s*(n+s*(r+s*(i+s*a))));return e*(1-c*Math.exp(-o*o))}function fe({median:o,p10:e},t){if(o<=0)throw new Error("median must be greater than zero");if(e<=0)throw new Error("p10 must be greater than zero");if(e>=o)throw new Error("p10 must be less than the median");if(t<=0)return 1;let n=.9061938024368232,r=Math.max(Number.MIN_VALUE,t/o),i=Math.log(r),a=Math.max(Number.MIN_VALUE,e/o),l=-Math.log(a),s=i*n/l,c=(1-He(s))/2,d;return t<=e?d=Math.max(.9,Math.min(1,c)):t<=o?d=Math.max(Ne,Math.min(Re,c)):d=Math.max(0,Math.min(Ie,c)),d}var U="\\u2026",Oe="\\xA0",ve=.9,$e={PASS:{label:"pass",minScore:ve},AVERAGE:{label:"average",minScore:.5},FAIL:{label:"fail"},ERROR:{label:"error"}},Ve=["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"],E=class o{static get RATINGS(){return $e}static get PASS_THRESHOLD(){return ve}static get MS_DISPLAY_VALUE(){return`%10d${Oe}ms`}static getFinalDisplayedUrl(e){if(e.finalDisplayedUrl)return e.finalDisplayedUrl;if(e.finalUrl)return e.finalUrl;throw new Error("Could not determine final displayed URL")}static getMainDocumentUrl(e){return e.mainDocumentUrl||e.finalUrl}static getFullPageScreenshot(e){return e.fullPageScreenshot?e.fullPageScreenshot:e.audits["full-page-screenshot"]?.details}static getEntityFromUrl(e,t){return t&&t.find(r=>r.origins.find(i=>e.startsWith(i)))||o.getPseudoRootDomain(e)}static splitMarkdownCodeSpans(e){let t=[],n=e.split(/`(.*?)`/g);for(let r=0;r<n.length;r++){let i=n[r];if(!i)continue;let a=r%2!==0;t.push({isCode:a,text:i})}return t}static splitMarkdownLink(e){let t=[],n=e.split(/\\[([^\\]]+?)\\]\\((https?:\\/\\/.*?)\\)/g);for(;n.length;){let[r,i,a]=n.splice(0,3);r&&t.push({isLink:!1,text:r}),i&&a&\
&t.push({isLink:!0,text:i,linkHref:a})}return t}static truncate(e,t,n="\\u2026"){if(e.length<=t)return e;let i=new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)[Symbol.iterator](),a=0;for(let l=0;l<=t-n.length;l++){let s=i.next();if(s.done)return e;a=s.value.index}for(let l=0;l<n.length;l++)if(i.next().done)return e;return e.slice(0,a)+n}static getURLDisplayName(e,t){t=t||{numPathParts:void 0,preserveQuery:void 0,preserveHost:void 0};let n=t.numPathParts!==void 0?t.numPathParts:2,r=t.preserveQuery!==void 0?t.preserveQuery:!0,i=t.preserveHost||!1,a;if(e.protocol==="about:"||e.protocol==="data:")a=e.href;else{a=e.pathname;let s=a.split("/").filter(c=>c.length);n&&s.length>n&&(a=U+s.slice(-1*n).join("/")),i&&(a=`${e.host}/${a.replace(/^\\//,"")}`),r&&(a=`${a}${e.search}`)}let l=64;if(e.protocol!=="data:"&&(a=a.slice(0,200),a=a.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${U}`),a=a.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,`$1${U}`),a=\
a.replace(/(\\d{3})\\d{6,}/g,`$1${U}`),a=a.replace(/\\u2026+/g,U),a.length>l&&a.includes("?")&&(a=a.replace(/\\?([^=]*)(=)?.*/,`?$1$2${U}`),a.length>l&&(a=a.replace(/\\?.*/,`?${U}`)))),a.length>l){let s=a.lastIndexOf(".");s>=0?a=a.slice(0,l-1-(a.length-s))+`${U}${a.slice(s)}`:a=a.slice(0,l-1)+U}return a}static getChromeExtensionOrigin(e){let t=new URL(e);return t.protocol+"//"+t.host}static parseURL(e){let t=new URL(e);return{file:o.getURLDisplayName(t),hostname:t.hostname,origin:t.protocol==="chrome-extension:"?o.getChromeExtensionOrigin(e):t.origin}}static createOrReturnURL(e){return e instanceof URL?e:new URL(e)}static getPseudoTld(e){let t=e.split(".").slice(-2);return Ve.includes(t[0])?`.${t.join(".")}`:`.${t[t.length-1]}`}static getPseudoRootDomain(e){let t=o.createOrReturnURL(e).hostname,r=o.getPseudoTld(t).split(".");return t.split(".").slice(-r.length).join(".")}static filterRelevantLines(e,t,n){if(t.length===0)return e.slice(0,n*2+1);let r=3,i=new Set;return t=t.sort((a,l)=>(a.lin\
eNumber||0)-(l.lineNumber||0)),t.forEach(({lineNumber:a})=>{let l=a-n,s=a+n;for(;l<1;)l++,s++;i.has(l-r-1)&&(l-=r);for(let c=l;c<=s;c++){let d=c;i.add(d)}}),e.filter(a=>i.has(a.lineNumber))}static computeLogNormalScore(e,t){let n=fe(e,t);return n>.9&&(n+=.05*(n-.9)),Math.floor(n*100)/100}};function Ge(o){let e=o.createFragment(),t=o.createElement("style");t.append(`\n    .lh-3p-filter {\n      color: var(--color-gray-600);\n      float: right;\n      padding: 6px var(--stackpack-padding-horizontal);\n    }\n    .lh-3p-filter-label, .lh-3p-filter-input {\n      vertical-align: middle;\n      user-select: none;\n    }\n    .lh-3p-filter-input:disabled + .lh-3p-ui-string {\n      text-decoration: line-through;\n    }\n  `),e.append(t);let n=o.createElement("div","lh-3p-filter"),r=o.createElement("label","lh-3p-filter-label"),i=o.createElement("input","lh-3p-filter-input");i.setAttribute("type","checkbox"),i.setAttribute("checked","");let a=o.createElement("span","lh-3p-ui-string");a.append("Show 3rd p\
arty resources");let l=o.createElement("span","lh-3p-filter-count");return r.append(" ",i," ",a," (",l,") "),n.append(" ",r," "),e.append(n),e}function Be(o){let e=o.createFragment(),t=o.createElement("div","lh-audit"),n=o.createElement("details","lh-expandable-details"),r=o.createElement("summary"),i=o.createElement("div","lh-audit__header lh-expandable-details__summary"),a=o.createElement("span","lh-audit__score-icon"),l=o.createElement("span","lh-audit__title-and-text"),s=o.createElement("span","lh-audit__title"),c=o.createElement("span","lh-audit__display-text");l.append(" ",s," ",c," ");let d=o.createElement("div","lh-chevron-container");i.append(" ",a," ",l," ",d," "),r.append(" ",i," ");let h=o.createElement("div","lh-audit__description"),p=o.createElement("div","lh-audit__stackpacks");return n.append(" ",r," ",h," ",p," "),t.append(" ",n," "),e.append(t),e}function qe(o){let e=o.createFragment(),t=o.createElement("div","lh-category-header"),n=o.createElement("div","lh-score__ga\
uge");n.setAttribute("role","heading"),n.setAttribute("aria-level","2");let r=o.createElement("div","lh-category-header__description");return t.append(" ",n," ",r," "),e.append(t),e}function je(o){let e=o.createFragment(),t=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-chevron");t.setAttribute("viewBox","0 0 100 100");let n=o.createElementNS("http://www.w3.org/2000/svg","g","lh-chevron__lines"),r=o.createElementNS("http://www.w3.org/2000/svg","path","lh-chevron__line lh-chevron__line-left");r.setAttribute("d","M10 50h40");let i=o.createElementNS("http://www.w3.org/2000/svg","path","lh-chevron__line lh-chevron__line-right");return i.setAttribute("d","M90 50H50"),n.append(" ",r," ",i," "),t.append(" ",n," "),e.append(t),e}function We(o){let e=o.createFragment(),t=o.createElement("div","lh-audit-group"),n=o.createElement("details","lh-clump"),r=o.createElement("summary"),i=o.createElement("div","lh-audit-group__summary"),a=o.createElement("div","lh-audit-group__header"),l=o.cre\
ateElement("span","lh-audit-group__title"),s=o.createElement("span","lh-audit-group__itemcount");a.append(" ",l," ",s," "," "," ");let c=o.createElement("div","lh-clump-toggle"),d=o.createElement("span","lh-clump-toggletext--show"),h=o.createElement("span","lh-clump-toggletext--hide");return c.append(" ",d," ",h," "),i.append(" ",a," ",c," "),r.append(" ",i," "),n.append(" ",r," "),t.append(" "," ",n," "),e.append(t),e}function Ke(o){let e=o.createFragment(),t=o.createElement("div","lh-crc-container"),n=o.createElement("style");n.append(`\n      .lh-crc .lh-tree-marker {\n        width: 12px;\n        height: 26px;\n        display: block;\n        float: left;\n        background-position: top left;\n      }\n      .lh-crc .lh-horiz-down {\n        background: url(\'data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><g fill="%23D8D8D8" fill-rule="evenodd"><path d="M16 12v2H-2v-2z"/><path d="M9 12v14H7V12z"/></g></svg>\');\n      }\n      .lh-\
crc .lh-right {\n        background: url(\'data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M16 12v2H0v-2z" fill="%23D8D8D8" fill-rule="evenodd"/></svg>\');\n      }\n      .lh-crc .lh-up-right {\n        background: url(\'data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M7 0h2v14H7zm2 12h7v2H9z" fill="%23D8D8D8" fill-rule="evenodd"/></svg>\');\n      }\n      .lh-crc .lh-vert-right {\n        background: url(\'data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M7 0h2v27H7zm2 12h7v2H9z" fill="%23D8D8D8" fill-rule="evenodd"/></svg>\');\n      }\n      .lh-crc .lh-vert {\n        background: url(\'data:image/svg+xml;utf8,<svg width="16" height="26" viewBox="0 0 16 26" xmlns="http://www.w3.org/2000/svg"><path d="M7 0h2v26H7z" fill="%23D8D8D8" fill-rule="evenodd"/></svg>\');\n      }\n      .lh-crc .lh-crc-tree {\n\
        font-size: 14px;\n        width: 100%;\n        overflow-x: auto;\n      }\n      .lh-crc .lh-crc-node {\n        height: 26px;\n        line-height: 26px;\n        white-space: nowrap;\n      }\n      .lh-crc .lh-crc-node__longest {\n        color: var(--color-average-secondary);\n      }\n      .lh-crc .lh-crc-node__tree-value {\n        margin-left: 10px;\n      }\n      .lh-crc .lh-crc-node__tree-value div {\n        display: inline;\n      }\n      .lh-crc .lh-crc-node__chain-duration {\n        font-weight: 700;\n      }\n      .lh-crc .lh-crc-initial-nav {\n        color: #595959;\n        font-style: italic;\n      }\n      .lh-crc__summary-value {\n        margin-bottom: 10px;\n      }\n    `);let r=o.createElement("div"),i=o.createElement("div","lh-crc__summary-value"),a=o.createElement("span","lh-crc__longest_duration_label"),l=o.createElement("b","lh-crc__longest_duration");i.append(" ",a," ",l," "),r.append(" ",i," ");let s=o.createElement("div","lh-crc"),c=o.createElement("div","lh-crc-initi\
al-nav");return s.append(" ",c," "," "),t.append(" ",n," ",r," ",s," "),e.append(t),e}function Ze(o){let e=o.createFragment(),t=o.createElement("div","lh-crc-node"),n=o.createElement("span","lh-crc-node__tree-marker"),r=o.createElement("span","lh-crc-node__tree-value");return t.append(" ",n," ",r," "),e.append(t),e}function Je(o){let e=o.createFragment(),t=o.createElement("div","lh-element-screenshot"),n=o.createElement("div","lh-element-screenshot__content"),r=o.createElement("div","lh-element-screenshot__image"),i=o.createElement("div","lh-element-screenshot__mask"),a=o.createElementNS("http://www.w3.org/2000/svg","svg");a.setAttribute("height","0"),a.setAttribute("width","0");let l=o.createElementNS("http://www.w3.org/2000/svg","defs"),s=o.createElementNS("http://www.w3.org/2000/svg","clipPath");s.setAttribute("clipPathUnits","objectBoundingBox"),l.append(" ",s," "," "),a.append(" ",l," "),i.append(" ",a," ");let c=o.createElement("div","lh-element-screenshot__element-marker");retur\
n r.append(" ",i," ",c," "),n.append(" ",r," "),t.append(" ",n," "),e.append(t),e}function Qe(o){let e=o.createFragment(),t=o.createElement("div","lh-exp-gauge-component"),n=o.createElement("div","lh-exp-gauge__wrapper");n.setAttribute("target","_blank");let r=o.createElement("div","lh-exp-gauge__svg-wrapper"),i=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-exp-gauge"),a=o.createElementNS("http://www.w3.org/2000/svg","g","lh-exp-gauge__inner"),l=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-exp-gauge__bg"),s=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-exp-gauge__base lh-exp-gauge--faded"),c=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-exp-gauge__arc"),d=o.createElementNS("http://www.w3.org/2000/svg","text","lh-exp-gauge__percentage");a.append(" ",l," ",s," ",c," ",d," ");let h=o.createElementNS("http://www.w3.org/2000/svg","g","lh-exp-gauge__outer"),p=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-cover");h.append(" "\
,p," ");let g=o.createElementNS("http://www.w3.org/2000/svg","text","lh-exp-gauge__label");return g.setAttribute("text-anchor","middle"),g.setAttribute("x","0"),g.setAttribute("y","60"),i.append(" ",a," ",h," ",g," "),r.append(" ",i," "),n.append(" ",r," "),t.append(" ",n," "),e.append(t),e}function Ye(o){let e=o.createFragment(),t=o.createElement("style");t.append(`\n    .lh-footer {\n      padding: var(--footer-padding-vertical) calc(var(--default-padding) * 2);\n      max-width: var(--report-content-max-width);\n      margin: 0 auto;\n    }\n    .lh-footer .lh-generated {\n      text-align: center;\n    }\n  `),e.append(t);let n=o.createElement("footer","lh-footer"),r=o.createElement("ul","lh-meta__items");r.append(" ");let i=o.createElement("div","lh-generated"),a=o.createElement("b");a.append("Lighthouse");let l=o.createElement("span","lh-footer__version"),s=o.createElement("a","lh-footer__version_issue");return s.setAttribute("href","https://github.com/GoogleChrome/Lighthouse/issues"),s.s\
etAttribute("target","_blank"),s.setAttribute("rel","noopener"),s.append("File an issue"),i.append(" "," Generated by ",a," ",l," | ",s," "),n.append(" ",r," ",i," "),e.append(n),e}function Xe(o){let e=o.createFragment(),t=o.createElement("a","lh-fraction__wrapper"),n=o.createElement("div","lh-fraction__content-wrapper"),r=o.createElement("div","lh-fraction__content"),i=o.createElement("div","lh-fraction__background");r.append(" ",i," "),n.append(" ",r," ");let a=o.createElement("div","lh-fraction__label");return t.append(" ",n," ",a," "),e.append(t),e}function et(o){let e=o.createFragment(),t=o.createElement("a","lh-gauge__wrapper"),n=o.createElement("div","lh-gauge__svg-wrapper"),r=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-gauge");r.setAttribute("viewBox","0 0 120 120");let i=o.createElementNS("http://www.w3.org/2000/svg","circle","lh-gauge-base");i.setAttribute("r","56"),i.setAttribute("cx","60"),i.setAttribute("cy","60"),i.setAttribute("stroke-width","8");let a=o.cre\
ateElementNS("http://www.w3.org/2000/svg","circle","lh-gauge-arc");a.setAttribute("r","56"),a.setAttribute("cx","60"),a.setAttribute("cy","60"),a.setAttribute("stroke-width","8"),r.append(" ",i," ",a," "),n.append(" ",r," ");let l=o.createElement("div","lh-gauge__percentage"),s=o.createElement("div","lh-gauge__label");return t.append(" "," ",n," ",l," "," ",s," "),e.append(t),e}function tt(o){let e=o.createFragment(),t=o.createElement("style");t.append(`\n    /* CSS Fireworks. Originally by Eddie Lin\n       https://codepen.io/paulirish/pen/yEVMbP\n    */\n    .lh-pyro {\n      display: none;\n      z-index: 1;\n      pointer-events: none;\n    }\n    .lh-score100 .lh-pyro {\n      display: block;\n    }\n    .lh-score100 .lh-lighthouse stop:first-child {\n      stop-color: hsla(200, 12%, 95%, 0);\n    }\n    .lh-score100 .lh-lighthouse stop:last-child {\n      stop-color: hsla(65, 81%, 76%, 1);\n    }\n\n    .lh-pyro > .lh-pyro-before, .lh-pyro > .lh-pyro-after {\n      position: absolute;\n      width: 5\
px;\n      height: 5px;\n      border-radius: 2.5px;\n      box-shadow: 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff;\n      animation: 1s bang ease-out infinite backwards,  1s gravity ease-in infinite backwards,  5s position linear infinite backwards;\n      animation-delay: 1s, 1s, 1s;\n    }\n\n    .lh-pyro > .lh-pyro-after {\n      animation-delay: 2.25s, 2.25s, 2.25s;\n      animation-duration: 1.25s, 1.25s, 6.25s;\n    }\n\n    @keyframes bang {\n      to {\n        opacity: 1;\n        box-shadow: -70px -115.67px #47ebbc, -28px -99.67px #e\
b47a4, 58px -31.67px #7eeb47, 13px -141.67px #eb47c5, -19px 6.33px #7347eb, -2px -74.67px #ebd247, 24px -151.67px #eb47e0, 57px -138.67px #b4eb47, -51px -104.67px #479eeb, 62px 8.33px #ebcf47, -93px 0.33px #d547eb, -16px -118.67px #47bfeb, 53px -84.67px #47eb83, 66px -57.67px #eb47bf, -93px -65.67px #91eb47, 30px -13.67px #86eb47, -2px -59.67px #83eb47, -44px 1.33px #eb47eb, 61px -58.67px #47eb73, 5px -22.67px #47e8eb, -66px -28.67px #ebe247, 42px -123.67px #eb5547, -75px 26.33px #7beb47, 15px -52.67px #a147eb, 36px -51.67px #eb8347, -38px -12.67px #eb5547, -46px -59.67px #47eb81, 78px -114.67px #eb47ba, 15px -156.67px #eb47bf, -36px 1.33px #eb4783, -72px -86.67px #eba147, 31px -46.67px #ebe247, -68px 29.33px #47e2eb, -55px 19.33px #ebe047, -56px 27.33px #4776eb, -13px -91.67px #eb5547, -47px -138.67px #47ebc7, -18px -96.67px #eb47ac, 11px -88.67px #4783eb, -67px -28.67px #47baeb, 53px 10.33px #ba47eb, 11px 19.33px #5247eb, -5px -11.67px #eb4791, -68px -4.67px #47eba7, 95px -37.67px #e\
b478b, -67px -162.67px #eb5d47, -54px -120.67px #eb6847, 49px -12.67px #ebe047, 88px 8.33px #47ebda, 97px 33.33px #eb8147, 6px -71.67px #ebbc47;\n      }\n    }\n    @keyframes gravity {\n      from {\n        opacity: 1;\n      }\n      to {\n        transform: translateY(80px);\n        opacity: 0;\n      }\n    }\n    @keyframes position {\n      0%, 19.9% {\n        margin-top: 4%;\n        margin-left: 47%;\n      }\n      20%, 39.9% {\n        margin-top: 7%;\n        margin-left: 30%;\n      }\n      40%, 59.9% {\n        margin-top: 6%;\n        margin-left: 70%;\n      }\n      60%, 79.9% {\n        margin-top: 3%;\n        margin-left: 20%;\n      }\n      80%, 99.9% {\n        margin-top: 3%;\n        margin-left: 80%;\n      }\n    }\n  `),e.append(t);let n=o.createElement("div","lh-header-container"),r=o.createElement("div","lh-scores-wrapper-placeholder");return n.append(" ",r," "),e.append(n),e}function nt(o){let e=o.createFragment(),t=o.createElement("div","lh-metric"),n=o.createElement("div","lh-metric\
__innerwrap"),r=o.createElement("div","lh-metric__icon"),i=o.createElement("span","lh-metric__title"),a=o.createElement("div","lh-metric__value"),l=o.createElement("div","lh-metric__description");return n.append(" ",r," ",i," ",a," ",l," "),t.append(" ",n," "),e.append(t),e}function rt(o){let e=o.createFragment(),t=o.createElement("div","lh-scorescale"),n=o.createElement("span","lh-scorescale-range lh-scorescale-range--fail");n.append("0\\u201349");let r=o.createElement("span","lh-scorescale-range lh-scorescale-range--average");r.append("50\\u201389");let i=o.createElement("span","lh-scorescale-range lh-scorescale-range--pass");return i.append("90\\u2013100"),t.append(" ",n," ",r," ",i," "),e.append(t),e}function ot(o){let e=o.createFragment(),t=o.createElement("style");t.append(`\n    .lh-scores-container {\n      display: flex;\n      flex-direction: column;\n      padding: var(--default-padding) 0;\n      position: relative;\n      width: 100%;\n    }\n\n    .lh-sticky-header {\n      --gauge-ci\
rcle-size: var(--gauge-circle-size-sm);\n      --plugin-badge-size: 16px;\n      --plugin-icon-size: 75%;\n      --gauge-wrapper-width: 60px;\n      --gauge-percentage-font-size: 13px;\n      position: fixed;\n      left: 0;\n      right: 0;\n      top: var(--topbar-height);\n      font-weight: 500;\n      display: none;\n      justify-content: center;\n      background-color: var(--sticky-header-background-color);\n      border-bottom: 1px solid var(--color-gray-200);\n      padding-top: var(--score-container-padding);\n      padding-bottom: 4px;\n      z-index: 2;\n      pointer-events: none;\n    }\n\n    .lh-devtools .lh-sticky-header {\n      /* The report within DevTools is placed in a container with overflow, which changes the placement of this header unless we change \\`position\\` to \\`sticky.\\` */\n      position: sticky;\n    }\n\n    .lh-sticky-header--visible {\n      display: grid;\n      grid-auto-flow: column;\n      pointer-events: auto;\n    }\n\n    /* Disable the gauge arc animation for the sticky \
header, so toggling display: none\n       does not play the animation. */\n    .lh-sticky-header .lh-gauge-arc {\n      animation: none;\n    }\n\n    .lh-sticky-header .lh-gauge__label,\n    .lh-sticky-header .lh-fraction__label {\n      display: none;\n    }\n\n    .lh-highlighter {\n      width: var(--gauge-wrapper-width);\n      height: 1px;\n      background-color: var(--highlighter-background-color);\n      /* Position at bottom of first gauge in sticky header. */\n      position: absolute;\n      grid-column: 1;\n      bottom: -1px;\n      left: 0px;\n      right: 0px;\n    }\n  `),e.append(t);let n=o.createElement("div","lh-scores-wrapper"),r=o.createElement("div","lh-scores-container"),i=o.createElement("div","lh-pyro"),a=o.createElement("div","lh-pyro-before"),l=o.createElement("div","lh-pyro-after");return i.append(" ",a," ",l," "),r.append(" ",i," "),n.append(" ",r," "),e.append(n),e}function it(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet"),n=o.createElement("style");return n\
.append(`\n          :root {\n            --snippet-highlight-light: #fbf1f2;\n            --snippet-highlight-dark: #ffd6d8;\n          }\n\n         .lh-snippet__header {\n          position: relative;\n          overflow: hidden;\n          padding: 10px;\n          border-bottom: none;\n          color: var(--snippet-color);\n          background-color: var(--snippet-background-color);\n          border: 1px solid var(--report-border-color-secondary);\n        }\n        .lh-snippet__title {\n          font-weight: bold;\n          float: left;\n        }\n        .lh-snippet__node {\n          float: left;\n          margin-left: 4px;\n        }\n        .lh-snippet__toggle-expand {\n          padding: 1px 7px;\n          margin-top: -1px;\n          margin-right: -7px;\n          float: right;\n          background: transparent;\n          border: none;\n          cursor: pointer;\n          font-size: 14px;\n          color: #0c50c7;\n        }\n\n        .lh-snippet__snippet {\n          overflow: auto;\n         \
 border: 1px solid var(--report-border-color-secondary);\n        }\n        /* Container needed so that all children grow to the width of the scroll container */\n        .lh-snippet__snippet-inner {\n          display: inline-block;\n          min-width: 100%;\n        }\n\n        .lh-snippet:not(.lh-snippet--expanded) .lh-snippet__show-if-expanded {\n          display: none;\n        }\n        .lh-snippet.lh-snippet--expanded .lh-snippet__show-if-collapsed {\n          display: none;\n        }\n\n        .lh-snippet__line {\n          background: white;\n          white-space: pre;\n          display: flex;\n        }\n        .lh-snippet__line:not(.lh-snippet__line--message):first-child {\n          padding-top: 4px;\n        }\n        .lh-snippet__line:not(.lh-snippet__line--message):last-child {\n          padding-bottom: 4px;\n        }\n        .lh-snippet__line--content-highlighted {\n          background: var(--snippet-highlight-dark);\n        }\n        .lh-snippet__line--message {\n          backgr\
ound: var(--snippet-highlight-light);\n        }\n        .lh-snippet__line--message .lh-snippet__line-number {\n          padding-top: 10px;\n          padding-bottom: 10px;\n        }\n        .lh-snippet__line--message code {\n          padding: 10px;\n          padding-left: 5px;\n          color: var(--color-fail);\n          font-family: var(--report-font-family);\n        }\n        .lh-snippet__line--message code {\n          white-space: normal;\n        }\n        .lh-snippet__line-icon {\n          padding-top: 10px;\n          display: none;\n        }\n        .lh-snippet__line--message .lh-snippet__line-icon {\n          display: block;\n        }\n        .lh-snippet__line-icon:before {\n          content: "";\n          display: inline-block;\n          vertical-align: middle;\n          margin-right: 4px;\n          width: var(--score-icon-size);\n          height: var(--score-icon-size);\n          background-image: var(--fail-icon-url);\n        }\n        .lh-snippet__line-number {\n          flex\
-shrink: 0;\n          width: 40px;\n          text-align: right;\n          font-family: monospace;\n          padding-right: 5px;\n          margin-right: 5px;\n          color: var(--color-gray-600);\n          user-select: none;\n        }\n    `),t.append(" ",n," "),e.append(t),e}function at(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet__snippet"),n=o.createElement("div","lh-snippet__snippet-inner");return t.append(" ",n," "),e.append(t),e}function lt(o){let e=o.createFragment(),t=o.createElement("div","lh-snippet__header"),n=o.createElement("div","lh-snippet__title"),r=o.createElement("div","lh-snippet__node"),i=o.createElement("button","lh-snippet__toggle-expand"),a=o.createElement("span","lh-snippet__btn-label-collapse lh-snippet__show-if-expanded"),l=o.createElement("span","lh-snippet__btn-label-expand lh-snippet__show-if-collapsed");return i.append(" ",a," ",l," "),t.append(" ",n," ",r," ",i," "),e.append(t),e}function st(o){let e=o.createFragment(),t=o.createElement\
("div","lh-snippet__line"),n=o.createElement("div","lh-snippet__line-number"),r=o.createElement("div","lh-snippet__line-icon"),i=o.createElement("code");return t.append(" ",n," ",r," ",i," "),e.append(t),e}function ct(o){let e=o.createFragment(),t=o.createElement("style");return t.append(`/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/*\n  Naming convention:\n\n  If a variable is used for a specific component: --{component}-{property name}-{modifier}\n\n  Both {component} and {property name} should be kebab-case. If the target is the entire page,\n  use \'report\' for the component. The property name should not be abbreviated. Use the\n  property name the variable is intended for - if it\'s used for multiple, a common descriptor\n  is fine (ex: \'size\' for a variable applied to \'width\' and \'height\'). If a variable is shared\n  across multiple components, either create more variables or just drop the "{component}-"\n  part of the name. Append any modifiers a\
t the end (ex: \'big\', \'dark\').\n\n  For colors: --color-{hue}-{intensity}\n\n  {intensity} is the Material Design tag - 700, A700, etc.\n*/\n.lh-vars {\n  /* Palette using Material Design Colors\n   * https://www.materialui.co/colors */\n  --color-amber-50: #FFF8E1;\n  --color-blue-200: #90CAF9;\n  --color-blue-900: #0D47A1;\n  --color-blue-A700: #2962FF;\n  --color-blue-primary: #06f;\n  --color-cyan-500: #00BCD4;\n  --color-gray-100: #F5F5F5;\n  --color-gray-300: #CFCFCF;\n  --color-gray-200: #E0E0E0;\n  --color-gray-400: #BDBDBD;\n  --color-gray-50: #FAFAFA;\n  --color-gray-500: #9E9E9E;\n  --color-gray-600: #757575;\n  --color-gray-700: #616161;\n  --color-gray-800: #424242;\n  --color-gray-900: #212121;\n  --color-gray: #000000;\n  --color-green-700: #080;\n  --color-green: #0c6;\n  --color-lime-400: #D3E156;\n  --color-orange-50: #FFF3E0;\n  --color-orange-700: #C33300;\n  --color-orange: #fa3;\n  --color-red-700: #c00;\n  --color-red: #f33;\n  --color-teal-600: #00897B;\n  --color-white: #FFFFFF;\n\n  /* Context-sp\
ecific colors */\n  --color-average-secondary: var(--color-orange-700);\n  --color-average: var(--color-orange);\n  --color-fail-secondary: var(--color-red-700);\n  --color-fail: var(--color-red);\n  --color-hover: var(--color-gray-50);\n  --color-informative: var(--color-blue-900);\n  --color-pass-secondary: var(--color-green-700);\n  --color-pass: var(--color-green);\n  --color-not-applicable: var(--color-gray-600);\n\n  /* Component variables */\n  --audit-description-padding-left: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right));\n  --audit-explanation-line-height: 16px;\n  --audit-group-margin-bottom: calc(var(--default-padding) * 6);\n  --audit-group-padding-vertical: 8px;\n  --audit-margin-horizontal: 5px;\n  --audit-padding-vertical: 8px;\n  --category-padding: calc(var(--default-padding) * 6) var(--edge-gap-padding) calc(var(--default-padding) * 4);\n  --chevron-line-stroke: var(--color-gray-600);\n  --chevron-size: 12px;\n  --default-padding: 8px;\n  --\
edge-gap-padding: calc(var(--default-padding) * 4);\n  --env-item-background-color: var(--color-gray-100);\n  --env-item-font-size: 28px;\n  --env-item-line-height: 36px;\n  --env-item-padding: 10px 0px;\n  --env-name-min-width: 220px;\n  --footer-padding-vertical: 16px;\n  --gauge-circle-size-big: 96px;\n  --gauge-circle-size: 48px;\n  --gauge-circle-size-sm: 32px;\n  --gauge-label-font-size-big: 18px;\n  --gauge-label-font-size: var(--report-font-size-secondary);\n  --gauge-label-line-height-big: 24px;\n  --gauge-label-line-height: var(--report-line-height-secondary);\n  --gauge-percentage-font-size-big: 38px;\n  --gauge-percentage-font-size: var(--report-font-size-secondary);\n  --gauge-wrapper-width: 120px;\n  --header-line-height: 24px;\n  --highlighter-background-color: var(--report-text-color);\n  --icon-square-size: calc(var(--score-icon-size) * 0.88);\n  --image-preview-size: 48px;\n  --link-color: var(--color-blue-primary);\n  --locale-selector-background-color: var(--color-white);\n  --metric-togg\
le-lines-fill: #7F7F7F;\n  --metric-value-font-size: calc(var(--report-font-size) * 1.8);\n  --metrics-toggle-background-color: var(--color-gray-200);\n  --plugin-badge-background-color: var(--color-white);\n  --plugin-badge-size-big: calc(var(--gauge-circle-size-big) / 2.7);\n  --plugin-badge-size: calc(var(--gauge-circle-size) / 2.7);\n  --plugin-icon-size: 65%;\n  --report-background-color: #fff;\n  --report-border-color-secondary: #ebebeb;\n  --report-font-family-monospace: monospace, \'Roboto Mono\', \'Menlo\', \'dejavu sans mono\', \'Consolas\', \'Lucida Console\';\n  --report-font-family: system-ui, Roboto, Helvetica, Arial, sans-serif;\n  --report-font-size: 14px;\n  --report-font-size-secondary: 12px;\n  --report-icon-size: var(--score-icon-background-size);\n  --report-line-height: 24px;\n  --report-line-height-secondary: 20px;\n  --report-monospace-font-size: calc(var(--report-font-size) * 0.85);\n  --report-text-color-secondary: var(--color-gray-800);\n  --report-text-color: var(--color-gray-900);\n  -\
-report-content-max-width: calc(60 * var(--report-font-size)); /* defaults to 840px */\n  --report-content-min-width: 360px;\n  --report-content-max-width-minus-edge-gap: calc(var(--report-content-max-width) - var(--edge-gap-padding) * 2);\n  --score-container-padding: 8px;\n  --score-icon-background-size: 24px;\n  --score-icon-margin-left: 6px;\n  --score-icon-margin-right: 14px;\n  --score-icon-margin: 0 var(--score-icon-margin-right) 0 var(--score-icon-margin-left);\n  --score-icon-size: 12px;\n  --score-icon-size-big: 16px;\n  --screenshot-overlay-background: rgba(0, 0, 0, 0.3);\n  --section-padding-vertical: calc(var(--default-padding) * 6);\n  --snippet-background-color: var(--color-gray-50);\n  --snippet-color: #0938C2;\n  --stackpack-padding-horizontal: 10px;\n  --sticky-header-background-color: var(--report-background-color);\n  --sticky-header-buffer: var(--topbar-height);\n  --sticky-header-height: calc(var(--gauge-circle-size-sm) + var(--score-container-padding) * 2 + 1em);\n  --table-group-\
header-background-color: #EEF1F4;\n  --table-group-header-text-color: var(--color-gray-700);\n  --table-higlight-background-color: #F5F7FA;\n  --tools-icon-color: var(--color-gray-600);\n  --topbar-background-color: var(--color-white);\n  --topbar-height: 32px;\n  --topbar-logo-size: 24px;\n  --topbar-padding: 0 8px;\n  --toplevel-warning-background-color: hsla(30, 100%, 75%, 10%);\n  --toplevel-warning-message-text-color: var(--color-average-secondary);\n  --toplevel-warning-padding: 18px;\n  --toplevel-warning-text-color: var(--report-text-color);\n\n  /* SVGs */\n  --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>\');\n  --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>\');\n\n  --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>\');\n  --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>\');\n  --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>\');\n  --error-icon-url: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3 15"><title>error</title><path d="M0 15H 3V 12H 0V" fill="%23FF4E42"/><path d="M0 9H 3V 0H 0V" fill="%23FF4E42"/></svg>\');\n\n  --swap-locale-icon-url: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="%23000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 \
19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></svg>\');\n  \n  --baseline-high-icon-url: url("data:image/svg+xml;utf8,<svg width=\'18\' height=\'10\' viewBox=\'0 0 540 300\' fill=\'none\' xmlns=\'http://www.w3.org/2000/svg\'> <path d=\'M420 30L390 60L480 150L390 240L330 180L300 210L390 300L540 150L420 30Z\' fill=\'%23C4EED0\'/> <path d=\'M150 0L30 120L60 150L150 60L210 120L240 90L150 0Z\' fill=\'%23C4EED0\'/> <path d=\'M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z\' fill=\'%231EA446\'/> </svg>");\n  --baseline-low-icon-url: url("data:image/svg+xml;utf8,<svg width=\'18\' height=\'10\' viewBox=\'0 0 540 300\' fill=\'none\' xmlns=\'http://www.w3.org/2000/svg\'> <path d=\'M150 0L180 30L150 60L120 30L150 0Z\' fill=\'%23A8C7FA\'/> <path d=\'M210 60L240 90L210 120L180 90L210 60Z\' fill=\'%23A8C7FA\'/> <path d=\'M450 60L480 90L450 120L420 90L450 60Z\' fill=\'%23A8C7FA\'/> <path d=\'M510 120L540 150L510 180L480 150L510 120Z\' fill=\'%23A8C7FA\'/> <path d=\'M450 180L480 210L450 2\
40L420 210L450 180Z\' fill=\'%23A8C7FA\'/> <path d=\'M390 240L420 270L390 300L360 270L390 240Z\' fill=\'%23A8C7FA\'/> <path d=\'M330 180L360 210L330 240L300 210L330 180Z\' fill=\'%23A8C7FA\'/> <path d=\'M90 60L120 90L90 120L60 90L90 60Z\' fill=\'%23A8C7FA\'/> <path d=\'M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z\' fill=\'%231B6EF3\'/> </svg>");\n  --baseline-limited-icon-url: url("data:image/svg+xml;utf8,<svg width=\'18\' height=\'10\' viewBox=\'0 0 540 300\' fill=\'none\' xmlns=\'http://www.w3.org/2000/svg\'> <path d=\'M150 0L240 90L210 120L120 30L150 0Z\' fill=\'%23F09409\'/> <path d=\'M420 30L540 150L420 270L390 240L480 150L390 60L420 30Z\' fill=\'%23C6C6C6\'/> <path d=\'M330 180L300 210L390 300L420 270L330 180Z\' fill=\'%23F09409\'/> <path d=\'M120 30L150 60L60 150L150 240L120 270L0 150L120 30Z\' fill=\'%23C6C6C6\'/> <path d=\'M390 0L420 30L150 300L120 270L390 0Z\' fill=\'%23F09409\'/> </svg>");\n}\n\n@media not print {\n  .lh-dark {\n    /* Pallete */\n    --color-gray-200: var(--color-gray-800);\n    --color-gray-300: #616161;\n  \
  --color-gray-400: var(--color-gray-600);\n    --color-gray-700: var(--color-gray-400);\n    --color-gray-50: #757575;\n    --color-gray-600: var(--color-gray-500);\n    --color-green-700: var(--color-green);\n    --color-orange-700: var(--color-orange);\n    --color-red-700: var(--color-red);\n    --color-teal-600: var(--color-cyan-500);\n\n    /* Context-specific colors */\n    --color-hover: rgba(0, 0, 0, 0.2);\n    --color-informative: var(--color-blue-200);\n\n    /* Component variables */\n    --env-item-background-color: #393535;\n    --link-color: var(--color-blue-200);\n    --locale-selector-background-color: var(--color-gray-200);\n    --plugin-badge-background-color: var(--color-gray-800);\n    --report-background-color: var(--color-gray-900);\n    --report-border-color-secondary: var(--color-gray-200);\n    --report-text-color-secondary: var(--color-gray-400);\n    --report-text-color: var(--color-gray-100);\n    --snippet-color: var(--color-cyan-500);\n    --topbar-background-color: var(--color\
-gray);\n    --toplevel-warning-background-color: hsl(33deg 14% 18%);\n    --toplevel-warning-message-text-color: var(--color-orange-700);\n    --toplevel-warning-text-color: var(--color-gray-100);\n    --table-group-header-background-color: rgba(186, 196, 206, 0.15);\n    --table-group-header-text-color: var(--color-gray-100);\n    --table-higlight-background-color: rgba(186, 196, 206, 0.09);\n\n    /* SVGs */\n    --plugin-icon-url: var(--plugin-icon-url-dark);\n  }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media only screen and (max-width: 480px) {\n  .lh-vars {\n    --audit-group-margin-bottom: 20px;\n    --edge-gap-padding: var(--default-padding);\n    --env-name-min-width: 120px;\n    --gauge-circle-size-big: 96px;\n    --gauge-circle-size: 72px;\n    --gauge-label-font-size-big: 22px\
;\n    --gauge-label-font-size: 14px;\n    --gauge-label-line-height-big: 26px;\n    --gauge-label-line-height: 20px;\n    --gauge-percentage-font-size-big: 34px;\n    --gauge-percentage-font-size: 26px;\n    --gauge-wrapper-width: 112px;\n    --header-padding: 16px 0 16px 0;\n    --image-preview-size: 24px;\n    --plugin-icon-size: 75%;\n    --report-font-size: 14px;\n    --report-line-height: 20px;\n    --score-icon-margin-left: 2px;\n    --score-icon-size: 10px;\n    --topbar-height: 28px;\n    --topbar-logo-size: 20px;\n  }\n}\n\n@container lh-container (max-width: 480px) {\n  .lh-vars {\n    --audit-group-margin-bottom: 20px;\n    --edge-gap-padding: var(--default-padding);\n    --env-name-min-width: 120px;\n    --gauge-circle-size-big: 96px;\n    --gauge-circle-size: 72px;\n    --gauge-label-font-size-big: 22px;\n    --gauge-label-font-size: 14px;\n    --gauge-label-line-height-big: 26px;\n    --gauge-label-line-height: 20px;\n    --gauge-percentage-font-size-big: 34px;\n    --gauge-percentage-font-size: 26px;\
\n    --gauge-wrapper-width: 112px;\n    --header-padding: 16px 0 16px 0;\n    --image-preview-size: 24px;\n    --plugin-icon-size: 75%;\n    --report-font-size: 14px;\n    --report-line-height: 20px;\n    --score-icon-margin-left: 2px;\n    --score-icon-size: 10px;\n    --topbar-height: 28px;\n    --topbar-logo-size: 20px;\n  }\n}\n\n.lh-vars.lh-devtools {\n  --audit-explanation-line-height: 14px;\n  --audit-group-margin-bottom: 20px;\n  --audit-group-padding-vertical: 12px;\n  --audit-padding-vertical: 4px;\n  --category-padding: 12px;\n  --default-padding: 12px;\n  --env-name-min-width: 120px;\n  --footer-padding-vertical: 8px;\n  --gauge-circle-size-big: 72px;\n  --gauge-circle-size: 64px;\n  --gauge-label-font-size-big: 22px;\n  --gauge-label-font-size: 14px;\n  --gauge-label-line-height-big: 26px;\n  --gauge-label-line-height: 20px;\n  --gauge-percentage-font-size-big: 34px;\n  --gauge-percentage-font-size: 26px;\n  --gauge-wrapper-width: 97px;\n  --header-line-height: 20px;\n  --header-padding: 16px 0 16px 0;\n \
 --screenshot-overlay-background: transparent;\n  --plugin-icon-size: 75%;\n  --report-font-size: 12px;\n  --report-line-height: 20px;\n  --score-icon-margin-left: 2px;\n  --score-icon-size: 10px;\n  --section-padding-vertical: 8px;\n}\n\n.lh-devtools :focus-visible {\n  outline: -webkit-focus-ring-color auto 1px;\n}\n\n.lh-container:has(.lh-sticky-header) {\n  --sticky-header-buffer: calc(var(--topbar-height) + var(--sticky-header-height));\n}\n\n.lh-container:not(.lh-topbar + .lh-container) {\n  --topbar-height: 0;\n  --sticky-header-height: 0;\n  --sticky-header-buffer: 0;\n}\n\n.lh-max-viewport {\n  display: flex;\n  flex-direction: column;\n  min-height: 100vh;\n  width: 100%;\n}\n\n.lh-devtools.lh-root {\n  height: 100%;\n}\n.lh-devtools.lh-root img {\n  /* Override devtools default \'min-width: 0\' so svg without size in a flexbox isn\'t collapsed. */\n  min-width: auto;\n}\n.lh-devtools .lh-container {\n  overflow-y: scroll;\n  height: calc(100% - var(--topbar-height));\n  /** The .lh-container is the scroll parent in D\
evTools so we exclude the topbar from the sticky header buffer. */\n  --sticky-header-buffer: 0;\n}\n.lh-devtools .lh-container:has(.lh-sticky-header) {\n  /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */\n  --sticky-header-buffer: var(--sticky-header-height);\n}\n@media print {\n  .lh-devtools .lh-container {\n    overflow: unset;\n  }\n}\n.lh-devtools .lh-sticky-header {\n  /* This is normally the height of the topbar, but we want it to stick to the top of our scroll container .lh-container\\` */\n  top: 0;\n}\n.lh-devtools .lh-element-screenshot__overlay {\n  position: absolute;\n}\n\n@keyframes fadeIn {\n  0% { opacity: 0;}\n  100% { opacity: 0.6;}\n}\n\n.lh-root *, .lh-root *::before, .lh-root *::after {\n  box-sizing: border-box;\n}\n\n.lh-root {\n  font-family: var(--report-font-family);\n  font-size: var(--report-font-size);\n  margin: 0;\n  line-height: var(--report-line-height);\n  background: var(--report-background-color);\n  color: var(--report\
-text-color);\n}\n\n.lh-root [hidden] {\n  display: none !important;\n}\n\n.lh-root pre {\n  margin: 0;\n}\n\n.lh-root pre,\n.lh-root code {\n  font-family: var(--report-font-family-monospace);\n}\n\n.lh-root details > summary {\n  cursor: pointer;\n}\n\n.lh-hidden {\n  display: none !important;\n}\n\n.lh-container {\n  /*\n  Text wrapping in the report is so much FUN!\n  We have a \\`word-break: break-word;\\` globally here to prevent a few common scenarios, namely\n  long non-breakable text (usually URLs) found in:\n    1. The footer\n    2. .lh-node (outerHTML)\n    3. .lh-code\n\n  With that sorted, the next challenge is appropriate column sizing and text wrapping inside our\n  .lh-details tables. Even more fun.\n    * We don\'t want table headers ("Est Savings (ms)") to wrap or their column values, but\n      we\'d be happy for the URL column to wrap if the URLs are particularly long.\n    * We want the narrow columns to remain narrow, providing the most column width for URL\n    * We don\'t want the table to extend past 1\
00% width.\n    * Long URLs in the URL column can wrap. Util.getURLDisplayName maxes them out at 64 characters,\n      but they do not get any overflow:ellipsis treatment.\n  */\n  word-break: break-word;\n\n  container-name: lh-container;\n  container-type: inline-size;\n}\n\n.lh-audit-group a,\n.lh-category-header__description a,\n.lh-audit__description a,\n.lh-warnings a,\n.lh-footer a,\n.lh-table-column--link a {\n  color: var(--link-color);\n}\n\n.lh-audit__description, .lh-audit__stackpack, .lh-list-section__description {\n  --inner-audit-padding-right: var(--stackpack-padding-horizontal);\n  padding-left: var(--audit-description-padding-left);\n  padding-right: var(--inner-audit-padding-right);\n  padding-top: 8px;\n  padding-bottom: 8px;\n}\n\n.lh-details {\n  margin-top: var(--default-padding);\n  margin-bottom: var(--default-padding);\n  margin-left: var(--audit-description-padding-left);\n}\n\n.lh-audit__stackpack {\n  display: flex;\n  align-items: center;\n}\n\n.lh-audit__stackpack__img {\n  max-width: 30px;\n  \
margin-right: var(--default-padding)\n}\n\n/* Report header */\n\n.lh-report-icon {\n  display: flex;\n  align-items: center;\n  padding: 10px 12px;\n  cursor: pointer;\n}\n.lh-report-icon[disabled] {\n  opacity: 0.3;\n  pointer-events: none;\n}\n\n.lh-report-icon::before {\n  content: "";\n  margin: 4px;\n  background-repeat: no-repeat;\n  width: var(--report-icon-size);\n  height: var(--report-icon-size);\n  opacity: 0.7;\n  display: inline-block;\n  vertical-align: middle;\n}\n.lh-report-icon:hover::before {\n  opacity: 1;\n}\n.lh-dark .lh-report-icon::before {\n  filter: invert(1);\n}\n.lh-report-icon--print::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/><path fill="none" d="M0 0h24v24H0z"/></svg>\');\n}\n.lh-report-icon--copy::before {\n  background-image: url(\'data:im\
age/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>\');\n}\n.lh-report-icon--open::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z"/></svg>\');\n}\n.lh-report-icon--download::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>\');\n}\n.lh-report-icon--dark::before {\n  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>\');\n}\n.lh-report-icon--treemap::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="black"><path d="M3 5v14h19V5H3zm2 2h15v4H5V7zm0 10v-4h4v4H5zm6 0v-4h9v4h-9z"/></svg>\');\n}\n\n.lh-report-icon--date::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">\
<path d="M7 11h2v2H7v-2zm14-5v14a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h1V2h2v2h8V2h2v2h1a2 2 0 012 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z"/></svg>\');\n}\n.lh-report-icon--devices::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 6h18V4H4a2 2 0 00-2 2v11H0v3h14v-3H4V6zm19 2h-6a1 1 0 00-1 1v10c0 .6.5 1 1 1h6c.6 0 1-.5 1-1V9c0-.6-.5-1-1-1zm-1 9h-4v-7h4v7z"/></svg>\');\n}\n.lh-report-icon--world::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm7 6h-3c-.3-1.3-.8-2.5-1.4-3.6A8 8 0 0 1 18.9 8zm-7-4a14 14 0 0 1 2 4h-4a14 14 0 0 1 2-4zM4.3 14a8.2 8.2 0 0 1 0-4h3.3a16.5 16.5 0 0 0 0 4H4.3zm.8 2h3a14 14 0 0 0 1.3 3.6A8 8 0 0 1 5.1 16zm3-8H5a8 8 0 0 1 4.3-3.6L8 8zM12 20a14 14 0 0 1-2-4h4a14 14 0 0 1-2 4zm2.3-6H9.7a14.7 14.7 0 0 1 0-4h4.6a14.6 14.6 0 0 1 0 4zm.3 5.6c.6-1.2\
 1-2.4 1.4-3.6h3a8 8 0 0 1-4.4 3.6zm1.8-5.6a16.5 16.5 0 0 0 0-4h3.3a8.2 8.2 0 0 1 0 4h-3.3z"/></svg>\');\n}\n.lh-report-icon--stopwatch::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.1-6.6L20.5 6l-1.4-1.4L17.7 6A9 9 0 0 0 3 13a9 9 0 1 0 16-5.6zm-7 12.6a7 7 0 1 1 0-14 7 7 0 0 1 0 14z"/></svg>\');\n}\n.lh-report-icon--networkspeed::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.9 5c-.2 0-.3 0-.4.2v.2L10.1 17a2 2 0 0 0-.2 1 2 2 0 0 0 4 .4l2.4-12.9c0-.3-.2-.5-.5-.5zM1 9l2 2c2.9-2.9 6.8-4 10.5-3.6l1.2-2.7C10 3.8 4.7 5.3 1 9zm20 2 2-2a15.4 15.4 0 0 0-5.6-3.6L17 8.2c1.5.7 2.9 1.6 4.1 2.8zm-4 4 2-2a9.9 9.9 0 0 0-2.7-1.9l-.5 3 1.2.9zM5 13l2 2a7.1 7.1 0 0 1 4-2l1.3-2.9C9.7 10.1 7 11 5 13z"/></svg>\');\n}\n.lh-report-icon--samples-one::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http:/\
/www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="7" cy="14" r="3"/><path d="M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>\');\n}\n.lh-report-icon--samples-many::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/><circle cx="7" cy="14" r="3"/><circle cx="11" cy="6" r="3"/></svg>\');\n}\n.lh-report-icon--chrome::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50 -50 562 562"><path d="M256 25.6v25.6a\
204 204 0 0 1 144.8 60 204 204 0 0 1 60 144.8 204 204 0 0 1-60 144.8 204 204 0 0 1-144.8 60 204 204 0 0 1-144.8-60 204 204 0 0 1-60-144.8 204 204 0 0 1 60-144.8 204 204 0 0 1 144.8-60V0a256 256 0 1 0 0 512 256 256 0 0 0 0-512v25.6z"/><path d="M256 179.2v25.6a51.3 51.3 0 0 1 0 102.4 51.3 51.3 0 0 1 0-102.4v-51.2a102.3 102.3 0 1 0-.1 204.7 102.3 102.3 0 0 0 .1-204.7v25.6z"/><path d="M256 204.8h217.6a25.6 25.6 0 0 0 0-51.2H256a25.6 25.6 0 0 0 0 51.2m44.3 76.8L191.5 470.1a25.6 25.6 0 1 0 44.4 25.6l108.8-188.5a25.6 25.6 0 1 0-44.4-25.6m-88.6 0L102.9 93.2a25.7 25.7 0 0 0-35-9.4 25.7 25.7 0 0 0-9.4 35l108.8 188.5a25.7 25.7 0 0 0 35 9.4 25.9 25.9 0 0 0 9.4-35.1"/></svg>\');\n}\n.lh-report-icon--external::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><path d="M3.15 11.9a1.01 1.01 0 0 1-.743-.307 1.01 1.01 0 0 1-.306-.743v-7.7c0-.292.102-.54.306-.744a1.01 1.01 0 0 1 .744-.306H7v1.05H3.15v7.7h7.7V7h1.05v3.85c0 .291-.103.54-.307.743a1.01 1.01 0 0 1-\
.743.307h-7.7Zm2.494-2.8-.743-.744 5.206-5.206H8.401V2.1h3.5v3.5h-1.05V3.893L5.644 9.1Z"/></svg>\');\n}\n.lh-report-icon--experiment::before {\n  background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path d="M4.50002 17C3.86136 17 3.40302 16.7187 3.12502 16.156C2.84702 15.5933 2.90936 15.069 3.31202 14.583L7.50002 9.5V4.5H6.75002C6.54202 4.5 6.36502 4.427 6.21902 4.281C6.07302 4.135 6.00002 3.958 6.00002 3.75C6.00002 3.542 6.07302 3.365 6.21902 3.219C6.36502 3.073 6.54202 3 6.75002 3H13.25C13.458 3 13.635 3.073 13.781 3.219C13.927 3.365 14 3.542 14 3.75C14 3.958 13.927 4.135 13.781 4.281C13.635 4.427 13.458 4.5 13.25 4.5H12.5V9.5L16.688 14.583C17.0767 15.069 17.132 15.5933 16.854 16.156C16.5767 16.7187 16.1254 17 15.5 17H4.50002ZM4.50002 15.5H15.5L11 10V4.5H9.00002V10L4.50002 15.5Z" fill="black"/></svg>\');\n}\n\n/** These are still icons, but w/o the auto-color invert / opacity / etc. that come with .lh-report-icon */\n\n.lh-repo\
rt-plain-icon {\n  display: flex;\n  align-items: center;\n}\n.lh-report-plain-icon::before {\n  content: "";\n  background-repeat: no-repeat;\n  width: var(--report-icon-size);\n  height: var(--report-icon-size);\n  display: inline-block;\n  margin-right: 5px;\n}\n\n.lh-report-plain-icon--checklist-pass::before {\n  --icon-url: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M8.938 13L13.896 8.062L12.833 7L8.938 10.875L7.167 9.125L6.104 10.188L8.938 13ZM10 18C8.90267 18 7.868 17.7917 6.896 17.375C5.924 16.9583 5.07333 16.3853 4.344 15.656C3.61467 14.9267 3.04167 14.076 2.625 13.104C2.20833 12.132 2 11.0973 2 10C2 8.88867 2.20833 7.85033 2.625 6.885C3.04167 5.92033 3.61467 5.07333 4.344 4.344C5.07333 3.61467 5.924 3.04167 6.896 2.625C7.868 2.20833 8.90267 2 10 2C11.1113 2 12.1497 2.20833 13.115 2.625C14.0797 3.04167 14.9267 3.61467 15.656 4.344C16.3853 5.07333 16.9583 5.92033 17.375 6.885C17.7917 7.85033 18 8.88867 18 10C18 11.0973 17.7917 12.132 17.\
375 13.104C16.9583 14.076 16.3853 14.9267 15.656 15.656C14.9267 16.3853 14.0797 16.9583 13.115 17.375C12.1497 17.7917 11.1113 18 10 18ZM10 16.5C11.8053 16.5 13.34 15.868 14.604 14.604C15.868 13.34 16.5 11.8053 16.5 10C16.5 8.19467 15.868 6.66 14.604 5.396C13.34 4.132 11.8053 3.5 10 3.5C8.19467 3.5 6.66 4.132 5.396 5.396C4.132 6.66 3.5 8.19467 3.5 10C3.5 11.8053 4.132 13.34 5.396 14.604C6.66 15.868 8.19467 16.5 10 16.5Z" fill="black"/></svg>\');\n  background-color: var(--color-pass);\n  mask: var(--icon-url) center / contain no-repeat;\n}\n.lh-report-plain-icon--checklist-fail::before {\n  --icon-url: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5 10C17.5 14.1421 14.1421 17.5 10 17.5C5.85786 17.5 2.5 14.1421 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5C14.1421 2.5 17.5 5.85786 17.5 10ZM16 10C16 13.3137 13.3137 16 10 16C8.6135 16 7.33683 15.5297 6.32083 14.7399L14.7399 6.32083C15.5297 7.33683 16 8.6135 1\
6 10ZM5.26016 13.6793L13.6793 5.26016C12.6633 4.47033 11.3866 4 10 4C6.68629 4 4 6.68629 4 10C4 11.3866 4.47033 12.6633 5.26016 13.6793Z" fill="black"/></svg>\');\n  background-color: var(--color-fail);\n  mask: var(--icon-url) center / contain no-repeat;\n}\n\n.lh-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  margin: var(--default-padding) 0;\n}\n.lh-button {\n  height: 32px;\n  border: 1px solid var(--report-border-color-secondary);\n  border-radius: 3px;\n  color: var(--link-color);\n  background-color: var(--report-background-color);\n  margin: 5px;\n}\n\n.lh-button:first-of-type {\n  margin-left: 0;\n}\n\n/* Node */\n.lh-node {\n  display: flow-root;\n}\n\n.lh-node__snippet {\n  font-family: var(--report-font-family-monospace);\n  color: var(--snippet-color);\n  font-size: var(--report-monospace-font-size);\n  line-height: 20px;\n}\n\n.lh-checklist {\n  list-style: none;\n  padding: 0;\n}\n\n.lh-checklist-item {\n  margin: 10px 0 10px 0;\n}\n\n/* Baseline Status */\n.lh-baseline-status {\n  display: flex;\n  align-items: c\
enter;\n}\n.lh-baseline-status::before {\n  content: "";\n  display: inline-block;\n  width: 18px;\n  height: 10px;\n  margin-right: 6px;\n  background-repeat: no-repeat;\n  background-size: contain;\n}\n.lh-baseline-status--high::before {\n  background-image: var(--baseline-high-icon-url);\n}\n.lh-baseline-status--low::before {\n  background-image: var(--baseline-low-icon-url);\n}\n.lh-baseline-status--limited::before {\n  background-image: var(--baseline-limited-icon-url);\n}\n\n/* Score */\n\n.lh-audit__score-icon {\n  width: var(--score-icon-size);\n  height: var(--score-icon-size);\n  margin: var(--score-icon-margin);\n}\n\n.lh-audit--pass .lh-audit__display-text {\n  color: var(--color-pass-secondary);\n}\n.lh-audit--pass .lh-audit__score-icon,\n.lh-scorescale-range--pass::before {\n  border-radius: 100%;\n  background: var(--color-pass);\n}\n\n.lh-audit--average .lh-audit__display-text {\n  color: var(--color-average-secondary);\n}\n.lh-audit--average .lh-audit__score-icon,\n.lh-scorescale-range--average::before {\n  bac\
kground: var(--color-average);\n  width: var(--icon-square-size);\n  height: var(--icon-square-size);\n}\n\n.lh-audit--fail .lh-audit__display-text {\n  color: var(--color-fail-secondary);\n}\n.lh-audit--fail .lh-audit__score-icon,\n.lh-audit--error .lh-audit__score-icon,\n.lh-scorescale-range--fail::before {\n  border-left: calc(var(--score-icon-size) / 2) solid transparent;\n  border-right: calc(var(--score-icon-size) / 2) solid transparent;\n  border-bottom: var(--score-icon-size) solid var(--color-fail);\n}\n\n.lh-audit--error .lh-audit__score-icon,\n.lh-metric--error .lh-metric__icon {\n  background-image: var(--error-icon-url);\n  background-repeat: no-repeat;\n  background-position: center;\n  border: none;\n}\n\n.lh-gauge__wrapper--fail .lh-gauge--error {\n  background-image: var(--error-icon-url);\n  background-repeat: no-repeat;\n  background-position: center;\n  transform: scale(0.5);\n  top: var(--score-container-padding);\n}\n\n.lh-audit--manual .lh-audit__display-text,\n.lh-audit--notapplicable .lh-audit\
__display-text {\n  color: var(--color-gray-600);\n}\n.lh-audit--manual .lh-audit__score-icon,\n.lh-audit--notapplicable .lh-audit__score-icon {\n  border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);\n  border-radius: 100%;\n  background: none;\n}\n\n.lh-audit--informative .lh-audit__display-text {\n  color: var(--color-gray-600);\n}\n\n.lh-audit--informative .lh-audit__score-icon {\n  border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);\n  border-radius: 100%;\n}\n\n.lh-audit__description,\n.lh-audit__stackpack {\n  color: var(--report-text-color-secondary);\n}\n.lh-audit__adorn {\n  border: 1px solid var(--color-gray-500);\n  border-radius: 3px;\n  margin: 0 3px;\n  padding: 0 2px;\n  line-height: 1.1;\n  display: inline-block;\n  font-size: 90%;\n  color: var(--report-text-color-secondary);\n}\n\n.lh-category-header__description  {\n  text-align: center;\n  color: var(--color-gray-700);\n  margin: 0px auto;\n  max-width: 400px;\n}\n\n\n.lh-audit__display-text,\n.lh-chevron-container {\n \
 margin: 0 var(--audit-margin-horizontal);\n}\n.lh-chevron-container {\n  margin-right: 0;\n}\n\n.lh-audit__title-and-text {\n  flex: 1;\n}\n\n.lh-audit__title-and-text code {\n  color: var(--snippet-color);\n  font-size: var(--report-monospace-font-size);\n}\n\n/* Prepend display text with em dash separator. */\n.lh-audit__display-text:not(:empty):before {\n  content: \'\\u2014\';\n  margin-right: var(--audit-margin-horizontal);\n}\n\n/* Expandable Details (Audit Groups, Audits) */\n.lh-audit__header {\n  display: flex;\n  align-items: center;\n  padding: var(--default-padding);\n}\n\n\n.lh-metricfilter {\n  display: grid;\n  justify-content: end;\n  align-items: center;\n  grid-auto-flow: column;\n  gap: 4px;\n  color: var(--color-gray-700);\n}\n\n.lh-metricfilter__radio {\n  /*\n   * Instead of hiding, position offscreen so it\'s still accessible to screen readers\n   * https://bugs.chromium.org/p/chromium/issues/detail?id=1439785\n   */\n  position: fixed;\n  left: -9999px;\n}\n.lh-metricfilter input[type=\'radio\']:focus-visible + \
label {\n  outline: -webkit-focus-ring-color auto 1px;\n}\n\n.lh-metricfilter__label {\n  display: inline-flex;\n  padding: 0 4px;\n  height: 16px;\n  text-decoration: underline;\n  align-items: center;\n  cursor: pointer;\n  font-size: 90%;\n}\n\n.lh-metricfilter__label--active {\n  background: var(--color-blue-primary);\n  color: var(--color-white);\n  border-radius: 3px;\n  text-decoration: none;\n}\n/* Give the \'All\' choice a more muted display */\n.lh-metricfilter__label--active[for="metric-All"] {\n  background-color: var(--color-blue-200) !important;\n  color: black !important;\n}\n\n.lh-metricfilter__text {\n  margin-right: 8px;\n}\n\n/* If audits are filtered, hide the itemcount for Passed Audits\\u2026 */\n.lh-category--filtered .lh-audit-group .lh-audit-group__itemcount {\n  display: none;\n}\n\n\n.lh-audit__header:hover {\n  background-color: var(--color-hover);\n}\n\n/* We want to hide the browser\'s default arrow marker on summary elements. Admittedly, it\'s complicated. */\n.lh-root details > summary {\n  /* Blink \
89+ and Firefox will hide the arrow when display is changed from (new) default of \\`list-item\\` to block.  https://chromestatus.com/feature/6730096436051968*/\n  display: block;\n}\n/* Safari and Blink <=88 require using the -webkit-details-marker selector */\n.lh-root details > summary::-webkit-details-marker {\n  display: none;\n}\n\n/* Perf Metric */\n\n.lh-metrics-container {\n  display: grid;\n  grid-auto-rows: 1fr;\n  grid-template-columns: 1fr 1fr;\n  grid-column-gap: var(--report-line-height);\n  margin-bottom: var(--default-padding);\n}\n\n.lh-metric {\n  border-top: 1px solid var(--report-border-color-secondary);\n}\n\n.lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(-n+2) {\n  border-bottom: 1px solid var(--report-border-color-secondary);\n}\n\n.lh-metric__innerwrap {\n  display: grid;\n  /**\n   * Icon -- Metric Name\n   *      -- Metric Value\n   */\n  grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 1fr;\n  align-items: cent\
er;\n  padding: var(--default-padding);\n}\n\n.lh-metric__details {\n  order: -1;\n}\n\n.lh-metric__title {\n  flex: 1;\n}\n\n.lh-calclink {\n  padding-left: calc(1ex / 3);\n}\n\n.lh-metric__description {\n  display: none;\n  grid-column-start: 2;\n  grid-column-end: 4;\n  color: var(--report-text-color-secondary);\n}\n\n.lh-metric__value {\n  font-size: var(--metric-value-font-size);\n  margin: calc(var(--default-padding) / 2) 0;\n  white-space: nowrap; /* No wrapping between metric value and the icon */\n  grid-column-start: 2;\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 535px) {\n  .lh-metrics-container {\n    display: block;\n  }\n\n  .lh-metric {\n    border-bottom: none !important;\n  }\n  .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {\n    border-bottom: 1\
px solid var(--report-border-color-secondary) !important;\n  }\n\n  /* Change the grid to 3 columns for narrow viewport. */\n  .lh-metric__innerwrap {\n  /**\n   * Icon -- Metric Name -- Metric Value\n   */\n    grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;\n  }\n  .lh-metric__value {\n    justify-self: end;\n    grid-column-start: unset;\n  }\n}\n\n@container lh-container (max-width: 535px) {\n  .lh-metrics-container {\n    display: block;\n  }\n\n  .lh-metric {\n    border-bottom: none !important;\n  }\n  .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {\n    border-bottom: 1px solid var(--report-border-color-secondary) !important;\n  }\n\n  /* Change the grid to 3 columns for narrow viewport. */\n  .lh-metric__innerwrap {\n  /**\n   * Icon -- Metric Name -- Metric Value\n   */\n    grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;\n  }\n  .lh-metr\
ic__value {\n    justify-self: end;\n    grid-column-start: unset;\n  }\n}\n\n/* No-JS toggle switch */\n/* Keep this selector sync\'d w/ \\`magicSelector\\` in report-ui-features-test.js */\n .lh-metrics-toggle__input:checked ~ .lh-metrics-container .lh-metric__description {\n  display: block;\n}\n\n/* TODO get rid of the SVGS and clean up these some more */\n.lh-metrics-toggle__input {\n  opacity: 0;\n  position: absolute;\n  right: 0;\n  top: 0px;\n}\n\n.lh-metrics-toggle__input + div > label > .lh-metrics-toggle__labeltext--hide,\n.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--show {\n  display: none;\n}\n.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--hide {\n  display: inline;\n}\n.lh-metrics-toggle__input:focus + div > label {\n  outline: -webkit-focus-ring-color auto 3px;\n}\n\n.lh-metrics-toggle__label {\n  cursor: pointer;\n  font-size: var(--report-font-size-secondary);\n  line-height: var(--report-line-height-secondary);\n  color: var(--color-gr\
ay-700);\n}\n\n/* Pushes the metric description toggle button to the right. */\n.lh-audit-group--metrics .lh-audit-group__header {\n  display: flex;\n  justify-content: space-between;\n}\n\n.lh-metric__icon,\n.lh-scorescale-range::before {\n  content: \'\';\n  width: var(--score-icon-size);\n  height: var(--score-icon-size);\n  display: inline-block;\n  margin: var(--score-icon-margin);\n}\n\n.lh-metric--pass .lh-metric__value {\n  color: var(--color-pass-secondary);\n}\n.lh-metric--pass .lh-metric__icon {\n  border-radius: 100%;\n  background: var(--color-pass);\n}\n\n.lh-metric--average .lh-metric__value {\n  color: var(--color-average-secondary);\n}\n.lh-metric--average .lh-metric__icon {\n  background: var(--color-average);\n  width: var(--icon-square-size);\n  height: var(--icon-square-size);\n}\n\n.lh-metric--fail .lh-metric__value {\n  color: var(--color-fail-secondary);\n}\n.lh-metric--fail .lh-metric__icon {\n  border-left: calc(var(--score-icon-size) / 2) solid transparent;\n  border-right: calc(var(--score-icon-size\
) / 2) solid transparent;\n  border-bottom: var(--score-icon-size) solid var(--color-fail);\n}\n\n.lh-metric--error .lh-metric__value,\n.lh-metric--error .lh-metric__description {\n  color: var(--color-fail-secondary);\n}\n\n/* Filmstrip */\n\n.lh-filmstrip-container {\n  /* smaller gap between metrics and filmstrip */\n  margin: -8px auto 0 auto;\n}\n\n.lh-filmstrip {\n  display: flex;\n  justify-content: space-between;\n  justify-items: center;\n  margin-bottom: var(--default-padding);\n  width: 100%;\n}\n\n.lh-filmstrip__frame {\n  overflow: hidden;\n  line-height: 0;\n}\n\n.lh-filmstrip__thumbnail {\n  border: 1px solid var(--report-border-color-secondary);\n  max-height: 150px;\n  max-width: 120px;\n}\n\n.lh-dark .lh-perf-toggle-text {\n  color: rgba(30, 164, 70, 1);\n}\n\n.lh-perf-toggle-text a {\n  color: var(--link-color);\n}\n\n/* Audit */\n\n.lh-audit {\n  border-bottom: 1px solid var(--report-border-color-secondary);\n}\n\n/* Apply border-top to just the first audit. */\n.lh-audit {\n  border-top: 1px solid var(--report-bord\
er-color-secondary);\n}\n.lh-audit ~ .lh-audit {\n  border-top: none;\n}\n\n\n.lh-audit--error .lh-audit__display-text {\n  color: var(--color-fail-secondary);\n}\n\n/* Audit Group */\n\n.lh-audit-group {\n  margin-bottom: var(--audit-group-margin-bottom);\n  position: relative;\n}\n.lh-audit-group--metrics {\n  margin-bottom: calc(var(--audit-group-margin-bottom) / 2);\n}\n\n.lh-audit-group--metrics .lh-audit-group__summary {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.lh-audit-group__summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.lh-audit-group__header .lh-chevron {\n  margin-top: calc((var(--report-line-height) - 5px) / 2);\n}\n\n.lh-audit-group__header {\n  letter-spacing: 0.8px;\n  padding: var(--default-padding);\n  padding-left: 0;\n}\n\n.lh-audit-group__header, .lh-audit-group__summary {\n  font-size: var(--report-font-size-secondary);\n  line-height: var(--report-line-height-secondary);\n  color: var(--color-gray-700);\n}\n\n.lh-audit-group__title {\n  text-transform: uppercas\
e;\n  font-weight: 500;\n}\n\n.lh-audit-group__itemcount {\n  color: var(--color-gray-600);\n}\n\n.lh-audit-group__footer {\n  color: var(--color-gray-600);\n  display: block;\n  margin-top: var(--default-padding);\n}\n\n.lh-details,\n.lh-category-header__description,\n.lh-audit-group__footer {\n  font-size: var(--report-font-size-secondary);\n  line-height: var(--report-line-height-secondary);\n}\n\n.lh-audit-explanation {\n  margin: var(--audit-padding-vertical) 0 calc(var(--audit-padding-vertical) / 2) var(--audit-margin-horizontal);\n  line-height: var(--audit-explanation-line-height);\n  display: inline-block;\n}\n\n.lh-audit--fail .lh-audit-explanation {\n  color: var(--color-fail-secondary);\n}\n\n/* Report */\n.lh-list {\n  margin-right: calc(var(--default-padding) * 2);\n}\n.lh-list > :not(:last-child) {\n  margin-bottom: calc(var(--default-padding) * 2);\n  border-bottom: 1px solid #A8C7FA;\n}\n.lh-list-section {\n  padding: calc(var(--default-padding) * 2) 0;\n}\n.lh-list-section__title {\n  text-decoration: underlin\
e;\n}\n\n.lh-header-container {\n  display: block;\n  margin: 0 auto;\n  position: relative;\n  word-wrap: break-word;\n}\n\n.lh-header-container .lh-scores-wrapper {\n  border-bottom: 1px solid var(--color-gray-200);\n}\n\n\n.lh-report {\n  min-width: var(--report-content-min-width);\n}\n\n.lh-exception {\n  font-size: large;\n}\n\n.lh-code {\n  white-space: normal;\n  margin-top: 0;\n  font-size: var(--report-monospace-font-size);\n}\n\n.lh-warnings {\n  --item-margin: calc(var(--report-line-height) / 6);\n  color: var(--color-average-secondary);\n  margin: var(--audit-padding-vertical) 0;\n  padding: var(--default-padding)\n    var(--default-padding)\n    var(--default-padding)\n    calc(var(--audit-description-padding-left));\n  background-color: var(--toplevel-warning-background-color);\n}\n.lh-warnings span {\n  font-weight: bold;\n}\n\n.lh-warnings--toplevel {\n  --item-margin: calc(var(--header-line-height) / 4);\n  color: var(--toplevel-warning-text-color);\n  margin-left: auto;\n  margin-right: auto;\n  max-width: var(--re\
port-content-max-width-minus-edge-gap);\n  padding: var(--toplevel-warning-padding);\n  border-radius: 8px;\n}\n\n.lh-warnings__msg {\n  color: var(--toplevel-warning-message-text-color);\n  margin: 0;\n}\n\n.lh-warnings ul {\n  margin: 0;\n}\n.lh-warnings li {\n  margin: var(--item-margin) 0;\n}\n.lh-warnings li:last-of-type {\n  margin-bottom: 0;\n}\n\n.lh-scores-header {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n}\n.lh-scores-header__solo {\n  padding: 0;\n  border: 0;\n}\n\n/* Gauge */\n\n.lh-gauge__wrapper--pass {\n  color: var(--color-pass-secondary);\n  fill: var(--color-pass);\n  stroke: var(--color-pass);\n}\n\n.lh-gauge__wrapper--average {\n  color: var(--color-average-secondary);\n  fill: var(--color-average);\n  stroke: var(--color-average);\n}\n\n.lh-gauge__wrapper--fail {\n  color: var(--color-fail-secondary);\n  fill: var(--color-fail);\n  stroke: var(--color-fail);\n}\n\n.lh-gauge__wrapper--not-applicable {\n  color: var(--color-not-applicable);\n  fill: var(--color-not-applicable);\n  stroke: var\
(--color-not-applicable);\n}\n\n.lh-fraction__wrapper .lh-fraction__content::before {\n  content: \'\';\n  height: var(--score-icon-size);\n  width: var(--score-icon-size);\n  margin: var(--score-icon-margin);\n  display: inline-block;\n}\n.lh-fraction__wrapper--pass .lh-fraction__content {\n  color: var(--color-pass-secondary);\n}\n.lh-fraction__wrapper--pass .lh-fraction__background {\n  background-color: var(--color-pass);\n}\n.lh-fraction__wrapper--pass .lh-fraction__content::before {\n  background-color: var(--color-pass);\n  border-radius: 50%;\n}\n.lh-fraction__wrapper--average .lh-fraction__content {\n  color: var(--color-average-secondary);\n}\n.lh-fraction__wrapper--average .lh-fraction__background,\n.lh-fraction__wrapper--average .lh-fraction__content::before {\n  background-color: var(--color-average);\n}\n.lh-fraction__wrapper--fail .lh-fraction__content {\n  color: var(--color-fail);\n}\n.lh-fraction__wrapper--fail .lh-fraction__background {\n  background-color: var(--color-fail);\n}\n.lh-fraction__wrapper\
--fail .lh-fraction__content::before {\n  border-left: calc(var(--score-icon-size) / 2) solid transparent;\n  border-right: calc(var(--score-icon-size) / 2) solid transparent;\n  border-bottom: var(--score-icon-size) solid var(--color-fail);\n}\n.lh-fraction__wrapper--null .lh-fraction__content {\n  color: var(--color-gray-700);\n}\n.lh-fraction__wrapper--null .lh-fraction__background {\n  background-color: var(--color-gray-700);\n}\n.lh-fraction__wrapper--null .lh-fraction__content::before {\n  border-radius: 50%;\n  border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-700);\n}\n\n.lh-fraction__background {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  border-radius: calc(var(--gauge-circle-size) / 2);\n  opacity: 0.1;\n  z-index: -1;\n}\n\n.lh-fraction__content-wrapper {\n  height: var(--gauge-circle-size);\n  display: flex;\n  align-items: center;\n}\n\n.lh-fraction__content {\n  display: flex;\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(0.3 *\
 var(--gauge-circle-size));\n  line-height: calc(0.4 * var(--gauge-circle-size));\n  width: max-content;\n  min-width: calc(1.5 * var(--gauge-circle-size));\n  padding: calc(0.1 * var(--gauge-circle-size)) calc(0.2 * var(--gauge-circle-size));\n  --score-icon-size: calc(0.21 * var(--gauge-circle-size));\n  --score-icon-margin: 0 calc(0.15 * var(--gauge-circle-size)) 0 0;\n}\n\n.lh-gauge {\n  stroke-linecap: round;\n  width: var(--gauge-circle-size);\n  height: var(--gauge-circle-size);\n}\n\n.lh-category .lh-gauge {\n  --gauge-circle-size: var(--gauge-circle-size-big);\n}\n\n.lh-gauge-base {\n  opacity: 0.1;\n}\n\n.lh-gauge-arc {\n  fill: none;\n  transform-origin: 50% 50%;\n  animation: load-gauge var(--transition-length) ease both;\n  animation-delay: 250ms;\n}\n\n.lh-gauge__svg-wrapper {\n  position: relative;\n  height: var(--gauge-circle-size);\n}\n.lh-category .lh-gauge__svg-wrapper,\n.lh-category .lh-fraction__wrapper {\n  --gauge-circle-size: var(--gauge-circle-size-big);\n}\n\n/* The plugin badge overlay */\n.lh-gau\
ge__wrapper--plugin .lh-gauge__svg-wrapper::before {\n  width: var(--plugin-badge-size);\n  height: var(--plugin-badge-size);\n  background-color: var(--plugin-badge-background-color);\n  background-image: var(--plugin-icon-url);\n  background-repeat: no-repeat;\n  background-size: var(--plugin-icon-size);\n  background-position: 58% 50%;\n  content: "";\n  position: absolute;\n  right: -6px;\n  bottom: 0px;\n  display: block;\n  z-index: 100;\n  box-shadow: 0 0 4px rgba(0,0,0,.2);\n  border-radius: 25%;\n}\n.lh-category .lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {\n  width: var(--plugin-badge-size-big);\n  height: var(--plugin-badge-size-big);\n}\n\n@keyframes load-gauge {\n  from { stroke-dasharray: 0 352; }\n}\n\n.lh-gauge__percentage {\n  width: 100%;\n  height: var(--gauge-circle-size);\n  line-height: var(--gauge-circle-size);\n  position: absolute;\n  font-family: var(--report-font-family-monospace);\n  font-size: calc(var(--gauge-circle-size) * 0.34 + 1.3px);\n  text-align: center;\n  top: var(--\
score-container-padding);\n}\n\n.lh-category .lh-gauge__percentage {\n  --gauge-circle-size: var(--gauge-circle-size-big);\n  --gauge-percentage-font-size: var(--gauge-percentage-font-size-big);\n}\n\n.lh-gauge__wrapper,\n.lh-fraction__wrapper {\n  position: relative;\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  text-decoration: none;\n  padding: var(--score-container-padding);\n\n  --transition-length: 1s;\n\n  /* Contain the layout style paint & layers during animation*/\n  contain: content;\n  will-change: opacity; /* Only using for layer promotion */\n}\n\n.lh-gauge__label,\n.lh-fraction__label {\n  font-size: var(--gauge-label-font-size);\n  font-weight: 500;\n  line-height: var(--gauge-label-line-height);\n  margin-top: 10px;\n  text-align: center;\n  color: var(--report-text-color);\n  word-break: keep-all;\n}\n\n/* TODO(#8185) use more BEM (.lh-gauge__label--big) instead of relying on descendant selector */\n.lh-category .lh-gauge__label,\n.lh-category .lh-fraction__label {\n  --gauge-lab\
el-font-size: var(--gauge-label-font-size-big);\n  --gauge-label-line-height: var(--gauge-label-line-height-big);\n  margin-top: 14px;\n}\n\n.lh-scores-header .lh-gauge__wrapper,\n.lh-scores-header .lh-fraction__wrapper,\n.lh-sticky-header .lh-gauge__wrapper,\n.lh-sticky-header .lh-fraction__wrapper {\n  width: var(--gauge-wrapper-width);\n}\n\n.lh-scorescale {\n  display: inline-flex;\n\n  gap: calc(var(--default-padding) * 4);\n  margin: 16px auto 0 auto;\n  font-size: var(--report-font-size-secondary);\n  color: var(--color-gray-700);\n\n}\n\n.lh-scorescale-range {\n  display: flex;\n  align-items: center;\n  font-family: var(--report-font-family-monospace);\n  white-space: nowrap;\n}\n\n.lh-category-header__finalscreenshot .lh-scorescale {\n  border: 0;\n  display: flex;\n  justify-content: center;\n}\n\n.lh-category-header__finalscreenshot .lh-scorescale-range {\n  font-family: unset;\n  font-size: 12px;\n}\n\n.lh-scorescale-wrap {\n  display: contents;\n}\n\n/* Hide category score gauages if it\'s a single category report *\
/\n.lh-header--solo-category .lh-scores-wrapper {\n  display: none;\n}\n\n\n.lh-categories {\n  width: 100%;\n}\n\n.lh-category {\n  padding: var(--category-padding);\n  max-width: var(--report-content-max-width);\n  margin: 0 auto;\n\n  scroll-margin-top: calc(var(--sticky-header-buffer) - 1em);\n}\n\n.lh-category-wrapper {\n  border-bottom: 1px solid var(--color-gray-200);\n}\n.lh-category-wrapper:last-of-type {\n  border-bottom: 0;\n}\n\n.lh-category-header {\n  margin-bottom: var(--section-padding-vertical);\n}\n\n.lh-category-header .lh-score__gauge {\n  max-width: 400px;\n  width: auto;\n  margin: 0px auto;\n}\n\n.lh-category-header__finalscreenshot {\n  display: grid;\n  grid-template: none / 1fr 1px 1fr;\n  justify-items: center;\n  align-items: center;\n  gap: var(--report-line-height);\n  min-height: 288px;\n  margin-bottom: var(--default-padding);\n}\n\n.lh-final-ss-image {\n  /* constrain the size of the image to not be too large */\n  max-height: calc(var(--gauge-circle-size-big) * 2.8);\n  max-width: calc(var(--gauge-c\
ircle-size-big) * 3.5);\n  border: 1px solid var(--color-gray-200);\n  padding: 4px;\n  border-radius: 3px;\n  display: block;\n}\n\n.lh-category-headercol--separator {\n  background: var(--color-gray-200);\n  width: 1px;\n  height: var(--gauge-circle-size-big);\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 780px) {\n  .lh-category-header__finalscreenshot {\n    grid-template: 1fr 1fr / none\n  }\n  .lh-category-headercol--separator {\n    display: none;\n  }\n}\n\n@container lh-container (max-width: 780px) {\n  .lh-category-header__finalscreenshot {\n    grid-template: 1fr 1fr / none\n  }\n  .lh-category-headercol--separator {\n    display: none;\n  }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove thi\
s media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 964px) {\n  .lh-report {\n    margin-left: 0;\n    width: 100%;\n  }\n}\n\n/* 964 fits the min-width of the filmstrip */\n@container lh-container (max-width: 964px) {\n  .lh-report {\n    margin-left: 0;\n    width: 100%;\n  }\n}\n\n@media print {\n  body {\n    -webkit-print-color-adjust: exact; /* print background colors */\n  }\n  .lh-container {\n    display: block;\n  }\n  .lh-report {\n    margin-left: 0;\n    padding-top: 0;\n  }\n  .lh-categories {\n    margin-top: 0;\n  }\n  .lh-buttons, .lh-highlighter {\n    /* hide stickyheader marker when printing. crbug.com/41486992 */\n    display: none;\n  }\n}\n\n.lh-table {\n  position: relative;\n  border-collapse: separate;\n  border-spacing: 0;\n  /* Can\'t assign padding to table, so shorten the width instead. */\n  width: calc(100% - var(--audit-description-padding-left) - var(--stackpack-padding-horizontal))\
;\n  border: 1px solid var(--report-border-color-secondary);\n}\n\n.lh-table thead th {\n  position: sticky;\n  top: var(--sticky-header-buffer);\n  z-index: 1;\n  background-color: var(--report-background-color);\n  border-bottom: 1px solid var(--report-border-color-secondary);\n  font-weight: normal;\n  color: var(--color-gray-600);\n  /* See text-wrapping comment on .lh-container. */\n  word-break: normal;\n}\n\n.lh-row--group {\n  background-color: var(--table-group-header-background-color);\n}\n\n.lh-row--group td {\n  font-weight: bold;\n  font-size: 1.05em;\n  color: var(--table-group-header-text-color);\n}\n\n.lh-row--group td:first-child {\n  display: block;\n  min-width: max-content;\n  font-weight: normal;\n}\n\n.lh-row--group .lh-text {\n  color: inherit;\n  text-decoration: none;\n  display: inline-block;\n}\n\n.lh-row--group a.lh-link:hover {\n  text-decoration: underline;\n}\n\n.lh-row--group .lh-audit__adorn {\n  text-transform: capitalize;\n  font-weight: normal;\n  padding: 2px 3px 1px 3px;\n}\n\n.lh-row--group .lh\
-audit__adorn1p {\n  color: var(--link-color);\n  border-color: var(--link-color);\n}\n\n.lh-row--group .lh-report-icon--external::before {\n  content: "";\n  background-repeat: no-repeat;\n  width: 14px;\n  height: 16px;\n  opacity: 0.7;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.lh-row--group .lh-report-icon--external {\n  visibility: hidden;\n}\n\n.lh-row--group:hover .lh-report-icon--external {\n  visibility: visible;\n}\n\n.lh-dark .lh-report-icon--external::before {\n  filter: invert(1);\n}\n\n/** Manages indentation of two-level and three-level nested adjacent rows */\n\n.lh-row--group ~ [data-entity]:not(.lh-row--group) td:first-child {\n  padding-left: 20px;\n}\n\n.lh-row--group ~ [data-entity]:not(.lh-row--group) ~ .lh-sub-item-row td:first-child {\n  margin-left: 20px;\n  padding-left: 10px;\n  border-left: 1px solid #A8C7FA;\n  display: block;\n}\n\n.lh-row--even {\n  background-color: var(--table-group-header-background-color);\n}\n.lh-row--hidden {\n  display: none;\n}\n\n.lh-table th,\n.lh-table td {\n\
  padding: var(--default-padding);\n}\n\n.lh-table tr {\n  vertical-align: middle;\n}\n\n.lh-table tr:hover {\n  background-color: var(--table-higlight-background-color);\n}\n\n/* Looks unnecessary, but mostly for keeping the <th>s left-aligned */\n.lh-table-column--text,\n.lh-table-column--source-location,\n.lh-table-column--url,\n/* .lh-table-column--thumbnail, */\n/* .lh-table-column--empty,*/\n.lh-table-column--code,\n.lh-table-column--node {\n  text-align: left;\n}\n\n.lh-table-column--code {\n  min-width: 100px;\n}\n\n.lh-table-column--bytes,\n.lh-table-column--timespanMs,\n.lh-table-column--ms,\n.lh-table-column--numeric {\n  text-align: right;\n  word-break: normal;\n}\n\n\n\n.lh-table .lh-table-column--thumbnail {\n  width: var(--image-preview-size);\n}\n\n.lh-table-column--url {\n  min-width: 250px;\n}\n\n.lh-table-column--text {\n  min-width: 80px;\n}\n\n/* Keep columns narrow if they follow the URL column */\n/* 12% was determined to be a decent narrow width, but wide enough for column headings */\n.lh-table-column--url + \
th.lh-table-column--bytes,\n.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--bytes,\n.lh-table-column--url + .lh-table-column--ms,\n.lh-table-column--url + .lh-table-column--ms + th.lh-table-column--bytes,\n.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--timespanMs {\n  width: 12%;\n}\n\n/** Tweak styling for tables in insight audits. */\n.lh-audit[id$="-insight"] .lh-table {\n  border: none;\n}\n\n.lh-audit[id$="-insight"] .lh-table thead th {\n  font-weight: bold;\n  color: unset;\n}\n\n.lh-audit[id$="-insight"] .lh-table th,\n.lh-audit[id$="-insight"] .lh-table td {\n  padding: calc(var(--default-padding) / 2);\n}\n\n.lh-audit[id$="-insight"] .lh-table .lh-row--even,\n.lh-audit[id$="-insight"] .lh-table tr:not(.lh-row--group):hover {\n  background-color: unset;\n}\n\n.lh-text__url-host {\n  display: inline;\n}\n\n.lh-text__url-host {\n  margin-left: calc(var(--report-font-size) / 2);\n  opacity: 0.6;\n  font-size: 90%\n}\n\n.lh-thumbnail {\n  object-fit: cover;\n  width: var(--im\
age-preview-size);\n  height: var(--image-preview-size);\n  display: block;\n}\n\n.lh-unknown pre {\n  overflow: scroll;\n  border: solid 1px var(--color-gray-200);\n}\n\n.lh-text__url > a {\n  color: inherit;\n  text-decoration: none;\n}\n\n.lh-text__url > a:hover {\n  text-decoration: underline dotted #999;\n}\n\n.lh-sub-item-row {\n  margin-left: 20px;\n  margin-bottom: 0;\n  color: var(--color-gray-700);\n}\n\n.lh-sub-item-row td {\n  padding-top: 4px;\n  padding-bottom: 4px;\n  padding-left: 20px;\n}\n\n.lh-sub-item-row .lh-element-screenshot {\n  zoom: 0.6;\n}\n\n/* Chevron\n   https://codepen.io/paulirish/pen/LmzEmK\n */\n.lh-chevron {\n  --chevron-angle: 42deg;\n  /* Edge doesn\'t support transform: rotate(calc(...)), so we define it here */\n  --chevron-angle-right: -42deg;\n  width: var(--chevron-size);\n  height: var(--chevron-size);\n  margin-top: calc((var(--report-line-height) - 12px) / 2);\n}\n\n.lh-chevron__lines {\n  transition: transform 0.4s;\n  transform: translateY(var(--report-line-height));\n}\n.lh-chevron__line {\
\n stroke: var(--chevron-line-stroke);\n stroke-width: var(--chevron-size);\n stroke-linecap: square;\n transform-origin: 50%;\n transform: rotate(var(--chevron-angle));\n transition: transform 300ms, stroke 300ms;\n}\n\n.lh-expandable-details .lh-chevron__line-right,\n.lh-expandable-details[open] .lh-chevron__line-left {\n transform: rotate(var(--chevron-angle-right));\n}\n\n.lh-expandable-details[open] .lh-chevron__line-right {\n  transform: rotate(var(--chevron-angle));\n}\n\n\n.lh-expandable-details[open]  .lh-chevron__lines {\n transform: translateY(calc(var(--chevron-size) * -1));\n}\n\n.lh-expandable-details[open] {\n  animation: 300ms openDetails forwards;\n  padding-bottom: var(--default-padding);\n}\n\n@keyframes openDetails {\n  from {\n    outline: 1px solid var(--report-background-color);\n  }\n  to {\n   outline: 1px solid;\n   box-shadow: 0 2px 4px rgba(0, 0, 0, .24);\n  }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media que\
ry when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 780px) {\n  /* no black outline if we\'re not confident the entire table can be displayed within bounds */\n  .lh-expandable-details[open] {\n    animation: none;\n  }\n}\n\n@container lh-container (max-width: 780px) {\n  /* no black outline if we\'re not confident the entire table can be displayed within bounds */\n  .lh-expandable-details[open] {\n    animation: none;\n  }\n}\n\n.lh-expandable-details[open] summary, details.lh-clump > summary {\n  border-bottom: 1px solid var(--report-border-color-secondary);\n}\ndetails.lh-clump[open] > summary {\n  border-bottom-width: 0;\n}\n\n\n\ndetails .lh-clump-toggletext--hide,\ndetails[open] .lh-clump-toggletext--show { display: none; }\ndetails[open] .lh-clump-toggletext--hide { display: block;}\n\n\n/* Tooltip */\n.lh-tooltip-boundary {\n  position: relative;\n}\n\n.lh-tooltip {\n  position: absolute;\n  display: none; /* Don\
\'t retain these layers when not needed */\n  opacity: 0;\n  background: #ffffff;\n  white-space: pre-line; /* Render newlines in the text */\n  min-width: 246px;\n  max-width: 275px;\n  padding: 15px;\n  border-radius: 5px;\n  text-align: initial;\n  line-height: 1.4;\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 535px) {\n  .lh-tooltip {\n    min-width: 45cqi;\n    padding: 3cqi;\n  }\n}\n\n/* shrink tooltips to not be cutoff on left edge of narrow container\n   45vw is chosen to be ~= width of the left column of metrics\n*/\n@container lh-container (max-width: 535px) {\n  .lh-tooltip {\n    min-width: 45cqi;\n    padding: 3cqi;\n  }\n}\n\n.lh-tooltip-boundary:hover .lh-tooltip {\n  display: block;\n  animation: fadeInTooltip 250ms;\n  animation-fill-mode: forwards;\n  animatio\
n-delay: 850ms;\n  bottom: 100%;\n  z-index: 1;\n  will-change: opacity;\n  right: 0;\n  pointer-events: none;\n}\n\n.lh-tooltip::before {\n  content: "";\n  border: solid transparent;\n  border-bottom-color: #fff;\n  border-width: 10px;\n  position: absolute;\n  bottom: -20px;\n  right: 6px;\n  transform: rotate(180deg);\n  pointer-events: none;\n}\n\n@keyframes fadeInTooltip {\n  0% { opacity: 0; }\n  75% { opacity: 1; }\n  100% { opacity: 1;  filter: drop-shadow(1px 0px 1px #aaa) drop-shadow(0px 2px 4px hsla(206, 6%, 25%, 0.15)); pointer-events: auto; }\n}\n\n/* Element screenshot */\n.lh-element-screenshot {\n  float: left;\n  margin-right: 20px;\n}\n.lh-element-screenshot__content {\n  overflow: hidden;\n  min-width: 110px;\n  display: flex;\n  justify-content: center;\n  background-color: var(--report-background-color);\n}\n.lh-element-screenshot__image {\n  position: relative;\n  /* Set by ElementScreenshotRenderer.installFullPageScreenshotCssVariable */\n  background-image: var(--element-screenshot-url);\n  outline: 2p\
x solid #777;\n  background-color: white;\n  background-repeat: no-repeat;\n}\n.lh-element-screenshot__mask {\n  position: absolute;\n  background: #555;\n  opacity: 0.8;\n}\n.lh-element-screenshot__element-marker {\n  position: absolute;\n  outline: 2px solid var(--color-lime-400);\n}\n.lh-element-screenshot__overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 2000; /* .lh-topbar is 1000 */\n  background: var(--screenshot-overlay-background);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: zoom-out;\n}\n\n.lh-element-screenshot__overlay .lh-element-screenshot {\n  margin-right: 0; /* clearing margin used in thumbnail case */\n  outline: 1px solid var(--color-gray-700);\n}\n\n.lh-screenshot-overlay--enabled .lh-element-screenshot {\n  cursor: zoom-out;\n}\n.lh-screenshot-overlay--enabled .lh-node .lh-element-screenshot {\n  cursor: zoom-in;\n}\n\n\n.lh-meta__items {\n  --meta-icon-size: calc(var(--report-icon-size) * 0.667);\n  padding: var(--default-padd\
ing);\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  background-color: var(--env-item-background-color);\n  border-radius: 3px;\n  margin: 0 0 var(--default-padding) 0;\n  font-size: 12px;\n  column-gap: var(--default-padding);\n  color: var(--color-gray-700);\n}\n\n.lh-meta__item {\n  display: block;\n  list-style-type: none;\n  position: relative;\n  padding: 0 0 0 calc(var(--meta-icon-size) + var(--default-padding) * 2);\n  cursor: unset; /* disable pointer cursor from report-icon */\n}\n\n.lh-meta__item.lh-tooltip-boundary {\n  text-decoration: dotted underline var(--color-gray-500);\n  cursor: help;\n}\n\n.lh-meta__item.lh-report-icon::before {\n  position: absolute;\n  left: var(--default-padding);\n  width: var(--meta-icon-size);\n  height: var(--meta-icon-size);\n}\n\n.lh-meta__item.lh-report-icon:hover::before {\n  opacity: 0.7;\n}\n\n.lh-meta__item .lh-tooltip {\n  color: var(--color-gray-800);\n}\n\n.lh-meta__item .lh-tooltip::before {\n  right: auto; /* Set the tooltip arrow to the leftside */\n  left\
: 6px;\n}\n\n.lh-meta__item:hover .lh-tooltip {\n  right: auto;\n  left: 6px;\n}\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 640px) {\n  .lh-meta__items {\n    grid-template-columns: 1fr 1fr;\n  }\n}\n\n/* Change the grid for narrow container */\n@container lh-container (max-width: 640px) {\n  .lh-meta__items {\n    grid-template-columns: 1fr 1fr;\n  }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n* TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 535px) {\n  .lh-meta__items {\n    display: block;\n  }\n}\n\n@container lh-container (max-width: 535px) {\n  .lh-meta__items {\n    display: \
block;\n  }\n}\n\n/* Explodey gauge */\n\n.lh-exp-gauge-component {\n  margin-bottom: 10px;\n}\n\n.lh-exp-gauge-component circle {\n  stroke: currentcolor;\n  r: var(--radius);\n}\n\n.lh-exp-gauge-component text {\n  font-size: calc(var(--radius) * 0.2);\n}\n\n.lh-exp-gauge-component .lh-exp-gauge {\n  margin: 0 auto;\n  width: 225px;\n  stroke-width: var(--stroke-width);\n  stroke-linecap: round;\n\n  /* for better rendering perf */\n  contain: strict;\n  height: 225px;\n  will-change: transform;\n}\n.lh-exp-gauge-component .lh-exp-gauge--faded {\n  opacity: 0.1;\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper {\n  font-family: var(--report-font-family-monospace);\n  text-align: center;\n  text-decoration: none;\n  transition: .3s;\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass {\n  color: var(--color-pass);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--average {\n  color: var(--color-average);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail {\n  color: var(--color-fail);\n}\n.lh-exp-gauge-component .sta\
te--expanded {\n  transition: color .3s;\n}\n.lh-exp-gauge-component .state--highlight {\n  color: var(--color-highlight);\n}\n.lh-exp-gauge-component .lh-exp-gauge__svg-wrapper {\n  display: flex;\n  flex-direction: column-reverse;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__label {\n  fill: var(--report-text-color);\n  font-family: var(--report-font-family);\n  font-size: 12px;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__cutout {\n  opacity: .999;\n  transition: opacity .3s;\n}\n.lh-exp-gauge-component .state--highlight .lh-exp-gauge__cutout {\n  opacity: 0;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__inner {\n  color: inherit;\n}\n.lh-exp-gauge-component .lh-exp-gauge__base {\n  fill: currentcolor;\n}\n\n\n.lh-exp-gauge-component .lh-exp-gauge__arc {\n  fill: none;\n  transition: opacity .3s;\n}\n.lh-exp-gauge-component .lh-exp-gauge__arc--metric {\n  color: var(--metric-color);\n  stroke-dashoffset: var(--metric-offset);\n  opacity: 0.3;\n}\n.lh-exp-gauge-component .lh-exp-gauge-hovertarget {\n  color: currentcolor;\n  op\
acity: 0.001;\n  stroke-linecap: butt;\n  stroke-width: 24;\n  /* hack. move the hover target out of the center. ideally i tweak the r instead but that rquires considerably more math. */\n  transform: scale(1.15);\n}\n.lh-exp-gauge-component .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\n  opacity: 0;\n  stroke-dasharray: 0 calc(var(--circle-meas) * var(--radius));\n  transition: 0s .005s;\n}\n.lh-exp-gauge-component .state--expanded .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\n  opacity: .999;\n  stroke-dasharray: var(--metric-array);\n  transition: 0.3s; /*  calc(.005s + var(--i)*.05s); entrace animation */\n}\n.lh-exp-gauge-component .state--expanded .lh-exp-gauge__inner .lh-exp-gauge__arc {\n  opacity: 0;\n}\n\n\n.lh-exp-gauge-component .lh-exp-gauge__percentage {\n  text-anchor: middle;\n  dominant-baseline: middle;\n  opacity: .999;\n  font-size: calc(var(--radius) * 0.625);\n  transition: opacity .3s ease-in;\n}\n.lh-exp-gauge-component .state--highlight .lh-exp-gauge__percentage {\n  opacity: 0\
;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail .lh-exp-gauge__percentage {\n  fill: var(--color-fail);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--average .lh-exp-gauge__percentage {\n  fill: var(--color-average);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass .lh-exp-gauge__percentage {\n  fill: var(--color-pass);\n}\n\n.lh-exp-gauge-component .lh-cover {\n  fill: none;\n  opacity: .001;\n  pointer-events: none;\n}\n.lh-exp-gauge-component .state--expanded .lh-cover {\n  pointer-events: auto;\n}\n\n.lh-exp-gauge-component .metric {\n  transform: scale(var(--scale-initial));\n  opacity: 0;\n  transition: transform .1s .2s ease-out,  opacity .3s ease-out;\n  pointer-events: none;\n}\n.lh-exp-gauge-component .metric text {\n  pointer-events: none;\n}\n.lh-exp-gauge-component .metric__value {\n  fill: currentcolor;\n  opacity: 0;\n  transition: opacity 0.2s;\n}\n.lh-exp-gauge-component .state--expanded .metric {\n  transform: scale(1);\n  opacity: .999;\n  transition: transform .3s ease-out,  op\
acity .3s ease-in,  stroke-width .1s ease-out;\n  transition-delay: calc(var(--i)*.05s);\n  pointer-events: auto;\n}\n.lh-exp-gauge-component .state--highlight .metric {\n  opacity: .3;\n}\n.lh-exp-gauge-component .state--highlight .metric--highlight {\n  opacity: .999;\n  stroke-width: calc(1.5*var(--stroke-width));\n}\n.lh-exp-gauge-component .state--highlight .metric--highlight .metric__value {\n  opacity: 0.999;\n}\n\n\n/*\n the initial first load peek\n*/\n.lh-exp-gauge-component .lh-exp-gauge__bg {  /* needed for the use zindex stacking w/ transparency */\n  fill: var(--report-background-color);\n  stroke: var(--report-background-color);\n}\n.lh-exp-gauge-component .state--peek .metric {\n  transition-delay: 0ms;\n  animation: peek var(--peek-dur) cubic-bezier(0.46, 0.03, 0.52, 0.96);\n  animation-fill-mode: forwards;\n}\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__inner .lh-exp-gauge__arc {\n  opacity: 1;\n}\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc.lh-exp-gauge--faded {\n  opacity: 0.3;\
 /* just a tad stronger cuz its fighting with a big solid arg */\n}\n/* do i need to set expanded and override this? */\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\n  transition: opacity 0.3s;\n}\n.lh-exp-gauge-component .state--peek {\n  color: unset;\n}\n.lh-exp-gauge-component .state--peek .metric__label {\n  display: none;\n}\n\n.lh-exp-gauge-component .metric__label {\n  fill: var(--report-text-color);\n}\n\n@keyframes peek {\n  /* biggest it should go is 0.92. smallest is 0.8 */\n  0% {\n    transform: scale(0.8);\n    opacity: 0.8;\n  }\n\n  50% {\n    transform: scale(0.92);\n    opacity: 1;\n  }\n\n  100% {\n    transform: scale(0.8);\n    opacity: 0.8;\n  }\n}\n\n.lh-exp-gauge-component .wrapper {\n  width: 620px;\n}\n\n/*# sourceURL=report-styles.css */\n`),e.append(t),e}function dt(o){let e=o.createFragment(),t=o.createElement("style");t.append(`\n    .lh-topbar {\n      position: sticky;\n      top: 0;\n      left: 0;\n      right: 0;\n      z-index: 1000;\n      display: fl\
ex;\n      align-items: center;\n      height: var(--topbar-height);\n      padding: var(--topbar-padding);\n      font-size: var(--report-font-size-secondary);\n      background-color: var(--topbar-background-color);\n      border-bottom: 1px solid var(--color-gray-200);\n    }\n\n    .lh-topbar__logo {\n      width: var(--topbar-logo-size);\n      height: var(--topbar-logo-size);\n      user-select: none;\n      flex: none;\n    }\n\n    .lh-topbar__url {\n      margin: var(--topbar-padding);\n      text-decoration: none;\n      color: var(--report-text-color);\n      text-overflow: ellipsis;\n      overflow: hidden;\n      white-space: nowrap;\n    }\n\n    .lh-tools {\n      display: flex;\n      align-items: center;\n      margin-left: auto;\n      will-change: transform;\n      min-width: var(--report-icon-size);\n    }\n    .lh-tools__button {\n      width: var(--report-icon-size);\n      min-width: 24px;\n      height: var(--report-icon-size);\n      cursor: pointer;\n      margin-right: 5px;\n      /* This is actu\
ally a button element, but we want to style it like a transparent div. */\n      display: flex;\n      background: none;\n      color: inherit;\n      border: none;\n      padding: 0;\n      font: inherit;\n    }\n    .lh-tools__button svg {\n      fill: var(--tools-icon-color);\n    }\n    .lh-dark .lh-tools__button svg {\n      filter: invert(1);\n    }\n    .lh-tools__button.lh-active + .lh-tools__dropdown {\n      opacity: 1;\n      clip: rect(-1px, 194px, 270px, -3px);\n      visibility: visible;\n    }\n    .lh-tools__dropdown {\n      position: absolute;\n      background-color: var(--report-background-color);\n      border: 1px solid var(--report-border-color);\n      border-radius: 3px;\n      padding: calc(var(--default-padding) / 2) 0;\n      cursor: pointer;\n      top: 36px;\n      right: 0;\n      box-shadow: 1px 1px 3px #ccc;\n      min-width: 125px;\n      clip: rect(0, 164px, 0, 0);\n      visibility: hidden;\n      opacity: 0;\n      transition: all 200ms cubic-bezier(0,0,0.2,1);\n    }\n    .lh-tools_\
_dropdown a {\n      color: currentColor;\n      text-decoration: none;\n      white-space: nowrap;\n      padding: 0 6px;\n      line-height: 2;\n    }\n    .lh-tools__dropdown a:hover,\n    .lh-tools__dropdown a:focus {\n      background-color: var(--color-gray-200);\n      outline: none;\n    }\n    /* save-gist option hidden in report. */\n    .lh-tools__dropdown a[data-action=\'save-gist\'] {\n      display: none;\n    }\n\n    .lh-locale-selector {\n      width: 100%;\n      color: var(--report-text-color);\n      background-color: var(--locale-selector-background-color);\n      padding: 2px;\n    }\n    .lh-tools-locale {\n      display: flex;\n      align-items: center;\n      flex-direction: row-reverse;\n    }\n    .lh-tools-locale__selector-wrapper {\n      transition: opacity 0.15s;\n      opacity: 0;\n      max-width: 200px;\n    }\n    .lh-button.lh-tool-locale__button {\n      height: var(--topbar-height);\n      color: var(--tools-icon-color);\n      padding: calc(var(--default-padding) / 2);\n    }\n    .lh-\
tool-locale__button.lh-active + .lh-tools-locale__selector-wrapper {\n      opacity: 1;\n      clip: rect(-1px, 255px, 242px, -3px);\n      visibility: visible;\n      margin: 0 4px;\n    }\n\n    /**\n    * This media query is a temporary fallback for browsers that do not support \\`@container query\\`.\n    * TODO: remove this media query when \\`@container query\\` is fully supported by browsers\n    * See https://github.com/GoogleChrome/lighthouse/pull/16332\n    */\n    @media screen and (max-width: 964px) {\n      .lh-tools__dropdown {\n        right: 0;\n        left: initial;\n      }\n    }\n\n    @container lh-container (max-width: 964px) {\n      .lh-tools__dropdown {\n        right: 0;\n        left: initial;\n      }\n    }\n\n    @media print {\n      .lh-topbar {\n        position: static;\n        margin-left: 0;\n      }\n\n      .lh-tools__dropdown {\n        display: none;\n      }\n    }\n  `),e.append(t);let n=o.createElement("div","lh-topbar"),r=o.createElementNS("http://www.w3.org/2000/svg","svg","lh-t\
opbar__logo");r.setAttribute("role","img"),r.setAttribute("title","Lighthouse logo"),r.setAttribute("fill","none"),r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("viewBox","0 0 48 48");let i=o.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d","m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z"),i.setAttribute("fill","#F63");let a=o.createElementNS("http://www.w3.org/2000/svg","path");a.setAttribute("d","M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z"),a.setAttribute("fill","#FFA385");let l=o.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("fill","#FF3"),l.setAttribute("d","M20.5 10h7v7h-7z"),r.append(" ",i," ",a," ",l," ");let s=o.createElement("a","lh-topbar__url");s.setAttribute("href",""),s.setAttribute("target","_blank"),s.setAttribute("rel","noopener");let c=o.createElement("div","lh-tools"),d=o.createElement("div","lh-tools-locale lh-hidden"),h=o.createElement("button","\
lh-button lh-tool-locale__button");h.setAttribute("id","lh-button__swap-locales"),h.setAttribute("title","Show Language Picker"),h.setAttribute("aria-label","Toggle language picker"),h.setAttribute("aria-haspopup","menu"),h.setAttribute("aria-expanded","false"),h.setAttribute("aria-controls","lh-tools-locale__selector-wrapper");let p=o.createElementNS("http://www.w3.org/2000/svg","svg");p.setAttribute("width","20px"),p.setAttribute("height","20px"),p.setAttribute("viewBox","0 0 24 24"),p.setAttribute("fill","currentColor");let g=o.createElementNS("http://www.w3.org/2000/svg","path");g.setAttribute("d","M0 0h24v24H0V0z"),g.setAttribute("fill","none");let b=o.createElementNS("http://www.w3.org/2000/svg","path");b.setAttribute("d","M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12\
zm-2.62 7l1.62-4.33L19.12 17h-3.24z"),p.append(g,b),h.append(" ",p," ");let w=o.createElement("div","lh-tools-locale__selector-wrapper");w.setAttribute("id","lh-tools-locale__selector-wrapper"),w.setAttribute("role","menu"),w.setAttribute("aria-labelledby","lh-button__swap-locales"),w.setAttribute("aria-hidden","true"),w.append(" "," "),d.append(" ",h," ",w," ");let f=o.createElement("button","lh-tools__button");f.setAttribute("id","lh-tools-button"),f.setAttribute("title","Tools menu"),f.setAttribute("aria-label","Toggle report tools menu"),f.setAttribute("aria-haspopup","menu"),f.setAttribute("aria-expanded","false"),f.setAttribute("aria-controls","lh-tools-dropdown");let u=o.createElementNS("http://www.w3.org/2000/svg","svg");u.setAttribute("width","100%"),u.setAttribute("height","100%"),u.setAttribute("viewBox","0 0 24 24");let v=o.createElementNS("http://www.w3.org/2000/svg","path");v.setAttribute("d","M0 0h24v24H0z"),v.setAttribute("fill","none");let _=o.createElementNS("http://w\
ww.w3.org/2000/svg","path");_.setAttribute("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"),u.append(" ",v," ",_," "),f.append(" ",u," ");let x=o.createElement("div","lh-tools__dropdown");x.setAttribute("id","lh-tools-dropdown"),x.setAttribute("role","menu"),x.setAttribute("aria-labelledby","lh-tools-button");let L=o.createElement("a","lh-report-icon lh-report-icon--print");L.setAttribute("role","menuitem"),L.setAttribute("tabindex","-1"),L.setAttribute("href","#"),L.setAttribute("data-i18n","dropdownPrintSummary"),L.setAttribute("data-action","print-summary");let C=o.createElement("a","lh-report-icon lh-report-icon--print");C.setAttribute("role","menuitem"),C.setAttribute("tabindex","-1"),C.setAttribute("href","#"),C.setAttribute("data-i18n","dropdownPrintExpanded"),C.setAttribute("data-action","print-expanded");let z=o.createElement("a","lh-report-icon lh-report-icon--copy");z.setA\
ttribute("role","menuitem"),z.setAttribute("tabindex","-1"),z.setAttribute("href","#"),z.setAttribute("data-i18n","dropdownCopyJSON"),z.setAttribute("data-action","copy");let M=o.createElement("a","lh-report-icon lh-report-icon--download lh-hidden");M.setAttribute("role","menuitem"),M.setAttribute("tabindex","-1"),M.setAttribute("href","#"),M.setAttribute("data-i18n","dropdownSaveHTML"),M.setAttribute("data-action","save-html");let $=o.createElement("a","lh-report-icon lh-report-icon--download");$.setAttribute("role","menuitem"),$.setAttribute("tabindex","-1"),$.setAttribute("href","#"),$.setAttribute("data-i18n","dropdownSaveJSON"),$.setAttribute("data-action","save-json");let R=o.createElement("a","lh-report-icon lh-report-icon--open");R.setAttribute("role","menuitem"),R.setAttribute("tabindex","-1"),R.setAttribute("href","#"),R.setAttribute("data-i18n","dropdownViewer"),R.setAttribute("data-action","open-viewer");let N=o.createElement("a","lh-report-icon lh-report-icon--open");N.set\
Attribute("role","menuitem"),N.setAttribute("tabindex","-1"),N.setAttribute("href","#"),N.setAttribute("data-i18n","dropdownSaveGist"),N.setAttribute("data-action","save-gist");let D=o.createElement("a","lh-report-icon lh-report-icon--open lh-hidden");D.setAttribute("role","menuitem"),D.setAttribute("tabindex","-1"),D.setAttribute("href","#"),D.setAttribute("data-i18n","dropdownViewUnthrottledTrace"),D.setAttribute("data-action","view-unthrottled-trace");let I=o.createElement("a","lh-report-icon lh-report-icon--dark");return I.setAttribute("role","menuitem"),I.setAttribute("tabindex","-1"),I.setAttribute("href","#"),I.setAttribute("data-i18n","dropdownDarkTheme"),I.setAttribute("data-action","toggle-dark"),x.append(" ",L," ",C," ",z," "," ",M," ",$," ",R," ",N," "," ",D," ",I," "),c.append(" ",d," ",f," ",x," "),n.append(" "," ",r," ",s," ",c," "),e.append(n),e}function ht(o){let e=o.createFragment(),t=o.createElement("div","lh-warnings lh-warnings--toplevel"),n=o.createElement("p","lh\
-warnings__msg"),r=o.createElement("ul");return t.append(" ",n," ",r," "),e.append(t),e}function be(o,e){switch(e){case"3pFilter":return Ge(o);case"audit":return Be(o);case"categoryHeader":return qe(o);case"chevron":return je(o);case"clump":return We(o);case"crc":return Ke(o);case"crcChain":return Ze(o);case"elementScreenshot":return Je(o);case"explodeyGauge":return Qe(o);case"footer":return Ye(o);case"fraction":return Xe(o);case"gauge":return et(o);case"heading":return tt(o);case"metric":return nt(o);case"scorescale":return rt(o);case"scoresWrapper":return ot(o);case"snippet":return it(o);case"snippetContent":return at(o);case"snippetHeader":return lt(o);case"snippetLine":return st(o);case"styles":return ct(o);case"topbar":return dt(o);case"warningsToplevel":return ht(o)}throw new Error("unexpected component: "+e)}var ee=class{constructor(e,t){this._document=e,this._lighthouseChannel="unknown",this._componentCache=new Map,this.rootEl=t}createElement(e,t){let n=this._document.createEle\
ment(e);if(t)for(let r of t.split(/\\s+/))r&&n.classList.add(r);return n}createElementNS(e,t,n){let r=this._document.createElementNS(e,t);if(n)for(let i of n.split(/\\s+/))i&&r.classList.add(i);return r}createSVGElement(e,t){return this._document.createElementNS("http://www.w3.org/2000/svg",e,t)}createFragment(){return this._document.createDocumentFragment()}createTextNode(e){return this._document.createTextNode(e)}createChildOf(e,t,n){let r=this.createElement(t,n);return e.append(r),r}createComponent(e){let t=this._componentCache.get(e);if(t){let r=t.cloneNode(!0);return this.findAll("style",r).forEach(i=>i.remove()),r}return t=be(this,e),this._componentCache.set(e,t),t.cloneNode(!0)}clearComponentCache(){this._componentCache.clear()}convertMarkdownLinkSnippets(e,t={}){let n=this.createElement("span");for(let r of E.splitMarkdownLink(e)){let i=r.text.includes("`")?this.convertMarkdownCodeSnippets(r.text):r.text;if(!r.isLink){n.append(i);continue}let a=new URL(r.linkHref);(["https://deve\
lopers.google.com","https://web.dev","https://developer.chrome.com"].includes(a.origin)||t.alwaysAppendUtmSource)&&(a.searchParams.set("utm_source","lighthouse"),a.searchParams.set("utm_medium",this._lighthouseChannel));let s=this.createElement("a");s.rel="noopener",s.target="_blank",s.append(i),this.safelySetHref(s,a.href),n.append(s)}return n}safelySetHref(e,t){if(t=t||"",t.startsWith("#")){e.href=t;return}let n=["https:","http:"],r;try{r=new URL(t)}catch{}r&&n.includes(r.protocol)&&(e.href=r.href)}safelySetBlobHref(e,t){if(t.type!=="text/html"&&t.type!=="application/json")throw new Error("Unsupported blob type");let n=URL.createObjectURL(t);e.href=n}convertMarkdownCodeSnippets(e){let t=this.createElement("span");for(let n of E.splitMarkdownCodeSpans(e))if(n.isCode){let r=this.createElement("code");r.textContent=n.text,t.append(r)}else t.append(this._document.createTextNode(n.text));return t}setLighthouseChannel(e){this._lighthouseChannel=e}document(){return this._document}isDevTools\
(){return!!this._document.querySelector(".lh-devtools")}find(e,t=this.rootEl??this._document){let n=this.maybeFind(e,t);if(n===null)throw new Error(`query ${e} not found`);return n}maybeFind(e,t=this.rootEl??this._document){return t.querySelector(e)}findAll(e,t){return Array.from(t.querySelectorAll(e))}fireEventOn(e,t=this._document,n){let r=new CustomEvent(e,n?{detail:n}:void 0);t.dispatchEvent(r)}saveFile(e,t){let n=this.createElement("a");n.download=t,this.safelySetBlobHref(n,e),this._document.body.append(n),n.click(),this._document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(n.href),500)}};var _e=0,m=class o{static i18n=null;static strings={};static reportJson=null;static apply(e){o.strings={...we,...e.providedStrings},o.i18n=e.i18n,o.reportJson=e.reportJson}static getUniqueSuffix(){return _e++}static resetUniqueSuffix(){_e=0}};var ye="data:image/jpeg;base64,";function xe(o){o.configSettings.locale||(o.configSettings.locale="en"),o.configSettings.formFactor||(o.configSet\
tings.formFactor=o.configSettings.emulatedFormFactor),o.finalDisplayedUrl=E.getFinalDisplayedUrl(o),o.mainDocumentUrl=E.getMainDocumentUrl(o);for(let n of Object.values(o.audits))if((n.scoreDisplayMode==="not_applicable"||n.scoreDisplayMode==="not-applicable")&&(n.scoreDisplayMode="notApplicable"),n.scoreDisplayMode==="informative"&&(n.score=1),n.details){if((n.details.type===void 0||n.details.type==="diagnostic")&&(n.details.type="debugdata"),n.details.type==="filmstrip")for(let r of n.details.items)r.data.startsWith(ye)||(r.data=ye+r.data);if(n.details.type==="table")for(let r of n.details.headings){let{itemType:i,text:a}=r;i!==void 0&&(r.valueType=i,delete r.itemType),a!==void 0&&(r.label=a,delete r.text);let l=r.subItemsHeading?.itemType;r.subItemsHeading&&l!==void 0&&(r.subItemsHeading.valueType=l,delete r.subItemsHeading.itemType)}if(n.id==="third-party-summary"&&(n.details.type==="opportunity"||n.details.type==="table")){let{headings:r,items:i}=n.details;if(r[0].valueType==="lin\
k"){r[0].valueType="text";for(let a of i)typeof a.entity=="object"&&a.entity.type==="link"&&(a.entity=a.entity.text);n.details.isEntityGrouped=!0}}}let[e]=o.lighthouseVersion.split(".").map(Number),t=o.categories.performance;if(t){if(e<9){o.categoryGroups||(o.categoryGroups={}),o.categoryGroups.hidden={title:""};for(let n of t.auditRefs)n.group?n.group==="load-opportunities"&&(n.group="diagnostics"):n.group="hidden"}else if(e<12)for(let n of t.auditRefs)n.group||(n.group="diagnostics")}if(e<12&&t){let n=new Map;for(let r of t.auditRefs){let i=r.relevantAudits;if(!(!i||!r.acronym))for(let a of i){let l=n.get(a)||[];l.push(r.acronym),n.set(a,l)}}for(let[r,i]of n){if(!i.length)continue;let a=o.audits[r];if(a&&!a.metricSavings){a.metricSavings={};for(let l of i)a.metricSavings[l]=0}}}if(o.environment||(o.environment={benchmarkIndex:0,networkUserAgent:o.userAgent,hostUserAgent:o.userAgent}),o.configSettings.screenEmulation||(o.configSettings.screenEmulation={width:-1,height:-1,deviceScaleFa\
ctor:-1,mobile:/mobile/i.test(o.environment.hostUserAgent),disabled:!1}),o.i18n||(o.i18n={}),o.audits["full-page-screenshot"]){let n=o.audits["full-page-screenshot"].details;n?o.fullPageScreenshot={screenshot:n.screenshot,nodes:n.nodes}:o.fullPageScreenshot=null,delete o.audits["full-page-screenshot"]}}var O=E.RATINGS,k=class o{static prepareReportResult(e){let t=JSON.parse(JSON.stringify(e));xe(t);for(let r of Object.values(t.audits))r.details&&(r.details.type==="opportunity"||r.details.type==="table")&&!r.details.isEntityGrouped&&t.entities&&o.classifyEntities(t.entities,r.details);if(typeof t.categories!="object")throw new Error("No categories provided.");let n=new Map;for(let r of Object.values(t.categories))r.auditRefs.forEach(i=>{i.acronym&&n.set(i.acronym,i)}),r.auditRefs.forEach(i=>{let a=t.audits[i.id];i.result=a;let l=Object.keys(i.result.metricSavings||{});if(l.length){i.relevantMetrics=[];for(let s of l){let c=n.get(s);c&&i.relevantMetrics.push(c)}}if(t.stackPacks){let s=[i\
.id,...i.result.replacesAudits??[]];t.stackPacks.forEach(c=>{let d=s.find(h=>c.descriptions[h]);d&&c.descriptions[d]&&(i.stackPacks=i.stackPacks||[],i.stackPacks.push({title:c.title,iconDataURL:c.iconDataURL,description:c.descriptions[d]}))})}});return t}static getUrlLocatorFn(e){let t=e.find(r=>r.valueType==="url")?.key;if(t&&typeof t=="string")return r=>{let i=r[t];if(typeof i=="string")return i};let n=e.find(r=>r.valueType==="source-location")?.key;if(n)return r=>{let i=r[n];if(typeof i=="object"&&i.type==="source-location")return i.url}}static classifyEntities(e,t){let{items:n,headings:r}=t;if(!n.length||n.some(a=>a.entity))return;let i=o.getUrlLocatorFn(r);if(i)for(let a of n){let l=i(a);if(!l)continue;let s="";try{s=E.parseURL(l).origin}catch{}if(!s)continue;let c=e.find(d=>d.origins.includes(s));c&&(a.entity=c.name)}}static getTableItemSortComparator(e){return(t,n)=>{for(let r of e){let i=t[r],a=n[r];if((typeof i!=typeof a||!["number","string"].includes(typeof i))&&console.warn(\
`Warning: Attempting to sort unsupported value type: ${r}.`),typeof i=="number"&&typeof a=="number"&&i!==a)return a-i;if(typeof i=="string"&&typeof a=="string"&&i!==a)return i.localeCompare(a)}return 0}}static getEmulationDescriptions(e){let t,n,r,i=e.throttling,a=m.i18n,l=m.strings;switch(e.throttlingMethod){case"provided":r=n=t=l.throttlingProvided;break;case"devtools":{let{cpuSlowdownMultiplier:p,requestLatencyMs:g}=i;t=`${a.formatNumber(p)}x slowdown (DevTools)`,n=`${a.formatMilliseconds(g)} HTTP RTT, ${a.formatKbps(i.downloadThroughputKbps)} down, ${a.formatKbps(i.uploadThroughputKbps)} up (DevTools)`,r=g===150*3.75&&i.downloadThroughputKbps===1.6*1024*.9&&i.uploadThroughputKbps===750*.9?l.runtimeSlow4g:l.runtimeCustom;break}case"simulate":{let{cpuSlowdownMultiplier:p,rttMs:g,throughputKbps:b}=i;t=`${a.formatNumber(p)}x slowdown (Simulated)`,n=`${a.formatMilliseconds(g)} TCP RTT, ${a.formatKbps(b)} throughput (Simulated)`,r=g===150&&b===1.6*1024?l.runtimeSlow4g:l.runtimeCustom;bre\
ak}default:r=t=n=l.runtimeUnknown}let s=e.channel==="devtools"?!1:e.screenEmulation.disabled,c=e.channel==="devtools"?e.formFactor==="mobile":e.screenEmulation.mobile,d=l.runtimeMobileEmulation;s?d=l.runtimeNoEmulation:c||(d=l.runtimeDesktopEmulation);let h=s?void 0:`${e.screenEmulation.width}x${e.screenEmulation.height}, DPR ${e.screenEmulation.deviceScaleFactor}`;return{deviceEmulation:d,screenEmulation:h,cpuThrottling:t,networkThrottling:n,summary:r}}static showAsPassed(e){switch(e.scoreDisplayMode){case"manual":case"notApplicable":return!0;case"error":case"informative":return!1;case"numeric":case"binary":default:return Number(e.score)>=O.PASS.minScore}}static calculateRating(e,t){if(t==="manual"||t==="notApplicable")return O.PASS.label;if(t==="error")return O.ERROR.label;if(e===null)return O.FAIL.label;let n=O.FAIL.label;return e>=O.PASS.minScore?n=O.PASS.label:e>=O.AVERAGE.minScore&&(n=O.AVERAGE.label),n}static calculateCategoryFraction(e){let t=0,n=0,r=0,i=0;for(let a of e.auditR\
efs){let l=o.showAsPassed(a.result);if(!(a.group==="hidden"||a.result.scoreDisplayMode==="manual"||a.result.scoreDisplayMode==="notApplicable")){if(a.result.scoreDisplayMode==="informative"){l||++r;continue}++t,i+=a.weight,l&&n++}}return{numPassed:n,numPassableAudits:t,numInformative:r,totalWeight:i}}static isPluginCategory(e){return e.startsWith("lighthouse-plugin-")}static shouldDisplayAsFraction(e,t){return e==="timespan"||e==="snapshot"||t?.categoryScoreDisplayMode==="fraction"}},we={varianceDisclaimer:"Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.",calculatorLink:"See calculator.",showRelevantAudits:"Show audits relevant to:",opportunityResourceColumnLabel:"Opportunity",opportunitySavingsColumnLabel:"Estimated Savings",errorMissingAuditInfo:"Report error: no audit information",errorLabel:"Error!",warningHeader:"Warnings: ",warningAuditsGroupTitle:"\
Passed audits but with warnings",passedAuditsGroupTitle:"Passed audits",notApplicableAuditsGroupTitle:"Not applicable",manualAuditsGroupTitle:"Additional items to manually check",toplevelWarningsMessage:"There were issues affecting this run of Lighthouse:",crcInitialNavigation:"Initial Navigation",crcLongestDurationLabel:"Maximum critical path latency:",snippetExpandButtonLabel:"Expand snippet",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",thirdPartyResourcesLabel:"Show 3rd-party resources",viewTreemapLabel:"View Treemap",viewTraceLabel:"View Trace",dropdownPrintSummary:"Print Summary",dropdownPrintExpanded:"Print Expanded",dropdownCopyJSON:"Copy JSON",dropdownSaveHTML:"Save as HTML",dropdownSaveJSON:"Save as JSON",dropdownViewer:"Open in Viewer",dropdownSaveGist:"Save \
as Gist",dropdownDarkTheme:"Toggle Dark Theme",dropdownViewUnthrottledTrace:"View Unthrottled Trace",runtimeSettingsDevice:"Device",runtimeSettingsNetworkThrottling:"Network throttling",runtimeSettingsCPUThrottling:"CPU throttling",runtimeSettingsUANetwork:"User agent (network)",runtimeSettingsBenchmark:"Unthrottled CPU/Memory Power",runtimeSettingsAxeVersion:"Axe version",runtimeSettingsScreenEmulation:"Screen emulation",footerIssue:"File an issue",runtimeNoEmulation:"No emulation",runtimeMobileEmulation:"Emulated Moto G Power",runtimeDesktopEmulation:"Emulated Desktop",runtimeUnknown:"Unknown",runtimeSingleLoad:"Single page session",runtimeAnalysisWindow:"Initial page load",runtimeAnalysisWindowTimespan:"User interactions timespan",runtimeAnalysisWindowSnapshot:"Point-in-time snapshot",runtimeSingleLoadTooltip:"This data is taken from a single page session, as opposed to field data summarizing many sessions.",throttlingProvided:"Provided by environment",show:"Show",hide:"Hide",expand\
View:"Expand view",collapseView:"Collapse view",runtimeSlow4g:"Slow 4G throttling",runtimeCustom:"Custom throttling",firstPartyChipLabel:"1st party",openInANewTabTooltip:"Open in a new tab",unattributable:"Unattributable",unscoredLabel:"Unscored",unscoredTitle:"This audit does not contribute to the overall category score."};var G=class{constructor(e,t){this.dom=e,this.detailsRenderer=t}get _clumpTitles(){return{warning:m.strings.warningAuditsGroupTitle,manual:m.strings.manualAuditsGroupTitle,passed:m.strings.passedAuditsGroupTitle,notApplicable:m.strings.notApplicableAuditsGroupTitle}}renderAudit(e){let t=m.strings,n=this.dom.createComponent("audit"),r=this.dom.find("div.lh-audit",n);r.id=e.result.id;let i=e.result.scoreDisplayMode;e.result.displayValue&&(this.dom.find(".lh-audit__display-text",r).textContent=e.result.displayValue);let a=this.dom.find(".lh-audit__title",r);a.append(this.dom.convertMarkdownCodeSnippets(e.result.title));let l=this.dom.find(".lh-audit__description",r);l.a\
ppend(this.dom.convertMarkdownLinkSnippets(e.result.description));for(let p of e.relevantMetrics||[]){let g=this.dom.createChildOf(l,"span","lh-audit__adorn");g.title=`Relevant to ${p.result.title}`,g.textContent=p.acronym||p.id}if(e.weight===0){let p=this.dom.createChildOf(l,"span","lh-audit__adorn");p.title=m.strings.unscoredTitle,p.textContent=m.strings.unscoredLabel}e.stackPacks&&e.stackPacks.forEach(p=>{let g=this.dom.createElement("img","lh-audit__stackpack__img");g.src=p.iconDataURL,g.alt=p.title;let b=this.dom.convertMarkdownLinkSnippets(p.description,{alwaysAppendUtmSource:!0}),w=this.dom.createElement("div","lh-audit__stackpack");w.append(g,b),this.dom.find(".lh-audit__stackpacks",r).append(w)});let s=this.dom.find("details",r);if(e.result.details){let p=this.detailsRenderer.render(e.result.details);p&&(p.classList.add("lh-details"),s.append(p))}if(this.dom.find(".lh-chevron-container",r).append(this._createChevron()),this._setRatingClass(r,e.result.score,i),e.result.scoreDis\
playMode==="error"){r.classList.add("lh-audit--error");let p=this.dom.find(".lh-audit__display-text",r);p.textContent=t.errorLabel,p.classList.add("lh-tooltip-boundary");let g=this.dom.createChildOf(p,"div","lh-tooltip lh-tooltip--error");g.textContent=e.result.errorMessage||t.errorMissingAuditInfo}else if(e.result.explanation){let p=this.dom.createChildOf(a,"div","lh-audit-explanation");p.textContent=e.result.explanation}let c=e.result.warnings;if(!c||c.length===0)return r;let d=this.dom.find("summary",s),h=this.dom.createChildOf(d,"div","lh-warnings");if(this.dom.createChildOf(h,"span").textContent=t.warningHeader,c.length===1)h.append(this.dom.createTextNode(c.join("")));else{let p=this.dom.createChildOf(h,"ul");for(let g of c){let b=this.dom.createChildOf(p,"li");b.textContent=g}}return r}injectFinalScreenshot(e,t,n){let r=t["final-screenshot"];if(!r||r.scoreDisplayMode==="error"||!r.details||r.details.type!=="screenshot")return null;let i=this.dom.createElement("img","lh-final-ss-\
image"),a=r.details.data;i.src=a,i.alt=r.title;let l=this.dom.find(".lh-category .lh-category-header",e),s=this.dom.createElement("div","lh-category-headercol"),c=this.dom.createElement("div","lh-category-headercol lh-category-headercol--separator"),d=this.dom.createElement("div","lh-category-headercol");s.append(...l.childNodes),s.append(n),d.append(i),l.append(s,c,d),l.classList.add("lh-category-header__finalscreenshot")}_createChevron(){let e=this.dom.createComponent("chevron");return this.dom.find("svg.lh-chevron",e)}_setRatingClass(e,t,n){let r=k.calculateRating(t,n);return e.classList.add(`lh-audit--${n.toLowerCase()}`),n!=="informative"&&e.classList.add(`lh-audit--${r}`),e}renderCategoryHeader(e,t,n){let r=this.dom.createComponent("categoryHeader"),i=this.dom.find(".lh-score__gauge",r),a=this.renderCategoryScore(e,t,n);if(i.append(a),e.description){let l=this.dom.convertMarkdownLinkSnippets(e.description);this.dom.find(".lh-category-header__description",r).append(l)}return r}ren\
derAuditGroup(e){let t=this.dom.createElement("div","lh-audit-group"),n=this.dom.createElement("div","lh-audit-group__header");this.dom.createChildOf(n,"span","lh-audit-group__title").textContent=e.title,t.append(n);let r=null;return e.description&&(r=this.dom.convertMarkdownLinkSnippets(e.description),r.classList.add("lh-audit-group__description","lh-audit-group__footer"),t.append(r)),[t,r]}_renderGroupedAudits(e,t){let n=new Map,r="NotAGroup";n.set(r,[]);for(let a of e){let l=a.group||r,s=n.get(l)||[];s.push(a),n.set(l,s)}let i=[];for(let[a,l]of n){if(a===r){for(let h of l)i.push(this.renderAudit(h));continue}let s=t[a],[c,d]=this.renderAuditGroup(s);for(let h of l)c.insertBefore(this.renderAudit(h),d);c.classList.add(`lh-audit-group--${a}`),i.push(c)}return i}renderUnexpandableClump(e,t){let n=this.dom.createElement("div");return this._renderGroupedAudits(e,t).forEach(i=>n.append(i)),n}renderClump(e,{auditRefsOrEls:t,description:n,openByDefault:r}){let i=this.dom.createComponent("cl\
ump"),a=this.dom.find(".lh-clump",i);r&&a.setAttribute("open","");let l=this.dom.find(".lh-audit-group__header",a),s=this._clumpTitles[e];this.dom.find(".lh-audit-group__title",l).textContent=s;let c=this.dom.find(".lh-audit-group__itemcount",a);c.textContent=`(${t.length})`;let d=t.map(p=>p instanceof HTMLElement?p:this.renderAudit(p));a.append(...d);let h=this.dom.find(".lh-audit-group",i);if(n){let p=this.dom.convertMarkdownLinkSnippets(n);p.classList.add("lh-audit-group__description","lh-audit-group__footer"),h.append(p)}return this.dom.find(".lh-clump-toggletext--show",h).textContent=m.strings.show,this.dom.find(".lh-clump-toggletext--hide",h).textContent=m.strings.hide,a.classList.add(`lh-clump--${e.toLowerCase()}`),h}renderCategoryScore(e,t,n){let r;if(n&&k.shouldDisplayAsFraction(n.gatherMode,e)?r=this.renderCategoryFraction(e):r=this.renderScoreGauge(e,t),n?.omitLabel&&this.dom.find(".lh-gauge__label,.lh-fraction__label",r).remove(),n?.onPageAnchorRendered){let i=this.dom.find\
("a",r);n.onPageAnchorRendered(i)}return r}renderScoreGauge(e,t){let n=this.dom.createComponent("gauge"),r=this.dom.find("a.lh-gauge__wrapper",n);k.isPluginCategory(e.id)&&r.classList.add("lh-gauge__wrapper--plugin");let i=Number(e.score),a=this.dom.find(".lh-gauge",n),l=this.dom.find("circle.lh-gauge-arc",a);l&&this._setGaugeArc(l,i);let s=Math.round(i*100),c=this.dom.find("div.lh-gauge__percentage",n);return c.textContent=s.toString(),e.score===null&&(c.classList.add("lh-gauge--error"),c.textContent="",c.title=m.strings.errorLabel),e.auditRefs.length===0||this.hasApplicableAudits(e)?r.classList.add(`lh-gauge__wrapper--${k.calculateRating(e.score)}`):(r.classList.add("lh-gauge__wrapper--not-applicable"),c.textContent="-",c.title=m.strings.notApplicableAuditsGroupTitle),this.dom.find(".lh-gauge__label",n).textContent=e.title,n}renderCategoryFraction(e){let t=this.dom.createComponent("fraction"),n=this.dom.find("a.lh-fraction__wrapper",t),{numPassed:r,numPassableAudits:i,totalWeight:a}=\
k.calculateCategoryFraction(e),l=r/i,s=this.dom.find(".lh-fraction__content",t),c=this.dom.createElement("span");c.textContent=`${r}/${i}`,s.append(c);let d=k.calculateRating(l);return a===0&&(d="null"),n.classList.add(`lh-fraction__wrapper--${d}`),this.dom.find(".lh-fraction__label",t).textContent=e.title,t}hasApplicableAudits(e){return e.auditRefs.some(t=>t.result.scoreDisplayMode!=="notApplicable")}_setGaugeArc(e,t){let n=2*Math.PI*Number(e.getAttribute("r")),r=Number(e.getAttribute("stroke-width")),i=.25*r/n;e.style.transform=`rotate(${-90+i*360}deg)`;let a=t*n-r/2;t===0&&(e.style.opacity="0"),t===1&&(a=n),e.style.strokeDasharray=`${Math.max(a,0)} ${n}`}_auditHasWarning(e){return!!e.result.warnings?.length}_getClumpIdForAuditRef(e){let t=e.result.scoreDisplayMode;return t==="manual"||t==="notApplicable"?t:k.showAsPassed(e.result)?this._auditHasWarning(e)?"warning":"passed":"failed"}render(e,t={},n){let r=this.dom.createElement("div","lh-category");r.id=e.id,r.append(this.renderCate\
goryHeader(e,t,n));let i=new Map;i.set("failed",[]),i.set("warning",[]),i.set("manual",[]),i.set("passed",[]),i.set("notApplicable",[]);for(let l of e.auditRefs){if(l.group==="hidden")continue;let s=this._getClumpIdForAuditRef(l),c=i.get(s);c.push(l),i.set(s,c)}for(let l of i.values())l.sort((s,c)=>c.weight-s.weight);let a=i.get("failed")?.length;for(let[l,s]of i){if(s.length===0)continue;if(l==="failed"){let p=this.renderUnexpandableClump(s,t);p.classList.add("lh-clump--failed"),r.append(p);continue}let c=l==="manual"?e.manualDescription:void 0,d=l==="warning"||l==="manual"&&a===0,h=this.renderClump(l,{auditRefsOrEls:s,description:c,openByDefault:d});r.append(h)}return r}};var Y=class{static createSegment(e,t,n,r){let i=e[t],a=Object.keys(e),l=a.indexOf(t)===a.length-1,s=!!i.children&&Object.keys(i.children).length>0,c=Array.isArray(n)?n.slice(0):[];return typeof r<"u"&&c.push(!r),{node:i,isLastChild:l,hasChildren:s,treeMarkers:c}}static createChainNode(e,t,n){let r=e.createComponent(\
"crcChain"),i,a,l,s,c;"request"in t.node?(a=t.node.request.transferSize,l=t.node.request.url,i=(t.node.request.endTime-t.node.request.startTime)*1e3,s=!1):(a=t.node.transferSize,l=t.node.url,i=t.node.navStartToEndTime,s=!0,c=t.node.isLongest);let d=e.find(".lh-crc-node",r);d.setAttribute("title",l),c&&d.classList.add("lh-crc-node__longest");let h=e.find(".lh-crc-node__tree-marker",r);t.treeMarkers.forEach(f=>{let u=f?"lh-tree-marker lh-vert":"lh-tree-marker";h.append(e.createElement("span",u),e.createElement("span","lh-tree-marker"))});let p=t.isLastChild?"lh-tree-marker lh-up-right":"lh-tree-marker lh-vert-right",g=t.hasChildren?"lh-tree-marker lh-horiz-down":"lh-tree-marker lh-right";h.append(e.createElement("span",p),e.createElement("span","lh-tree-marker lh-right"),e.createElement("span",g));let b=n.renderTextURL(l),w=e.find(".lh-crc-node__tree-value",r);if(w.append(b),!t.hasChildren||s){let f=e.createElement("span","lh-crc-node__chain-duration");f.textContent=" - "+m.i18n.formatMi\
lliseconds(i)+", ";let u=e.createElement("span","lh-crc-node__chain-size");u.textContent=m.i18n.formatBytesToKiB(a,.01),w.append(f,u)}return r}static buildTree(e,t,n,r){if(n.append(Q.createChainNode(e,t,r)),t.node.children)for(let i of Object.keys(t.node.children)){let a=Q.createSegment(t.node.children,i,t.treeMarkers,t.isLastChild);Q.buildTree(e,a,n,r)}}static render(e,t,n){let r=e.createComponent("crc"),i=e.find(".lh-crc",r);e.find(".lh-crc-initial-nav",r).textContent=m.strings.crcInitialNavigation,e.find(".lh-crc__longest_duration_label",r).textContent=m.strings.crcLongestDurationLabel,e.find(".lh-crc__longest_duration",r).textContent=m.i18n.formatMilliseconds(t.longestChain.duration);let a=t.chains;for(let l of Object.keys(a)){let s=Q.createSegment(a,l);Q.buildTree(e,s,i,n)}return e.find(".lh-crc-container",r)}},Q=Y;function pt(o,e){return e.left<=o.width&&0<=e.right&&e.top<=o.height&&0<=e.bottom}function ke(o,e,t){return o<e?e:o>t?t:o}function ut(o){return{x:o.left+o.width/2,y:o.t\
op+o.height/2}}var V=class o{static getScreenshotPositions(e,t,n){let r=ut(e),i=ke(r.x-t.width/2,0,n.width-t.width),a=ke(r.y-t.height/2,0,n.height-t.height);return{screenshot:{left:i,top:a},clip:{left:e.left-i,top:e.top-a}}}static renderClipPathInScreenshot(e,t,n,r,i){let a=e.find("clipPath",t),l=`clip-${m.getUniqueSuffix()}`;a.id=l,t.style.clipPath=`url(#${l})`;let s=n.top/i.height,c=s+r.height/i.height,d=n.left/i.width,h=d+r.width/i.width,p=[`0,0             1,0            1,${s}          0,${s}`,`0,${c}     1,${c}    1,1               0,1`,`0,${s}        ${d},${s} ${d},${c} 0,${c}`,`${h},${s} 1,${s}       1,${c}       ${h},${c}`];for(let g of p){let b=e.createElementNS("http://www.w3.org/2000/svg","polygon");b.setAttribute("points",g),a.append(b)}}static installFullPageScreenshot(e,t){e.style.setProperty("--element-screenshot-url",`url(\'${t.data}\')`)}static installOverlayFeature(e){let{dom:t,rootEl:n,overlayContainerEl:r,fullPageScreenshot:i}=e,a="lh-screenshot-overlay--enabled";n.c\
lassList.contains(a)||(n.classList.add(a),n.addEventListener("click",l=>{let s=l.target;if(!s)return;let c=s.closest(".lh-node > .lh-element-screenshot");if(!c)return;let d=t.createElement("div","lh-element-screenshot__overlay");r.append(d);let h={width:d.clientWidth*.95,height:d.clientHeight*.8},p={width:Number(c.dataset.rectWidth),height:Number(c.dataset.rectHeight),left:Number(c.dataset.rectLeft),right:Number(c.dataset.rectLeft)+Number(c.dataset.rectWidth),top:Number(c.dataset.rectTop),bottom:Number(c.dataset.rectTop)+Number(c.dataset.rectHeight)},g=o.render(t,i.screenshot,p,h);if(!g){d.remove();return}d.append(g),d.addEventListener("click",()=>d.remove())}))}static _computeZoomFactor(e,t){let r={x:t.width/e.width,y:t.height/e.height},i=.75*Math.min(r.x,r.y);return Math.min(1,i)}static render(e,t,n,r){if(!pt(t,n))return null;let i=e.createComponent("elementScreenshot"),a=e.find("div.lh-element-screenshot",i);a.dataset.rectWidth=n.width.toString(),a.dataset.rectHeight=n.height.toStri\
ng(),a.dataset.rectLeft=n.left.toString(),a.dataset.rectTop=n.top.toString();let l=this._computeZoomFactor(n,r),s={width:r.width/l,height:r.height/l};s.width=Math.min(t.width,s.width),s.height=Math.min(t.height,s.height);let c={width:s.width*l,height:s.height*l},d=o.getScreenshotPositions(n,s,{width:t.width,height:t.height}),h=e.find("div.lh-element-screenshot__image",a);h.style.width=c.width+"px",h.style.height=c.height+"px",h.style.backgroundPositionY=-(d.screenshot.top*l)+"px",h.style.backgroundPositionX=-(d.screenshot.left*l)+"px",h.style.backgroundSize=`${t.width*l}px ${t.height*l}px`;let p=e.find("div.lh-element-screenshot__element-marker",a);p.style.width=n.width*l+"px",p.style.height=n.height*l+"px",p.style.left=d.clip.left*l+"px",p.style.top=d.clip.top*l+"px";let g=e.find("div.lh-element-screenshot__mask",a);return g.style.width=c.width+"px",g.style.height=c.height+"px",o.renderClipPathInScreenshot(e,g,d.clip,n,s),a}};var gt=["http://","https://","data:"],mt=["bytes","numeric"\
,"ms","timespanMs"],X=class{constructor(e,t={}){this._dom=e,this._fullPageScreenshot=t.fullPageScreenshot,this._entities=t.entities}render(e){switch(e.type){case"filmstrip":return this._renderFilmstrip(e);case"list":return this._renderList(e);case"checklist":return this._renderChecklist(e);case"table":case"opportunity":return this._renderTable(e);case"network-tree":case"criticalrequestchain":return Y.render(this._dom,e,this);case"screenshot":case"debugdata":case"treemap-data":return null;default:return this._renderUnknown(e.type,e)}}_renderBytes(e){let t=m.i18n.formatBytesToKiB(e.value,e.granularity||.1),n=this._renderText(t);return n.title=m.i18n.formatBytes(e.value),n}_renderMilliseconds(e){let t;return e.displayUnit==="duration"?t=m.i18n.formatDuration(e.value):t=m.i18n.formatMilliseconds(e.value,e.granularity||10),this._renderText(t)}renderTextURL(e){let t=e,n,r,i;try{let l=E.parseURL(t);n=l.file==="/"?l.origin:l.file,r=l.file==="/"||l.hostname===""?"":`(${l.hostname})`,i=t}catch{n\
=t}let a=this._dom.createElement("div","lh-text__url");if(a.append(this._renderLink({text:n,url:t})),r){let l=this._renderText(r);l.classList.add("lh-text__url-host"),a.append(l)}return i&&(a.title=t,a.dataset.url=t),a}_renderLink(e){let t=this._dom.createElement("a");if(this._dom.safelySetHref(t,e.url),!t.href){let n=this._renderText(e.text);return n.classList.add("lh-link"),n}return t.rel="noopener",t.target="_blank",t.textContent=e.text,t.classList.add("lh-link"),t}_renderText(e){let t=this._dom.createElement("div","lh-text");return t.textContent=e,t}_renderBaselineStatus(e){let t=this._dom.createElement("div","lh-baseline-status"),n=e.status;return t.classList.add(`lh-baseline-status--${n}`),t.textContent=String(e.displayString),t}_renderNumeric(e){let t=m.i18n.formatNumber(e.value,e.granularity||.1),n=this._dom.createElement("div","lh-numeric");return n.textContent=t,n}_renderThumbnail(e){let t=this._dom.createElement("img","lh-thumbnail"),n=e;return t.src=n,t.title=n,t.alt="",t}_\
renderUnknown(e,t){console.error(`Unknown details type: ${e}`,t);let n=this._dom.createElement("details","lh-unknown");return this._dom.createChildOf(n,"summary").textContent=`We don\'t know how to render audit details of type \\`${e}\\`. The Lighthouse version that collected this data is likely newer than the Lighthouse version of the report renderer. Expand for the raw JSON.`,this._dom.createChildOf(n,"pre").textContent=JSON.stringify(t,null,2),n}_renderTableValue(e,t){if(e==null)return null;if(typeof e=="object")switch(e.type){case"code":return this._renderCode(e.value);case"link":return this._renderLink(e);case"node":return this.renderNode(e);case"numeric":return this._renderNumeric(e);case"text":return this._renderText(e.value);case"source-location":return this.renderSourceLocation(e);case"url":return this.renderTextURL(e.value);case"baseline-status":return this._renderBaselineStatus(e);default:return this._renderUnknown(e.type,e)}switch(t.valueType){case"bytes":{let n=Number(e);retu\
rn this._renderBytes({value:n,granularity:t.granularity})}case"code":{let n=String(e);return this._renderCode(n)}case"ms":{let n={value:Number(e),granularity:t.granularity,displayUnit:t.displayUnit};return this._renderMilliseconds(n)}case"numeric":{let n=Number(e);return this._renderNumeric({value:n,granularity:t.granularity})}case"text":{let n=String(e);return this._renderText(n)}case"thumbnail":{let n=String(e);return this._renderThumbnail(n)}case"timespanMs":{let n=Number(e);return this._renderMilliseconds({value:n})}case"url":{let n=String(e);return gt.some(r=>n.startsWith(r))?this.renderTextURL(n):this._renderCode(n)}default:return this._renderUnknown(t.valueType,e)}}_getDerivedSubItemsHeading(e){return e.subItemsHeading?{key:e.subItemsHeading.key||"",valueType:e.subItemsHeading.valueType||e.valueType,granularity:e.subItemsHeading.granularity||e.granularity,displayUnit:e.subItemsHeading.displayUnit||e.displayUnit,label:""}:null}_renderTableRow(e,t){let n=this._dom.createElement("t\
r");for(let r of t){if(!r||!r.key){this._dom.createChildOf(n,"td","lh-table-column--empty");continue}let i=e[r.key],a;if(i!=null&&(a=this._renderTableValue(i,r)),a){let l=`lh-table-column--${r.valueType}`;this._dom.createChildOf(n,"td",l).append(a)}else this._dom.createChildOf(n,"td","lh-table-column--empty")}return n}_renderTableRowsFromItem(e,t){let n=this._dom.createFragment();if(n.append(this._renderTableRow(e,t)),!e.subItems)return n;let r=t.map(this._getDerivedSubItemsHeading);if(!r.some(Boolean))return n;for(let i of e.subItems.items){let a=this._renderTableRow(i,r);a.classList.add("lh-sub-item-row"),n.append(a)}return n}_adornEntityGroupRow(e){let t=e.dataset.entity;if(!t)return;let n=this._entities?.find(i=>i.name===t);if(!n)return;let r=this._dom.find("td",e);if(n.category){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn"),i.textContent=n.category,r.append(" ",i)}if(n.isFirstParty){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn",\
"lh-audit__adorn1p"),i.textContent=m.strings.firstPartyChipLabel,r.append(" ",i)}if(n.homepage){let i=this._dom.createElement("a");i.href=n.homepage,i.target="_blank",i.title=m.strings.openInANewTabTooltip,i.classList.add("lh-report-icon--external"),r.append(" ",i)}}_renderEntityGroupRow(e,t){let n={...t[0]};n.valueType="text";let r=[n,...t.slice(1)],i=this._dom.createFragment();return i.append(this._renderTableRow(e,r)),this._dom.find("tr",i).classList.add("lh-row--group"),i}_getEntityGroupItems(e){let{items:t,headings:n,sortedBy:r}=e;if(!t.length||e.isEntityGrouped||!t.some(d=>d.entity))return[];let i=new Set(e.skipSumming||[]),a=[];for(let d of n)!d.key||i.has(d.key)||mt.includes(d.valueType)&&a.push(d.key);let l=n[0].key;if(!l)return[];let s=new Map;for(let d of t){let h=typeof d.entity=="string"?d.entity:void 0,p=s.get(h)||{[l]:h||m.strings.unattributable,entity:h};for(let g of a)p[g]=Number(p[g]||0)+Number(d[g]||0);s.set(h,p)}let c=[...s.values()];return r&&c.sort(k.getTableItemS\
ortComparator(r)),c}_renderTable(e){if(!e.items.length)return this._dom.createElement("span");let t=this._dom.createElement("table","lh-table"),n=this._dom.createChildOf(t,"thead"),r=this._dom.createChildOf(n,"tr");for(let l of e.headings){let c=`lh-table-column--${l.valueType||"text"}`,d=this._dom.createElement("div","lh-text");d.textContent=l.label,this._dom.createChildOf(r,"th",c).append(d)}let i=this._getEntityGroupItems(e),a=this._dom.createChildOf(t,"tbody");if(i.length)for(let l of i){let s=typeof l.entity=="string"?l.entity:void 0,c=this._renderEntityGroupRow(l,e.headings);for(let h of e.items.filter(p=>p.entity===s))c.append(this._renderTableRowsFromItem(h,e.headings));let d=this._dom.findAll("tr",c);s&&d.length&&(d.forEach(h=>h.dataset.entity=s),this._adornEntityGroupRow(d[0])),a.append(c)}else{let l=!0;for(let s of e.items){let c=this._renderTableRowsFromItem(s,e.headings),d=this._dom.findAll("tr",c),h=d[0];if(typeof s.entity=="string"&&(h.dataset.entity=s.entity),e.isEntity\
Grouped&&s.entity)h.classList.add("lh-row--group"),this._adornEntityGroupRow(h);else for(let p of d)p.classList.add(l?"lh-row--even":"lh-row--odd");l=!l,a.append(c)}}return t}_renderListValue(e){return e.type==="node"?this.renderNode(e):e.type==="text"?this._renderText(e.value):this.render(e)}_renderList(e){let t=this._dom.createElement("div","lh-list");return e.items.forEach(n=>{if(n.type==="list-section"){let i=this._dom.createElement("div","lh-list-section");n.title&&this._dom.createChildOf(i,"div","lh-list-section__title").append(this._dom.convertMarkdownLinkSnippets(n.title)),n.description&&this._dom.createChildOf(i,"div","lh-list-section__description").append(this._dom.convertMarkdownLinkSnippets(n.description));let a=this._renderListValue(n.value);a&&i.append(a),t.append(i);return}let r=this._renderListValue(n);r&&t.append(r)}),t}_renderChecklist(e){let t=this._dom.createElement("ul","lh-checklist");return Object.values(e.items).forEach(n=>{let r=this._dom.createChildOf(t,"li","\
lh-checklist-item"),i=n.value?"lh-report-plain-icon--checklist-pass":"lh-report-plain-icon--checklist-fail";this._dom.createChildOf(r,"span",`lh-report-plain-icon ${i}`).textContent=n.label}),t}renderNode(e){let t=this._dom.createElement("span","lh-node");if(e.nodeLabel){let a=this._dom.createElement("div");a.textContent=e.nodeLabel,t.append(a)}if(e.snippet){let a=this._dom.createElement("div");a.classList.add("lh-node__snippet"),a.textContent=e.snippet,t.append(a)}if(e.selector&&(t.title=e.selector),e.path&&t.setAttribute("data-path",e.path),e.selector&&t.setAttribute("data-selector",e.selector),e.snippet&&t.setAttribute("data-snippet",e.snippet),!this._fullPageScreenshot)return t;let n=e.lhId&&this._fullPageScreenshot.nodes[e.lhId];if(!n||n.width===0||n.height===0)return t;let r={width:147,height:100},i=V.render(this._dom,this._fullPageScreenshot.screenshot,n,r);return i&&t.prepend(i),t}renderSourceLocation(e){if(!e.url)return null;let t=`${e.url}:${e.line+1}:${e.column}`,n;e.origina\
l&&(n=`${e.original.file||"<unmapped>"}:${e.original.line+1}:${e.original.column}`);let r;if(e.urlProvider==="network"&&n)r=this._renderLink({url:e.url,text:n}),r.title=`maps to generated location ${t}`;else if(e.urlProvider==="network"&&!n)r=this.renderTextURL(e.url),this._dom.find(".lh-link",r).textContent+=`:${e.line+1}:${e.column}`;else if(e.urlProvider==="comment"&&n)r=this._renderText(`${n} (from source map)`),r.title=`${t} (from sourceURL)`;else if(e.urlProvider==="comment"&&!n)r=this._renderText(`${t} (from sourceURL)`);else return null;return r.classList.add("lh-source-location"),r.setAttribute("data-source-url",e.url),r.setAttribute("data-source-line",String(e.line)),r.setAttribute("data-source-column",String(e.column)),r}_renderFilmstrip(e){let t=this._dom.createElement("div","lh-filmstrip");for(let n of e.items){let r=this._dom.createChildOf(t,"div","lh-filmstrip__frame"),i=this._dom.createChildOf(r,"img","lh-filmstrip__thumbnail");i.src=n.data,i.alt="Screenshot"}return t}_\
renderCode(e){let t=this._dom.createElement("pre","lh-code");return t.textContent=e,t}};var te=class{constructor(e){e==="en-XA"&&(e="de"),this._locale=e,this._cachedNumberFormatters=new Map}_formatNumberWithGranularity(e,t,n={}){if(t!==void 0){let a=-Math.log10(t);Number.isInteger(a)||(console.warn(`granularity of ${t} is invalid. Using 1 instead`),t=1),t<1&&(n={...n},n.minimumFractionDigits=n.maximumFractionDigits=Math.ceil(a)),e=Math.round(e/t)*t,Object.is(e,-0)&&(e=0)}else Math.abs(e)<5e-4&&(e=0);let r,i=[n.minimumFractionDigits,n.maximumFractionDigits,n.style,n.unit,n.unitDisplay,this._locale].join("");return r=this._cachedNumberFormatters.get(i),r||(r=new Intl.NumberFormat(this._locale,n),this._cachedNumberFormatters.set(i,r)),r.format(e).replace(" ","\\xA0")}formatNumber(e,t){return this._formatNumberWithGranularity(e,t)}formatInteger(e){return this._formatNumberWithGranularity(e,1)}formatPercent(e){return new Intl.NumberFormat(this._locale,{style:"percent"}).format(e)}formatBytes\
ToKiB(e,t=void 0){return this._formatNumberWithGranularity(e/1024,t)+"\\xA0KiB"}formatBytesToMiB(e,t=void 0){return this._formatNumberWithGranularity(e/1048576,t)+"\\xA0MiB"}formatBytes(e,t=1){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"long"})}formatBytesWithBestUnit(e,t=.1){return e>=1048576?this.formatBytesToMiB(e,t):e>=1024?this.formatBytesToKiB(e,t):this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"narrow"})}formatKbps(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"kilobit-per-second",unitDisplay:"short"})}formatMilliseconds(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"millisecond",unitDisplay:"short"})}formatSeconds(e,t=void 0){return this._formatNumberWithGranularity(e/1e3,t,{style:"unit",unit:"second",unitDisplay:"narrow"})}formatDateTime(e){let t={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"numeric",timeZoneName:"short"},n;try{n=n\
ew Intl.DateTimeFormat(this._locale,t)}catch{t.timeZone="UTC",n=new Intl.DateTimeFormat(this._locale,t)}return n.format(new Date(e))}formatDuration(e){let t=e/1e3;if(Math.round(t)===0)return"None";let n=[],r={day:3600*24,hour:3600,minute:60,second:1};return Object.keys(r).forEach(i=>{let a=r[i],l=Math.floor(t/a);if(l>0){t-=l*a;let s=this._formatNumberWithGranularity(l,1,{style:"unit",unit:i,unitDisplay:"narrow"});n.push(s)}}),n.join(" ")}};function Ee(o){let e=o.createComponent("explodeyGauge");return o.find(".lh-exp-gauge-component",e)}function Le(o,e,t){let n=o.find("div.lh-exp-gauge__wrapper",e);n.className="",n.classList.add("lh-exp-gauge__wrapper",`lh-exp-gauge__wrapper--${k.calculateRating(t.score)}`),vt(o,n,t)}function ft(o,e,t){t=t||o/32;let n=o/t,r=.5*t,i=n+r+t,a=2*Math.PI*n,l=Math.acos(1-.5*Math.pow(.5*t/n,2))*n,s=2*Math.PI*i,c=Math.acos(1-.5*Math.pow(.5*t/i,2))*i;return{radiusInner:n,radiusOuter:i,circumferenceInner:a,circumferenceOuter:s,getArcLength:()=>Math.max(0,Number(e\
*a)),getMetricArcLength:(d,h=!1)=>{let p=h?0:2*c;return Math.max(0,Number(d*s-r-p))},endDiffInner:l,endDiffOuter:c,strokeWidth:t,strokeGap:r}}function vt(o,e,t){let i=Number(t.score),{radiusInner:a,radiusOuter:l,circumferenceInner:s,circumferenceOuter:c,getArcLength:d,getMetricArcLength:h,endDiffInner:p,endDiffOuter:g,strokeWidth:b,strokeGap:w}=ft(128,i),f=o.find("svg.lh-exp-gauge",e);o.find(".lh-exp-gauge__label",f).textContent=t.title,f.setAttribute("viewBox",[-64,-64/2,128,128/2].join(" ")),f.style.setProperty("--stroke-width",`${b}px`),f.style.setProperty("--circle-meas",(2*Math.PI).toFixed(4));let u=o.find("g.lh-exp-gauge__outer",e),v=o.find("g.lh-exp-gauge__inner",e),_=o.find("circle.lh-cover",u),x=o.find("circle.lh-exp-gauge__arc",v),L=o.find("text.lh-exp-gauge__percentage",v);u.style.setProperty("--scale-initial",String(a/l)),u.style.setProperty("--radius",`${l}px`),_.style.setProperty("--radius",`${.5*(a+l)}px`),_.setAttribute("stroke-width",String(w)),f.style.setProperty("--r\
adius",`${a}px`),x.setAttribute("stroke-dasharray",`${d()} ${(s-d()).toFixed(4)}`),x.setAttribute("stroke-dashoffset",String(.25*s-p)),L.textContent=Math.round(i*100).toString();let C=l+b,z=l-b,M=t.auditRefs.filter(y=>y.group==="metrics"&&y.weight),$=M.reduce((y,S)=>y+=S.weight,0),R=.25*c-g-.5*w,N=-.5*Math.PI;u.querySelectorAll(".metric").forEach(y=>{M.map(F=>`metric--${F.id}`).find(F=>y.classList.contains(F))||y.remove()}),M.forEach((y,S)=>{let A=y.acronym??y.id,F=!u.querySelector(`.metric--${A}`),T=o.maybeFind(`g.metric--${A}`,u)||o.createSVGElement("g"),B=o.maybeFind(`.metric--${A} circle.lh-exp-gauge--faded`,u)||o.createSVGElement("circle"),K=o.maybeFind(`.metric--${A} circle.lh-exp-gauge--miniarc`,u)||o.createSVGElement("circle"),q=o.maybeFind(`.metric--${A} circle.lh-exp-gauge-hovertarget`,u)||o.createSVGElement("circle"),P=o.maybeFind(`.metric--${A} text.metric__label`,u)||o.createSVGElement("text"),H=o.maybeFind(`.metric--${A} text.metric__value`,u)||o.createSVGElement("text");\
T.classList.add("metric",`metric--${A}`),B.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--faded"),K.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--miniarc"),q.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget");let j=y.weight/$,de=h(j),he=y.result.score?y.result.score*j:0,pe=h(he),Pe=j*c,ue=h(j,!0),ge=k.calculateRating(y.result.score,y.result.scoreDisplayMode);T.style.setProperty("--metric-rating",ge),T.style.setProperty("--metric-color",`var(--color-${ge})`),T.style.setProperty("--metric-offset",`${R}`),T.style.setProperty("--i",S.toString()),B.setAttribute("stroke-dasharray",`${de} ${c-de}`),K.style.setProperty("--metric-array",`${pe} ${c-pe}`),q.setAttribute("stroke-dasharray",`${ue} ${c-ue-g}`),P.classList.add("metric__label"),H.classList.add("metric__value"),P.textContent=A,H.textContent=`+${Math.round(he*100)}`;let me=N+j*Math.PI,Z=Math.cos(me),J=Math.sin(me);switch(!0){case Z>0:H.se\
tAttribute("text-anchor","end");break;case Z<0:P.setAttribute("text-anchor","end");break;case Z===0:P.setAttribute("text-anchor","middle"),H.setAttribute("text-anchor","middle");break}switch(!0){case J>0:P.setAttribute("dominant-baseline","hanging");break;case J<0:H.setAttribute("dominant-baseline","hanging");break;case J===0:P.setAttribute("dominant-baseline","middle"),H.setAttribute("dominant-baseline","middle");break}P.setAttribute("x",(C*Z).toFixed(2)),P.setAttribute("y",(C*J).toFixed(2)),H.setAttribute("x",(z*Z).toFixed(2)),H.setAttribute("y",(z*J).toFixed(2)),F&&(T.appendChild(B),T.appendChild(K),T.appendChild(q),T.appendChild(P),T.appendChild(H),u.appendChild(T)),R-=Pe,N+=j*2*Math.PI});let D=u.querySelector(".lh-exp-gauge-underhovertarget")||o.createSVGElement("circle");D.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget","lh-exp-gauge-underhovertarget");let I=h(1,!0);if(D.setAttribute("stroke-dasharray",`${I} ${c-I-g}`),D.isConnected||u.pre\
pend(D),f.dataset.listenersSetup)return;f.dataset.listenersSetup=!0,De(f),f.addEventListener("pointerover",y=>{if(y.target===f&&f.classList.contains("state--expanded")){f.classList.remove("state--expanded"),f.classList.contains("state--highlight")&&(f.classList.remove("state--highlight"),o.find(".metric--highlight",f).classList.remove("metric--highlight"));return}if(!(y.target instanceof Element))return;let S=y.target.parentNode;if(S instanceof SVGElement){if(S&&S===v){f.classList.contains("state--expanded")?f.classList.contains("state--highlight")&&(f.classList.remove("state--highlight"),o.find(".metric--highlight",f).classList.remove("metric--highlight")):f.classList.add("state--expanded");return}if(S&&S.classList&&S.classList.contains("metric")){let A=S.style.getPropertyValue("--metric-rating");if(e.style.setProperty("--color-highlight",`var(--color-${A}-secondary)`),!f.classList.contains("state--highlight"))f.classList.add("state--highlight"),S.classList.add("metric--highlight");el\
se{let F=o.find(".metric--highlight",f);S!==F&&(F.classList.remove("metric--highlight"),S.classList.add("metric--highlight"))}}}}),f.addEventListener("mouseleave",()=>{f.classList.remove("state--highlight"),f.querySelector(".metric--highlight")?.classList.remove("metric--highlight")});async function De(y){if(await new Promise(P=>setTimeout(P,1e3)),y.classList.contains("state--expanded"))return;let S=o.find(".lh-exp-gauge__inner",y),A=`uniq-${Math.random()}`;S.setAttribute("id",A);let F=o.createSVGElement("use");F.setAttribute("href",`#${A}`),y.appendChild(F);let T=2.5;y.style.setProperty("--peek-dur",`${T}s`),y.classList.add("state--peek","state--expanded");let B=()=>{y.classList.remove("state--peek","state--expanded"),F.remove()},K=setTimeout(()=>{y.removeEventListener("mouseenter",q),B()},T*1e3*1.5);function q(){clearTimeout(K),B()}y.addEventListener("mouseenter",q,{once:!0})}}var ne=class extends G{_renderMetric(e){let t=this.dom.createComponent("metric"),n=this.dom.find(".lh-metric\
",t);n.id=e.result.id;let r=k.calculateRating(e.result.score,e.result.scoreDisplayMode);n.classList.add(`lh-metric--${r}`);let i=this.dom.find(".lh-metric__title",t);i.textContent=e.result.title;let a=this.dom.find(".lh-metric__value",t);a.textContent=e.result.displayValue||"";let l=this.dom.find(".lh-metric__description",t);if(l.append(this.dom.convertMarkdownLinkSnippets(e.result.description)),e.result.scoreDisplayMode==="error"){l.textContent="",a.textContent="Error!";let s=this.dom.createChildOf(l,"span");s.textContent=e.result.errorMessage||"Report error: no metric information"}else e.result.scoreDisplayMode==="notApplicable"&&(a.textContent="--");return n}_getScoringCalculatorHref(e){let t=e.filter(h=>h.group==="metrics"),n=e.find(h=>h.id==="interactive"),r=e.find(h=>h.id==="first-cpu-idle"),i=e.find(h=>h.id==="first-meaningful-paint");n&&t.push(n),r&&t.push(r),i&&typeof i.result.score=="number"&&t.push(i);let a=h=>Math.round(h*100)/100,s=[...t.map(h=>{let p;return typeof h.resul\
t.numericValue=="number"?(p=h.id==="cumulative-layout-shift"?a(h.result.numericValue):Math.round(h.result.numericValue),p=p.toString()):p="null",[h.acronym||h.id,p]})];m.reportJson&&(s.push(["device",m.reportJson.configSettings.formFactor]),s.push(["version",m.reportJson.lighthouseVersion]));let c=new URLSearchParams(s),d=new URL("https://googlechrome.github.io/lighthouse/scorecalc/");return d.hash=c.toString(),d.href}overallImpact(e,t){if(!e.result.metricSavings)return{overallImpact:0,overallLinearImpact:0};let n=0,r=0;for(let[i,a]of Object.entries(e.result.metricSavings)){if(a===void 0)continue;let l=t.find(g=>g.acronym===i);if(!l||l.result.score===null)continue;let s=l.result.numericValue;if(!s)continue;let c=a/s*l.weight;r+=c;let d=l.result.scoringOptions;if(!d)continue;let p=(E.computeLogNormalScore(d,s-a)-l.result.score)*l.weight;n+=p}return{overallImpact:n,overallLinearImpact:r}}render(e,t,n){let r=m.strings,i=this.dom.createElement("div","lh-category");i.id=e.id,i.append(this.r\
enderCategoryHeader(e,t,n));let a=e.auditRefs.filter(p=>p.group==="metrics");if(a.length){let[p,g]=this.renderAuditGroup(t.metrics),b=this.dom.createElement("input","lh-metrics-toggle__input"),w=`lh-metrics-toggle${m.getUniqueSuffix()}`;b.setAttribute("aria-label","Toggle the display of metric descriptions"),b.type="checkbox",b.id=w,p.prepend(b);let f=this.dom.find(".lh-audit-group__header",p),u=this.dom.createChildOf(f,"label","lh-metrics-toggle__label");u.htmlFor=w;let v=this.dom.createChildOf(u,"span","lh-metrics-toggle__labeltext--show"),_=this.dom.createChildOf(u,"span","lh-metrics-toggle__labeltext--hide");v.textContent=m.strings.expandView,_.textContent=m.strings.collapseView;let x=this.dom.createElement("div","lh-metrics-container");if(p.insertBefore(x,g),a.forEach(L=>{x.append(this._renderMetric(L))}),i.querySelector(".lh-gauge__wrapper")){let L=this.dom.find(".lh-category-header__description",i),C=this.dom.createChildOf(L,"div","lh-metrics__disclaimer"),z=this.dom.convertMark\
downLinkSnippets(r.varianceDisclaimer);C.append(z);let M=this.dom.createChildOf(C,"a","lh-calclink");M.target="_blank",M.textContent=r.calculatorLink,this.dom.safelySetHref(M,this._getScoringCalculatorHref(e.auditRefs))}p.classList.add("lh-audit-group--metrics"),i.append(p)}let l=this.dom.createChildOf(i,"div","lh-filmstrip-container"),c=e.auditRefs.find(p=>p.id==="screenshot-thumbnails")?.result;if(c?.details){l.id=c.id;let p=this.detailsRenderer.render(c.details);p&&l.append(p)}let d=this.renderFilterableSection(e,t,["insights","diagnostics"],a);if(d&&(d.classList.add("lh-perf-audits"),i.append(d)),(!n||n?.gatherMode==="navigation")&&e.score!==null){let p=Ee(this.dom);Le(this.dom,p,e),this.dom.find(".lh-score__gauge",i).replaceWith(p)}return i}renderFilterableSection(e,t,n,r){if(n.some(u=>!t[u]))return null;let i=this.dom.createElement("div"),a=u=>u.group??"",s=e.auditRefs.filter(u=>n.includes(a(u))).map(u=>{let{overallImpact:v,overallLinearImpact:_}=this.overallImpact(u,r),x=u.resul\
t.guidanceLevel||1,L=this.renderAudit(u);return{auditRef:u,auditEl:L,overallImpact:v,overallLinearImpact:_,guidanceLevel:x}}),c=s.filter(u=>!k.showAsPassed(u.auditRef.result)),d=s.filter(u=>k.showAsPassed(u.auditRef.result)),h={};for(let u of n){let v=this.renderAuditGroup(t[u]);v[0].classList.add(`lh-audit-group--${u}`),h[u]=v}function p(u){for(let v of s)if(u==="All")v.auditEl.hidden=!1;else{let _=v.auditRef.result.metricSavings?.[u]===void 0;v.auditEl.hidden=_}c.sort((v,_)=>{let x=v.auditRef.result.score||0,L=_.auditRef.result.score||0;if(x!==L)return x-L;if(u!=="All"){let C=v.auditRef.result.metricSavings?.[u]??-1,z=_.auditRef.result.metricSavings?.[u]??-1;if(C!==z)return z-C}return v.overallImpact!==_.overallImpact?_.overallImpact*_.guidanceLevel-v.overallImpact*v.guidanceLevel:v.overallImpact===0&&_.overallImpact===0&&v.overallLinearImpact!==_.overallLinearImpact?_.overallLinearImpact*_.guidanceLevel-v.overallLinearImpact*v.guidanceLevel:_.guidanceLevel-v.guidanceLevel});for(let \
v of c){if(!v.auditRef.group)continue;let _=h[a(v.auditRef)];if(!_)continue;let[x,L]=_;x.insertBefore(v.auditEl,L)}}let g=new Set;for(let u of c){let v=u.auditRef.result.metricSavings||{};for(let[_,x]of Object.entries(v))typeof x=="number"&&g.add(_)}let b=r.filter(u=>u.acronym&&g.has(u.acronym));b.length&&this.renderMetricAuditFilter(b,i,p),p("All");for(let u of n)if(c.some(v=>a(v.auditRef)===u)){let v=h[u];if(!v)continue;i.append(v[0])}if(!d.length)return i;let w={auditRefsOrEls:d.map(u=>u.auditEl),groupDefinitions:t},f=this.renderClump("passed",w);return i.append(f),i}renderMetricAuditFilter(e,t,n){let r=this.dom.createElement("div","lh-metricfilter"),i=this.dom.createChildOf(r,"span","lh-metricfilter__text");i.textContent=m.strings.showRelevantAudits;let a=[{acronym:"All",id:"All"},...e],l=m.getUniqueSuffix();for(let s of a){let c=`metric-${s.acronym}-${l}`,d=this.dom.createChildOf(r,"input","lh-metricfilter__radio");d.type="radio",d.name=`metricsfilter-${l}`,d.id=c;let h=this.dom.c\
reateChildOf(r,"label","lh-metricfilter__label");h.htmlFor=c,h.title="result"in s?s.result.title:"",h.textContent=s.acronym||s.id,s.acronym==="All"&&(d.checked=!0,h.classList.add("lh-metricfilter__label--active")),t.append(r),d.addEventListener("input",p=>{for(let b of t.querySelectorAll("label.lh-metricfilter__label"))b.classList.toggle("lh-metricfilter__label--active",b.htmlFor===c);t.classList.toggle("lh-category--filtered",s.acronym!=="All"),n(s.acronym||"All");let g=t.querySelectorAll("div.lh-audit-group, details.lh-audit-group");for(let b of g){b.hidden=!1;let w=Array.from(b.querySelectorAll("div.lh-audit")),f=!!w.length&&w.every(u=>u.hidden);b.hidden=f}})}}};var re=class{constructor(e){this._dom=e,this._opts={}}renderReport(e,t,n){if(!this._dom.rootEl&&t){console.warn("Please adopt the new report API in renderer/api.js.");let i=t.closest(".lh-root");i?this._dom.rootEl=i:(t.classList.add("lh-root","lh-vars"),this._dom.rootEl=t)}else this._dom.rootEl&&t&&(this._dom.rootEl=t);n&&(t\
his._opts=n),this._dom.setLighthouseChannel(e.configSettings.channel||"unknown");let r=k.prepareReportResult(e);return this._dom.rootEl.textContent="",this._dom.rootEl.append(this._renderReport(r)),this._opts.occupyEntireViewport&&this._dom.rootEl.classList.add("lh-max-viewport"),this._dom.rootEl}_renderReportTopbar(e){let t=this._dom.createComponent("topbar"),n=this._dom.find("a.lh-topbar__url",t);return n.textContent=e.finalDisplayedUrl,n.title=e.finalDisplayedUrl,this._dom.safelySetHref(n,e.finalDisplayedUrl),t}_renderReportHeader(){let e=this._dom.createComponent("heading"),t=this._dom.createComponent("scoresWrapper");return this._dom.find(".lh-scores-wrapper-placeholder",e).replaceWith(t),e}_renderReportFooter(e){let t=this._dom.createComponent("footer");return this._renderMetaBlock(e,t),this._dom.find(".lh-footer__version_issue",t).textContent=m.strings.footerIssue,this._dom.find(".lh-footer__version",t).textContent=e.lighthouseVersion,t}_renderMetaBlock(e,t){let n=k.getEmulation\
Descriptions(e.configSettings||{}),r=e.userAgent.match(/(\\w*Chrome\\/[\\d.]+)/),i=Array.isArray(r)?r[1].replace("/"," ").replace("Chrome","Chromium"):"Chromium",a=e.configSettings.channel,l=e.environment.benchmarkIndex.toFixed(0),s=e.environment.credits?.["axe-core"],c=[`${m.strings.runtimeSettingsBenchmark}: ${l}`,`${m.strings.runtimeSettingsCPUThrottling}: ${n.cpuThrottling}`];n.screenEmulation&&c.push(`${m.strings.runtimeSettingsScreenEmulation}: ${n.screenEmulation}`),s&&c.push(`${m.strings.runtimeSettingsAxeVersion}: ${s}`);let d=m.strings.runtimeAnalysisWindow;e.gatherMode==="timespan"?d=m.strings.runtimeAnalysisWindowTimespan:e.gatherMode==="snapshot"&&(d=m.strings.runtimeAnalysisWindowSnapshot);let h=[["date",`Captured at ${m.i18n.formatDateTime(e.fetchTime)}`],["devices",`${n.deviceEmulation} with Lighthouse ${e.lighthouseVersion}`,c.join(`\n`)],["samples-one",m.strings.runtimeSingleLoad,m.strings.runtimeSingleLoadTooltip],["stopwatch",d],["networkspeed",`${n.summary}`,`${m.strin\
gs.runtimeSettingsNetworkThrottling}: ${n.networkThrottling}`],["chrome",`Using ${i}`+(a?` with ${a}`:""),`${m.strings.runtimeSettingsUANetwork}: "${e.environment.networkUserAgent}"`]],p=this._dom.find(".lh-meta__items",t);for(let[g,b,w]of h){let f=this._dom.createChildOf(p,"li","lh-meta__item");if(f.textContent=b,w){f.classList.add("lh-tooltip-boundary");let u=this._dom.createChildOf(f,"div","lh-tooltip");u.textContent=w}f.classList.add("lh-report-icon",`lh-report-icon--${g}`)}}_renderReportWarnings(e){if(!e.runWarnings||e.runWarnings.length===0)return this._dom.createElement("div");let t=this._dom.createComponent("warningsToplevel"),n=this._dom.find(".lh-warnings__msg",t);n.textContent=m.strings.toplevelWarningsMessage;let r=[];for(let i of e.runWarnings){let a=this._dom.createElement("li");a.append(this._dom.convertMarkdownLinkSnippets(i)),r.push(a)}return this._dom.find("ul",t).append(...r),t}_renderScoreGauges(e,t,n){let r=[],i=[];for(let a of Object.values(e.categories)){let s=(n\
[a.id]||t).renderCategoryScore(a,e.categoryGroups||{},{gatherMode:e.gatherMode}),c=this._dom.find("a.lh-gauge__wrapper, a.lh-fraction__wrapper",s);c&&(this._dom.safelySetHref(c,`#${a.id}`),c.addEventListener("click",d=>{if(!c.matches(\'[href^="#"]\'))return;let h=c.getAttribute("href"),p=this._dom.rootEl;if(!h||!p)return;let g=this._dom.find(h,p);d.preventDefault(),g.scrollIntoView()}),this._opts.onPageAnchorRendered?.(c)),k.isPluginCategory(a.id)?i.push(s):r.push(s)}return[...r,...i]}_renderReport(e){m.apply({providedStrings:e.i18n.rendererFormattedStrings,i18n:new te(e.configSettings.locale),reportJson:e});let t=new X(this._dom,{fullPageScreenshot:e.fullPageScreenshot??void 0,entities:e.entities}),n=new G(this._dom,t),r={performance:new ne(this._dom,t)},i=this._dom.createElement("div");i.append(this._renderReportHeader());let a=this._dom.createElement("div","lh-container"),l=this._dom.createElement("div","lh-report");l.append(this._renderReportWarnings(e));let s;Object.keys(e.categorie\
s).length===1?i.classList.add("lh-header--solo-category"):s=this._dom.createElement("div","lh-scores-header");let d=this._dom.createElement("div");if(d.classList.add("lh-scorescale-wrap"),d.append(this._dom.createComponent("scorescale")),s){let b=this._dom.find(".lh-scores-container",i);s.append(...this._renderScoreGauges(e,n,r)),b.append(s,d);let w=this._dom.createElement("div","lh-sticky-header");w.append(...this._renderScoreGauges(e,n,r)),a.append(w)}let h=this._dom.createElement("div","lh-categories");l.append(h);let p={gatherMode:e.gatherMode};for(let b of Object.values(e.categories)){let w=r[b.id]||n;w.dom.createChildOf(h,"div","lh-category-wrapper").append(w.render(b,e.categoryGroups,p))}n.injectFinalScreenshot(h,e.audits,d);let g=this._dom.createFragment();return this._opts.omitGlobalStyles||g.append(this._dom.createComponent("styles")),this._opts.omitTopbar||g.append(this._renderReportTopbar(e)),g.append(a),l.append(this._renderReportFooter(e)),a.append(i,l),e.fullPageScreensh\
ot&&V.installFullPageScreenshot(this._dom.rootEl,e.fullPageScreenshot.screenshot),g}};function W(o,e){let t=o.rootEl;typeof e>"u"?t.classList.toggle("lh-dark"):t.classList.toggle("lh-dark",e)}var bt=typeof btoa<"u"?btoa:o=>Buffer.from(o).toString("base64"),_t=typeof atob<"u"?atob:o=>Buffer.from(o,"base64").toString();async function wt(o,e){let t=new TextEncoder().encode(o);if(e.gzip)if(typeof CompressionStream<"u"){let i=new CompressionStream("gzip"),a=i.writable.getWriter();a.write(t),a.close();let l=await new Response(i.readable).arrayBuffer();t=new Uint8Array(l)}else t=window.pako.gzip(o);let n="",r=5e3;for(let i=0;i<t.length;i+=r)n+=String.fromCharCode(...t.subarray(i,i+r));return bt(n)}function yt(o,e){let t=_t(o),n=Uint8Array.from(t,r=>r.charCodeAt(0));return e.gzip?window.pako.ungzip(n,{to:"string"}):new TextDecoder().decode(n)}var Se={toBase64:wt,fromBase64:yt};function se(){let o=window.location.host.endsWith(".vercel.app"),e=new URLSearchParams(window.location.search).has("de\
v");return o?`https://${window.location.host}/gh-pages`:e?"http://localhost:7333":"https://googlechrome.github.io/lighthouse"}function ce(o){let e=o.generatedTime,t=o.fetchTime||e;return`${o.lighthouseVersion}-${o.finalDisplayedUrl}-${t}`}function xt(o,e,t){let n=new URL(e).origin;window.addEventListener("message",function i(a){a.origin===n&&r&&a.data.opened&&(r.postMessage(o,n),window.removeEventListener("message",i))});let r=window.open(e,t)}async function Ce(o,e,t){let n=new URL(e),r=!!window.CompressionStream;n.hash=await Se.toBase64(JSON.stringify(o),{gzip:r}),r&&n.searchParams.set("gzip","1"),window.open(n.toString(),t)}async function Ae(o){let e="viewer-"+ce(o),t=se()+"/viewer/";await Ce({lhr:o},t,e)}async function ze(o){let e="viewer-"+ce(o),t=se()+"/viewer/";xt({lhr:o},t,e)}function Me(o){if(!o.audits["script-treemap-data"].details)throw new Error("no script treemap data found");let t={lhr:{mainDocumentUrl:o.mainDocumentUrl,finalUrl:o.finalUrl,finalDisplayedUrl:o.finalDisplaye\
dUrl,audits:{"script-treemap-data":o.audits["script-treemap-data"]},configSettings:{locale:o.configSettings.locale}}},n=se()+"/treemap/",r="treemap-"+ce(o);Ce(t,n,r)}var oe=class{constructor(e){this._dom=e,this._toggleEl,this._menuEl,this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onToggleClick=this.onToggleClick.bind(this),this.onToggleKeydown=this.onToggleKeydown.bind(this),this.onMenuFocusOut=this.onMenuFocusOut.bind(this),this.onMenuKeydown=this.onMenuKeydown.bind(this),this._getNextMenuItem=this._getNextMenuItem.bind(this),this._getNextSelectableNode=this._getNextSelectableNode.bind(this),this._getPreviousMenuItem=this._getPreviousMenuItem.bind(this)}setup(e){this._toggleEl=this._dom.find(".lh-topbar button.lh-tools__button",this._dom.rootEl),this._toggleEl.addEventListener("click",this.onToggleClick),this._toggleEl.addEventListener("keydown",this.onToggleKeydown),this._menuEl=this._dom.find(".lh-topbar div.lh-tools__dropdown",this._dom.rootEl),this._menuEl.addEventL\
istener("keydown",this.onMenuKeydown),this._menuEl.addEventListener("click",e)}close(){this._toggleEl.classList.remove("lh-active"),this._toggleEl.setAttribute("aria-expanded","false"),this._menuEl.contains(this._dom.document().activeElement)&&this._toggleEl.focus(),this._menuEl.removeEventListener("focusout",this.onMenuFocusOut),this._dom.document().removeEventListener("keydown",this.onDocumentKeyDown)}open(e){this._toggleEl.classList.contains("lh-active")?e.focus():this._menuEl.addEventListener("transitionend",()=>{e.focus()},{once:!0}),this._toggleEl.classList.add("lh-active"),this._toggleEl.setAttribute("aria-expanded","true"),this._menuEl.addEventListener("focusout",this.onMenuFocusOut),this._dom.document().addEventListener("keydown",this.onDocumentKeyDown)}onToggleClick(e){e.preventDefault(),e.stopImmediatePropagation(),this._toggleEl.classList.contains("lh-active")?this.close():this.open(this._getNextMenuItem())}onToggleKeydown(e){switch(e.code){case"ArrowUp":e.preventDefault(),\
this.open(this._getPreviousMenuItem());break;case"ArrowDown":case"Enter":case" ":e.preventDefault(),this.open(this._getNextMenuItem());break;default:}}onMenuKeydown(e){let t=e.target;switch(e.code){case"ArrowUp":e.preventDefault(),this._getPreviousMenuItem(t).focus();break;case"ArrowDown":e.preventDefault(),this._getNextMenuItem(t).focus();break;case"Home":e.preventDefault(),this._getNextMenuItem().focus();break;case"End":e.preventDefault(),this._getPreviousMenuItem().focus();break;default:}}onDocumentKeyDown(e){e.keyCode===27&&this.close()}onMenuFocusOut(e){let t=e.relatedTarget;this._menuEl.contains(t)||this.close()}_getNextSelectableNode(e,t){let n=e.filter(i=>i instanceof HTMLElement).filter(i=>!(i.hasAttribute("disabled")||window.getComputedStyle(i).display==="none")),r=t?n.indexOf(t)+1:0;return r>=n.length&&(r=0),n[r]}_getNextMenuItem(e){let t=Array.from(this._menuEl.childNodes);return this._getNextSelectableNode(t,e)}_getPreviousMenuItem(e){let t=Array.from(this._menuEl.childNod\
es).reverse();return this._getNextSelectableNode(t,e)}};var ie=class{constructor(e,t){this.lhr,this._reportUIFeatures=e,this._dom=t,this._dropDownMenu=new oe(this._dom),this._copyAttempt=!1,this.topbarEl,this.categoriesEl,this.stickyHeaderEl,this.highlightEl,this.onDropDownMenuClick=this.onDropDownMenuClick.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onCopy=this.onCopy.bind(this),this.collapseAllDetails=this.collapseAllDetails.bind(this)}enable(e){this.lhr=e,this._dom.rootEl.addEventListener("keyup",this.onKeyUp),this._dom.document().addEventListener("copy",this.onCopy),this._dropDownMenu.setup(this.onDropDownMenuClick),this._setUpCollapseDetailsAfterPrinting(),this._dom.find(".lh-topbar__logo",this._dom.rootEl).addEventListener("click",()=>W(this._dom)),this._setupStickyHeader()}onDropDownMenuClick(e){e.preventDefault();let t=e.target;if(!(!t||!t.hasAttribute("data-action"))){switch(t.getAttribute("data-action")){case"copy":this.onCopyButtonClick();break;case"print-summary":t\
his.collapseAllDetails(),this._print();break;case"print-expanded":this.expandAllDetails(),this._print();break;case"save-json":{let n=JSON.stringify(this.lhr,null,2);this._reportUIFeatures._saveFile(new Blob([n],{type:"application/json"}));break}case"save-html":{let n=this._reportUIFeatures.getReportHtml();try{this._reportUIFeatures._saveFile(new Blob([n],{type:"text/html"}))}catch(r){this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"error",msg:"Could not export as HTML. "+r.message})}break}case"open-viewer":{this._dom.isDevTools()?Ae(this.lhr):ze(this.lhr);break}case"save-gist":{this._reportUIFeatures.saveAsGist();break}case"toggle-dark":{W(this._dom);break}case"view-unthrottled-trace":this._reportUIFeatures._opts.onViewTrace?.()}this._dropDownMenu.close()}}onCopy(e){this._copyAttempt&&e.clipboardData&&(e.preventDefault(),e.clipboardData.setData("text/plain",JSON.stringify(this.lhr,null,2)),this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"log",msg:"Report JSON copied t\
o clipboard"})),this._copyAttempt=!1}onCopyButtonClick(){this._dom.fireEventOn("lh-analytics",this._dom.document(),{name:"copy"});try{this._dom.document().queryCommandSupported("copy")&&(this._copyAttempt=!0,this._dom.document().execCommand("copy")||(this._copyAttempt=!1,this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"warn",msg:"Your browser does not support copy to clipboard."})))}catch(e){this._copyAttempt=!1,this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"log",msg:e.message})}}onKeyUp(e){(e.ctrlKey||e.metaKey)&&e.keyCode===80&&this._dropDownMenu.close()}expandAllDetails(){this._dom.findAll(".lh-categories details",this._dom.rootEl).map(t=>t.open=!0)}collapseAllDetails(){this._dom.findAll(".lh-categories details",this._dom.rootEl).map(t=>t.open=!1)}_print(){this._reportUIFeatures._opts.onPrintOverride?this._reportUIFeatures._opts.onPrintOverride(this._dom.rootEl):self.print()}resetUIState(){this._dropDownMenu.close()}_getScrollParent(e){let{overflowY:t}=window.get\
ComputedStyle(e);return t!=="visible"&&t!=="hidden"?e:e.parentElement?this._getScrollParent(e.parentElement):document}_setUpCollapseDetailsAfterPrinting(){"onbeforeprint"in self?self.addEventListener("afterprint",this.collapseAllDetails):self.matchMedia("print").addListener(t=>{t.matches?this.expandAllDetails():this.collapseAllDetails()})}_setupStickyHeader(){this.topbarEl=this._dom.find("div.lh-topbar",this._dom.rootEl),this.categoriesEl=this._dom.find("div.lh-categories",this._dom.rootEl),requestAnimationFrame(()=>requestAnimationFrame(()=>{try{this.stickyHeaderEl=this._dom.find("div.lh-sticky-header",this._dom.rootEl)}catch{return}this.highlightEl=this._dom.createChildOf(this.stickyHeaderEl,"div","lh-highlighter");let e=this._getScrollParent(this._dom.find(".lh-container",this._dom.rootEl));e.addEventListener("scroll",()=>this._updateStickyHeader());let t=e instanceof window.Document?document.documentElement:e;new window.ResizeObserver(()=>this._updateStickyHeader()).observe(t)}))}_\
updateStickyHeader(){if(!this.stickyHeaderEl)return;let e=this.topbarEl.getBoundingClientRect().bottom,t=this.categoriesEl.getBoundingClientRect().top,n=e>=t,i=Array.from(this._dom.rootEl.querySelectorAll(".lh-category")).filter(h=>h.getBoundingClientRect().top-window.innerHeight/2<0),a=i.length>0?i.length-1:0,l=this.stickyHeaderEl.querySelectorAll(".lh-gauge__wrapper, .lh-fraction__wrapper"),s=l[a],c=l[0].getBoundingClientRect().left,d=s.getBoundingClientRect().left-c;this.highlightEl.style.transform=`translate(${d}px)`,this.stickyHeaderEl.classList.toggle("lh-sticky-header--visible",n)}};function kt(o,e){let t=e?new Date(e):new Date,n=t.toLocaleTimeString("en-US",{hour12:!1}),r=t.toLocaleDateString("en-US",{year:"numeric",month:"2-digit",day:"2-digit"}).split("/");r.unshift(r.pop());let i=r.join("-");return`${o}_${i}_${n}`.replace(/[/?<>\\\\:*|"]/g,"-")}function Te(o){let e=new URL(o.finalDisplayedUrl).hostname;return kt(e,o.fetchTime)}function Et(o){return Array.from(o.tBodies[0].rows\
)}var ae=class{constructor(e,t={}){this.json,this._dom=e,this._opts=t,this._topbar=t.omitTopbar?null:new ie(this,e),this.onMediaQueryChange=this.onMediaQueryChange.bind(this)}initFeatures(e){this.json=e,this._fullPageScreenshot=E.getFullPageScreenshot(e),this._topbar&&(this._topbar.enable(e),this._topbar.resetUIState()),this._setupMediaQueryListeners(),this._setupThirdPartyFilter(),this._setupElementScreenshotOverlay(this._dom.rootEl);let t=this._dom.isDevTools()||this._opts.disableDarkMode||this._opts.disableAutoDarkModeAndFireworks;!t&&window.matchMedia("(prefers-color-scheme: dark)").matches&&W(this._dom,!0);let r=["performance","accessibility","best-practices","seo"].every(s=>{let c=e.categories[s];return c&&c.score===1}),i=this._opts.disableFireworks||this._opts.disableAutoDarkModeAndFireworks;if(r&&!i&&(this._enableFireworks(),t||W(this._dom,!0)),e.categories.performance&&e.categories.performance.auditRefs.some(s=>!!(s.group==="metrics"&&e.audits[s.id].errorMessage))){let s=this.\
_dom.find("input.lh-metrics-toggle__input",this._dom.rootEl);s.checked=!0}this.json.audits["script-treemap-data"]&&this.json.audits["script-treemap-data"].details&&this.addButton({text:m.strings.viewTreemapLabel,icon:"treemap",onClick:()=>Me(this.json)}),this._opts.onViewTrace&&(e.configSettings.throttlingMethod==="simulate"?this._dom.find(\'a[data-action="view-unthrottled-trace"]\',this._dom.rootEl).classList.remove("lh-hidden"):this.addButton({text:m.strings.viewTraceLabel,onClick:()=>this._opts.onViewTrace?.()})),this._opts.getStandaloneReportHTML&&this._dom.find(\'a[data-action="save-html"]\',this._dom.rootEl).classList.remove("lh-hidden");for(let s of this._dom.findAll("[data-i18n]",this._dom.rootEl)){let d=s.getAttribute("data-i18n");s.textContent=m.strings[d]}}addButton(e){let t=this._dom.rootEl.querySelector(".lh-audit-group--metrics");if(!t)return;let n=t.querySelector(".lh-buttons");n||(n=this._dom.createChildOf(t,"div","lh-buttons"));let r=["lh-button"];e.icon&&(r.push("lh-repor\
t-icon"),r.push(`lh-report-icon--${e.icon}`));let i=this._dom.createChildOf(n,"button",r.join(" "));return i.textContent=e.text,i.addEventListener("click",e.onClick),i}resetUIState(){this._topbar&&this._topbar.resetUIState()}getReportHtml(){if(!this._opts.getStandaloneReportHTML)throw new Error("`getStandaloneReportHTML` is not set");return this.resetUIState(),this._opts.getStandaloneReportHTML()}saveAsGist(){throw new Error("Cannot save as gist from base report")}_enableFireworks(){this._dom.find(".lh-scores-container",this._dom.rootEl).classList.add("lh-score100")}_setupMediaQueryListeners(){let e=self.matchMedia("(max-width: 500px)");e.addListener(this.onMediaQueryChange),this.onMediaQueryChange(e)}_resetUIState(){this._topbar&&this._topbar.resetUIState()}onMediaQueryChange(e){this._dom.rootEl.classList.toggle("lh-narrow",e.matches)}_setupThirdPartyFilter(){let e=["uses-rel-preconnect","third-party-facades","network-dependency-tree-insight"],t=["legacy-javascript","legacy-javascript\
-insight"];Array.from(this._dom.rootEl.querySelectorAll("table.lh-table")).filter(i=>i.querySelector("td.lh-table-column--url, td.lh-table-column--source-location")).filter(i=>{let a=i.closest(".lh-audit");if(!a)throw new Error(".lh-table not within audit");return!e.includes(a.id)}).forEach(i=>{let a=Et(i),l=a.filter(f=>!f.classList.contains("lh-sub-item-row")),s=this._getThirdPartyRows(l,E.getFinalDisplayedUrl(this.json)),c=a.some(f=>f.classList.contains("lh-row--even")),d=this._dom.createComponent("3pFilter"),h=this._dom.find("input",d);h.addEventListener("change",f=>{let u=f.target instanceof HTMLInputElement&&!f.target.checked,v=!0,_=l[0];for(;_;){let x=u&&s.includes(_);do _.classList.toggle("lh-row--hidden",x),c&&(_.classList.toggle("lh-row--even",!x&&v),_.classList.toggle("lh-row--odd",!x&&!v)),_=_.nextElementSibling;while(_&&_.classList.contains("lh-sub-item-row"));x||(v=!v)}});let p=s.filter(f=>!f.classList.contains("lh-row--group")).length;this._dom.find(".lh-3p-filter-count",\
d).textContent=`${p}`,this._dom.find(".lh-3p-ui-string",d).textContent=m.strings.thirdPartyResourcesLabel;let g=s.length===l.length,b=!s.length;if((g||b)&&(this._dom.find("div.lh-3p-filter",d).hidden=!0),!i.parentNode)return;i.parentNode.insertBefore(d,i);let w=i.closest(".lh-audit");if(!w)throw new Error(".lh-table not within audit");t.includes(w.id)&&!g&&h.click()})}_setupElementScreenshotOverlay(e){this._fullPageScreenshot&&V.installOverlayFeature({dom:this._dom,rootEl:e,overlayContainerEl:e,fullPageScreenshot:this._fullPageScreenshot})}_getThirdPartyRows(e,t){let n=E.getEntityFromUrl(t,this.json.entities),r=this.json.entities?.find(a=>a.isFirstParty===!0)?.name,i=[];for(let a of e){if(r){if(!a.dataset.entity||a.dataset.entity===r)continue}else{let l=a.querySelector("div.lh-text__url");if(!l)continue;let s=l.dataset.url;if(!s||!(E.getEntityFromUrl(s,this.json.entities)!==n))continue}i.push(a)}return i}_saveFile(e){let t=e.type.match("json")?".json":".html",n=Te({finalDisplayedUrl:E.\
getFinalDisplayedUrl(this.json),fetchTime:this.json.fetchTime})+t;this._opts.onSaveFileOverride?this._opts.onSaveFileOverride(e,n):this._dom.saveFile(e,n)}};function Fe(o,e={}){let t=document.createElement("article");t.classList.add("lh-root","lh-vars");let n=new ee(t.ownerDocument,t);return new re(n).renderReport(o,t,e),new ae(n,e).initFeatures(o),t}var le=class{constructor(e){this.el=e;let t=document.createElement("style");if(t.textContent=`\n      #lh-log {\n        position: fixed;\n        background-color: #323232;\n        color: #fff;\n        min-height: 48px;\n        min-width: 288px;\n        padding: 16px 24px;\n        box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\n        border-radius: 2px;\n        margin: 12px;\n        font-size: 14px;\n        cursor: default;\n        transition: transform 0.3s, opacity 0.3s;\n        transform: translateY(100px);\n        opacity: 0;\n        bottom: 0;\n        left: 0;\n        z-index: 3;\n        display: flex;\n        flex-direction: row;\n      \
  justify-content: center;\n        align-items: center;\n      }\n      \n      #lh-log.lh-show {\n        opacity: 1;\n        transform: translateY(0);\n      }\n    `,!this.el.parentNode)throw new Error("element needs to be in the DOM");this.el.parentNode.insertBefore(t,this.el),this._id=void 0}log(e,t=!0){this._id&&clearTimeout(this._id),this.el.textContent=e,this.el.classList.add("lh-show"),t&&(this._id=setTimeout(()=>{this.el.classList.remove("lh-show")},7e3))}warn(e){this.log("Warning: "+e)}error(e){this.log(e),setTimeout(()=>{throw new Error(e)},0)}hide(){this._id&&clearTimeout(this._id),this.el.classList.remove("lh-show")}};function Lt(){let o=window.__LIGHTHOUSE_JSON__,e=Fe(o,{occupyEntireViewport:!0,getStandaloneReportHTML(){return document.documentElement.outerHTML}});document.body.append(e),document.addEventListener("lh-analytics",t=>{let n=t;"gtag"in window&&window.gtag("event",n.detail.name,n.detail.data??{})}),document.addEventListener("lh-log",t=>{let n=document.querySelector\
("div#lh-log");if(!n)return;let r=new le(n),i=t.detail;switch(i.cmd){case"log":r.log(i.msg);break;case"warn":r.warn(i.msg);break;case"error":r.error(i.msg);break;case"hide":r.hide();break}})}window.__initLighthouseReport__=Lt;})();\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See\
 the License for the specific language governing permissions and limitations under the License.\n*/\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n *\n * Dummy text for ensuring report robustness: <\\/script> pre$`post %%LIGHTHOUSE_JSON%%\n * (this is handled by terser)\n */\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n'
    };
  }
});

// report/generator/report-generator.js
var ReportGenerator;
var init_report_generator = __esm({
  "report/generator/report-generator.js"() {
    "use strict";
    init_process_global();
    init_report_assets();
    /**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    ReportGenerator = class _ReportGenerator {
      static {
        __name(this, "ReportGenerator");
      }
      /**
       * Replaces all the specified strings in source without serial replacements.
       * @param {string} source
       * @param {!Array<{search: string, replacement: string}>} replacements
       * @return {string}
       */
      static replaceStrings(source, replacements) {
        if (replacements.length === 0) {
          return source;
        }
        const firstReplacement = replacements[0];
        const nextReplacements = replacements.slice(1);
        return source.split(firstReplacement.search).map((part) => _ReportGenerator.replaceStrings(part, nextReplacements)).join(firstReplacement.replacement);
      }
      /**
       * @param {unknown} object
       * @return {string}
       */
      static sanitizeJson(object) {
        return JSON.stringify(object).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
      }
      /**
       * Returns the standalone report HTML as a string with the report JSON and renderer JS inlined.
       * @param {LHResult} lhr
       * @return {string}
       */
      static generateReportHtml(lhr) {
        const sanitizedJson = _ReportGenerator.sanitizeJson(lhr);
        const sanitizedJavascript = reportAssets.REPORT_JAVASCRIPT.replace(/<\//g, "\\u003c/");
        return _ReportGenerator.replaceStrings(reportAssets.REPORT_TEMPLATE, [
          { search: "%%LIGHTHOUSE_JSON%%", replacement: sanitizedJson },
          { search: "%%LIGHTHOUSE_JAVASCRIPT%%", replacement: sanitizedJavascript }
        ]);
      }
      /**
       * Returns the standalone flow report HTML as a string with the report JSON and renderer JS inlined.
       * @param {FlowResult} flow
       * @return {string}
       */
      static generateFlowReportHtml(flow) {
        const sanitizedJson = _ReportGenerator.sanitizeJson(flow);
        const sanitizedJavascript = reportAssets.FLOW_REPORT_JAVASCRIPT.replace(/<\//g, "\\u003c/");
        return _ReportGenerator.replaceStrings(reportAssets.FLOW_REPORT_TEMPLATE, [
          { search: "%%LIGHTHOUSE_FLOW_JSON%%", replacement: sanitizedJson },
          { search: "%%LIGHTHOUSE_FLOW_JAVASCRIPT%%", replacement: sanitizedJavascript },
          { search: "/*%%LIGHTHOUSE_FLOW_CSS%%*/", replacement: reportAssets.FLOW_REPORT_CSS }
        ]);
      }
      /**
       * Converts the results to a CSV formatted string
       * Each row describes the result of 1 audit with
       *  - the name of the category the audit belongs to
       *  - the name of the audit
       *  - a description of the audit
       *  - the score type that is used for the audit
       *  - the score value of the audit
       *
       * @param {LHResult} lhr
       * @return {string}
       */
      static generateReportCSV(lhr) {
        const CRLF = "\r\n";
        const separator = ",";
        const escape = /* @__PURE__ */ __name((value) => `"${value.replace(/"/g, '""')}"`, "escape");
        const rowFormatter = /* @__PURE__ */ __name((row) => row.map((value) => {
          if (value === null) return "null";
          return value.toString();
        }).map(escape), "rowFormatter");
        const rows = [];
        const topLevelKeys = (
          /** @type {const} */
          ["requestedUrl", "finalDisplayedUrl", "fetchTime", "gatherMode"]
        );
        rows.push(rowFormatter(topLevelKeys));
        rows.push(rowFormatter(topLevelKeys.map((key) => lhr[key] ?? null)));
        rows.push([]);
        rows.push(["category", "score"]);
        for (const category of Object.values(lhr.categories)) {
          rows.push(rowFormatter([
            category.id,
            category.score
          ]));
        }
        rows.push([]);
        rows.push(["category", "audit", "score", "displayValue", "description"]);
        for (const category of Object.values(lhr.categories)) {
          for (const auditRef of category.auditRefs) {
            const audit = lhr.audits[auditRef.id];
            if (!audit) continue;
            rows.push(rowFormatter([
              category.id,
              auditRef.id,
              audit.score,
              audit.displayValue || "",
              audit.description
            ]));
          }
        }
        return rows.map((row) => row.join(separator)).join(CRLF);
      }
      /**
       * @param {LHResult|FlowResult} result
       * @return {result is FlowResult}
       */
      static isFlowResult(result) {
        return "steps" in result;
      }
      /**
       * Creates the results output in a format based on the `mode`.
       * @param {LHResult|FlowResult} result
       * @param {LHResult['configSettings']['output']} outputModes
       * @return {string|string[]}
       */
      static generateReport(result, outputModes) {
        const outputAsArray = Array.isArray(outputModes);
        if (typeof outputModes === "string") outputModes = [outputModes];
        const output = outputModes.map((outputMode) => {
          if (outputMode === "html") {
            if (_ReportGenerator.isFlowResult(result)) {
              return _ReportGenerator.generateFlowReportHtml(result);
            }
            return _ReportGenerator.generateReportHtml(result);
          }
          if (outputMode === "csv") {
            if (_ReportGenerator.isFlowResult(result)) {
              throw new Error("CSV output is not support for user flows");
            }
            return _ReportGenerator.generateReportCSV(result);
          }
          if (outputMode === "json") {
            return JSON.stringify(result, null, 2);
          }
          throw new Error("Invalid output mode: " + outputMode);
        });
        return outputAsArray ? output : output[0];
      }
    };
  }
});

// core/runner.js
import path6 from "path";
var Runner;
var init_runner = __esm({
  "core/runner.js"() {
    "use strict";
    init_process_global();
    init_lighthouse_logger();
    init_lodash();
    init_scoring();
    init_audit();
    init_format();
    init_stack_packs();
    init_asset_saver();
    init_sentry();
    init_report_generator();
    init_lh_error();
    init_root2();
    init_esm_utils();
    init_entity_classification();
    init_url_utils();
    /**
     * @license
     * Copyright 2016 Google LLC
     * SPDX-License-Identifier: Apache-2.0
     */
    Runner = class _Runner {
      static {
        __name(this, "Runner");
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {{resolvedConfig: LH.Config.ResolvedConfig, computedCache: Map<string, ArbitraryEqualityMap>}} options
       * @return {Promise<LH.RunnerResult|undefined>}
       */
      static async audit(artifacts, options) {
        const { resolvedConfig, computedCache } = options;
        const settings = resolvedConfig.settings;
        try {
          const runnerStatus = { msg: "Audit phase", id: "lh:runner:audit" };
          lighthouse_logger_default.time(runnerStatus, "verbose");
          const lighthouseRunWarnings = [];
          if (settings.gatherMode && !settings.auditMode) return;
          if (!resolvedConfig.audits) {
            throw new Error("No audits to evaluate.");
          }
          const auditResultsById = await _Runner._runAudits(
            settings,
            resolvedConfig.audits,
            artifacts,
            lighthouseRunWarnings,
            computedCache
          );
          const resultsStatus = { msg: "Generating results...", id: "lh:runner:generate" };
          lighthouse_logger_default.time(resultsStatus);
          if (artifacts.LighthouseRunWarnings) {
            lighthouseRunWarnings.push(...artifacts.LighthouseRunWarnings);
          }
          const axeVersion = artifacts.Accessibility?.version;
          const credits = {
            "axe-core": axeVersion
          };
          let categories = {};
          if (resolvedConfig.categories) {
            categories = ReportScoring.scoreAllCategories(resolvedConfig.categories, auditResultsById);
          }
          lighthouse_logger_default.timeEnd(resultsStatus);
          lighthouse_logger_default.timeEnd(runnerStatus);
          let fullPageScreenshot = artifacts.FullPageScreenshot;
          if (resolvedConfig.settings.disableFullPageScreenshot || fullPageScreenshot instanceof Error) {
            fullPageScreenshot = void 0;
          }
          const i18nLhr = {
            lighthouseVersion,
            requestedUrl: artifacts.URL.requestedUrl,
            mainDocumentUrl: artifacts.URL.mainDocumentUrl,
            finalDisplayedUrl: artifacts.URL.finalDisplayedUrl,
            finalUrl: artifacts.URL.mainDocumentUrl,
            fetchTime: artifacts.fetchTime,
            gatherMode: artifacts.GatherContext.gatherMode,
            runtimeError: _Runner.getArtifactRuntimeError(artifacts),
            runWarnings: lighthouseRunWarnings,
            userAgent: artifacts.HostUserAgent,
            environment: {
              networkUserAgent: artifacts.NetworkUserAgent,
              hostUserAgent: artifacts.HostUserAgent,
              benchmarkIndex: artifacts.BenchmarkIndex,
              credits
            },
            audits: auditResultsById,
            configSettings: settings,
            categories,
            categoryGroups: resolvedConfig.groups || void 0,
            stackPacks: getStackPacks(artifacts.Stacks),
            entities: await _Runner.getEntityClassification(artifacts, { computedCache }),
            fullPageScreenshot,
            timing: this._getTiming(artifacts),
            i18n: {
              rendererFormattedStrings: getRendererFormattedStrings(settings.locale),
              icuMessagePaths: {}
            }
          };
          i18nLhr.i18n.icuMessagePaths = replaceIcuMessages(i18nLhr, settings.locale);
          const lhr = (
            /** @type {LH.Result} */
            i18nLhr
          );
          if (settings.auditMode) {
            const path7 = _Runner._getDataSavePath(settings);
            saveLhr(lhr, path7);
          }
          const report = ReportGenerator.generateReport(lhr, settings.output);
          return { lhr, artifacts, report };
        } catch (err) {
          throw _Runner.createRunnerError(err, settings);
        }
      }
      /**
       * @param {LH.Artifacts} artifacts
       * @param {LH.Artifacts.ComputedContext} context
       */
      static async getEntityClassification(artifacts, context) {
        const devtoolsLog = artifacts.DevtoolsLog;
        if (!devtoolsLog) return;
        const classifiedEntities = await EntityClassification.request(
          { URL: artifacts.URL, devtoolsLog },
          context
        );
        const entities = [];
        for (const [entity, entityUrls] of classifiedEntities.urlsByEntity) {
          const uniqueOrigins = /* @__PURE__ */ new Set();
          for (const url of entityUrls) {
            const origin = url_utils_default.getOrigin(url);
            if (origin) uniqueOrigins.add(origin);
          }
          const shortEntity = {
            name: entity.name,
            homepage: entity.homepage,
            origins: [...uniqueOrigins]
          };
          if (entity === classifiedEntities.firstParty) shortEntity.isFirstParty = true;
          if (entity.isUnrecognized) shortEntity.isUnrecognized = true;
          if (entity.category) shortEntity.category = entity.category;
          entities.push(shortEntity);
        }
        return entities;
      }
      /**
       * User can run -G solo, -A solo, or -GA together
       * -G and -A will run partial lighthouse pipelines,
       * and -GA will run everything plus save artifacts and lhr to disk.
       *
       * @param {(runnerData: {resolvedConfig: LH.Config.ResolvedConfig}) => Promise<LH.Artifacts>} gatherFn
       * @param {{resolvedConfig: LH.Config.ResolvedConfig, computedCache: Map<string, ArbitraryEqualityMap>}} options
       * @return {Promise<LH.Artifacts>}
       */
      static async gather(gatherFn, options) {
        const settings = options.resolvedConfig.settings;
        try {
          const sentryContext = Sentry.getContext();
          Sentry.captureBreadcrumb({
            message: "Run started",
            category: "lifecycle",
            data: sentryContext
          });
          if (settings.auditMode && !settings.gatherMode) {
            const path7 = this._getDataSavePath(settings);
            return loadArtifacts(path7);
          }
          const runnerStatus = { msg: "Gather phase", id: "lh:runner:gather" };
          lighthouse_logger_default.time(runnerStatus, "verbose");
          const artifacts = await gatherFn({ resolvedConfig: options.resolvedConfig });
          lighthouse_logger_default.timeEnd(runnerStatus);
          artifacts.Timing = lighthouse_logger_default.takeTimeEntries();
          if (settings.gatherMode) {
            const path7 = this._getDataSavePath(settings);
            await saveArtifacts(artifacts, path7);
          }
          return artifacts;
        } catch (err) {
          throw _Runner.createRunnerError(err, settings);
        }
      }
      /**
       * @param {any} err
       * @param {LH.Config.Settings} settings
       */
      static createRunnerError(err, settings) {
        if (err.friendlyMessage) {
          err.friendlyMessage = getFormatted(err.friendlyMessage, settings.locale);
        }
        Sentry.captureException(err, { level: "fatal" });
        return err;
      }
      /**
       * This handles both the auditMode case where gatherer entries need to be merged in and
       * the gather/audit case where timingEntriesFromRunner contains all entries from this run,
       * including those also in timingEntriesFromArtifacts.
       * @param {LH.Artifacts} artifacts
       * @return {LH.Result.Timing}
       */
      static _getTiming(artifacts) {
        const timingEntriesFromArtifacts = artifacts.Timing || [];
        const timingEntriesFromRunner = lighthouse_logger_default.takeTimeEntries();
        const timingEntriesKeyValues = [
          ...timingEntriesFromArtifacts,
          ...timingEntriesFromRunner
        ].map((entry) => (
          /** @type {[string, PerformanceEntry]} */
          [
            // As entries can share a name and start time, dedupe based on the name, startTime and duration
            `${entry.startTime}-${entry.name}-${entry.duration}`,
            entry
          ]
        ));
        const timingEntries = Array.from(new Map(timingEntriesKeyValues).values()).map((entry) => {
          return {
            // Don't spread entry because browser PerformanceEntries can't be spread.
            // https://github.com/GoogleChrome/lighthouse/issues/8638
            startTime: parseFloat(entry.startTime.toFixed(2)),
            name: entry.name,
            duration: parseFloat(entry.duration.toFixed(2)),
            entryType: entry.entryType
          };
        }).sort((a, b) => a.startTime - b.startTime);
        const gatherEntry = timingEntries.find((e) => e.name === "lh:runner:gather");
        const auditEntry = timingEntries.find((e) => e.name === "lh:runner:audit");
        const gatherTiming = gatherEntry?.duration || 0;
        const auditTiming = auditEntry?.duration || 0;
        return { entries: timingEntries, total: gatherTiming + auditTiming };
      }
      /**
       * Run all audits with specified settings and artifacts.
       * @param {LH.Config.Settings} settings
       * @param {Array<LH.Config.AuditDefn>} audits
       * @param {LH.Artifacts} artifacts
       * @param {Array<string | LH.IcuMessage>} runWarnings
       * @param {Map<string, ArbitraryEqualityMap>} computedCache
       * @return {Promise<Record<string, LH.RawIcu<LH.Audit.Result>>>}
       */
      static async _runAudits(settings, audits, artifacts, runWarnings, computedCache) {
        const status = { msg: "Analyzing and running audits...", id: "lh:runner:auditing" };
        lighthouse_logger_default.time(status);
        if (artifacts.settings) {
          const overrides = {
            locale: void 0,
            gatherMode: void 0,
            auditMode: void 0,
            output: void 0,
            channel: void 0
          };
          const normalizedGatherSettings = Object.assign({}, artifacts.settings, overrides);
          const normalizedAuditSettings = Object.assign({}, settings, overrides);
          const keys2 = /* @__PURE__ */ new Set([
            ...Object.keys(normalizedGatherSettings),
            ...Object.keys(normalizedAuditSettings)
          ]);
          for (const k of keys2) {
            if (!isEqual_default(normalizedGatherSettings[k], normalizedAuditSettings[k])) {
              throw new Error(
                `Cannot change settings between gathering and auditing…
Difference found at: \`${k}\`: ${JSON.stringify(normalizedGatherSettings[k], null, 2)}
vs: ${JSON.stringify(normalizedAuditSettings[k], null, 2)}`
              );
            }
          }
          if (!isEqual_default(normalizedGatherSettings, normalizedAuditSettings)) {
            throw new Error("Cannot change settings between gathering and auditing");
          }
        }
        const sharedAuditContext = {
          settings,
          computedCache
        };
        const auditResultsById = {};
        for (const auditDefn of audits) {
          const auditId = auditDefn.implementation.meta.id;
          const auditResult = await _Runner._runAudit(
            auditDefn,
            artifacts,
            sharedAuditContext,
            runWarnings
          );
          auditResultsById[auditId] = auditResult;
        }
        lighthouse_logger_default.timeEnd(status);
        return auditResultsById;
      }
      /**
       * Checks that the audit's required artifacts exist and runs the audit if so.
       * Otherwise returns error audit result.
       * @param {LH.Config.AuditDefn} auditDefn
       * @param {LH.Artifacts} artifacts
       * @param {Pick<LH.Audit.Context, 'settings'|'computedCache'>} sharedAuditContext
       * @param {Array<string | LH.IcuMessage>} runWarnings
       * @return {Promise<LH.RawIcu<LH.Audit.Result>>}
       * @private
       */
      static async _runAudit(auditDefn, artifacts, sharedAuditContext, runWarnings) {
        const audit = auditDefn.implementation;
        const status = {
          msg: `Auditing: ${getFormatted(audit.meta.title, "en-US")}`,
          id: `lh:audit:${audit.meta.id}`
        };
        lighthouse_logger_default.time(status);
        let auditResult;
        try {
          if (artifacts.PageLoadError) throw artifacts.PageLoadError;
          for (const artifactName of audit.meta.requiredArtifacts) {
            const noArtifact = artifacts[artifactName] === void 0;
            if (noArtifact) {
              lighthouse_logger_default.warn(
                "Runner",
                `${artifactName} gatherer, required by audit ${audit.meta.id}, did not run.`
              );
              throw new LighthouseError(
                LighthouseError.errors.MISSING_REQUIRED_ARTIFACT,
                { artifactName }
              );
            }
            if (artifacts[artifactName] instanceof Error) {
              const artifactError = artifacts[artifactName];
              lighthouse_logger_default.warn("Runner", `${artifactName} gatherer, required by audit ${audit.meta.id}, encountered an error: ${artifactError.message}`);
              const error = new LighthouseError(
                LighthouseError.errors.ERRORED_REQUIRED_ARTIFACT,
                { artifactName, errorMessage: artifactError.message },
                { cause: artifactError }
              );
              error.expected = true;
              throw error;
            }
          }
          const auditOptions = Object.assign({}, audit.defaultOptions, auditDefn.options);
          const auditContext = {
            options: auditOptions,
            ...sharedAuditContext
          };
          const requestedArtifacts = audit.meta.requiredArtifacts.concat(audit.meta.__internalOptionalArtifacts || []);
          const narrowedArtifacts = requestedArtifacts.reduce(
            (narrowedArtifacts2, artifactName) => {
              const requestedArtifact = artifacts[artifactName];
              narrowedArtifacts2[artifactName] = requestedArtifact;
              return narrowedArtifacts2;
            },
            /** @type {LH.Artifacts} */
            {}
          );
          const product = await audit.audit(narrowedArtifacts, auditContext);
          runWarnings.push(...product.runWarnings || []);
          auditResult = Audit.generateAuditResult(audit, product);
        } catch (err) {
          if (err.code !== "MISSING_REQUIRED_ARTIFACT" && err.code !== "ERRORED_REQUIRED_ARTIFACT") {
            lighthouse_logger_default.warn(audit.meta.id, `Caught exception: ${err.message}`);
          }
          Sentry.captureException(err, { tags: { audit: audit.meta.id }, level: "error" });
          const errorMessage = err.friendlyMessage ? err.friendlyMessage : err.message;
          const stack = err.cause?.stack ?? err.stack;
          auditResult = Audit.generateErrorAuditResult(audit, errorMessage, stack);
        }
        lighthouse_logger_default.timeEnd(status);
        return auditResult;
      }
      /**
       * Searches a pass's artifacts for any `lhrRuntimeError` error artifacts.
       * Returns the first one found or `null` if none found.
       * @param {LH.Artifacts} artifacts
       * @return {LH.RawIcu<LH.Result['runtimeError']>|undefined}
       */
      static getArtifactRuntimeError(artifacts) {
        const possibleErrorArtifacts = [
          ["PageLoadError", artifacts.PageLoadError],
          // Preferentially use `PageLoadError`, if it exists.
          ...Object.entries(artifacts)
          // Otherwise check amongst all artifacts.
        ];
        for (const [artifactKey, possibleErrorArtifact] of possibleErrorArtifacts) {
          const isError = possibleErrorArtifact instanceof LighthouseError;
          if (isError && possibleErrorArtifact.lhrRuntimeError) {
            const errorMessage = possibleErrorArtifact.friendlyMessage || possibleErrorArtifact.message;
            const stack = (
              /** @type {any} */
              possibleErrorArtifact.cause?.stack ?? possibleErrorArtifact.stack
            );
            return {
              code: possibleErrorArtifact.code,
              message: errorMessage,
              errorStack: stack,
              artifactKey
            };
          }
        }
        return void 0;
      }
      /**
       * Returns list of audit names for external querying.
       * @return {Array<string>}
       */
      static getAuditList() {
        const ignoredFiles = [
          "audit.js",
          "violation-audit.js",
          "accessibility/axe-audit.js",
          "multi-check-audit.js",
          "byte-efficiency/byte-efficiency-audit.js",
          "manual/manual-audit.js",
          "insights/insight-audit.js"
        ];
        const fileList = [
          ...["accessibility", "agentic", "audit.js", "autocomplete.js", "baseline.js", "bf-cache.js", "bootup-time.js", "byte-efficiency", "clickjacking-mitigation.js", "csp-xss.js", "deprecations.js", "diagnostics.js", "dobetterweb", "errors-in-console.js", "final-screenshot.js", "has-hsts.js", "image-aspect-ratio.js", "image-size-responsive.js", "insights", "is-on-https.js", "layout-shifts.js", "long-tasks.js", "main-thread-tasks.js", "mainthread-work-breakdown.js", "manual", "metrics", "metrics.js", "network-requests.js", "network-rtt.js", "network-server-latency.js", "non-composited-animations.js", "oopif-iframe-test-audit.js", "origin-isolation.js", "predictive-perf.js", "redirects-http.js", "redirects.js", "resource-summary.js", "screenshot-thumbnails.js", "script-treemap-data.js", "seo", "server-response-time.js", "third-party-cookies.js", "trusted-types-xss.js", "unsized-images.js", "user-timings.js", "valid-source-maps.js", "violation-audit.js", "webmcp-form-coverage.js", "we\
bmcp-registered-tools.js", "webmcp-schema-validity.js"],
          ...["charset.js", "doctype.js", "geolocation-on-start.js", "inspector-issues.js", "js-libraries.js", "notification-on-start.js", "paste-preventing-inputs.js"].map((f) => `dobetterweb/${f}`),
          ...["cumulative-layout-shift.js", "first-contentful-paint.js", "interaction-to-next-paint.js", "interactive.js", "largest-contentful-paint.js", "max-potential-fid.js", "speed-index.js", "total-blocking-time.js"].map((f) => `metrics/${f}`),
          ...["canonical.js", "crawlable-anchors.js", "hreflang.js", "http-status-code.js", "is-crawlable.js", "link-text.js", "manual", "meta-description.js", "robots-txt.js"].map((f) => `seo/${f}`),
          ...["structured-data.js"].map((f) => `seo/manual/${f}`),
          ...["accesskeys.js", "aria-allowed-attr.js", "aria-allowed-role.js", "aria-command-name.js", "aria-conditional-attr.js", "aria-deprecated-role.js", "aria-dialog-name.js", "aria-hidden-body.js", "aria-hidden-focus.js", "aria-input-field-name.js", "aria-meter-name.js", "aria-progressbar-name.js", "aria-prohibited-attr.js", "aria-required-attr.js", "aria-required-children.js", "aria-required-parent.js", "aria-roles.js", "aria-text.js", "aria-toggle-field-name.js", "aria-tooltip-name.js", "aria-treeitem-name.js", "aria-valid-attr-value.js", "aria-valid-attr.js", "autocomplete-valid.js", "axe-audit.js", "button-name.js", "bypass.js", "color-contrast.js", "definition-list.js", "dlitem.js", "document-title.js", "duplicate-id-aria.js", "empty-heading.js", "form-field-multiple-labels.js", "frame-title.js", "heading-order.js", "html-has-lang.js", "html-lang-valid.js", "html-xml-lang-mismatch.js", "identical-links-same-purpose.js", "image-alt.js", "image-redundant-alt.js", "input-button\
-name.js", "input-image-alt.js", "label-content-name-mismatch.js", "label.js", "landmark-one-main.js", "link-in-text-block.js", "link-name.js", "list.js", "listitem.js", "manual", "meta-refresh.js", "meta-viewport.js", "object-alt.js", "presentation-role-conflict.js", "select-name.js", "skip-link.js", "svg-img-alt.js", "tabindex.js", "table-duplicate-name.js", "table-fake-caption.js", "target-size.js", "td-has-header.js", "td-headers-attr.js", "th-has-data-cells.js", "valid-lang.js", "video-caption.js"].map((f) => `accessibility/${f}`),
          ...["custom-controls-labels.js", "custom-controls-roles.js", "focus-traps.js", "focusable-controls.js", "interactive-element-affordance.js", "logical-tab-order.js", "managed-focus.js", "offscreen-content-hidden.js", "use-landmarks.js", "visual-order-follows-dom.js"].map((f) => `accessibility/manual/${f}`),
          ...["byte-efficiency-audit.js", "total-byte-weight.js", "unminified-css.js", "unminified-javascript.js", "unused-css-rules.js", "unused-javascript.js"].map((f) => `byte-efficiency/${f}`),
          ...["manual-audit.js"].map((f) => `manual/${f}`),
          ...["README.md", "cache-insight.js", "cls-culprits-insight.js", "document-latency-insight.js", "dom-size-insight.js", "duplicated-javascript-insight.js", "font-display-insight.js", "forced-reflow-insight.js", "image-delivery-insight.js", "inp-breakdown-insight.js", "insight-audit.js", "lcp-breakdown-insight.js", "lcp-discovery-insight.js", "legacy-javascript-insight.js", "modern-http-insight.js", "network-dependency-tree-insight.js", "render-blocking-insight.js", "slow-css-selector-insight.js", "third-parties-insight.js", "viewport-insight.js"].map((f) => `insights/${f}`),
          ...["agent-accessibility-tree.js", "llms-txt.js"].map((f) => `agentic/${f}`)
        ];
        return fileList.filter((f) => {
          return /\.js$/.test(f) && !ignoredFiles.includes(f);
        }).sort();
      }
      /**
       * Returns list of gatherer names for external querying.
       * @return {Array<string>}
       */
      static getGathererList() {
        const fileList = [
          ...["accessibility.js", "agentic", "anchor-elements.js", "bf-cache-failures.js", "console-messages.js", "css-usage.js", "devtools-log.js", "dobetterweb", "full-page-screenshot.js", "iframe-elements.js", "image-elements.js", "inputs.js", "inspector-issues.js", "js-usage.js", "link-elements.js", "main-document-content.js", "meta-elements.js", "network-user-agent.js", "scripts.js", "seo", "source-maps.js", "stacks.js", "stylesheets.js", "trace-elements.js", "trace.js", "viewport-dimensions.js", "webmcp-schema.js", "webmcp.js"],
          ...["robots-txt.js"].map((f) => `seo/${f}`),
          ...["doctype.js"].map((f) => `dobetterweb/${f}`),
          ...["llms-txt.js"].map((f) => `agentic/${f}`)
        ];
        return fileList.filter((f) => /\.js$/.test(f) && f !== "gatherer.js").sort();
      }
      /**
       * Get path to use for -G and -A modes. Defaults to $CWD/latest-run
       * @param {LH.Config.Settings} settings
       * @return {string}
       */
      static _getDataSavePath(settings) {
        const { auditMode, gatherMode } = settings;
        if (typeof auditMode === "string") return path6.resolve(process.cwd(), auditMode);
        if (typeof gatherMode === "string") return path6.resolve(process.cwd(), gatherMode);
        return path6.join(process.cwd(), "latest-run");
      }
    };
  }
});

// clients/devtools-mcp/devtools-mcp-entry.js
init_process_global();

// core/index.js
init_process_global();
init_trace();
init_runner();

// core/user-flow.js
init_process_global();
init_report_generator();

// core/gather/snapshot-runner.js
init_process_global();
init_lighthouse_logger();

// core/gather/driver.js
init_process_global();
init_lighthouse_logger();
init_execution_context();

// core/gather/driver/target-manager.js
init_process_global();
init_lighthouse_logger();
import EventEmitter4 from "events";

// core/gather/session.js
init_process_global();
init_lighthouse_logger();
init_lh_error();
import EventEmitter3 from "events";
/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var DEFAULT_PROTOCOL_TIMEOUT = 3e4;
var PPTR_BUFFER = 50;
var MAX_TIMEOUT = 2147483647 - PPTR_BUFFER;
var CrdpEventEmitter = (
  /** @type {CrdpEventMessageEmitter} */
  EventEmitter3
);
var ProtocolSession = class extends CrdpEventEmitter {
  static {
    __name(this, "ProtocolSession");
  }
  /**
   * @param {LH.Puppeteer.CDPSession} cdpSession
   */
  constructor(cdpSession) {
    super();
    this._cdpSession = cdpSession;
    this._targetInfo = void 0;
    this._nextProtocolTimeout = void 0;
    this._handleProtocolEvent = this._handleProtocolEvent.bind(this);
    this._cdpSession.on("*", this._handleProtocolEvent);
    let rej = /* @__PURE__ */ __name((_) => {
    }, "rej");
    this._targetCrashedPromise = /** @type {Promise<never>} */
    new Promise((_, theRej) => rej = theRej);
    this.on("Inspector.targetCrashed", async () => {
      lighthouse_logger_default.error("TargetManager", "Inspector.targetCrashed");
      void this.dispose();
      rej(new LighthouseError(LighthouseError.errors.TARGET_CRASHED));
    });
  }
  id() {
    return this._cdpSession.id();
  }
  /**
   * Re-emit protocol events from the underlying CDPSession.
   * @template {keyof LH.CrdpEvents} E
   * @param {E} method
   * @param {LH.CrdpEvents[E]} params
   */
  _handleProtocolEvent(method, ...params) {
    this.emit(method, ...params);
  }
  /** @param {LH.Crdp.Target.TargetInfo} targetInfo */
  setTargetInfo(targetInfo) {
    this._targetInfo = targetInfo;
  }
  /**
   * @return {boolean}
   */
  hasNextProtocolTimeout() {
    return this._nextProtocolTimeout !== void 0;
  }
  /**
   * @return {number}
   */
  getNextProtocolTimeout() {
    return this._nextProtocolTimeout || DEFAULT_PROTOCOL_TIMEOUT;
  }
  /**
   * @param {number} ms
   */
  setNextProtocolTimeout(ms) {
    if (ms > MAX_TIMEOUT) ms = MAX_TIMEOUT;
    this._nextProtocolTimeout = ms;
  }
  /**
   * @template {keyof LH.CrdpCommands} C
   * @param {C} method
   * @param {LH.CrdpCommands[C]['paramsType']} params
   * @return {Promise<LH.CrdpCommands[C]['returnType']>}
   */
  sendCommand(method, ...params) {
    const timeoutMs = this.getNextProtocolTimeout();
    this._nextProtocolTimeout = void 0;
    let timeout;
    const timeoutPromise = new Promise((resolve, reject) => {
      timeout = setTimeout(reject, timeoutMs, new LighthouseError(LighthouseError.errors.PROTOCOL_TIMEOUT, {
        protocolMethod: method
      }));
    });
    const resultPromise = this._cdpSession.send(method, ...params, {
      // Add 50ms to the Puppeteer timeout to ensure the Lighthouse timeout finishes first.
      timeout: timeoutMs + PPTR_BUFFER
    }).catch((error) => {
      lighthouse_logger_default.formatProtocol("method <= browser ERR", { method }, "error");
      throw LighthouseError.fromProtocolMessage(method, error);
    });
    const resultWithTimeoutPromise = Promise.race([resultPromise, timeoutPromise, this._targetCrashedPromise]);
    return resultWithTimeoutPromise.finally(() => {
      if (timeout) clearTimeout(timeout);
    });
  }
  /**
   * Send and if there's an error response, do not reject.
   * @template {keyof LH.CrdpCommands} C
   * @param {C} method
   * @param {LH.CrdpCommands[C]['paramsType']} params
   * @return {Promise<void>}
   */
  sendCommandAndIgnore(method, ...params) {
    return this.sendCommand(method, ...params).catch((e) => lighthouse_logger_default.verbose("session", method, e.message)).then((_) => void 0);
  }
  /**
   * Disposes of a session so that it can no longer talk to Chrome.
   * @return {Promise<void>}
   */
  async dispose() {
    this._cdpSession.off("*", this._handleProtocolEvent);
    await this._cdpSession.detach().catch((e) => lighthouse_logger_default.verbose("session", "detach failed", e.message));
  }
  onCrashPromise() {
    return this._targetCrashedPromise;
  }
};

// core/gather/driver/target-manager.js
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var ProtocolEventEmitter = (
  /** @type {ProtocolEventMessageEmitter} */
  EventEmitter4
);
var TargetManager = class extends ProtocolEventEmitter {
  static {
    __name(this, "TargetManager");
  }
  /** @param {LH.Puppeteer.CDPSession} cdpSession */
  constructor(cdpSession) {
    super();
    this._enabled = false;
    this._rootCdpSession = cdpSession;
    this._mainFrameId = "";
    this._targetIdToTargets = /* @__PURE__ */ new Map();
    this._executionContextIdToDescriptions = /* @__PURE__ */ new Map();
    this._onSessionAttached = this._onSessionAttached.bind(this);
    this._onFrameNavigated = this._onFrameNavigated.bind(this);
    this._onExecutionContextCreated = this._onExecutionContextCreated.bind(this);
    this._onExecutionContextDestroyed = this._onExecutionContextDestroyed.bind(this);
    this._onExecutionContextsCleared = this._onExecutionContextsCleared.bind(this);
  }
  /**
   * @param {LH.Crdp.Page.FrameNavigatedEvent} frameNavigatedEvent
   */
  async _onFrameNavigated(frameNavigatedEvent) {
    if (frameNavigatedEvent.frame.parentId) return;
    if (!this._enabled) return;
    try {
      await this._rootCdpSession.send("Target.setAutoAttach", {
        autoAttach: true,
        flatten: true,
        waitForDebuggerOnStart: true
      });
    } catch (err) {
      if (this._enabled) throw err;
    }
  }
  /**
   * @param {string} sessionId
   * @return {LH.Gatherer.ProtocolSession}
   */
  _findSession(sessionId) {
    for (const { session, cdpSession } of this._targetIdToTargets.values()) {
      if (cdpSession.id() === sessionId) return session;
    }
    throw new Error(`session ${sessionId} not found`);
  }
  /**
   * @param {string} targetType
   * @return {targetType is LH.Protocol.TargetType}
   */
  _isAcceptedTargetType(targetType) {
    return targetType === "page" || targetType === "iframe" || targetType === "worker";
  }
  /**
   * Returns the root session.
   * @return {LH.Gatherer.ProtocolSession}
   */
  rootSession() {
    const rootSessionId = this._rootCdpSession.id();
    return this._findSession(rootSessionId);
  }
  mainFrameExecutionContexts() {
    return [...this._executionContextIdToDescriptions.values()].filter((executionContext) => {
      return executionContext.auxData.frameId === this._mainFrameId;
    });
  }
  /**
   * @param {LH.Puppeteer.CDPSession} cdpSession
   */
  async _onSessionAttached(cdpSession) {
    const newSession = new ProtocolSession(cdpSession);
    let targetType;
    try {
      const { targetInfo } = await newSession.sendCommand("Target.getTargetInfo");
      targetType = targetInfo.type;
      if (!this._isAcceptedTargetType(targetType)) return;
      const targetId = targetInfo.targetId;
      if (this._targetIdToTargets.has(targetId)) return;
      newSession.setTargetInfo(targetInfo);
      const targetName = targetInfo.url || targetInfo.targetId;
      lighthouse_logger_default.verbose("target-manager", `target ${targetName} attached`);
      const trueProtocolListener = this._getProtocolEventListener(targetType, newSession.id());
      const protocolListener = trueProtocolListener;
      cdpSession.on("*", protocolListener);
      cdpSession.on("sessionattached", this._onSessionAttached);
      const targetWithSession = {
        target: targetInfo,
        cdpSession,
        session: newSession,
        protocolListener
      };
      this._targetIdToTargets.set(targetId, targetWithSession);
      await newSession.sendCommand("Network.enable");
      await newSession.sendCommand("Target.setAutoAttach", {
        autoAttach: true,
        flatten: true,
        waitForDebuggerOnStart: true
      });
    } catch (err) {
      if (/Target closed/.test(err.message)) return;
      if (/'Target.getTargetInfo' wasn't found/.test(err)) return;
      if (targetType === "worker") {
        lighthouse_logger_default.warn("target-manager", `Issue attaching to worker target: ${err}`);
        return;
      }
      throw err;
    } finally {
      await newSession.sendCommandAndIgnore("Runtime.runIfWaitingForDebugger");
    }
  }
  /**
   * @param {LH.Crdp.Runtime.ExecutionContextCreatedEvent} event
   */
  _onExecutionContextCreated(event) {
    if (event.context.name.match(/^__puppeteer_utility_world__/)) return;
    if (event.context.name === "lighthouse_isolated_context") return;
    this._executionContextIdToDescriptions.set(event.context.uniqueId, event.context);
  }
  /**
   * @param {LH.Crdp.Runtime.ExecutionContextDestroyedEvent} event
   */
  _onExecutionContextDestroyed(event) {
    this._executionContextIdToDescriptions.delete(event.executionContextUniqueId);
  }
  _onExecutionContextsCleared() {
    this._executionContextIdToDescriptions.clear();
  }
  /**
   * Returns a listener for all protocol events from session, and augments the
   * event with the sessionId.
   * @param {LH.Protocol.TargetType} targetType
   * @param {string} sessionId
   */
  _getProtocolEventListener(targetType, sessionId) {
    const onProtocolEvent = /* @__PURE__ */ __name((method, params) => {
      const payload = (
        /** @type {LH.Protocol.RawEventMessage} */
        { method, params, targetType, sessionId }
      );
      this.emit("protocolevent", payload);
    }, "onProtocolEvent");
    return onProtocolEvent;
  }
  /**
   * @return {Promise<void>}
   */
  async enable() {
    if (this._enabled) return;
    this._enabled = true;
    this._targetIdToTargets = /* @__PURE__ */ new Map();
    this._executionContextIdToDescriptions = /* @__PURE__ */ new Map();
    this._rootCdpSession.on("Page.frameNavigated", this._onFrameNavigated);
    this._rootCdpSession.on("Runtime.executionContextCreated", this._onExecutionContextCreated);
    this._rootCdpSession.on("Runtime.executionContextDestroyed", this._onExecutionContextDestroyed);
    this._rootCdpSession.on("Runtime.executionContextsCleared", this._onExecutionContextsCleared);
    await this._rootCdpSession.send("Page.enable");
    await this._rootCdpSession.send("Runtime.enable");
    this._mainFrameId = (await this._rootCdpSession.send("Page.getFrameTree")).frameTree.frame.id;
    await this._onSessionAttached(this._rootCdpSession);
  }
  /**
   * @return {Promise<void>}
   */
  async disable() {
    this._rootCdpSession.off("Page.frameNavigated", this._onFrameNavigated);
    this._rootCdpSession.off("Runtime.executionContextCreated", this._onExecutionContextCreated);
    this._rootCdpSession.off(
      "Runtime.executionContextDestroyed",
      this._onExecutionContextDestroyed
    );
    this._rootCdpSession.off("Runtime.executionContextsCleared", this._onExecutionContextsCleared);
    for (const { cdpSession, protocolListener } of this._targetIdToTargets.values()) {
      cdpSession.off("*", protocolListener);
      cdpSession.off("sessionattached", this._onSessionAttached);
    }
    await this._rootCdpSession.send("Page.disable").catch((_) => {
    });
    await this._rootCdpSession.send("Runtime.disable").catch((_) => {
    });
    this._enabled = false;
    this._targetIdToTargets = /* @__PURE__ */ new Map();
    this._executionContextIdToDescriptions = /* @__PURE__ */ new Map();
    this._mainFrameId = "";
  }
};

// core/gather/fetcher.js
init_process_global();
init_lh();
/**
 * @license Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var Fetcher = class {
  static {
    __name(this, "Fetcher");
  }
  /**
   * @param {LH.Gatherer.ProtocolSession} session
   */
  constructor(session) {
    this.session = session;
  }
  /**
   * Fetches any resource using the network directly.
   *
   * @param {string} url
   * @param {{timeout: number}=} options timeout is in ms
   * @return {Promise<FetchResponse>}
   */
  async fetchResource(url, options = { timeout: 2e3 }) {
    if (global.isLightrider) {
      return this._wrapWithTimeout(this._fetchWithFetchApi(url), options.timeout);
    }
    return this._fetchResourceOverProtocol(url, options);
  }
  /**
   * @param {string} url
   * @return {Promise<FetchResponse>}
   */
  async _fetchWithFetchApi(url) {
    const response = await fetch(url);
    let content = null;
    try {
      content = await response.text();
    } catch {
    }
    return {
      content,
      status: response.status
    };
  }
  /**
   * @param {string} handle
   * @param {{timeout: number}=} options,
   * @return {Promise<string>}
   */
  async _readIOStream(handle, options = { timeout: 2e3 }) {
    const startTime = Date.now();
    let ioResponse;
    let data31 = "";
    while (!ioResponse || !ioResponse.eof) {
      const elapsedTime = Date.now() - startTime;
      if (elapsedTime > options.timeout) {
        throw new Error("Waiting for the end of the IO stream exceeded the allotted time.");
      }
      ioResponse = await this.session.sendCommand("IO.read", { handle });
      const responseData = ioResponse.base64Encoded ? Buffer.from(ioResponse.data, "base64").toString("utf-8") : ioResponse.data;
      data31 = data31.concat(responseData);
    }
    return data31;
  }
  /**
   * @param {string} url
   * @return {Promise<{stream: LH.Crdp.IO.StreamHandle|null, status: number|null}>}
   */
  async _loadNetworkResource(url) {
    const frameTreeResponse = await this.session.sendCommand("Page.getFrameTree");
    const networkResponse = await this.session.sendCommand("Network.loadNetworkResource", {
      frameId: frameTreeResponse.frameTree.frame.id,
      url,
      options: {
        disableCache: true,
        includeCredentials: true
      }
    });
    return {
      stream: networkResponse.resource.success ? networkResponse.resource.stream || null : null,
      status: networkResponse.resource.httpStatusCode || null
    };
  }
  /**
   * @param {string} url
   * @param {{timeout: number}} options timeout is in ms
   * @return {Promise<FetchResponse>}
   */
  async _fetchResourceOverProtocol(url, options) {
    const startTime = Date.now();
    const response = await this._wrapWithTimeout(this._loadNetworkResource(url), options.timeout);
    const isOk = response.status && response.status >= 200 && response.status <= 299;
    if (!response.stream || !isOk) return { status: response.status, content: null };
    const timeout = options.timeout - (Date.now() - startTime);
    const content = await this._readIOStream(response.stream, { timeout });
    return { status: response.status, content };
  }
  /**
   * @template T
   * @param {Promise<T>} promise
   * @param {number} ms
   */
  async _wrapWithTimeout(promise, ms) {
    let timeoutHandle;
    const timeoutPromise = new Promise((_, reject) => {
      timeoutHandle = setTimeout(reject, ms, new Error("Timed out fetching resource"));
    });
    const wrappedPromise = await Promise.race([promise, timeoutPromise]).finally(() => clearTimeout(timeoutHandle));
    return wrappedPromise;
  }
};

// core/gather/driver/network-monitor.js
init_process_global();
init_lighthouse_logger();
init_lh();
init_network_recorder();
init_network_request();
init_url_utils();
import { EventEmitter as EventEmitter5 } from "events";
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var NetworkMonitorEventEmitter = (
  /** @type {NetworkMonitorEmitter} */
  EventEmitter5
);
var NetworkMonitor = class extends NetworkMonitorEventEmitter {
  static {
    __name(this, "NetworkMonitor");
  }
  /** @type {NetworkRecorder|undefined} */
  _networkRecorder = void 0;
  /** @type {Array<LH.Crdp.Page.Frame>} */
  _frameNavigations = [];
  /** @param {LH.Gatherer.Driver['targetManager']} targetManager */
  constructor(targetManager) {
    super();
    this._targetManager = targetManager;
    this._session = targetManager.rootSession();
    this._onFrameNavigated = (event) => this._frameNavigations.push(event.frame);
    this._onProtocolMessage = (event) => {
      if (!this._networkRecorder) return;
      this._networkRecorder.dispatch(event);
    };
  }
  /**
   * @return {Promise<void>}
   */
  async enable() {
    if (this._networkRecorder) return;
    this._frameNavigations = [];
    this._networkRecorder = new NetworkRecorder();
    const reEmit = /* @__PURE__ */ __name((event) => (r) => {
      this.emit(event, r);
      this._emitNetworkStatus();
    }, "reEmit");
    this._networkRecorder.on("requeststarted", reEmit("requeststarted"));
    this._networkRecorder.on("requestfinished", reEmit("requestfinished"));
    this._session.on("Page.frameNavigated", this._onFrameNavigated);
    this._targetManager.on("protocolevent", this._onProtocolMessage);
  }
  /**
   * @return {Promise<void>}
   */
  async disable() {
    if (!this._networkRecorder) return;
    this._session.off("Page.frameNavigated", this._onFrameNavigated);
    this._targetManager.off("protocolevent", this._onProtocolMessage);
    this._frameNavigations = [];
    this._networkRecorder = void 0;
  }
  /** @return {Promise<{requestedUrl?: string, mainDocumentUrl?: string}>} */
  async getNavigationUrls() {
    const frameNavigations = this._frameNavigations;
    if (!frameNavigations.length) return {};
    const mainFrameNavigations2 = frameNavigations.filter((frame) => !frame.parentId);
    if (!mainFrameNavigations2.length) lighthouse_logger_default.warn("NetworkMonitor", "No detected navigations");
    let requestedUrl = mainFrameNavigations2[0]?.url;
    if (this._networkRecorder) {
      const records = this._networkRecorder.getRawRecords();
      let initialUrlRequest = records.find((record) => record.url === requestedUrl);
      while (initialUrlRequest?.redirectSource) {
        initialUrlRequest = initialUrlRequest.redirectSource;
        requestedUrl = initialUrlRequest.url;
      }
    }
    return {
      requestedUrl,
      mainDocumentUrl: mainFrameNavigations2[mainFrameNavigations2.length - 1]?.url
    };
  }
  /**
   * @return {Array<NetworkRequest>}
   */
  getInflightRequests() {
    if (!this._networkRecorder) return [];
    return this._networkRecorder.getRawRecords().filter((request) => !request.finished);
  }
  /**
   * Returns whether the network is completely idle (i.e. there are 0 inflight network requests).
   */
  isIdle() {
    return this._isIdlePeriod(0);
  }
  /**
   * Returns whether any important resources for the page are in progress.
   * Above-the-fold images and XHRs should be included.
   * Tracking pixels, low priority images, and cross frame requests should be excluded.
   * @return {boolean}
   */
  isCriticalIdle() {
    if (!this._networkRecorder) return false;
    const requests = this._networkRecorder.getRawRecords();
    const rootFrameRequest = requests.find((r) => r.resourceType === "Document");
    const rootFrameId = rootFrameRequest?.frameId;
    return this._isIdlePeriod(
      0,
      // Return true if it should be a candidate for critical.
      (request) => request.frameId === rootFrameId && // WebSocket and Server-sent Events are typically long-lived and shouldn't be considered critical.
      request.resourceType !== "WebSocket" && request.resourceType !== "EventSource" && (request.priority === "VeryHigh" || request.priority === "High")
    );
  }
  /**
   * Returns whether the network is semi-idle (i.e. there are 2 or fewer inflight network requests).
   */
  is2Idle() {
    return this._isIdlePeriod(2);
  }
  /**
   * Returns whether the number of currently inflight requests is less than or
   * equal to the number of allowed concurrent requests.
   * @param {number} allowedRequests
   * @param {(request: NetworkRequest) => boolean} [requestFilter]
   * @return {boolean}
   */
  _isIdlePeriod(allowedRequests, requestFilter) {
    if (!this._networkRecorder) return false;
    const requests = this._networkRecorder.getRawRecords();
    let inflightRequests = 0;
    for (let i = 0; i < requests.length; i++) {
      const request = requests[i];
      if (request.finished) continue;
      if (requestFilter?.(request) === false) continue;
      if (NetworkRequest.isNonNetworkRequest(request)) continue;
      inflightRequests++;
    }
    return inflightRequests <= allowedRequests;
  }
  /**
   * Emits the appropriate network status event.
   */
  _emitNetworkStatus() {
    const zeroQuiet = this.isIdle();
    const twoQuiet = this.is2Idle();
    const criticalQuiet = this.isCriticalIdle();
    this.emit(zeroQuiet ? "networkidle" : "networkbusy");
    this.emit(twoQuiet ? "network-2-idle" : "network-2-busy");
    this.emit(criticalQuiet ? "network-critical-idle" : "network-critical-busy");
    if (twoQuiet && zeroQuiet) lighthouse_logger_default.verbose("NetworkRecorder", "network fully-quiet");
    else if (twoQuiet && !zeroQuiet) lighthouse_logger_default.verbose("NetworkRecorder", "network semi-quiet");
    else lighthouse_logger_default.verbose("NetworkRecorder", "network busy");
  }
  /**
   * Finds all time periods where the number of inflight requests is less than or equal to the
   * number of allowed concurrent requests.
   * The time periods returned are in ms.
   * @param {Array<LH.Artifacts.NetworkRequest>} requests
   * @param {number} allowedConcurrentRequests
   * @param {number=} endTime In ms
   * @return {Array<{start: number, end: number}>}
   */
  static findNetworkQuietPeriods(requests, allowedConcurrentRequests, endTime = Infinity) {
    let timeBoundaries = [];
    requests.forEach((request) => {
      if (url_utils_default.isNonNetworkProtocol(request.protocol)) return;
      if (request.protocol === "ws" || request.protocol === "wss") return;
      timeBoundaries.push({ time: request.networkRequestTime, isStart: true });
      if (request.finished) {
        timeBoundaries.push({ time: request.networkEndTime, isStart: false });
      }
    });
    timeBoundaries = timeBoundaries.filter((boundary) => boundary.time <= endTime).sort((a, b) => a.time - b.time);
    let numInflightRequests = 0;
    let quietPeriodStart = 0;
    const quietPeriods = [];
    timeBoundaries.forEach((boundary) => {
      if (boundary.isStart) {
        if (numInflightRequests === allowedConcurrentRequests) {
          quietPeriods.push({ start: quietPeriodStart, end: boundary.time });
        }
        numInflightRequests++;
      } else {
        numInflightRequests--;
        if (numInflightRequests === allowedConcurrentRequests) {
          quietPeriodStart = boundary.time;
        }
      }
    });
    if (numInflightRequests <= allowedConcurrentRequests) {
      quietPeriods.push({ start: quietPeriodStart, end: endTime });
    }
    return quietPeriods.filter((period) => period.start !== period.end);
  }
};

// core/gather/driver.js
/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var throwNotConnectedFn = /* @__PURE__ */ __name(() => {
  throw new Error("Session not connected");
}, "throwNotConnectedFn");
var throwingSession = {
  setTargetInfo: throwNotConnectedFn,
  hasNextProtocolTimeout: throwNotConnectedFn,
  getNextProtocolTimeout: throwNotConnectedFn,
  setNextProtocolTimeout: throwNotConnectedFn,
  on: throwNotConnectedFn,
  once: throwNotConnectedFn,
  off: throwNotConnectedFn,
  sendCommand: throwNotConnectedFn,
  sendCommandAndIgnore: throwNotConnectedFn,
  dispose: throwNotConnectedFn,
  onCrashPromise: throwNotConnectedFn
};
var Driver = class {
  static {
    __name(this, "Driver");
  }
  /**
   * @param {LH.Puppeteer.Page} page
   */
  constructor(page) {
    this._page = page;
    this._targetManager = void 0;
    this._networkMonitor = void 0;
    this._executionContext = void 0;
    this._fetcher = void 0;
    this.defaultSession = throwingSession;
  }
  /** @return {LH.Gatherer.Driver['executionContext']} */
  get executionContext() {
    if (!this._executionContext) return throwNotConnectedFn();
    return this._executionContext;
  }
  get fetcher() {
    if (!this._fetcher) return throwNotConnectedFn();
    return this._fetcher;
  }
  get targetManager() {
    if (!this._targetManager) return throwNotConnectedFn();
    return this._targetManager;
  }
  get networkMonitor() {
    if (!this._networkMonitor) return throwNotConnectedFn();
    return this._networkMonitor;
  }
  /** @return {Promise<string>} */
  async url() {
    return this._page.url();
  }
  /** @return {Promise<void>} */
  async connect() {
    if (this.defaultSession !== throwingSession) return;
    const status = { msg: "Connecting to browser", id: "lh:driver:connect" };
    lighthouse_logger_default.time(status);
    const cdpSession = await this._page.target().createCDPSession();
    this._targetManager = new TargetManager(cdpSession);
    await this._targetManager.enable();
    this._networkMonitor = new NetworkMonitor(this._targetManager);
    await this._networkMonitor.enable();
    this.defaultSession = this._targetManager.rootSession();
    this._executionContext = new ExecutionContext(this.defaultSession);
    this._fetcher = new Fetcher(this.defaultSession);
    lighthouse_logger_default.timeEnd(status);
  }
  /** @return {Promise<void>} */
  async disconnect() {
    if (this.defaultSession === throwingSession) return;
    await this._targetManager?.disable();
    await this._networkMonitor?.disable();
    await this.defaultSession.dispose();
  }
};

// core/gather/snapshot-runner.js
init_runner();

// core/gather/runner-helpers.js
init_process_global();
init_lighthouse_logger();
init_sentry();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
function createDependencyError(dependency, error) {
  const err = new Error(`Dependency "${dependency.id}" failed with exception: ${error.message}`);
  err.expected = true;
  return err;
}
__name(createDependencyError, "createDependencyError");
function getEmptyArtifactState() {
  return {
    startInstrumentation: {},
    startSensitiveInstrumentation: {},
    stopSensitiveInstrumentation: {},
    stopInstrumentation: {},
    getArtifact: {}
  };
}
__name(getEmptyArtifactState, "getEmptyArtifactState");
var phaseToPriorPhase = {
  startInstrumentation: void 0,
  startSensitiveInstrumentation: "startInstrumentation",
  stopSensitiveInstrumentation: "startSensitiveInstrumentation",
  stopInstrumentation: "stopSensitiveInstrumentation",
  getArtifact: "stopInstrumentation"
};
async function collectPhaseArtifacts(options) {
  const {
    driver,
    page,
    artifactDefinitions,
    artifactState,
    baseArtifacts,
    phase,
    gatherMode,
    computedCache,
    settings
  } = options;
  const priorPhase = phaseToPriorPhase[phase];
  const priorPhaseArtifacts = priorPhase && artifactState[priorPhase] || {};
  const isFinalPhase = phase === "getArtifact";
  for (const artifactDefn of artifactDefinitions) {
    lighthouse_logger_default.verbose(`artifacts:${phase}`, artifactDefn.id);
    const gatherer = artifactDefn.gatherer.instance;
    const priorArtifactPromise = priorPhaseArtifacts[artifactDefn.id] || Promise.resolve();
    const artifactPromise = priorArtifactPromise.then(async () => {
      const dependencies = isFinalPhase ? await collectArtifactDependencies(artifactDefn, artifactState.getArtifact) : (
        /** @type {Dependencies} */
        {}
      );
      const status = {
        msg: `Getting artifact: ${artifactDefn.id}`,
        id: `lh:gather:getArtifact:${artifactDefn.id}`
      };
      if (isFinalPhase) {
        lighthouse_logger_default.time(status);
      }
      const artifact = await gatherer[phase]({
        gatherMode,
        driver,
        page,
        baseArtifacts,
        dependencies,
        computedCache,
        settings
      });
      if (isFinalPhase) {
        lighthouse_logger_default.timeEnd(status);
      }
      return artifact;
    });
    await artifactPromise.catch((err) => {
      Sentry.captureException(err, {
        tags: { gatherer: artifactDefn.id, phase },
        level: "error"
      });
      lighthouse_logger_default.error(artifactDefn.id, err.message);
    });
    artifactState[phase][artifactDefn.id] = artifactPromise;
  }
}
__name(collectPhaseArtifacts, "collectPhaseArtifacts");
async function collectArtifactDependencies(artifact, artifactsById) {
  if (!artifact.dependencies) return (
    /** @type {Dependencies} */
    {}
  );
  const dependencyPromises = Object.entries(artifact.dependencies).map(
    async ([dependencyName, dependency]) => {
      const dependencyArtifact = artifactsById[dependency.id];
      if (dependencyArtifact === void 0) throw new Error(`"${dependency.id}" did not run`);
      if (dependencyArtifact instanceof Error) {
        throw createDependencyError(dependency, dependencyArtifact);
      }
      const dependencyPromise = Promise.resolve().then(() => dependencyArtifact).catch((err) => Promise.reject(createDependencyError(dependency, err)));
      return [dependencyName, await dependencyPromise];
    }
  );
  return Object.fromEntries(await Promise.all(dependencyPromises));
}
__name(collectArtifactDependencies, "collectArtifactDependencies");
async function awaitArtifacts(artifactState) {
  const artifacts = {};
  for (const [id, promise] of Object.entries(artifactState.getArtifact)) {
    const artifact = await promise.catch((err) => err);
    if (artifact !== void 0) artifacts[id] = artifact;
  }
  return artifacts;
}
__name(awaitArtifacts, "awaitArtifacts");

// core/gather/snapshot-runner.js
init_config();

// core/gather/base-artifacts.js
init_process_global();
init_lighthouse_logger();
init_lodash();

// core/gather/driver/environment.js
init_process_global();
init_lighthouse_logger();
init_constants();
init_page_functions();
init_i18n();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings130 = {
  /**
   * @description Warning that the host device where Lighthouse is running appears to have a slower
   * CPU than the expected Lighthouse baseline.
   */
  warningSlowHostCpu: "The tested device appears to have a slower CPU than  Lighthouse expects. This can negatively affect your performance score. Learn more about [calibrating an appropriate CPU slowdown multiplier](https://github.com/GoogleChrome/lighthouse/blob/main/docs/throttling.md#cpu-throttling)."
};
var SLOW_CPU_BENCHMARK_INDEX_THRESHOLD = 1e3;
var str_109 = createIcuMessageFn({ url: "core/gather/driver/environment.js" }.url, UIStrings130);
async function getBrowserVersion(session) {
  const status = { msg: "Getting browser version", id: "lh:gather:getVersion" };
  lighthouse_logger_default.time(status, "verbose");
  const version = await session.sendCommand("Browser.getVersion");
  const match = version.product.match(/\/(\d+)/);
  const milestone = match ? parseInt(match[1]) : 0;
  lighthouse_logger_default.timeEnd(status);
  return Object.assign(version, { milestone });
}
__name(getBrowserVersion, "getBrowserVersion");
async function getBenchmarkIndex(executionContext) {
  const status = { msg: "Benchmarking machine", id: "lh:gather:getBenchmarkIndex" };
  lighthouse_logger_default.time(status);
  const indexVal = await executionContext.evaluate(pageFunctions.computeBenchmarkIndex, {
    args: []
  });
  lighthouse_logger_default.timeEnd(status);
  return indexVal;
}
__name(getBenchmarkIndex, "getBenchmarkIndex");
async function getDevicePixelRatio(executionContext) {
  const status = { msg: "Host device pixel ratio", id: "lh:gather:getDevicePixelRatio" };
  lighthouse_logger_default.time(status);
  const indexVal = await executionContext.evaluate(() => devicePixelRatio, {
    args: []
  });
  lighthouse_logger_default.timeEnd(status);
  return indexVal;
}
__name(getDevicePixelRatio, "getDevicePixelRatio");
function getSlowHostCpuWarning(context) {
  const { settings, baseArtifacts } = context;
  const { throttling: throttling3, throttlingMethod } = settings;
  const defaultThrottling2 = defaultSettings.throttling;
  if (settings.channel !== "cli") return;
  const isThrottledMethod = throttlingMethod === "simulate" || throttlingMethod === "devtools";
  const isDefaultMultiplier = throttling3.cpuSlowdownMultiplier === defaultThrottling2.cpuSlowdownMultiplier;
  if (!isThrottledMethod || !isDefaultMultiplier) return;
  if (baseArtifacts.BenchmarkIndex > SLOW_CPU_BENCHMARK_INDEX_THRESHOLD) return;
  return str_109(UIStrings130.warningSlowHostCpu);
}
__name(getSlowHostCpuWarning, "getSlowHostCpuWarning");
function getEnvironmentWarnings(context) {
  return [
    getSlowHostCpuWarning(context)
  ].filter((s) => !!s);
}
__name(getEnvironmentWarnings, "getEnvironmentWarnings");

// core/gather/base-artifacts.js
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
async function getBaseArtifacts(resolvedConfig, driver, context) {
  const BenchmarkIndex = await getBenchmarkIndex(driver.executionContext);
  const { userAgent, product } = await getBrowserVersion(driver.defaultSession);
  const HostDPR = await getDevicePixelRatio(driver.executionContext);
  return {
    // Meta artifacts.
    fetchTime: (/* @__PURE__ */ new Date()).toJSON(),
    Timing: [],
    LighthouseRunWarnings: [],
    settings: resolvedConfig.settings,
    // Environment artifacts that can always be computed.
    BenchmarkIndex,
    HostDPR,
    HostUserAgent: userAgent,
    HostFormFactor: userAgent.includes("Android") || userAgent.includes("Mobile") ? "mobile" : "desktop",
    HostProduct: product,
    // Contextual artifacts whose collection changes based on gather mode.
    URL: {
      finalDisplayedUrl: ""
    },
    PageLoadError: null,
    GatherContext: context
  };
}
__name(getBaseArtifacts, "getBaseArtifacts");
function deduplicateWarnings(warnings) {
  const unique = [];
  for (const warning of warnings) {
    if (unique.some((existing) => isEqual_default(warning, existing))) continue;
    unique.push(warning);
  }
  return unique;
}
__name(deduplicateWarnings, "deduplicateWarnings");
function finalizeArtifacts(baseArtifacts, gathererArtifacts) {
  baseArtifacts.LighthouseRunWarnings.push(
    ...getEnvironmentWarnings({ settings: baseArtifacts.settings, baseArtifacts })
  );
  const artifacts = (
    /** @type {LH.Artifacts} */
    { ...baseArtifacts, ...gathererArtifacts }
  );
  artifacts.Timing = lighthouse_logger_default.getTimeEntries();
  artifacts.LighthouseRunWarnings = deduplicateWarnings(baseArtifacts.LighthouseRunWarnings);
  if (artifacts.PageLoadError && !artifacts.URL.finalDisplayedUrl) {
    artifacts.URL.finalDisplayedUrl = artifacts.URL.requestedUrl || "";
  }
  if (!artifacts.URL.finalDisplayedUrl) throw new Error("Runner did not set finalDisplayedUrl");
  return artifacts;
}
__name(finalizeArtifacts, "finalizeArtifacts");

// core/gather/snapshot-runner.js
/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
async function snapshotGather(page, options = {}) {
  const { flags = {}, config: config5 } = options;
  lighthouse_logger_default.setLevel(flags.logLevel || "error");
  const { resolvedConfig } = await initializeConfig("snapshot", config5, flags);
  const driver = new Driver(page);
  await driver.connect();
  const computedCache = /* @__PURE__ */ new Map();
  const url = await driver.url();
  const runnerOptions = { resolvedConfig, computedCache };
  const gatherFn = /* @__PURE__ */ __name(async () => {
    const baseArtifacts = await getBaseArtifacts(resolvedConfig, driver, { gatherMode: "snapshot" });
    baseArtifacts.URL = {
      finalDisplayedUrl: url
    };
    const artifactDefinitions = resolvedConfig.artifacts || [];
    const artifactState = getEmptyArtifactState();
    await collectPhaseArtifacts({
      phase: "getArtifact",
      gatherMode: "snapshot",
      driver,
      page,
      baseArtifacts,
      artifactDefinitions,
      artifactState,
      computedCache,
      settings: resolvedConfig.settings
    });
    await driver.disconnect();
    const artifacts2 = await awaitArtifacts(artifactState);
    return finalizeArtifacts(baseArtifacts, artifacts2);
  }, "gatherFn");
  const artifacts = await Runner.gather(gatherFn, runnerOptions);
  return { artifacts, runnerOptions };
}
__name(snapshotGather, "snapshotGather");

// core/gather/timespan-runner.js
init_process_global();
init_lighthouse_logger();
init_runner();

// core/gather/driver/prepare.js
init_process_global();
init_lighthouse_logger();

// core/gather/driver/storage.js
init_process_global();
init_lighthouse_logger();
init_i18n();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings131 = {
  /**
   * @description A warning that previously-saved data may have affected the measured performance and instructions on how to avoid the problem. "locations" will be a list of possible types of data storage locations, e.g. "IndexedDB",  "Local Storage", or "Web SQL".
   * @example {IndexedDB, Local Storage} locations
   */
  warningData: `{locationCount, plural,
    =1 {There may be stored data affecting loading performance in this location: {locations}. Audit this page in an incognito window to prevent those resources from affecting your scores.}
    other {There may be stored data affecting loading performance in these locations: {locations}. Audit this page in an incognito window to prevent those resources from affecting your scores.}
  }`,
  /** A warning that the data in the browser cache may have affected the measured performance because the operation to clear the browser cache timed out. */
  warningCacheTimeout: "Clearing the browser cache timed out. Try auditing this page again and file a bug if the issue persists.",
  /** A warning that the data on the page's origin may have affected the measured performance because the operation to clear the origin data timed out. */
  warningOriginDataTimeout: "Clearing the origin data timed out. Try auditing this page again and file a bug if the issue persists."
};
var str_110 = createIcuMessageFn({ url: "core/gather/driver/storage.js" }.url, UIStrings131);
async function clearDataForOrigin(session, url, clearStorageTypes) {
  const status = { msg: "Cleaning origin data", id: "lh:storage:clearDataForOrigin" };
  lighthouse_logger_default.time(status);
  const warnings = [];
  const origin = new URL(url).origin;
  const typesToClear = clearStorageTypes.join(",");
  session.setNextProtocolTimeout(5e3);
  try {
    await session.sendCommand("Storage.clearDataForOrigin", {
      origin,
      storageTypes: typesToClear
    });
  } catch (err) {
    if (
      /** @type {LH.LighthouseError} */
      err.code === "PROTOCOL_TIMEOUT"
    ) {
      lighthouse_logger_default.warn("Driver", "clearDataForOrigin timed out");
      warnings.push(str_110(UIStrings131.warningOriginDataTimeout));
    } else {
      throw err;
    }
  } finally {
    lighthouse_logger_default.timeEnd(status);
  }
  return warnings;
}
__name(clearDataForOrigin, "clearDataForOrigin");
async function getImportantStorageWarning(session, url) {
  const usageData = await session.sendCommand("Storage.getUsageAndQuota", {
    origin: url
  });
  const storageTypeNames = {
    local_storage: "Local Storage",
    indexeddb: "IndexedDB",
    websql: "Web SQL"
  };
  const locations = usageData.usageBreakdown.filter((usage) => usage.usage).map((usage) => storageTypeNames[usage.storageType] || "").filter(Boolean);
  if (locations.length) {
    return str_110(UIStrings131.warningData, {
      locations: locations.join(", "),
      locationCount: locations.length
    });
  }
}
__name(getImportantStorageWarning, "getImportantStorageWarning");
async function clearBrowserCaches(session) {
  const status = { msg: "Cleaning browser cache", id: "lh:storage:clearBrowserCaches" };
  lighthouse_logger_default.time(status);
  const warnings = [];
  try {
    await session.sendCommand("Network.clearBrowserCache");
    await session.sendCommand("Network.setCacheDisabled", { cacheDisabled: true });
    await session.sendCommand("Network.setCacheDisabled", { cacheDisabled: false });
  } catch (err) {
    if (
      /** @type {LH.LighthouseError} */
      err.code === "PROTOCOL_TIMEOUT"
    ) {
      lighthouse_logger_default.warn("Driver", "clearBrowserCaches timed out");
      warnings.push(str_110(UIStrings131.warningCacheTimeout));
    } else {
      throw err;
    }
  } finally {
    lighthouse_logger_default.timeEnd(status);
  }
  return warnings;
}
__name(clearBrowserCaches, "clearBrowserCaches");

// core/lib/emulation.js
init_process_global();
/**
 * @license
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var NO_THROTTLING_METRICS = {
  latency: 0,
  downloadThroughput: 0,
  uploadThroughput: 0,
  offline: false
};
var NO_CPU_THROTTLE_METRICS = {
  rate: 1
};
function parseUseragentIntoMetadata(fullVersion, formFactor) {
  const [version] = fullVersion.split(".", 1);
  const brands = [
    { brand: "Chromium", version },
    { brand: "Google Chrome", version }
  ];
  const motoGPowerDetails = {
    platform: "Android",
    platformVersion: "11.0",
    architecture: "",
    model: "moto g power (2022)"
  };
  const macDesktopDetails = {
    platform: "macOS",
    platformVersion: "10.15.7",
    architecture: "x86",
    model: ""
  };
  const mobile = formFactor === "mobile";
  return {
    brands,
    fullVersion,
    // Since config users can supply a custom useragent, they likely are emulating something
    // other than Moto G Power and MacOS Desktop.
    // TODO: Determine how to thoughtfully expose this metadata/client-hints configurability.
    ...mobile ? motoGPowerDetails : macDesktopDetails,
    mobile
  };
}
__name(parseUseragentIntoMetadata, "parseUseragentIntoMetadata");
async function matchHostUAVersion(session, userAgent) {
  const { milestone } = await getBrowserVersion(session);
  const tweakedUA = userAgent.replace(/(Chrome\/)[\d.]+/, `$1${milestone}.0.0.0`);
  const fullVersion = `${milestone}.0.0.0`;
  return { tweakedUA, fullVersion };
}
__name(matchHostUAVersion, "matchHostUAVersion");
async function emulate(session, settings) {
  if (settings.emulatedUserAgent !== false) {
    const userAgent = (
      /** @type {string} */
      settings.emulatedUserAgent
    );
    const { tweakedUA, fullVersion } = await matchHostUAVersion(session, userAgent);
    await session.sendCommand("Network.setUserAgentOverride", {
      userAgent: tweakedUA,
      userAgentMetadata: parseUseragentIntoMetadata(fullVersion, settings.formFactor)
    });
  }
  if (settings.screenEmulation.disabled !== true) {
    const { width, height, deviceScaleFactor, mobile } = settings.screenEmulation;
    const params = { width, height, deviceScaleFactor, mobile };
    await session.sendCommand("Emulation.setDeviceMetricsOverride", params);
    await session.sendCommand("Emulation.setTouchEmulationEnabled", {
      enabled: params.mobile
    });
  }
}
__name(emulate, "emulate");
async function throttle(session, settings) {
  if (settings.throttlingMethod !== "devtools") return clearNetworkThrottling(session);
  await Promise.all([
    enableNetworkThrottling(session, settings.throttling),
    enableCPUThrottling(session, settings.throttling)
  ]);
}
__name(throttle, "throttle");
async function clearThrottling(session) {
  await Promise.all([clearNetworkThrottling(session), clearCPUThrottling(session)]);
}
__name(clearThrottling, "clearThrottling");
function enableNetworkThrottling(session, throttlingSettings) {
  const conditions = {
    offline: false,
    latency: throttlingSettings.requestLatencyMs || 0,
    downloadThroughput: throttlingSettings.downloadThroughputKbps || 0,
    uploadThroughput: throttlingSettings.uploadThroughputKbps || 0
  };
  conditions.downloadThroughput = Math.floor(conditions.downloadThroughput * 1024 / 8);
  conditions.uploadThroughput = Math.floor(conditions.uploadThroughput * 1024 / 8);
  return session.sendCommand("Network.emulateNetworkConditions", conditions);
}
__name(enableNetworkThrottling, "enableNetworkThrottling");
function clearNetworkThrottling(session) {
  return session.sendCommandAndIgnore("Network.emulateNetworkConditions", NO_THROTTLING_METRICS);
}
__name(clearNetworkThrottling, "clearNetworkThrottling");
function enableCPUThrottling(session, throttlingSettings) {
  const rate = throttlingSettings.cpuSlowdownMultiplier;
  return session.sendCommand("Emulation.setCPUThrottlingRate", { rate });
}
__name(enableCPUThrottling, "enableCPUThrottling");
function clearCPUThrottling(session) {
  return session.sendCommandAndIgnore("Emulation.setCPUThrottlingRate", NO_CPU_THROTTLE_METRICS);
}
__name(clearCPUThrottling, "clearCPUThrottling");

// core/gather/driver/prepare.js
init_page_functions();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
async function enableAsyncStacks(session) {
  const enable = /* @__PURE__ */ __name(async () => {
    await session.sendCommand("Debugger.enable");
    await session.sendCommand("Debugger.setSkipAllPauses", { skip: true });
    await session.sendCommand("Debugger.setAsyncCallStackDepth", { maxDepth: 8 });
  }, "enable");
  function onDebuggerPaused() {
    session.sendCommand("Debugger.resume");
  }
  __name(onDebuggerPaused, "onDebuggerPaused");
  function onFrameNavigated(event) {
    if (event.frame.parentId) return;
    enable().catch((err) => lighthouse_logger_default.error("Driver", err));
  }
  __name(onFrameNavigated, "onFrameNavigated");
  session.on("Debugger.paused", onDebuggerPaused);
  session.on("Page.frameNavigated", onFrameNavigated);
  await enable();
  return async () => {
    await session.sendCommandAndIgnore("Debugger.disable");
    session.off("Debugger.paused", onDebuggerPaused);
    session.off("Page.frameNavigated", onFrameNavigated);
  };
}
__name(enableAsyncStacks, "enableAsyncStacks");
async function shimRequestIdleCallbackOnNewDocument(driver, settings) {
  await driver.executionContext.evaluateOnNewDocument(pageFunctions.wrapRequestIdleCallback, {
    args: [settings.throttling.cpuSlowdownMultiplier]
  });
}
__name(shimRequestIdleCallbackOnNewDocument, "shimRequestIdleCallbackOnNewDocument");
async function dismissJavaScriptDialogs(session) {
  session.on("Page.javascriptDialogOpening", (data31) => {
    lighthouse_logger_default.warn("Driver", `${data31.type} dialog opened by the page automatically suppressed.`);
    session.sendCommand("Page.handleJavaScriptDialog", {
      accept: true,
      promptText: "Lighthouse prompt response"
    }).catch((err) => lighthouse_logger_default.warn("Driver", err));
  });
  await session.sendCommand("Page.enable");
}
__name(dismissJavaScriptDialogs, "dismissJavaScriptDialogs");
async function resetStorageForUrl(session, url, clearStorageTypes) {
  const warnings = [];
  const clearDataWarnings = await clearDataForOrigin(session, url, clearStorageTypes);
  warnings.push(...clearDataWarnings);
  const clearCacheWarnings = await clearBrowserCaches(session);
  warnings.push(...clearCacheWarnings);
  const importantStorageWarning = await getImportantStorageWarning(session, url);
  if (importantStorageWarning) warnings.push(importantStorageWarning);
  return { warnings };
}
__name(resetStorageForUrl, "resetStorageForUrl");
async function prepareThrottlingAndNetwork(session, settings) {
  const status = { msg: "Preparing network conditions", id: `lh:gather:prepareThrottlingAndNetwork` };
  lighthouse_logger_default.time(status);
  await throttle(session, settings);
  const blockedUrls = settings.blockedUrlPatterns || [];
  await session.sendCommand("Network.setBlockedURLs", { urls: blockedUrls });
  const headers = settings.extraHeaders;
  if (headers) await session.sendCommand("Network.setExtraHTTPHeaders", { headers });
  lighthouse_logger_default.timeEnd(status);
}
__name(prepareThrottlingAndNetwork, "prepareThrottlingAndNetwork");
async function prepareDeviceEmulation(driver, settings) {
  await driver.defaultSession.sendCommand("Network.enable");
  await emulate(driver.defaultSession, settings);
}
__name(prepareDeviceEmulation, "prepareDeviceEmulation");
async function warmUpIntlSegmenter(driver) {
  await driver.executionContext.evaluate(pageFunctions.truncate, {
    args: ["aaa", 2]
  });
}
__name(warmUpIntlSegmenter, "warmUpIntlSegmenter");
async function prepareTargetForNavigationMode(driver, settings, requestor) {
  const status = { msg: "Preparing target for navigation mode", id: "lh:prepare:navigationMode" };
  lighthouse_logger_default.time(status);
  const warnings = [];
  await prepareDeviceEmulation(driver, settings);
  await dismissJavaScriptDialogs(driver.defaultSession);
  await driver.executionContext.cacheNativesOnNewDocument();
  if (settings.throttlingMethod === "simulate") {
    await shimRequestIdleCallbackOnNewDocument(driver, settings);
  }
  await warmUpIntlSegmenter(driver);
  const shouldResetStorage = !settings.disableStorageReset && // Without prior knowledge of the destination, we cannot know which URL to clear storage for.
  typeof requestor === "string";
  if (shouldResetStorage) {
    const { warnings: storageWarnings } = await resetStorageForUrl(
      driver.defaultSession,
      requestor,
      settings.clearStorageTypes
    );
    warnings.push(...storageWarnings);
  }
  await prepareThrottlingAndNetwork(driver.defaultSession, settings);
  lighthouse_logger_default.timeEnd(status);
  return { warnings };
}
__name(prepareTargetForNavigationMode, "prepareTargetForNavigationMode");

// core/gather/timespan-runner.js
init_config();
init_i18n();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings132 = {
  /** A warning that indicates page navigations should be audited using navigation mode, as opposed to timespan mode. "navigation mode" refers to a Lighthouse mode that analyzes a page navigation. "timespan mode" refers to a Lighthouse mode that analyzes user interactions over an arbitrary period of time. */
  warningNavigationDetected: "A page navigation was detected during the run. Using timespan mode to audit page navigations is not recommended. Use navigation mode to audit page navigations for better third-party attribution and main thread detection."
};
var str_111 = createIcuMessageFn({ url: "core/gather/timespan-runner.js" }.url, UIStrings132);

// core/gather/navigation-runner.js
init_process_global();

// replace-modules:/usr/local/google/home/lusazhan/Git/lighthouse/node_modules/puppeteer-core/lib/cjs/puppeteer/puppeteer-core.js
init_process_global();
var puppeteer_core_default = {};

// core/gather/navigation-runner.js
init_lighthouse_logger();
init_runner();

// core/gather/driver/navigation.js
init_process_global();
init_lighthouse_logger();

// core/gather/driver/wait-for-condition.js
init_process_global();
init_lighthouse_logger();
init_lh_error();
init_execution_context();
/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
function waitForNothing() {
  return { promise: Promise.resolve(), cancel() {
  } };
}
__name(waitForNothing, "waitForNothing");
function waitForFrameNavigated(session) {
  let cancel = /* @__PURE__ */ __name(() => {
    throw new Error("waitForFrameNavigated.cancel() called before it was defined");
  }, "cancel");
  const promise = new Promise((resolve, reject) => {
    session.once("Page.frameNavigated", resolve);
    cancel = /* @__PURE__ */ __name(() => {
      session.off("Page.frameNavigated", resolve);
      reject(new Error("Wait for navigated cancelled"));
    }, "cancel");
  });
  return { promise, cancel };
}
__name(waitForFrameNavigated, "waitForFrameNavigated");
function waitForFcp(session, pauseAfterFcpMs, maxWaitForFcpMs) {
  let cancel = /* @__PURE__ */ __name(() => {
    throw new Error("waitForFcp.cancel() called before it was defined");
  }, "cancel");
  const promise = new Promise((resolve, reject) => {
    const maxWaitTimeout = setTimeout(() => {
      reject(new LighthouseError(LighthouseError.errors.NO_FCP));
    }, maxWaitForFcpMs);
    let loadTimeout;
    const lifecycleListener = /* @__PURE__ */ __name((e) => {
      if (e.name === "firstContentfulPaint") {
        loadTimeout = setTimeout(() => {
          resolve();
          cancel();
        }, pauseAfterFcpMs);
      }
    }, "lifecycleListener");
    session.on("Page.lifecycleEvent", lifecycleListener);
    let canceled = false;
    cancel = /* @__PURE__ */ __name(() => {
      if (canceled) return;
      canceled = true;
      session.off("Page.lifecycleEvent", lifecycleListener);
      maxWaitTimeout && clearTimeout(maxWaitTimeout);
      loadTimeout && clearTimeout(loadTimeout);
      reject(new Error("Wait for FCP canceled"));
    }, "cancel");
  });
  return {
    promise,
    cancel
  };
}
__name(waitForFcp, "waitForFcp");
function waitForNetworkIdle(session, networkMonitor, networkQuietOptions) {
  let hasDCLFired = false;
  let idleTimeout;
  let cancel = /* @__PURE__ */ __name(() => {
    throw new Error("waitForNetworkIdle.cancel() called before it was defined");
  }, "cancel");
  const { networkQuietThresholdMs, busyEvent, idleEvent, isIdle } = networkQuietOptions;
  const promise = new Promise((resolve, reject) => {
    const onIdle = /* @__PURE__ */ __name(() => {
      networkMonitor.once(busyEvent, onBusy);
      idleTimeout = setTimeout(() => {
        cancel();
        resolve();
      }, networkQuietThresholdMs);
    }, "onIdle");
    const onBusy = /* @__PURE__ */ __name(() => {
      networkMonitor.once(idleEvent, onIdle);
      idleTimeout && clearTimeout(idleTimeout);
    }, "onBusy");
    const domContentLoadedListener = /* @__PURE__ */ __name(() => {
      hasDCLFired = true;
      if (isIdle(networkMonitor)) {
        onIdle();
      } else {
        onBusy();
      }
    }, "domContentLoadedListener");
    const logStatus = /* @__PURE__ */ __name(() => {
      if (!hasDCLFired) {
        lighthouse_logger_default.verbose("waitFor", "Waiting on DomContentLoaded");
        return;
      }
      const inflightRecords = networkMonitor.getInflightRequests();
      if (lighthouse_logger_default.isVerbose() && inflightRecords.length < 20 && inflightRecords.length > 0) {
        lighthouse_logger_default.verbose("waitFor", `=== Waiting on ${inflightRecords.length} requests to finish`);
        for (const record of inflightRecords) {
          lighthouse_logger_default.verbose("waitFor", `Waiting on ${record.url.slice(0, 120)} to finish`);
        }
      }
    }, "logStatus");
    networkMonitor.on("requeststarted", logStatus);
    networkMonitor.on("requestfinished", logStatus);
    networkMonitor.on(busyEvent, logStatus);
    if (!networkQuietOptions.pretendDCLAlreadyFired) {
      session.once("Page.domContentEventFired", domContentLoadedListener);
    } else {
      domContentLoadedListener();
    }
    let canceled = false;
    cancel = /* @__PURE__ */ __name(() => {
      if (canceled) return;
      canceled = true;
      if (idleTimeout) clearTimeout(idleTimeout);
      if (!networkQuietOptions.pretendDCLAlreadyFired) {
        session.off("Page.domContentEventFired", domContentLoadedListener);
      }
      networkMonitor.removeListener(busyEvent, onBusy);
      networkMonitor.removeListener(idleEvent, onIdle);
      networkMonitor.removeListener("requeststarted", logStatus);
      networkMonitor.removeListener("requestfinished", logStatus);
      networkMonitor.removeListener(busyEvent, logStatus);
    }, "cancel");
  });
  return {
    promise,
    cancel
  };
}
__name(waitForNetworkIdle, "waitForNetworkIdle");
function waitForCPUIdle(session, waitForCPUQuiet) {
  if (!waitForCPUQuiet) {
    return {
      promise: Promise.resolve(),
      cancel: /* @__PURE__ */ __name(() => void 0, "cancel")
    };
  }
  let lastTimeout;
  let canceled = false;
  async function checkForQuiet(executionContext2, resolve) {
    if (canceled) return;
    const timeSinceLongTask = await executionContext2.evaluate(
      checkTimeSinceLastLongTaskInPage,
      { args: [], useIsolation: true }
    );
    if (canceled) return;
    if (typeof timeSinceLongTask === "number") {
      if (timeSinceLongTask >= waitForCPUQuiet) {
        lighthouse_logger_default.verbose("waitFor", `CPU has been idle for ${timeSinceLongTask} ms`);
        resolve();
      } else {
        lighthouse_logger_default.verbose("waitFor", `CPU has been idle for ${timeSinceLongTask} ms`);
        const timeToWait = waitForCPUQuiet - timeSinceLongTask;
        lastTimeout = setTimeout(() => checkForQuiet(executionContext2, resolve), timeToWait);
      }
    }
  }
  __name(checkForQuiet, "checkForQuiet");
  let cancel = /* @__PURE__ */ __name(() => {
    throw new Error("waitForCPUIdle.cancel() called before it was defined");
  }, "cancel");
  const executionContext = new ExecutionContext(session);
  const promise = new Promise((resolve, reject) => {
    executionContext.evaluate(registerPerformanceObserverInPage, { args: [], useIsolation: true }).then(() => checkForQuiet(executionContext, resolve)).catch(reject);
    cancel = /* @__PURE__ */ __name(() => {
      if (canceled) return;
      canceled = true;
      if (lastTimeout) clearTimeout(lastTimeout);
      reject(new Error("Wait for CPU idle canceled"));
    }, "cancel");
  });
  return {
    promise,
    cancel
  };
}
__name(waitForCPUIdle, "waitForCPUIdle");
function registerPerformanceObserverInPage() {
  if (window.____lastLongTask !== void 0) return;
  window.____lastLongTask = performance.now();
  const observer = new window.PerformanceObserver((entryList) => {
    const entries = entryList.getEntries();
    for (const entry of entries) {
      if (entry.entryType === "longtask") {
        const taskEnd = entry.startTime + entry.duration;
        window.____lastLongTask = Math.max(window.____lastLongTask || 0, taskEnd);
      }
    }
  });
  observer.observe({ type: "longtask", buffered: true });
}
__name(registerPerformanceObserverInPage, "registerPerformanceObserverInPage");
function checkTimeSinceLastLongTaskInPage() {
  return new Promise((resolve) => {
    const firstAttemptTs = performance.now();
    const firstAttemptLastLongTaskTs = window.____lastLongTask || 0;
    setTimeout(() => {
      const secondAttemptLastLongTaskTs = window.____lastLongTask || 0;
      const timeSinceLongTask = firstAttemptLastLongTaskTs === secondAttemptLastLongTaskTs ? (
        // The time of the last long task hasn't changed, the information from our first attempt is accurate.
        firstAttemptTs - firstAttemptLastLongTaskTs
      ) : (
        // The time of the last long task *did* change, we can't really trust the information we have.
        0
      );
      resolve(timeSinceLongTask);
    }, 150);
  });
}
__name(checkTimeSinceLastLongTaskInPage, "checkTimeSinceLastLongTaskInPage");
function waitForLoadEvent(session, pauseAfterLoadMs) {
  let cancel = /* @__PURE__ */ __name(() => {
    throw new Error("waitForLoadEvent.cancel() called before it was defined");
  }, "cancel");
  const promise = new Promise((resolve, reject) => {
    let loadTimeout;
    const loadListener = /* @__PURE__ */ __name(function() {
      loadTimeout = setTimeout(resolve, pauseAfterLoadMs);
    }, "loadListener");
    session.once("Page.loadEventFired", loadListener);
    let canceled = false;
    cancel = /* @__PURE__ */ __name(() => {
      if (canceled) return;
      canceled = true;
      session.off("Page.loadEventFired", loadListener);
      loadTimeout && clearTimeout(loadTimeout);
    }, "cancel");
  });
  return {
    promise,
    cancel
  };
}
__name(waitForLoadEvent, "waitForLoadEvent");
async function isPageHung(session) {
  try {
    session.setNextProtocolTimeout(1e3);
    await session.sendCommand("Runtime.evaluate", {
      expression: '"ping"',
      returnByValue: true
    });
    return false;
  } catch (err) {
    try {
      await Promise.race([session.onCrashPromise(), Promise.resolve()]);
    } catch (crashErr) {
      if (crashErr.code === "TARGET_CRASHED") throw crashErr;
    }
    if (err.code === "TARGET_CRASHED") throw err;
    return true;
  }
}
__name(isPageHung, "isPageHung");
var DEFAULT_WAIT_FUNCTIONS = { waitForFcp, waitForLoadEvent, waitForCPUIdle, waitForNetworkIdle };
async function waitForFullyLoaded(session, networkMonitor, options) {
  const {
    pauseAfterFcpMs,
    pauseAfterLoadMs,
    networkQuietThresholdMs,
    cpuQuietThresholdMs,
    maxWaitForLoadedMs,
    maxWaitForFcpMs
  } = options;
  const { waitForFcp: waitForFcp2, waitForLoadEvent: waitForLoadEvent2, waitForNetworkIdle: waitForNetworkIdle2, waitForCPUIdle: waitForCPUIdle2 } = options._waitForTestOverrides || DEFAULT_WAIT_FUNCTIONS;
  let maxTimeoutHandle;
  const resolveOnFcp = maxWaitForFcpMs ? waitForFcp2(session, pauseAfterFcpMs, maxWaitForFcpMs) : waitForNothing();
  const resolveOnLoadEvent = waitForLoadEvent2(session, pauseAfterLoadMs);
  const resolveOnNetworkIdle = waitForNetworkIdle2(session, networkMonitor, {
    networkQuietThresholdMs,
    busyEvent: "network-2-busy",
    idleEvent: "network-2-idle",
    isIdle: /* @__PURE__ */ __name((recorder) => recorder.is2Idle(), "isIdle")
  });
  const resolveOnCriticalNetworkIdle = waitForNetworkIdle2(session, networkMonitor, {
    networkQuietThresholdMs,
    busyEvent: "network-critical-busy",
    idleEvent: "network-critical-idle",
    isIdle: /* @__PURE__ */ __name((recorder) => recorder.isCriticalIdle(), "isIdle")
  });
  let resolveOnCPUIdle = waitForNothing();
  if (lighthouse_logger_default.isVerbose()) {
    resolveOnFcp.promise.then(() => {
      lighthouse_logger_default.verbose("waitFor", "resolveOnFcp fired");
    });
    resolveOnLoadEvent.promise.then(() => {
      lighthouse_logger_default.verbose("waitFor", "resolveOnLoadEvent fired");
    });
    resolveOnNetworkIdle.promise.then(() => {
      lighthouse_logger_default.verbose("waitFor", "resolveOnNetworkIdle fired");
    });
    resolveOnCriticalNetworkIdle.promise.then(() => {
      lighthouse_logger_default.verbose("waitFor", "resolveOnCriticalNetworkIdle fired");
    });
  }
  const loadPromise = Promise.all([
    resolveOnFcp.promise,
    resolveOnLoadEvent.promise,
    resolveOnNetworkIdle.promise,
    resolveOnCriticalNetworkIdle.promise
  ]).then(() => {
    resolveOnCPUIdle = waitForCPUIdle2(session, cpuQuietThresholdMs);
    return resolveOnCPUIdle.promise;
  }).then(() => {
    const cleanupFn2 = /* @__PURE__ */ __name(async function() {
      lighthouse_logger_default.verbose("waitFor", "loadEventFired and network considered idle");
      return { timedOut: false };
    }, "cleanupFn");
    return cleanupFn2;
  }).catch((err) => {
    return function() {
      throw err;
    };
  });
  const maxTimeoutPromise = new Promise((resolve, reject) => {
    maxTimeoutHandle = setTimeout(resolve, maxWaitForLoadedMs);
  }).then((_) => {
    return async () => {
      lighthouse_logger_default.warn("waitFor", "Timed out waiting for page load. Checking if page is hung...");
      if (await isPageHung(session)) {
        lighthouse_logger_default.warn("waitFor", "Page appears to be hung, killing JavaScript...");
        void session.sendCommandAndIgnore("Emulation.setScriptExecutionDisabled", { value: true });
        void session.sendCommandAndIgnore("Runtime.terminateExecution");
        throw new LighthouseError(LighthouseError.errors.PAGE_HUNG);
      }
      const inflightRequestUrls = networkMonitor.getInflightRequests().map((request) => request.url);
      if (inflightRequestUrls.length > 0) {
        lighthouse_logger_default.warn(
          "waitFor",
          "Remaining inflight requests URLs",
          inflightRequestUrls
        );
      }
      return { timedOut: true };
    };
  });
  const cleanupFn = await Promise.race([
    loadPromise,
    maxTimeoutPromise
  ]);
  maxTimeoutHandle && clearTimeout(maxTimeoutHandle);
  resolveOnFcp.cancel();
  resolveOnLoadEvent.cancel();
  resolveOnNetworkIdle.cancel();
  resolveOnCPUIdle.cancel();
  return cleanupFn();
}
__name(waitForFullyLoaded, "waitForFullyLoaded");
function waitForUserToContinue(driver) {
  function createInPagePromise() {
    let resolve = /* @__PURE__ */ __name(() => {
    }, "resolve");
    const promise = new Promise((r) => resolve = r);
    console.log([
      `You have enabled Lighthouse navigation debug mode.`,
      `When you have finished inspecting the page, evaluate "continueLighthouseRun()"`,
      `in the console to continue with the Lighthouse run.`
    ].join(" "));
    window.continueLighthouseRun = resolve;
    return promise;
  }
  __name(createInPagePromise, "createInPagePromise");
  driver.defaultSession.setNextProtocolTimeout(Infinity);
  return driver.executionContext.evaluate(createInPagePromise, { args: [] });
}
__name(waitForUserToContinue, "waitForUserToContinue");

// core/gather/driver/navigation.js
init_constants();
init_i18n();
init_url_utils();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings133 = {
  /**
   * @description Warning that the web page redirected during testing and that may have affected the load.
   * @example {https://example.com/requested/page} requested
   * @example {https://example.com/final/resolved/page} final
   */
  warningRedirected: `The page may not be loading as expected because your test URL ({requested}) was redirected to {final}. Try testing the second URL directly.`,
  /**
   * @description Warning that Lighthouse timed out while waiting for the page to load.
   */
  warningTimeout: "The page loaded too slowly to finish within the time limit. Results may be incomplete."
};
var str_112 = createIcuMessageFn({ url: "core/gather/driver/navigation.js" }.url, UIStrings133);
var DEFAULT_PAUSE_AFTER_FCP = 0;
var DEFAULT_PAUSE_AFTER_LOAD = 0;
var DEFAULT_NETWORK_QUIET_THRESHOLD = 5e3;
var DEFAULT_CPU_QUIET_THRESHOLD = 0;
function resolveWaitForFullyLoadedOptions(options) {
  let { pauseAfterFcpMs, pauseAfterLoadMs, networkQuietThresholdMs, cpuQuietThresholdMs } = options;
  let maxWaitMs = options.maxWaitForLoad;
  let maxFCPMs = options.maxWaitForFcp;
  if (typeof pauseAfterFcpMs !== "number") pauseAfterFcpMs = DEFAULT_PAUSE_AFTER_FCP;
  if (typeof pauseAfterLoadMs !== "number") pauseAfterLoadMs = DEFAULT_PAUSE_AFTER_LOAD;
  if (typeof networkQuietThresholdMs !== "number") {
    networkQuietThresholdMs = DEFAULT_NETWORK_QUIET_THRESHOLD;
  }
  if (typeof cpuQuietThresholdMs !== "number") cpuQuietThresholdMs = DEFAULT_CPU_QUIET_THRESHOLD;
  if (typeof maxWaitMs !== "number") maxWaitMs = defaultSettings.maxWaitForLoad;
  if (typeof maxFCPMs !== "number") maxFCPMs = defaultSettings.maxWaitForFcp;
  if (!options.waitUntil.includes("fcp")) maxFCPMs = void 0;
  return {
    pauseAfterFcpMs,
    pauseAfterLoadMs,
    networkQuietThresholdMs,
    cpuQuietThresholdMs,
    maxWaitForLoadedMs: maxWaitMs,
    maxWaitForFcpMs: maxFCPMs
  };
}
__name(resolveWaitForFullyLoadedOptions, "resolveWaitForFullyLoadedOptions");
async function gotoURL(driver, requestor, options) {
  const status = typeof requestor === "string" ? { msg: `Navigating to ${requestor}`, id: "lh:driver:navigate" } : { msg: "Navigating using a user defined function", id: "lh:driver:navigate" };
  lighthouse_logger_default.time(status);
  const session = driver.defaultSession;
  const networkMonitor = driver.networkMonitor;
  await session.sendCommand("Page.enable");
  await session.sendCommand("Page.setLifecycleEventsEnabled", { enabled: true });
  let waitForNavigationTriggered;
  if (typeof requestor === "string") {
    session.setNextProtocolTimeout(Infinity);
    waitForNavigationTriggered = session.sendCommand("Page.navigate", { url: requestor });
  } else {
    waitForNavigationTriggered = requestor();
  }
  const waitForNavigated = options.waitUntil.includes("navigated");
  const waitForLoad = options.waitUntil.includes("load");
  const waitForFcp2 = options.waitUntil.includes("fcp");
  const waitConditionPromises = [];
  if (waitForNavigated) {
    const navigatedPromise = waitForFrameNavigated(session).promise;
    waitConditionPromises.push(navigatedPromise.then(() => ({ timedOut: false })));
  }
  if (waitForLoad) {
    const waitOptions = resolveWaitForFullyLoadedOptions(options);
    waitConditionPromises.push(waitForFullyLoaded(session, networkMonitor, waitOptions));
  } else if (waitForFcp2) {
    throw new Error("Cannot wait for FCP without waiting for page load");
  }
  const waitConditions = await Promise.race([
    session.onCrashPromise(),
    Promise.all(waitConditionPromises)
  ]);
  const timedOut = waitConditions.some((condition) => condition.timedOut);
  const navigationUrls = await networkMonitor.getNavigationUrls();
  let requestedUrl = navigationUrls.requestedUrl;
  if (typeof requestor === "string") {
    if (requestedUrl && !url_utils_default.equalWithExcludedFragments(requestor, requestedUrl)) {
      lighthouse_logger_default.error(
        "Navigation",
        `Provided URL (${requestor}) did not match initial navigation URL (${requestedUrl})`
      );
    }
    requestedUrl = requestor;
  }
  if (!requestedUrl) throw Error("No navigations detected when running user defined requestor.");
  const mainDocumentUrl = navigationUrls.mainDocumentUrl || requestedUrl;
  await waitForNavigationTriggered;
  if (options.debugNavigation) {
    await waitForUserToContinue(driver);
  }
  lighthouse_logger_default.timeEnd(status);
  return {
    requestedUrl,
    mainDocumentUrl,
    warnings: getNavigationWarnings({ timedOut, mainDocumentUrl, requestedUrl })
  };
}
__name(gotoURL, "gotoURL");
function getNavigationWarnings(navigation2) {
  const { requestedUrl, mainDocumentUrl } = navigation2;
  const warnings = [];
  if (navigation2.timedOut) warnings.push(str_112(UIStrings133.warningTimeout));
  if (!url_utils_default.equalWithExcludedFragments(requestedUrl, mainDocumentUrl)) {
    warnings.push(str_112(UIStrings133.warningRedirected, {
      requested: requestedUrl,
      final: mainDocumentUrl
    }));
  }
  return warnings;
}
__name(getNavigationWarnings, "getNavigationWarnings");

// core/gather/navigation-runner.js
init_config();
init_format();
init_lh_error();
init_url_utils();

// core/lib/navigation-error.js
init_process_global();
init_lantern2();
init_lh_error();
init_network_request();
init_i18n();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings134 = {
  /**
   * Warning shown in report when the page under test is an XHTML document, which Lighthouse does not directly support
   * so we display a warning.
   */
  warningXhtml: "The page MIME type is XHTML: Lighthouse does not explicitly support this document type",
  /**
   * @description Warning shown in report when the page under test returns an error code, which Lighthouse is not able to reliably load so we display a warning.
   * @example {404} errorCode
   */
  warningStatusCode: "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. (Status code: {errorCode})"
};
var str_113 = createIcuMessageFn({ url: "core/lib/navigation-error.js" }.url, UIStrings134);
var HTML_MIME_TYPE = "text/html";
var XHTML_MIME_TYPE = "application/xhtml+xml";
function getNetworkError(mainRecord, context) {
  if (!mainRecord) {
    return new LighthouseError(LighthouseError.errors.NO_DOCUMENT_REQUEST);
  } else if (mainRecord.failed) {
    const netErr = mainRecord.localizedFailDescription;
    if (netErr === "net::ERR_NAME_NOT_RESOLVED" || netErr === "net::ERR_NAME_RESOLUTION_FAILED" || netErr.startsWith("net::ERR_DNS_")) {
      return new LighthouseError(LighthouseError.errors.DNS_FAILURE);
    } else {
      return new LighthouseError(
        LighthouseError.errors.FAILED_DOCUMENT_REQUEST,
        { errorDetails: netErr }
      );
    }
  } else if (mainRecord.hasErrorStatusCode()) {
    if (context.ignoreStatusCode) {
      context.warnings.push(str_113(UIStrings134.warningStatusCode, { errorCode: mainRecord.statusCode }));
    } else {
      return new LighthouseError(LighthouseError.errors.ERRORED_DOCUMENT_REQUEST, {
        statusCode: `${mainRecord.statusCode}`
      });
    }
  }
}
__name(getNetworkError, "getNetworkError");
function getInterstitialError(mainRecord, networkRecords) {
  if (!mainRecord) return void 0;
  const interstitialRequest = networkRecords.find(
    (record) => record.documentURL.startsWith("chrome-error://")
  );
  if (!interstitialRequest) return void 0;
  if (!mainRecord.failed) return void 0;
  if (mainRecord.localizedFailDescription.startsWith("net::ERR_CERT")) {
    return new LighthouseError(LighthouseError.errors.INSECURE_DOCUMENT_REQUEST, {
      securityMessages: mainRecord.localizedFailDescription
    });
  }
  return new LighthouseError(LighthouseError.errors.CHROME_INTERSTITIAL_ERROR);
}
__name(getInterstitialError, "getInterstitialError");
function getNonHtmlError(finalRecord) {
  if (!finalRecord) return void 0;
  if (!finalRecord.mimeType || finalRecord.statusCode === -1) return void 0;
  if (finalRecord.mimeType !== HTML_MIME_TYPE && finalRecord.mimeType !== XHTML_MIME_TYPE) {
    return new LighthouseError(LighthouseError.errors.NOT_HTML, {
      mimeType: finalRecord.mimeType
    });
  }
  return void 0;
}
__name(getNonHtmlError, "getNonHtmlError");
function getPageLoadError(navigationError, context) {
  const { url, networkRecords } = context;
  const mainRecordLantern = core_exports.NetworkAnalyzer.findResourceForUrl(
    networkRecords,
    url
  );
  let mainRecord = mainRecordLantern;
  if (!mainRecord) {
    const documentRequests = networkRecords.filter(
      (record) => record.resourceType === NetworkRequest.TYPES.Document
    );
    if (documentRequests.length) {
      mainRecord = documentRequests.reduce((min, r) => {
        return r.networkRequestTime < min.networkRequestTime ? r : min;
      });
    }
  }
  let finalRecord;
  if (mainRecord) {
    finalRecord = core_exports.NetworkAnalyzer.resolveRedirects(mainRecord);
  } else {
    return navigationError;
  }
  if (finalRecord?.mimeType === XHTML_MIME_TYPE) {
    context.warnings.push(str_113(UIStrings134.warningXhtml));
  }
  const networkError = getNetworkError(mainRecord, context);
  const interstitialError = getInterstitialError(mainRecord, networkRecords);
  const nonHtmlError = getNonHtmlError(finalRecord);
  if (interstitialError) return interstitialError;
  if (networkError) return networkError;
  if (nonHtmlError) return nonHtmlError;
  return navigationError;
}
__name(getPageLoadError, "getPageLoadError");

// core/gather/navigation-runner.js
init_trace();
init_devtools_log();
init_network_records();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var DEFAULT_HOSTNAME = "127.0.0.1";
var DEFAULT_PORT = 9222;
async function _setup({ driver, resolvedConfig, requestor }) {
  await driver.connect();
  if (typeof requestor === "string" && !resolvedConfig.settings.skipAboutBlank) {
    await driver._networkMonitor?.disable();
    await gotoURL(driver, resolvedConfig.settings.blankPage, { waitUntil: ["navigated"] });
    await driver._networkMonitor?.enable();
  }
  const baseArtifacts = await getBaseArtifacts(resolvedConfig, driver, { gatherMode: "navigation" });
  const { warnings } = await prepareTargetForNavigationMode(driver, resolvedConfig.settings, requestor);
  baseArtifacts.LighthouseRunWarnings.push(...warnings);
  return { baseArtifacts };
}
__name(_setup, "_setup");
async function _cleanupNavigation({ driver }) {
  await clearThrottling(driver.defaultSession);
}
__name(_cleanupNavigation, "_cleanupNavigation");
async function _navigate(navigationContext) {
  const { driver, resolvedConfig, requestor } = navigationContext;
  try {
    const { requestedUrl, mainDocumentUrl, warnings } = await gotoURL(driver, requestor, {
      ...resolvedConfig.settings,
      waitUntil: resolvedConfig.settings.pauseAfterFcpMs ? ["fcp", "load"] : ["load"]
    });
    navigationContext.baseArtifacts.LighthouseRunWarnings.push(...warnings);
    return { requestedUrl, mainDocumentUrl, navigationError: void 0 };
  } catch (err) {
    if (!(err instanceof LighthouseError)) throw err;
    if (err.code !== "NO_FCP" && err.code !== "PAGE_HUNG" && err.code !== "TARGET_CRASHED") {
      throw err;
    }
    if (typeof requestor !== "string") throw err;
    return {
      requestedUrl: requestor,
      mainDocumentUrl: requestor,
      navigationError: err
    };
  }
}
__name(_navigate, "_navigate");
async function _collectDebugData(navigationContext, phaseState) {
  let devtoolsLog;
  let trace;
  for (const definition of phaseState.artifactDefinitions) {
    const { instance } = definition.gatherer;
    if (instance instanceof devtools_log_default) {
      devtoolsLog = instance.getDebugData();
    } else if (instance instanceof trace_default) {
      trace = instance.getDebugData();
    }
  }
  const records = devtoolsLog && await NetworkRecordsComputed.request(devtoolsLog, navigationContext);
  return { devtoolsLog, records, trace };
}
__name(_collectDebugData, "_collectDebugData");
async function _computeNavigationResult(navigationContext, phaseState, navigateResult) {
  const { navigationError, requestedUrl, mainDocumentUrl } = navigateResult;
  const debugData = await _collectDebugData(navigationContext, phaseState);
  const pageLoadError = debugData.records ? getPageLoadError(navigationError, {
    url: mainDocumentUrl,
    ignoreStatusCode: navigationContext.resolvedConfig.settings.ignoreStatusCode,
    networkRecords: debugData.records,
    warnings: navigationContext.baseArtifacts.LighthouseRunWarnings
  }) : navigationError;
  if (pageLoadError) {
    const locale = navigationContext.resolvedConfig.settings.locale;
    const localizedMessage = getFormatted(pageLoadError.friendlyMessage, locale);
    lighthouse_logger_default.error("NavigationRunner", localizedMessage, requestedUrl);
    const artifacts = {};
    if (debugData.devtoolsLog) {
      artifacts.DevtoolsLogError = debugData.devtoolsLog;
    }
    if (debugData.trace) {
      artifacts.TraceError = debugData.trace;
    }
    navigationContext.baseArtifacts.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
    navigationContext.baseArtifacts.PageLoadError = pageLoadError;
    return artifacts;
  } else {
    await collectPhaseArtifacts({ phase: "getArtifact", ...phaseState });
    return await awaitArtifacts(phaseState.artifactState);
  }
}
__name(_computeNavigationResult, "_computeNavigationResult");
async function _navigation(navigationContext) {
  if (!navigationContext.resolvedConfig.artifacts) {
    throw new Error("No artifacts were defined on the config");
  }
  const artifactState = getEmptyArtifactState();
  const phaseState = {
    url: await navigationContext.driver.url(),
    gatherMode: (
      /** @type {const} */
      "navigation"
    ),
    driver: navigationContext.driver,
    page: navigationContext.page,
    computedCache: navigationContext.computedCache,
    artifactDefinitions: navigationContext.resolvedConfig.artifacts,
    artifactState,
    baseArtifacts: navigationContext.baseArtifacts,
    settings: navigationContext.resolvedConfig.settings
  };
  const disableAsyncStacks = await enableAsyncStacks(navigationContext.driver.defaultSession);
  await collectPhaseArtifacts({ phase: "startInstrumentation", ...phaseState });
  await collectPhaseArtifacts({ phase: "startSensitiveInstrumentation", ...phaseState });
  const navigateResult = await _navigate(navigationContext);
  if (!Object.values(phaseState.baseArtifacts.URL).every(Boolean)) {
    phaseState.baseArtifacts.URL = {
      requestedUrl: navigateResult.requestedUrl,
      mainDocumentUrl: navigateResult.mainDocumentUrl,
      finalDisplayedUrl: await navigationContext.driver.url()
    };
  }
  phaseState.url = navigateResult.mainDocumentUrl;
  await collectPhaseArtifacts({ phase: "stopSensitiveInstrumentation", ...phaseState });
  await collectPhaseArtifacts({ phase: "stopInstrumentation", ...phaseState });
  await disableAsyncStacks();
  await _cleanupNavigation(navigationContext);
  return _computeNavigationResult(navigationContext, phaseState, navigateResult);
}
__name(_navigation, "_navigation");
async function _cleanup({ requestedUrl, driver, resolvedConfig, lhBrowser, lhPage }) {
  const didResetStorage = !resolvedConfig.settings.disableStorageReset && requestedUrl;
  if (didResetStorage) {
    await clearDataForOrigin(
      driver.defaultSession,
      requestedUrl,
      resolvedConfig.settings.clearStorageTypes
    );
  }
  await driver.disconnect();
  await lhPage?.close();
  await lhBrowser?.disconnect();
}
__name(_cleanup, "_cleanup");
async function navigationGather(page, requestor, options = {}) {
  const { flags = {}, config: config5 } = options;
  lighthouse_logger_default.setLevel(flags.logLevel || "error");
  const { resolvedConfig } = await initializeConfig("navigation", config5, flags);
  const computedCache = /* @__PURE__ */ new Map();
  const isCallback = typeof requestor === "function";
  const runnerOptions = { resolvedConfig, computedCache };
  const gatherFn = /* @__PURE__ */ __name(async () => {
    const normalizedRequestor = isCallback ? requestor : url_utils_default.normalizeUrl(requestor);
    let lhBrowser = void 0;
    let lhPage = void 0;
    if (!page) {
      const { hostname = DEFAULT_HOSTNAME, port = DEFAULT_PORT } = flags;
      lhBrowser = await puppeteer_core_default.connect({ browserURL: `http://${hostname}:${port}`, defaultViewport: null });
      lhPage = await lhBrowser.newPage();
      page = lhPage;
    }
    const driver = new Driver(page);
    const context = {
      driver,
      lhBrowser,
      lhPage,
      page,
      resolvedConfig,
      requestor: normalizedRequestor,
      computedCache
    };
    const { baseArtifacts } = await _setup(context);
    const artifacts2 = await _navigation({ ...context, baseArtifacts });
    await _cleanup(context);
    return finalizeArtifacts(baseArtifacts, artifacts2);
  }, "gatherFn");
  const artifacts = await Runner.gather(gatherFn, runnerOptions);
  return { artifacts, runnerOptions };
}
__name(navigationGather, "navigationGather");

// core/user-flow.js
init_runner();
init_config();
init_format();
init_config_helpers();
init_i18n();
init_lh();
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings135 = {
  /**
   * @description Default name for a user flow on the given url. "User flow" refers to the series of page navigations and user interactions being tested on the page. "url" is a trimmed version of a url that only includes the domain name.
   * @example {example.com} url
   */
  defaultFlowName: "User flow ({url})",
  /**
   * @description Default name for a Lighthouse report that analyzes a page navigation. "url" is a trimmed version of a url that only includes the domain name and path.
   * @example {example.com/page} url
   */
  defaultNavigationName: "Navigation report ({url})",
  /**
   * @description Default name for a Lighthouse report that analyzes user interactions over a period of time. "url" is a trimmed version of a url that only includes the domain name and path.
   * @example {example.com/page} url
   */
  defaultTimespanName: "Timespan report ({url})",
  /**
   * @description Default name for a Lighthouse report that analyzes the page state at a point in time. "url" is a trimmed version of a url that only includes the domain name and path.
   * @example {example.com/page} url
   */
  defaultSnapshotName: "Snapshot report ({url})"
};
var str_114 = createIcuMessageFn({ url: "core/user-flow.js" }.url, UIStrings135);

// core/index.js
init_report_generator();
init_lh();
init_audit();
init_base_gatherer();
init_network_records();
init_default_config();

// core/config/desktop-config.js
init_process_global();
init_lh();
init_constants();
/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var config3 = {
  extends: "lighthouse:default",
  settings: {
    formFactor: "desktop",
    throttling: throttling2.desktopDense4G,
    screenEmulation: screenEmulationMetrics.desktop,
    emulatedUserAgent: userAgents.desktop
  }
};

// core/config/agentic-browsing-config.js
init_process_global();
init_i18n();
/**
 * @license
 * Copyright 2026 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
var UIStrings136 = {
  /** Title of the Agentic Browsing category of audits. */
  agenticBrowsingCategoryTitle: "Agentic Browsing",
  /** Description of the Agentic Browsing category. */
  agenticBrowsingCategoryDescription: "These checks ensure high-quality, browsable websites for AI agents and validate the correctness of WebMCP integrations. This category is still under development and subject to change.",
  /** Title of the WebMCP group of audits. */
  webmcpGroupTitle: "WebMCP",
  /** Description of the WebMCP group. */
  webmcpGroupDescription: "Audits validating WebMCP integration.",
  /** Title of the Agent Accessibility group of audits. */
  agentAccessibilityGroupTitle: "Agent Accessibility",
  /** Description of the Agent Accessibility group of audits. */
  agentAccessibilityGroupDescription: "These audits highlight best practices for improving the accessibility of the website for AI agents."
};
var str_115 = createIcuMessageFn({ url: "core/config/agentic-browsing-config.js" }.url, UIStrings136);
var config4 = {
  extends: "lighthouse:default",
  audits: [
    "agentic/agent-accessibility-tree",
    "webmcp-registered-tools",
    "webmcp-form-coverage",
    "webmcp-schema-validity",
    "agentic/llms-txt"
  ],
  artifacts: [
    { id: "WebMCP", gatherer: "webmcp" },
    { id: "WebMcpSchemaIssues", gatherer: "webmcp-schema" },
    { id: "LlmsTxt", gatherer: "agentic/llms-txt" }
  ],
  groups: {
    "webmcp": {
      title: str_115(UIStrings136.webmcpGroupTitle),
      description: str_115(UIStrings136.webmcpGroupDescription)
    },
    "agent-accessibility": {
      title: str_115(UIStrings136.agentAccessibilityGroupTitle),
      description: str_115(UIStrings136.agentAccessibilityGroupDescription)
    }
  },
  categories: {
    "agentic-browsing": {
      title: str_115(UIStrings136.agenticBrowsingCategoryTitle),
      description: str_115(UIStrings136.agenticBrowsingCategoryDescription),
      supportedModes: ["navigation", "snapshot"],
      categoryScoreDisplayMode: "fraction",
      auditRefs: [
        { id: "agent-accessibility-tree", weight: 1, group: "agent-accessibility" },
        { id: "webmcp-form-coverage", weight: 1, group: "webmcp" },
        { id: "webmcp-registered-tools", weight: 1, group: "webmcp" },
        { id: "webmcp-schema-validity", weight: 1, group: "webmcp" },
        { id: "cumulative-layout-shift", weight: 1, acronym: "CLS" },
        { id: "llms-txt", weight: 1, group: "agent-accessibility" }
      ]
    }
  }
};
var agentic_browsing_config_default = config4;

// core/index.js
init_lh();
/**
 * @license
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
async function navigation(page, requestor, options) {
  const gatherResult = await navigationGather(page, requestor, options);
  return Runner.audit(gatherResult.artifacts, gatherResult.runnerOptions);
}
__name(navigation, "navigation");
async function snapshot(page, options) {
  const gatherResult = await snapshotGather(page, options);
  return Runner.audit(gatherResult.artifacts, gatherResult.runnerOptions);
}
__name(snapshot, "snapshot");
function generateReport(result, format = "html") {
  const reportOutput = ReportGenerator.generateReport(result, format);
  if (Array.isArray(reportOutput)) {
    return reportOutput[0];
  } else {
    return reportOutput;
  }
}
__name(generateReport, "generateReport");
var traceCategories = trace_default.getDefaultTraceCategories();

// clients/devtools-mcp/devtools-mcp-entry.js
/**
 * @license
 * Copyright 2026 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
export {
  agentic_browsing_config_default as agenticBrowsingConfig,
  generateReport,
  navigation,
  snapshot
};
//# sourceMappingURL=lighthouse-devtools-mcp-bundle.js.map
